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://mp-staging.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/_initial_prompt.py
"""Receipt-producing form of the existing local Foundry v1 create-agent fallback."""
from __future__ import annotations
import re
from urllib.parse import quote
try:
from . import _cleanup_dependencies as dependencies, _cleanup_receipts as receipts, _prompt_read
from ._common import (
HelperFailure, canonical_bytes, digest, reject_secrets, require_allowed_fields, sdk_error_status,
sdk_error_metadata,
)
except ImportError:
import _cleanup_dependencies as dependencies
import _cleanup_receipts as receipts
import _prompt_read
from _common import (
HelperFailure, canonical_bytes, digest, reject_secrets, require_allowed_fields, sdk_error_status,
sdk_error_metadata,
)
def fail(code, message):
return HelperFailure(code, message, blocked_at="initial-prompt-creation")
def validate(plan):
reject_secrets(plan)
require_allowed_fields(plan, {"operation", "sdk_major", "project_resource_id", "project_endpoint",
"agent", "owner", "cleanup_approved", "inventory_limits", "absence_inventory_digest",
"prerequisites"}, label="Initial Prompt creation")
_prompt_read._project_identity(plan)
if (plan.get("operation") != "create-initial-prompt-agent" or plan.get("sdk_major") != 2
or plan.get("cleanup_approved") is not False or not isinstance(plan.get("owner"), str) or not plan["owner"].strip()):
raise fail("input-schema-invalid", "Initial Prompt creation needs separate approved creation intent and owner.")
agent = plan.get("agent")
if not isinstance(agent, dict) or set(agent) != {"name", "definition"}:
raise fail("input-schema-invalid", "Select one exact initial agent name and complete definition.")
if not isinstance(agent["name"], str) or not re.fullmatch(r"[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?", agent["name"]):
raise fail("input-schema-invalid", "Select a v1 agent name, never a suffix or latest.")
definition = agent["definition"]
if (not isinstance(definition, dict) or set(definition) != {"kind", "model", "instructions", "tools"}
or definition["kind"] != "prompt" or not isinstance(definition["model"], str) or not definition["model"].strip()
or not isinstance(definition["instructions"], str) or definition["tools"] != []):
raise fail("input-schema-invalid", "Initial creation permits only an explicit Prompt model/instructions with no tools.")
prerequisites = plan.get("prerequisites")
if (not isinstance(prerequisites, dict) or set(prerequisites) != {"project", "model", "identity", "network"}
or any(not isinstance(v, str) or not v.strip() for v in prerequisites.values())):
raise fail("initial-prerequisites-unverified", "Retain the existing local-creation procedure's project/model/identity/network evidence.")
dependencies.limits(plan.get("inventory_limits"))
if not isinstance(plan.get("absence_inventory_digest"), str) or not dependencies.SHA.fullmatch(plan["absence_inventory_digest"]):
raise fail("input-schema-invalid", "The complete scoped absence inventory must be fingerprinted.")
def absence(plan, sdk_loader):
Client, _, _, _, extras = sdk_loader()
Credential, AzureError = extras
client = Client(endpoint=plan["project_endpoint"], credential=Credential())
try:
names = []
for item in dependencies._paged(client.agents.list(), dependencies.limits(plan["inventory_limits"])):
name = getattr(item, "name", None)
if not isinstance(name, str) or not name.strip() or name in names:
raise fail("initial-inventory-incomplete", "Agent absence needs a complete, unambiguous project inventory.")
names.append(name)
if plan["agent"]["name"] in names:
raise fail("initial-agent-exists", "Retain the existing agent; return to Connect rather than creating a version.")
try:
client.agents.get(agent_name=plan["agent"]["name"])
except AzureError as exc:
if sdk_error_status(exc) == 404:
return digest(sorted(names))
raise
raise fail("initial-agent-exists", "Exact agent GET found an existing identity.")
except AzureError as exc:
raise HelperFailure(message="Complete initial-agent absence discovery failed.", blocked_at="initial-prompt-creation",
**sdk_error_metadata(exc, "initial-inventory-failed")) from exc
except (AttributeError, TypeError, ValueError) as exc:
raise fail("initial-api-unavailable", "SDK complete agent listing and exact agent GET are required.") from exc
finally:
client.close()
def plan(request, sdk_loader):
if not isinstance(request, dict):
raise fail("input-schema-invalid", "Initial creation request must be a closed object.")
require_allowed_fields(request, {"schema_version", "project_resource_id", "project_endpoint", "agent",
"owner", "inventory_limits", "prerequisites"}, label="Initial Prompt request")
if request.get("schema_version") != "1.0":
raise fail("input-schema-invalid", "Initial request requires schema_version 1.0.")
proposed = {k: v for k, v in request.items() if k != "schema_version"}
proposed.update(operation="create-initial-prompt-agent", sdk_major=2, cleanup_approved=False,
inventory_limits=dependencies.limits(request.get("inventory_limits")),
absence_inventory_digest="sha256:" + "0" * 64)
validate(proposed)
proposed["absence_inventory_digest"] = absence(proposed, sdk_loader)
fingerprint = digest(proposed)
return {"status": "planned", "outcome": "create-initial-prompt-agent", "plan_fingerprint": fingerprint,
"execution_required": True, "mutation_approval_required": True,
"execution_input": {"schema_version": "1.0", "plan": proposed,
"approval": {"confirmed": False, "fingerprint": fingerprint}},
"approval_summary": {"create": [proposed["agent"]["name"]], "retain": ["existing agents", "projects", "models", "grants"],
"model_readiness": "Provided prerequisite evidence must be independently verified before approval.",
"invocation": "not performed", "cleanup": "separate owned-version approval; container retained"}}
def verify_created(plan, target, birth, sdk_loader):
Client, _, _, _, extras = sdk_loader()
Credential, AzureError = extras
client = Client(endpoint=plan["project_endpoint"], credential=Credential())
try:
agent = client.agents.get(agent_name=target["name"])
if agent.name != target["name"]:
raise fail("initial-readback-invalid", "Initial agent identity readback changed.")
versions = [
str(item.version) for item in dependencies._paged(
client.agents.list_versions(agent_name=target["name"], include_drafts=True),
dependencies.limits(plan["inventory_limits"]))
]
if versions != [target["version"]]:
raise fail("initial-version-inventory-changed", "Initial creation must retain exactly its acknowledged version, with no duplicates or unexpected versions.")
current = client.agents.get_version(agent_name=target["name"], agent_version=target["version"])
if (current.name != target["name"] or str(current.version) != target["version"]
or current.definition.as_dict() != plan["agent"]["definition"]
or receipts.version_identity(current) != birth):
raise fail("definition-drift", "Exact initial version differs from its native birth snapshot.")
except AzureError as exc:
raise HelperFailure(message="Initial agent/version verification failed.", blocked_at="initial-prompt-creation",
**sdk_error_metadata(exc, "initial-readback-failed")) from exc
except (AttributeError, TypeError, ValueError) as exc:
raise fail("initial-api-unavailable", "Complete draft-inclusive agent/version readback is required.") from exc
finally:
client.close()
def execute(document, *, capture, token_provider, transport, sdk_loader):
plan = document["plan"]
validate(plan)
if capture is None or capture.plan_digest != document["_computed_fingerprint"] or capture.owner != plan["owner"]:
raise fail("cleanup-receipt-required", "Initial creation requires its original approved input and protected receipt directory.")
if absence(plan, sdk_loader) != plan["absence_inventory_digest"]:
raise fail("initial-inventory-drift", "Project inventory changed; replan rather than weakening absence protection.")
token = token_provider("https://ai.azure.com/")
url = plan["project_endpoint"].rstrip("/") + "/agents?api-version=v1"
target = receipts.project_target(plan, "prompt-agent-version", name=plan["agent"]["name"], version="unverified")
try:
result = transport("POST", url, token, body=canonical_bytes(plan["agent"]), headers={"Content-Type": "application/json"})
except HelperFailure as failure:
if failure.http_status in (None, 408, 429) or (failure.http_status or 0) >= 500:
failure.partial = True
failure.warnings.append("Initial creation outcome unproven; no replay, ownership adoption or automatic cleanup.")
raise
write = {"action": "created", "type": "prompt-agent-version", "name": plan["agent"]["name"]}
if result.status != 200:
raise HelperFailure("initial-create-failed", "Create-agent returned an unexpected status; no replay or ownership adoption.",
blocked_at="initial-prompt-creation", status=result.status,
request_id=result.request_id, partial=(200 <= result.status < 300 or result.status in (408, 429) or result.status >= 500))
try:
if not isinstance(result.body, dict):
raise fail("initial-create-response-invalid", "Foundry v1 create-agent did not return the documented HTTP 200 AgentObject.")
versions = result.body.get("versions")
latest = versions.get("latest") if isinstance(versions, dict) else None
latest = latest if isinstance(latest, dict) else {}
target["version"] = latest.get("version", "unverified")
capture.start(target, {"operation": "agents.create", "status": result.status, "request_id": result.request_id,
"definition_digest": digest(latest.get("definition")), "version": target["version"],
"etag_evidence": None, "generated": None, "version_identity": receipts.version_identity(latest)})
if (result.body.get("name") != plan["agent"]["name"] or latest.get("name") != plan["agent"]["name"]
or not isinstance(target["version"], str) or not re.fullmatch(r"[1-9][0-9]*", target["version"])
or latest.get("definition") != plan["agent"]["definition"] or receipts.version_identity(latest) is None):
raise fail("initial-create-response-invalid", "Native created agent/version differs from approved initial intent.")
write["version"] = target["version"]
readback = transport("GET", plan["project_endpoint"].rstrip("/") + "/agents/" + quote(target["name"], safe="")
+ "/versions/" + quote(target["version"], safe="") + "?api-version=v1", token)
if (readback.status != 200 or not isinstance(readback.body, dict)
or readback.body.get("name") != target["name"] or readback.body.get("version") != target["version"]
or readback.body.get("definition") != latest["definition"]):
raise fail("definition-drift", "Initial version readback differs from the original successful create-agent response.")
verify_created(plan, target, receipts.version_identity(latest), sdk_loader)
capture.finish(target, {"definition_digest": digest(latest["definition"]), "etag": None, "generated": [],
"version_identity": receipts.version_identity(readback.body)})
except HelperFailure as failure:
failure.partial = True
failure.writes.insert(0, write)
raise
return {"status": "completed", "outcome": "create-initial-prompt-agent",
"approved_plan": document["approval"], "resources": {"created": [target], "reused": []},
"ownership": {"owner": plan["owner"], "run_owned": [target], "reused_not_owned": []},
"agent_invocation": "not-run", "cleanup": "separate version-only approval; never delete the container"}
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.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download foundry-iq.zip