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/_cleanup_receipts.py
"""Filtered, immutable creation evidence; never a credentialized callback surface."""
from __future__ import annotations
import copy
import uuid
from datetime import datetime
from pathlib import Path
try:
from . import _bootstrap_io as private_io, _search_read
from ._common import (
HelperFailure, digest, load_approved_input, reject_secrets, odata_name, validate_search_endpoint,
)
except ImportError:
import _bootstrap_io as private_io
import _search_read
from _common import (
HelperFailure, digest, load_approved_input, reject_secrets, odata_name, validate_search_endpoint,
)
def fail(code, message):
return HelperFailure(code, message, blocked_at="cleanup-provenance")
def version_identity(value):
get = value.get if isinstance(value, dict) else lambda key: getattr(value, key, None)
identifier, created = get("id"), get("created_at")
if isinstance(created, datetime):
created = int(created.timestamp()) if created.tzinfo is not None else None
if not isinstance(identifier, str) or not identifier.strip() or type(created) is not int or created <= 0:
return None
return {"id": identifier, "created_at": created}
def add_argument(parser):
parser.add_argument("--cleanup-receipt-dir", type=Path,
help="Existing absolute private directory for filtered original-create evidence.")
class Capture:
def __init__(self, directory, document):
self.directory = private_io.private_directory(str(directory))
self.plan_digest = digest(document["plan"])
self.owner = document["plan"].get("owner")
self.records = {}
self.summaries = []
def start(self, target, acknowledgement):
acknowledgement.setdefault("version_identity", None)
record = {
"schema_version": "1.0", "kind": "cleanup-creation-receipt",
"plan_digest": self.plan_digest, "owner": self.owner, "target": target,
"state": "acknowledged", "acknowledgement": acknowledgement, "snapshot": None,
}
key = digest(target)
self.records[key] = record
self._persist(record)
def finish(self, target, snapshot):
record = copy.deepcopy(self.records[digest(target)])
ack = record["acknowledgement"]
snapshot.setdefault("version_identity", None)
if (snapshot["version_identity"] != ack["version_identity"]
or (target["type"] == "prompt-agent-version" and ack["version_identity"] is None)):
raise fail("creation-version-unproven", "Native version identity/creation time must match the original acknowledgement.")
if not isinstance(ack["request_id"], str) or not ack["request_id"].strip():
raise fail("creation-request-id-unavailable", "Original native acknowledgement lacks a request ID.")
if snapshot["definition_digest"] != ack["definition_digest"]:
raise fail("definition-drift", "Readback differs from the acknowledged original creation.")
record.update(state="verified", snapshot=snapshot)
self._persist(record)
def _persist(self, record):
reject_secrets(record)
value = {**record, "integrity": digest(record)}
try:
path = private_io.private_file(self.directory, uuid.uuid4().hex + ".cleanup.json", value)
except OSError as exc:
raise fail("cleanup-receipt-persistence-failed", "Acknowledged creation evidence could not be retained privately.") from exc
self.summaries.append({"target": record["target"], "state": record["state"],
"receipt_file": str(path), "evidence_digest": value["integrity"]})
def search_target(plan):
return {"type": plan["resource_type"], "endpoint": validate_search_endpoint(plan["endpoint"]),
**{key: plan[key] for key in ("name", "api_version")}}
def search_ack(capture, plan, response):
try:
from . import _cleanup_dependencies as dependencies
except ImportError:
import _cleanup_dependencies as dependencies
generated = None
if plan["resource_type"] == "knowledge-source":
try:
generated = dependencies.generated(response.body) if isinstance(response.body, dict) else None
except HelperFailure as error:
if error.code not in {"source-cleanup-kind-unsupported", "generated-ownership-unproven", "name-invalid"}:
raise
# Retain the ACK before search_finish rejects incomplete ownership evidence.
generated = None
capture.start(search_target(plan), {
"operation": "search-create", "status": response.status, "request_id": response.request_id,
"definition_digest": digest(_search_read._definition(plan["desired"])),
"etag_evidence": _search_read.response_etags(response), "generated": generated, "version": None,
})
def search_finish(capture, plan, current, token, transport):
try:
from . import _cleanup_dependencies as dependencies
except ImportError:
import _cleanup_dependencies as dependencies
target = search_target(plan)
ack = capture.records[digest(target)]["acknowledgement"]
etag = _search_read.resolve_etag(ack["etag_evidence"], ack["request_id"])
if ack["status"] != 201 or not etag or current is None or current.get("@odata.etag") != etag:
raise fail("creation-version-unproven", "Require original HTTP 201 and the unchanged acknowledged ETag, not a later GET version.")
children = []
if plan["resource_type"] == "knowledge-source":
if ack["generated"] is None or dependencies.generated(current) != ack["generated"]:
raise fail("generated-creation-evidence-unavailable", "The original create response did not identify this exact generated cascade.")
for kind, name in sorted(ack["generated"].items()):
url = f"{plan['endpoint'].rstrip('/')}/{dependencies.COLLECTIONS[kind]}('{odata_name(name)}')?api-version={plan['api_version']}"
child, _ = _search_read.read_resource(url, token, transport=transport)
if child is None or child.get("name") != name or not child.get("@odata.etag"):
raise fail("generated-version-unavailable", "An original generated child lacks exact version readback.")
children.append({"type": kind, "name": name, "etag": child["@odata.etag"], "definition_digest": digest(child)})
refreshed, _ = _search_read.read_resource(_search_read.resource_url(plan), token, transport=transport)
if (refreshed is None or refreshed.get("@odata.etag") != etag
or _search_read._definition(refreshed) != _search_read._definition(current)
or dependencies.generated(refreshed) != ack["generated"]):
raise fail("definition-drift", "Source changed during original generated-child capture.")
capture.finish(target, {"definition_digest": digest(_search_read._definition(current)), "etag": etag, "generated": children})
def project_target(plan, kind, *, name=None, version=None):
target = {"type": kind, "project_resource_id": plan["project_resource_id"].casefold(),
"project_endpoint": plan["project_endpoint"].rstrip("/"),
"name": name or plan["connection"]["name"]}
if version is not None:
target["version"] = version
return target
def connection_ack(capture, plan, response):
body = response.body if isinstance(response.body, dict) else {}
capture.start(project_target(plan, "project-connection"), {
"operation": "project-connection-create", "status": response.status, "request_id": response.request_id,
"definition_digest": digest(body), "version": None, "generated": None,
"etag_evidence": {"body": body.get("etag") or body.get("@odata.etag"),
"headers": [v for k, v in response.headers.items() if k.casefold() == "etag"]},
})
def connection_finish(capture, plan, body):
target = project_target(plan, "project-connection")
ack = capture.records[digest(target)]["acknowledgement"]
etag = _search_read.resolve_etag(ack["etag_evidence"], ack["request_id"])
if ack["status"] != 201 or not etag or etag != (body.get("etag") or body.get("@odata.etag")):
raise fail("creation-version-unproven", "Connection readback must retain its original HTTP 201 ETag.")
capture.finish(target, {"definition_digest": digest(body), "etag": etag, "generated": []})
def sdk_response_hook(metadata):
def capture(response):
native = response.http_response
metadata["request_id"] = next((v for k, v in native.headers.items()
if k.casefold() in ("request-id", "x-request-id", "x-ms-request-id", "apim-request-id")), None)
metadata["status"] = native.status_code
return capture
def agent_ack(capture, plan, created, metadata):
target = project_target(plan, "prompt-agent-version", name=created.name, version=str(created.version))
capture.start(target, {
"operation": "agents.create_version", "status": metadata.get("status"), "request_id": metadata.get("request_id"),
"definition_digest": digest(created.definition.as_dict()), "version": str(created.version),
"etag_evidence": None, "generated": None,
"version_identity": version_identity(created),
})
if (metadata.get("status") not in (200, 201) or created.name != plan["agent"]["name"]
or str(created.version) == plan["agent"]["version"] or version_identity(created) is None):
raise fail("ownership-unproven", "The original SDK return must identify a newly created version in the approved agent.")
return target
def load(input_path, receipt_path, target):
try:
from . import _private_json
except ImportError:
import _private_json
_, plan, fingerprint = load_approved_input(input_path)
record = _private_json.read_private(receipt_path)
reject_secrets(record)
fields = {"schema_version", "kind", "plan_digest", "owner", "target", "state", "acknowledgement", "snapshot", "integrity"}
if (not isinstance(record, dict) or set(record) != fields or record["schema_version"] != "1.0"
or record["kind"] != "cleanup-creation-receipt" or record["state"] != "verified"
or record["plan_digest"] != fingerprint or record["owner"] != plan.get("owner")
or record["target"] != target
or record["integrity"] != digest({k: v for k, v in record.items() if k != "integrity"})):
raise fail("ownership-unproven", "Require the exact original verified producer receipt and original approval; ACK/recovery/reuse cannot substitute.")
ack, snapshot = record["acknowledgement"], record["snapshot"]
if (not isinstance(ack, dict) or set(ack) != {"operation", "status", "request_id", "definition_digest", "etag_evidence", "generated", "version", "version_identity"}
or not isinstance(snapshot, dict) or set(snapshot) != {"definition_digest", "etag", "generated", "version_identity"}
or not isinstance(ack["request_id"], str) or not ack["request_id"].strip()
or snapshot["definition_digest"] != ack["definition_digest"]
or not isinstance(snapshot["definition_digest"], str) or not _search_read.SHA256.fullmatch(snapshot["definition_digest"])
or not isinstance(snapshot["generated"], list)):
raise fail("ownership-unproven", "Producer receipt lacks complete acknowledged version evidence.")
if (snapshot["version_identity"] != ack["version_identity"]
or (target["type"] == "prompt-agent-version" and (
not isinstance(snapshot["version_identity"], dict)
or set(snapshot["version_identity"]) != {"id", "created_at"}
or version_identity(snapshot["version_identity"]) != snapshot["version_identity"]))):
raise fail("ownership-unproven", "Native version birth identity is missing or changed.")
if target["type"] != "prompt-agent-version" and (
not isinstance(ack["etag_evidence"], dict) or set(ack["etag_evidence"]) != {"body", "headers"}
or not isinstance(ack["etag_evidence"]["headers"], list)
):
raise fail("ownership-unproven", "Native ETag evidence must be complete.")
if target["type"] in ("knowledge-base", "knowledge-source"):
if (ack["operation"] != "search-create" or ack["status"] != 201
or _search_read.resolve_etag(ack["etag_evidence"], ack["request_id"]) != snapshot["etag"]
or not isinstance(snapshot["etag"], str) or not snapshot["etag"].strip()):
raise fail("creation-version-unproven", "Original Search create acknowledgement and snapshot versions disagree.")
elif target["type"] == "project-connection":
if (ack["operation"] != "project-connection-create" or ack["status"] != 201
or _search_read.resolve_etag(ack["etag_evidence"], ack["request_id"]) != snapshot["etag"]
or not snapshot["etag"] or snapshot["generated"]):
raise fail("creation-version-unproven", "Original connection acknowledgement and readback versions disagree.")
elif target["type"] == "prompt-agent-version":
if (ack["operation"] not in ("agents.create_version", "agents.create") or ack["status"] not in (200, 201)
or (ack["operation"] == "agents.create" and ack["status"] != 200)
or ack["version"] != target["version"] or snapshot["etag"] is not None or snapshot["generated"]):
raise fail("ownership-unproven", "Require original SDK version-create return and its exact readback.")
else:
raise fail("cleanup-kind-unsupported", "No producer receipt contract supports this target.")
return plan, record
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