AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
Foundry IQ provides a structured framework for creating, diagnosing, and connecting knowledge bases to AI agents. It supports making local or Blob-based documents searchable, managing multi-source knowledge configurations, and retrieving information with citations. The skill emphasizes strict adherence to defined procedures for service discovery, resource creation, and troubleshooting to ensure reliable agent-knowledge integration.
What it does
- Creates searchable knowledge bases from local or Azure Blob storage documents.
- Connects existing knowledge bases to AI agents.
- Diagnoses issues with knowledge base configurations or unsupported connectors.
- Retrieves information from knowledge bases with source citations.
- Manages the lifecycle of search services and knowledge sources.
- Routes requests based on specific operational needs rather than source counts.
When to use it
- When you need to make local or cloud-stored documents searchable by an AI agent.
- When connecting an existing knowledge base to a new or current agent.
- When troubleshooting or diagnosing a knowledge base configuration.
- When you need to create a new search service or knowledge source.
- When performing retrieval tasks that require citations from a knowledge base.
Advantages
- Provides a clear, procedural approach to knowledge base management.
- Ensures consistent handling of multi-source knowledge configurations.
- Includes built-in diagnostic paths for troubleshooting.
- Supports secure, citation-backed retrieval for agent responses.
- Prevents unauthorized or unsupported configuration changes.
Usage examples
- “Create a new knowledge base from my Azure Blob container.”
- The agent will initiate the knowledge base creation procedure, validating the source and setting up the necessary search indexing.
- “Connect my existing knowledge base to the current agent.”
- The agent will follow the connection workflow to link the specified knowledge base to the agent's retrieval pipeline.
- “Why is my multi-source knowledge base failing to index?”
- The agent will trigger the diagnostic procedure to identify configuration drifts or unsupported connector issues.
- “Retrieve information about project timelines from the knowledge base.”
- The agent will query the knowledge base and provide an answer with citations from the source documents.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/microsoft/foundry-iq/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip foundry-iq.zip -d .agents/skills
Documentation by Microsoft
Foundry IQ
Read one procedure before questions/actions; invocation is not a read.
Read the owning procedure before blocked/unsupported responses too.
Before mutation plans/approval, successfully read its required pre-action references, selected
branches only. Do not reload successful reads. On failure, try only permitted
bounded exact-path reads with any supported reader; never bypass restrictions
or search broadly. If still unavailable: blocked: reference-unavailable, name
missing references and inability to plan. Never invent requirements/plans.
Failures first.
Cleanup and receipt-backed execution go directly to their lifecycle/producer owner; do not reopen Search intake, provisioning or hardening.
Before expensive service discovery, reuse supplied resource/intent; otherwise ask one early USE EXISTING / FIND CANDIDATES / CREATE NEW choice. Only FIND enumerates; supplied identity uses exact/minimum scoped resolution. CREATE checks its proposed name, not existing-service inventories. Preserve these answers across source/KB/CU/model handoffs; selection is not write approval.
Searchable docs: KB + validated retrieval. Confirm intent once; KS-only must be explicit. Child success is not KB completion. Unclear/compound/mode/completion: read.
Route by requested operation, not existing KB source count. Connecting an existing KB with two or more sources, without changing the KB, uses Connect. Read-only operations use their owning procedure and actual helper constraints; this does not add retrieval modes or supported source kinds. Explicit unsupported provisioning or multi-source KB creation/reconfiguration uses Diagnose and stops before discovery, even when connecting an agent is also requested. This routing takes precedence over classic-search terms (e.g. hybrid search) in compound requests. Never end in a plain refusal: Diagnose gives the boundary, docs pointer and agent handoff; writes still need an approved concrete plan. Do not silently execute only the supported part of a compound request. If existing-KB connection versus KB creation/reconfiguration is unclear, read intent-routing and clarify that scope before Azure discovery. Never infer KB mutation.
| Outcome | Read |
|---|---|
| Cleanup | Plan cleanup |
| Failure/drift | Diagnose |
| Unsupported connector provisioning / multi-source KB creation or reconfiguration | Diagnose |
| Connect | Connect |
| Read KB | Query |
| Search only | Search |
| File KS only | File |
| Blob/ADLS KS only | Blob |
| Searchable/KB | KB |
Generic agents: microsoft-foundry.
Reads: no approval; approve unchanged plans before writes.
Hide hashes. No Search/Storage keys, scope widening, guessed identity/boundaries,
drift repair or joint cleanup/creation approval. Acceptance != success.
Files
- ATTRIBUTION.mdAdded by AutoGineer977 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md3.7 KiB
- agents/connect-hosted-toolbox.md7.8 KiB
- agents/connect-hosted.md7.8 KiB
- agents/connect-prompt-sdk-fallback.md7.8 KiB
- agents/connect.md7.8 KiB
- agents/create-missing-agent.md7.8 KiB
- helpers/_blob_observation.pyScript4.4 KiB
- helpers/_blob_source_read.pyScript39.5 KiB
- helpers/_bootstrap_io.pyScript30.1 KiB
- helpers/_cleanup_dependencies.pyScript27.5 KiB
- helpers/_cleanup_receipts.pyScript13.5 KiB
- helpers/_common.pyScript36.2 KiB
- helpers/_document_adapters.pyScript15.0 KiB
- helpers/_document_limits.pyScript3.9 KiB
- helpers/_embedding.pyScript7.0 KiB
- helpers/_file_inventory.pyScript24.4 KiB
- helpers/_file_source_config.pyScript15.6 KiB
- helpers/_indexer_observation.pyScript7.1 KiB
- helpers/_initial_prompt.pyScript12.5 KiB
- helpers/_private_json.pyScript2.4 KiB
- helpers/_progress.pyScript12.1 KiB
- helpers/_prompt_read.pyScript17.7 KiB
- helpers/_search_read.pyScript6.0 KiB
- helpers/_source_readback.pyScript1.6 KiB
- helpers/blob-contracts.md7.8 KiB
- helpers/blob-cu-contracts.md7.8 KiB
- helpers/blob_inventory.pyScript17.1 KiB
- helpers/blob_recheck.pyScript64.6 KiB
- helpers/blob_source.pyScript35.8 KiB
- helpers/bootstrap-contracts.md7.8 KiB
- helpers/bootstrap_azure.pyScript41.5 KiB
- helpers/cleanup_plan.pyScript41.4 KiB
- helpers/contracts.md7.8 KiB
- helpers/cu_ingestion_auth.pyScript12.5 KiB
- helpers/document-assessment.md7.8 KiB
- helpers/document_assess.pyScript14.0 KiB
- helpers/file-upload-recovery.md7.8 KiB
- helpers/file_cu_canary.pyScript32.7 KiB
- helpers/file_cu_mi.pyScript9.6 KiB
- helpers/file_ingest.pyScript15.4 KiB
- helpers/file_source.pyScript31.7 KiB
- helpers/file_upload.pyScript53.7 KiB
- helpers/hosted_connect.pyScript30.8 KiB
- helpers/kb-contracts.md7.8 KiB
- helpers/knowledge_base_retrieve.pyScript7.7 KiB
- helpers/model-discovery-contracts.md7.8 KiB
- helpers/model-discovery-scopes.md7.8 KiB
- helpers/model_discovery.pyScript23.7 KiB
- helpers/private-artifacts.md7.2 KiB
- helpers/private_artifacts.pyScript4.8 KiB
- helpers/prompt_cleanup.pyScript22.0 KiB
- helpers/prompt_connect.pyScript62.3 KiB
- helpers/requirements-assessment.txt103 B
- helpers/retrieval-verification-contracts.md7.8 KiB
- helpers/retrieval_verify.pyScript19.6 KiB
- helpers/search-intake-contracts.md7.6 KiB
- helpers/search_intake.pyScript18.4 KiB
- helpers/search_reconcile.pyScript59.7 KiB
- helpers/source_vector.pyScript33.2 KiB
- helpers/throttle-recovery.md5.0 KiB
- helpers/vector-contracts.md7.8 KiB
- knowledge-bases/create.md8.1 KiB
- knowledge-bases/retrieve.md7.8 KiB
- knowledge-sources/create-azure-blob.md7.8 KiB
- knowledge-sources/create-file.md7.8 KiB
- lifecycle/cleanup.md7.8 KiB
- references/abstention.md1.0 KiB
- references/blob-binding-evidence.md7.8 KiB
- references/blob-indexer-observation.md7.7 KiB
- references/blob-ingestion-progress.md6.5 KiB
- references/blob-readiness-recheck.md7.8 KiB
- references/blob-vector-readiness.md2.6 KiB
- references/bootstrap-azure.md7.8 KiB
- references/content-fit.md7.8 KiB
- references/cu-ingestion.md7.8 KiB
- references/file-cu-canary.md7.8 KiB
- references/intent-routing.md7.7 KiB
- references/owner.md2.1 KiB
- references/platform-contracts.md7.7 KiB
- references/platform-interfaces.md7.8 KiB
- references/resource-intake.md7.8 KiB
- references/search-substrate.md7.8 KiB
- references/standard-cu.md7.8 KiB
- search-services/create.md7.8 KiB
- troubleshooting/diagnose.md8.7 KiB
helpers/file_cu_mi.py
"""File Standard system-MI binding; implementation evidence is not rollout proof."""
from __future__ import annotations
import copy
import re
try:
from . import cu_ingestion_auth, _search_read
from ._common import MANAGEMENT_AUDIENCE, HelperFailure, require_allowed_fields
except ImportError:
import cu_ingestion_auth
import _search_read
from _common import MANAGEMENT_AUDIENCE, HelperFailure, require_allowed_fields
SEARCH_API = "2025-05-01"
ROLE_API = "2022-04-01"
CU_ROLE = "a97b65f3-24c7-4388-baec-2e87135dc908"
SEARCH_ID = re.compile(
r"/subscriptions/[0-9a-fA-F-]{36}/resourceGroups/[A-Za-z0-9_.()-]{1,90}"
r"/providers/Microsoft\.Search/searchServices/(?=.{2,60}$)((?a:[a-z0-9][a-z0-9]+(?:-[a-z0-9]+)*))", re.I,
)
REDACTED = (None, "", "<redacted>", "***")
def fail(code, message, *, request_id=None, status=None):
return HelperFailure(code, message, blocked_at="cu-managed-identity", request_id=request_id, status=status)
def validate_choice(value, resource_id):
if not isinstance(value, dict):
raise fail("cu-mi-prerequisite-missing", "Resolve existing Search resource ID and exact CU-scoped Cognitive Services User assignment. Missing identity/role changes need packaged bootstrap plans and explicit approval.")
require_allowed_fields(value, {"search_resource_id", "role_assignment_id"}, label="File CU managed identity")
search = value.get("search_resource_id")
role = value.get("role_assignment_id")
prefix = resource_id + "/providers/Microsoft.Authorization/roleAssignments/"
if (
not isinstance(search, str) or SEARCH_ID.fullmatch(search) is None
or not isinstance(role, str) or not role.casefold().startswith(prefix.casefold())
or cu_ingestion_auth.UUID.fullmatch(role[len(prefix):]) is None
):
raise fail("cu-mi-binding-invalid", "Select exact Search and CU-account-scoped role assignment IDs; no inferred account, inherited/custom role or user-assigned identity.")
return copy.deepcopy(value)
def read_binding(choice, endpoint, *, token_provider, transport):
selected = validate_choice(choice.get("managed_identity"), choice["resource_id"])
match = SEARCH_ID.fullmatch(selected["search_resource_id"])
if endpoint.rstrip("/").casefold() != f"https://{match.group(1)}.search.windows.net".casefold():
raise fail("cu-mi-search-mismatch", "Search resource ID must match the exact approved Search endpoint.")
ids = []
def get(resource, version):
response = transport(
"GET", f"{MANAGEMENT_AUDIENCE}{resource}?api-version={version}",
token_provider(MANAGEMENT_AUDIENCE), follow_redirects=False, max_response_bytes=65536,
)
if response.status != 200 or not isinstance(response.body, dict):
raise fail("cu-mi-prerequisite-unavailable", "Cannot GET the exact Search identity or scoped CU role. Have its owner resolve read access or plan missing setup; no key fallback or permission changes.",
request_id=response.request_id, status=response.status)
if str(response.body.get("id", "")).casefold() != resource.casefold():
raise fail("cu-mi-resource-mismatch", "ARM returned another resource or scope; refresh the selected bindings.", request_id=response.request_id)
if response.request_id:
ids.append(response.request_id)
return response.body
search = get(selected["search_resource_id"], SEARCH_API)
identity, props = search.get("identity"), search.get("properties")
if (
not isinstance(identity, dict) or not isinstance(props, dict)
or "SystemAssigned" not in str(identity.get("type", "")).replace(" ", "").split(",")
or any(not isinstance(identity.get(k), str) or cu_ingestion_auth.UUID.fullmatch(identity[k]) is None
for k in ("principalId", "tenantId"))
or str(props.get("provisioningState", "")).casefold() != "succeeded"
or str(props.get("status", "")).casefold() != "running"
or str(props.get("endpoint", "")).rstrip("/").casefold() not in (
endpoint.rstrip("/").casefold(), endpoint.rstrip("/").casefold().removeprefix("https://"),
)
):
raise fail("cu-mi-identity-unverified", "Require ready Search system-assigned principal/tenant and endpoint readback; resolve missing identity with a separately approved bootstrap plan.")
role = get(selected["role_assignment_id"], ROLE_API)
rp = role.get("properties")
expected_role = re.compile(r"/subscriptions/[0-9a-fA-F-]{36}/providers/Microsoft.Authorization/roleDefinitions/" + CU_ROLE, re.I)
if (
not isinstance(rp, dict)
or str(rp.get("principalId", "")).casefold() != identity["principalId"].casefold()
or rp.get("principalType") != "ServicePrincipal"
or str(rp.get("scope", "")).casefold() != choice["resource_id"].casefold()
or expected_role.fullmatch(str(rp.get("roleDefinitionId", ""))) is None
or rp.get("condition") not in (None, "")
):
raise fail("cu-mi-role-unverified", "Require the selected Search principal's unconditional Cognitive Services User assignment on this CU account. Plan a missing scoped role explicitly; no self-grant or key fallback.")
return {
**selected, "search_endpoint": endpoint.rstrip("/"),
"principal_id": identity["principalId"], "tenant_id": identity["tenantId"],
"identity_type": identity["type"], "search_api_version": SEARCH_API, "role_api_version": ROLE_API,
"role_definition_id": rp["roleDefinitionId"], "cu_resource_id": choice["resource_id"],
"search_network": {k: copy.deepcopy(props.get(k)) for k in ("publicNetworkAccess", "networkRuleSet")},
}, ids
def validate_state(state, choice, endpoint):
if not isinstance(state, dict):
raise fail("cu-mi-prerequisite-missing", "Retain the planner's verified Search identity/role binding.")
fields = {"search_resource_id", "role_assignment_id", "search_endpoint", "principal_id", "tenant_id",
"identity_type", "search_api_version", "role_api_version", "role_definition_id",
"cu_resource_id", "search_network"}
require_allowed_fields(state, fields, label="File CU identity state")
selected = validate_choice(choice["managed_identity"], choice["resource_id"])
if (
set(state) != fields or any(state.get(k) != v for k, v in selected.items())
or state["search_endpoint"] != endpoint.rstrip("/")
or state["cu_resource_id"] != choice["resource_id"]
or state["search_api_version"] != SEARCH_API or state["role_api_version"] != ROLE_API
or not isinstance(state["search_network"], dict)
or any(not isinstance(state[k], str) or cu_ingestion_auth.UUID.fullmatch(state[k]) is None
for k in ("principal_id", "tenant_id"))
or "SystemAssigned" not in str(state["identity_type"]).replace(" ", "").split(",")
or not str(state["role_definition_id"]).casefold().endswith("/roledefinitions/" + CU_ROLE)
):
raise fail("cu-mi-binding-invalid", "Retain complete, unchanged identity, role, API and account bindings.")
def guard_create(plan, transport, recheck, checkpoint=None):
"""An expected-absent MI plan must not adopt another actor's redacted source."""
url = _search_read.resource_url(plan["source"])
acknowledged = False
created_etag = None
def on_created(**evidence):
nonlocal created_etag
# The reconciler calls this after ACK, outside ambiguous transport recovery.
if checkpoint is not None:
try:
checkpoint(**evidence)
except HelperFailure:
raise
except Exception:
raise fail("cu-mi-checkpoint-failed", "Acknowledged MI creation checkpoint failed; private details withheld.") from None
try:
response = evidence["response"]
created_etag = _search_read.resolve_etag(_search_read.response_etags(response), response.request_id)
except HelperFailure:
raise fail("cu-mi-ack-version-unverified", "MI creation was acknowledged, but its version evidence is invalid. Retain ownership; do not replay.") from None
if created_etag is None:
raise fail("cu-mi-ack-version-unverified", "MI creation was acknowledged without an ETag; redacted auth cannot be bound to a created version. Retain ownership; do not replay.")
def guarded(method, target, token, **kwargs):
nonlocal acknowledged, created_etag
if method == "PUT" and target == url:
recheck()
result = transport(method, target, token, **kwargs)
if target == url:
if method == "PUT" and result.status in (200, 201):
acknowledged = True
if method == "GET" and result.status == 200 and plan["source"]["action"] == "create" and not acknowledged:
raise fail("cu-mi-source-drift", "Expected source absence changed before creation; do not infer MI from redacted readback. Refresh discovery and provenance.")
if method == "GET" and result.status == 200 and acknowledged:
try:
observed_etag = _search_read.resolve_etag(_search_read.response_etags(result), result.request_id)
except HelperFailure:
raise fail("cu-mi-readback-version-unverified", "Created MI source readback has invalid version evidence.") from None
if observed_etag != created_etag:
raise fail("cu-mi-source-drift", "Source version changed after acknowledged MI creation; redacted auth is unproven. Inspect ownership before cleanup.")
return result
return guarded, on_created
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Python
The author says: Azure
Security
What our scanner noticed· Medium risk
- References to credential files
- Instructions that use the network
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Microsoft
- Publisher
- Microsoft (Official)
- Source
- microsoft/skills · .github/plugins/foundry-iq-skills/skills/foundry-iq · commit 0696600
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from .github/plugins/foundry-iq-skills/LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Microsoft or Microsoft.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download foundry-iq.zip