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/knowledge_base_retrieve.py
from __future__ import annotations
import argparse
import json
import shutil
import subprocess
import sys
from pathlib import Path
from typing import Any
from urllib.parse import quote
try:
from ._common import (
SEARCH_AUDIENCE, HelperFailure, HttpResult, TokenProvider, Transport,
azure_cli_token, blocked_result, emit_result, http_request,
reject_secrets, require_allowed_fields, validate_search_endpoint,
)
except ImportError:
from _common import ( # type: ignore[no-redef]
SEARCH_AUDIENCE, HelperFailure, HttpResult, TokenProvider, Transport,
azure_cli_token, blocked_result, emit_result, http_request,
reject_secrets, require_allowed_fields, validate_search_endpoint,
)
API_VERSIONS = {"2026-04-01", "2026-08-01-preview"}
def _invalid(message: str) -> HelperFailure:
return HelperFailure("input-schema-invalid", message, blocked_at="input-resolution")
def _target(endpoint: Any, name: Any, api_version: Any) -> str:
if not isinstance(api_version, str) or api_version not in API_VERSIONS:
raise _invalid("Unsupported API version.")
if not isinstance(name, str) or not name.strip() or any(ord(c) < 32 for c in name):
raise _invalid("An exact nonempty resource name is required.")
try:
return validate_search_endpoint(endpoint)
except ValueError as exc:
raise _invalid("Invalid Search endpoint.") from exc
def retrieval_request(
endpoint: str, name: str, api_version: str, effort: str, query: str,
) -> tuple[str, str, dict[str, Any]]:
base = _target(endpoint, name, api_version) + "/knowledgebases"
if not isinstance(effort, str) or effort not in {"minimal", "low", "medium"}:
raise _invalid("Unsupported reasoning effort.")
if api_version == "2026-04-01" and effort != "minimal":
raise _invalid("GA requires minimal retrieval.")
if not isinstance(query, str) or not query.strip():
raise _invalid("A nonempty query is required.")
definition_url = base + "('" + quote(name.replace("'", "''"), safe="") + "')"
retrieve_url = base + "/" + quote(name, safe="") + "/retrieve"
suffix = "?api-version=" + api_version
body = (
{"intents": [{"type": "semantic", "search": query}]}
if effort == "minimal" else
{"messages": [{"role": "user", "content": [{"type": "text", "text": query}]}]}
)
return definition_url + suffix, retrieve_url + suffix, body
def read_json(
method: str, url: str, body: dict[str, Any] | None = None,
forward_permissions: bool = False, *,
token_provider: TokenProvider = azure_cli_token,
transport: Transport = http_request,
) -> HttpResult:
token = token_provider(SEARCH_AUDIENCE)
headers = {"Content-Type": "application/json"}
if forward_permissions:
headers["x-ms-query-source-authorization"] = token
result = transport(
method, url, token,
body=json.dumps(body).encode("utf-8") if body is not None else None,
headers=headers, follow_redirects=False, max_response_bytes=5 * 1024 * 1024,
)
if result.status != 200 or not isinstance(result.body, dict):
raise HelperFailure(
"retrieval-incomplete", "Expected complete JSON response.",
blocked_at="verification", status=result.status, request_id=result.request_id,
)
return result
def _verify_signed_in_user() -> None:
executable = shutil.which("az")
if executable is None:
raise HelperFailure(
"azure-cli-unavailable", "Azure CLI is required for keyless authentication.",
blocked_at="execution",
)
try:
result = subprocess.run(
[executable, "account", "show", "--query", "user.type", "--output", "tsv"],
check=True, capture_output=True, text=True, timeout=60,
)
except (OSError, subprocess.CalledProcessError, subprocess.TimeoutExpired) as exc:
raise HelperFailure(
"permission-forwarding-unavailable", "Could not verify the signed-in user.",
blocked_at="input-resolution",
) from exc
if result.stdout.strip().casefold() != "user":
raise HelperFailure(
"permission-forwarding-unavailable", "Permission forwarding requires a signed-in user.",
blocked_at="input-resolution",
)
def execute(
document: Any, *, token_provider: TokenProvider = azure_cli_token,
transport: Transport = http_request,
) -> dict[str, Any]:
if not isinstance(document, dict):
raise _invalid("Input must be a JSON object.")
reject_secrets(document)
operation = document.get("operation")
if not isinstance(operation, str) or operation not in {
"get-knowledge-base", "get-knowledge-source", "retrieve",
}:
raise _invalid("Choose get-knowledge-base, get-knowledge-source, or retrieve.")
fields = {"operation", "endpoint", "name", "api_version"}
if operation == "retrieve":
fields |= {"effort", "query", "forward_permissions"}
require_allowed_fields(document, fields, label="read-only request")
endpoint = _target(document.get("endpoint"), document.get("name"), document.get("api_version"))
name, api_version = document["name"], document["api_version"]
body = None
forwarding = False
if operation == "retrieve":
forwarding = document.get("forward_permissions")
if type(forwarding) is not bool:
raise _invalid("Explicit forward_permissions true or false is required.")
_, url, body = retrieval_request(
endpoint, name, api_version, document.get("effort"), document.get("query"),
)
if forwarding:
_verify_signed_in_user()
method = "POST"
else:
collection = "knowledgebases" if operation == "get-knowledge-base" else "knowledgesources"
url = endpoint + "/" + collection + "('" + quote(name.replace("'", "''"), safe="") + "')"
url += "?api-version=" + api_version
method = "GET"
result = read_json(
method, url, body, forwarding, token_provider=token_provider, transport=transport,
)
return {
"status": "response-received", "operation": operation, "mutation": "none",
"writes_performed": [], "http_status": result.status, "request_id": result.request_id,
"response_body": result.body, "verification": "not-performed", "cleanup": "not-applicable",
}
def main(argv: list[str] | None = None) -> int:
parser = argparse.ArgumentParser(description="Read Search KB/source definitions or retrieve from one KB.")
parser.add_argument("--input", required=True, type=Path)
args = parser.parse_args(argv)
try:
try:
document = json.loads(args.input.read_text(encoding="utf-8"))
except OSError as exc:
raise HelperFailure("input-unreadable", "Input file cannot be read.", blocked_at="input-resolution") from exc
except (UnicodeError, json.JSONDecodeError) as exc:
raise HelperFailure("input-invalid-json", "Input must be UTF-8 JSON.", blocked_at="input-resolution") from exc
result = execute(document)
except HelperFailure as failure:
# POST retrieve is read-only even when the generic transport marks it ambiguous.
readonly_failure = HelperFailure(
failure.code, failure.message, blocked_at=failure.blocked_at,
status=failure.http_status, request_id=failure.request_id,
)
result = blocked_result(readonly_failure, outcome="knowledge-base-retrieval", fingerprint=None)
result.update(
mutation="none", cleanup="not-applicable",
safe_next_decision="Resolve the first blocker before repeating this read-only request.",
)
emit_result(result)
return 2
emit_result(result)
return 0
if __name__ == "__main__":
sys.exit(main())
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