Microsoft Foundry
MicrosoftOfficialCreated by Microsoft
- Skill
- Workflow
- Data and AI
- MIT
- Low risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
Microsoft Foundry provides a comprehensive framework for the entire AI agent lifecycle. This skill enables developers to scaffold, provision, deploy, and manage agents while integrating evaluation and optimization workflows. It supports various agent types, including prompt-based, managed harness, and voice agents, and provides tools for CI/CD, continuous monitoring, and fine-tuning models. The skill emphasizes a structured approach using workspace-specific metadata and standard Azure Developer CLI (azd) patterns to ensure consistent environment management and deployment.
What it does
- Scaffold and create new AI agents with support for various harness types.
- Manage the full deployment lifecycle including provisioning and CI/CD integration.
- Execute batch and continuous evaluation workflows to monitor agent quality.
- Optimize agent prompts and instructions using automated evaluation-driven loops.
- Fine-tune models using SFT, DPO, or RFT techniques with dataset curation.
- Troubleshoot agent performance through log analysis, telemetry, and trace inspection.
When to use it
- When building, deploying, or managing AI agents within the Microsoft Foundry ecosystem.
- When you need to evaluate agent performance or optimize prompts based on production traces.
- When setting up CI/CD pipelines for automated agent deployment and monitoring.
- When fine-tuning models or managing capacity and quotas for AI services.
- When troubleshooting deployment failures or agent runtime issues.
Advantages
- Provides a unified, end-to-end workflow for the entire agent development lifecycle.
- Standardizes project structure and metadata management across different environments.
- Integrates seamlessly with Azure Developer CLI (azd) for consistent infrastructure management.
- Enables data-driven improvements through automated evaluation and prompt optimization.
- Supports advanced model customization including fine-tuning and distillation.
Usage examples
- “Create a new hosted Foundry agent from scratch.”
- The agent will guide you through the quick-start workflow to scaffold, provision, and deploy a new agent project.
- “Optimize the prompt for my existing Python hosted agent.”
- The agent will trigger the evaluation-driven optimization workflow to analyze performance and suggest prompt improvements.
- “Set up a CI/CD pipeline for my agent.”
- The agent will configure the necessary deployment pipeline steps for your Foundry agent project.
- “Troubleshoot why my agent deployment is failing.”
- The agent will help you inspect logs, telemetry, and quota settings to diagnose and resolve the deployment issue.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/microsoft/microsoft-foundry/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip microsoft-foundry.zip -d .agents/skills
Documentation by Microsoft
Microsoft Foundry Skill
This skill helps developers work with Microsoft Foundry resources, covering model discovery and deployment, complete dev lifecycle of AI agent, evaluation workflows, and troubleshooting.
Pre-Execution Requirements
Follow each applicable subsection below before starting its corresponding action or workflow.
Dependency Check and Setup
MANDATORY: As the first step after this skill loads, run the dependency check and setup script below from this skill's root and wait for it to finish before continuing. The script checks first and installs only missing dependencies; it does not reinstall dependencies that are already available.
You MUST complete this check before reading or entering any sub-skill, workflow, or workflow-specific reference.
./scripts/check-and-setup-dependencies.sh # macOS / Linux
./scripts/check-and-setup-dependencies.ps1 # Windows (pwsh)Strictly follow the script output for subsequent actions.
Workflow Guidance
MANDATORY: Before executing ANY workflow-specific steps, you MUST read the corresponding sub-skill document. Do not call workflow-specific MCP tools for a workflow without reading its skill document. This applies even if you already know the MCP tool parameters — the skill document contains required workflow steps, pre-checks, and validation logic that must be followed. This rule applies on every new user message that triggers a different workflow, even if the skill is already loaded.
Foundry MCP
MANDATORY: Before using Foundry MCP operations, call the Azure MCP foundry tool and inspect the available Foundry MCP tools and related parameters. Treat this as the discovery/help step for MCP-based workflows.
azd
MANDATORY: Before executing ANY azd command, you MUST read azd-guidance and strictly follow the shared rules defined in it, especially the AZURE_DEV_USER_AGENT setting rules.
Sub-Skills
This skill includes specialized sub-skills for specific workflows. When a sub-skill matches the task, strictly follow its workflow:
| Sub-Skill | When to Use | Reference |
|---|---|---|
| deploy | Deploy hosted agents to Foundry, smoke-test a deployment, create or update prompt agents, and manage agent versions and multi-environment deploys. | deploy |
| cicd | Set up a CI/CD deployment pipeline for a Foundry agent. | cicd |
| invoke | Send messages to an agent, single or multi-turn conversations | invoke |
| routine | Schedule or event-trigger Foundry agents with routines; use azd for CRUD, enable/disable, manual dispatch, and viewing past runs, or define routines in azure.yaml. | routine |
| invocations-ws | Build, deploy, and connect to custom Hosted agents that use developer-defined duplex real-time or media streams over invocations_ws. | invocations-ws |
| observe | Evaluate agent quality, run batch evals, analyze failures, optimize prompts, improve agent instructions, compare versions, set up CI/CD monitoring, and enable continuous production evaluation | observe |
| insights | Pull generated agent insights, evidence, and recommendations from an existing monitor; read-only retrieval, not a new analysis run | insights |
| trace | Query traces, analyze latency/failures, correlate eval results to specific responses via App Insights customEvents | trace |
| troubleshoot | View hosted agent logs, query telemetry, diagnose failures | troubleshoot |
| validate | Use only when the user explicitly asks to use this validation sub-skill or to validate Microsoft Foundry hosted-agent code against best practices. Never invoke it proactively or add it to another workflow. | validate |
| create (quick start) | Create a new hosted Foundry agent from scratch end-to-end — scaffold, provision or use an existing Foundry project, deploy, and smoke-test. Do not use for any work on existing code. For anything not covered by the quickstart, use create. | create/quick-start-hosted.md |
| create | Use when the standard end-to-end happy path (quick start) doesn't fit. Create a new Foundry agent, update code of an existing agent, continue development of an existing agent, wire connections at scaffold time, use advanced setup or A2A (Agent2Agent), or recover from a failed quickstart run. | create |
| create managed harness | Create or continue developing a Prompt Agent that explicitly uses the Foundry-managed Copilot harness. Uses azd and azure.yaml, not the ordinary Prompt Agent MCP workflow. | create-managed-harness |
| create voice | Create, configure, or extend a Foundry Voice Agent, defaulting generic requests to managed Prompt Voice and supporting self-deployed Prompt Voice or two-agent Hosted Voice. | create-voice |
| agent-optimizer | Make existing Python hosted-agent code optimization-ready, configure eval.yaml, run Agent Optimizer jobs, apply candidates locally, and deploy through azd after review. | agent-optimizer |
| eval-datasets | Harvest production traces into evaluation datasets, manage dataset versions and splits, track evaluation metrics over time, detect regressions, and maintain full lineage from trace to deployment. Use for: create dataset from traces, dataset versioning, evaluation trending, regression detection, dataset comparison, eval lineage. | eval-datasets |
| project/create | Creating a new Microsoft Foundry project for hosting agents and models. Use when onboarding to Foundry or setting up new infrastructure. | project/create/create-foundry-project.md |
| resource/create | Creating Azure AI Services multi-service resource (Foundry resource) using Azure CLI. Use when manually provisioning AI Services resources with granular control. | resource/create/create-foundry-resource.md |
| private-network | Answer questions about Foundry network isolation and deploy Foundry with VNet isolation (BYO VNet, Managed VNet, hybrid). Covers architecture concepts, template selection, deployment, and post-deployment validation. | resource/private-network/private-network.md |
| models/deploy-model | Unified model deployment with intelligent routing. Handles quick preset deployments, fully customized deployments (version/SKU/capacity/RAI), and capacity discovery across regions. Routes to sub-skills: preset (quick deploy), customize (full control), capacity (find availability). | models/deploy-model/SKILL.md |
| quota | Managing quotas and capacity for Microsoft Foundry resources. Use when checking quota usage, troubleshooting deployment failures due to insufficient quota, requesting quota increases, or planning capacity. | quota/quota.md |
| rbac | Managing RBAC permissions, role assignments, managed identities, and service principals for Microsoft Foundry resources. Use for access control, auditing permissions, and CI/CD setup. | rbac/rbac.md |
| finetuning | Fine-tune models on Microsoft Foundry — SFT distillation, DPO preference optimization, RFT with graders and tool calling. Dataset preparation, grader calibration, training, checkpoint selection, deployment, evaluation. Use for: fine-tune, SFT, DPO, RFT, training data, grader, distillation, fine-tuned model, large file upload. | finetuning/SKILL.md |
| azd-guidance | Provide shared azd knowledge and guidance for managing Foundry agents. Read this first for any workflows related to azd. | azd-guidance |
💡 Tip: For a complete onboarding flow:
project/create(public) orprivate-network(VNet isolation) →models/deploy-model→ agent workflows (create→deploy→invoke).
💡 Fine-Tuning: Use
finetuningfor all model customization — SFT distillation, DPO preference optimization, and RFT with graders. Includes quickstart, grader calibration, and training curve analysis.
💡 Model Deployment: Use
models/deploy-modelfor all deployment scenarios — it intelligently routes between quick preset deployment, customized deployment with full control, and capacity discovery across regions.
💡 Prompt Optimization: For requests like "optimize my prompt" or "improve my agent instructions," load observe and use the
prompt_optimizeMCP tool through that eval-driven workflow.
Infrastructure Lifecycle
Match user intent to the correct infrastructure workflow.
| User Intent | Workflow |
|---|---|
| "Create Foundry" / "Set up Foundry" (ambiguous) | Use AskUserQuestion: (a) just an AI Services resource, (b) a project with public access, or (c) a project with network isolation? Route: (a) → resource/create, (b) → project/create, (c) → private-network |
| Set up Foundry with VNet isolation | private-network |
| Create a Foundry project (public) | project/create |
| Create a bare Foundry resource | resource/create |
Agent Development Lifecycle
Match user intent to the correct agent workflow. Read each sub-skill in order before executing.
| User Intent | Workflow (read in order) |
|---|---|
| Create or develop a Voice Agent (Prompt Voice or Hosted Voice) | dependency check and setup → azd-guidance → create-voice → deploy → invoke |
| Create or develop an explicitly requested Managed Harness Agent / Copilot harness agent | dependency check and setup → azd-guidance → create-managed-harness → deploy → invoke |
| Create a new hosted agent end-to-end (scaffold + deploy + test) | dependency check and setup → azd-guidance → quick-start-hosted (self-contained end-to-end) |
| Anything beyond the standard quickstart (existing code, migration, re-hosting, deployment customization, scaffold-time connections, A2A (Agent2Agent), recovery) | dependency check and setup → azd-guidance → create → deploy → invoke |
| Optimize existing Python hosted agent | dependency check and setup → azd-guidance → agent-optimizer → scaffold/review → eval.yaml → optimize → apply candidate → deploy → invoke |
| Deploy an agent (code already exists) | dependency check and setup → azd-guidance → deploy (includes eval-suite setup) → invoke → observe (evaluate/optimize) |
| Update/redeploy an agent after code changes | dependency check and setup → azd-guidance → deploy (includes eval-suite setup) → invoke → observe (evaluate/optimize) |
| Set up a CI/CD deployment pipeline for a hosted agent | dependency check and setup → azd-guidance → cicd |
| Invoke/test/chat with an agent | dependency check and setup → azd-guidance → invoke |
| Schedule/event-trigger an agent, or CRUD/enable/disable/dispatch a routine | dependency check and setup → azd-guidance → routine |
| Optimize / improve agent prompt or instructions | observe (Step 4: Optimize) |
| Evaluate and optimize agent (full loop) | observe |
| Enable continuous evaluation monitoring | observe (Step 6: CI/CD & Monitoring) |
| Pull agent insights / list generated issues and recommendations | dependency check and setup → insights (all pages with expanded evidence; read-only) |
| Troubleshoot an agent issue | dependency check and setup → azd-guidance → invoke → troubleshoot |
| Fix a broken agent (troubleshoot + redeploy) | dependency check and setup → azd-guidance → invoke → troubleshoot → apply fixes → deploy → invoke |
Agent: .foundry Workspace Standard
Every agent source folder can keep Foundry-specific cache and overlay state under .foundry/:
<agent-root>/
.foundry/
agent-metadata.yaml
agent-metadata.prod.yaml
suites/
datasets/
evaluators/
results/In azd projects, derive deployment context (project endpoint, agent name/version, ACR, App Insights) from
azure.yamlplusazd env get-values; do not duplicate those values in metadata when azd already provides them.agent-metadata.yamlis the preferred local/dev overlay for non-azd values, remote Foundry suite references, local cache paths, result summaries, and explicit overrides. Optional sidecar files such asagent-metadata.prod.yamlcan hold a single prod or CI-targeted overlay without mixing multiple environments in one file.suites/,datasets/, andevaluators/are local cache folders. Reuse them when they are current, and ask before refreshing or overwriting them.See Agent Metadata Contract for the canonical schema and workflow rules.
Agent: Setup References
Standard Agent Setup — advanced setup for production workloads that need data-residency control (bring-your-own Cosmos DB / Storage / AI Search via a Foundry capability host). The default
azd ai agentflow uses Basic Agent Setup and does not provisioncapabilityHosts/agents— do not flag its absence as a bug. For default post-provision state, see the "Expected env-var fingerprint" section in foundry-agent/create/create-hosted.md.
Agent: Common Project Context Resolution
Agent skills should run this step only when they need configuration values they don't already have. If a value (for example, agent root, environment, project endpoint, or agent name) is already known from the user's message or a previous skill in the same session, skip resolution for that value.
Step 1: Discover Agent Roots and azd Context
First check whether the workspace has azure.yaml with services using host: azure.ai.agent.
One azd agent service -> classify it from
kind,harness,modelType, andconversationEngine, then use that service'sprojectfolder or theazure.yamldirectory as the agent root.Multiple azd agent services -> check whether a Voice wrapper references a
kind: hostedservice viaconversationEngine.name:Selecting the Hosted Voice wrapper implies its named
kind: hostedtarget as an upstream dependency (uses: [<target>],conversationEngine.name: <target>); deploy and verification must report both services separately.Selecting the
kind: hostedtarget alone scopes changes/debugging to the target container and does not automatically modify the wrapper.Otherwise -> require the user to choose the target service/folder.
No azd agent service -> search the workspace for
.foundry/folders that containagent-metadata.yamloragent-metadata.<env>.yaml.One match -> use that agent root.
Multiple matches -> require the user to choose the target agent folder.
No matches -> for insights, ask only for missing remote inputs without initializing local files; for create/deploy workflows, seed a new
.foundry/folder during setup; for other workflows, stop and ask the user which agent source folder to initialize.
After selecting an agent root, keep all local .foundry cache inspection, source inspection, evaluator suggestions, dataset suggestions, and prompt-optimization context inside that folder only. Do not scan sibling agent folders unless the user explicitly switches roots.
Step 2: Resolve Environment and Deployment Context
If azure.yaml is present, resolve the azd environment first:
Environment explicitly named by the user
AZURE_ENV_NAMEfromazd env get-valuesazd default environment from
.azure/config.jsonEnvironment already selected earlier in the session
Run azd env get-values for the selected environment when project/deployment values are not already known. Prefer azd values for deployment context:
| azd Variable | Resolves To |
|---|---|
AZURE_AI_PROJECT_ENDPOINT or AZURE_AIPROJECT_ENDPOINT | Project endpoint |
AGENT_<SERVICE>_NAME | Agent name for the selected azd service |
AGENT_<SERVICE>_VERSION | Agent version for the selected azd service |
AZURE_CONTAINER_REGISTRY_NAME or AZURE_CONTAINER_REGISTRY_ENDPOINT | ACR registry name / image URL prefix |
APPLICATIONINSIGHTS_CONNECTION_STRING | App Insights connection string for trace workflows |
AZURE_SUBSCRIPTION_ID, AZURE_RESOURCE_GROUP, AZURE_AI_ACCOUNT_NAME, AZURE_AI_PROJECT_NAME | Azure resource lookup and Playground links |
When azd supplies these values, use them as the source of truth and do not copy them into .foundry/agent-metadata*.yaml on metadata writes.
Step 3: Select Metadata Overlay and Resolve Environment
Inside the selected agent root, choose the metadata file in this order:
Metadata filename or path explicitly provided by the user or workflow
If an explicit environment is already known and
.foundry/agent-metadata.<env>.yamlexists, use that file.foundry/agent-metadata.yamlIf multiple metadata files remain and no rule above selects one, prompt the user to choose
Read the selected metadata file and resolve any remaining environment choice in this order:
Environment explicitly named by the user
If the selected metadata file defines exactly one environment, use it
Environment already selected earlier in the session
defaultEnvironmentfrom metadata
If the selected metadata file still contains multiple environments and none of the rules above selects one, prompt the user to choose. Keep the selected agent root, metadata file, environment, and whether context came from azd or metadata visible in every workflow summary.
If the selected environment exposes older testSuites[] metadata but not evaluationSuites[], treat testSuites[] as the source for this session and normalize each entry in memory to the evaluationSuites[] shape before continuing. If the metadata is older still and only exposes legacy testCases[], normalize that list the same way. Preserve dataset and evaluator fields, keep any existing tags, and map legacy priority to tags.tier only when tags.tier is missing: P0 -> smoke, P1 -> regression, P2 -> coverage.
Step 4: Resolve eval.yaml Local Evaluation Intent
If eval.yaml exists in the selected agent root, parse it before generating new suites:
agent.name-> target agent candidate; verify it matches the selected azd/metadata agent before using it.dataset.local_uri-> local seed dataset candidate; legacydataset_filemay be normalized in memory.dataset.name/dataset.version-> registered dataset candidate.validation_dataset-> optional validation dataset candidate.evaluators[]-> candidate Foundry evaluator names; verify withevaluator_catalog_getbefore treating them as remote evaluators.name-> local eval/suite candidate; verify remotely before persisting assuiteName.options.eval_model,options.optimization_model,options.max_candidates,options.optimization_config.model_search_space,options.pass_threshold,max_samples,trace_days, andgeneration_instruction-> setup defaults.
Treat eval.yaml as local evaluation intent, not proof that a Foundry suite exists. Persist synced suite/dataset/evaluator references to .foundry only after remote lookup or registration succeeds.
Step 5: Resolve Common Configuration
Layer sources in this order:
Explicit user input and values already selected in the session
azd environment values for deployment context
.foundry/agent-metadata*.yamloverlay values and remote suite/cache referencesazure.yamlandeval.yamllocal source configurationUser prompts for anything still missing
If azd and metadata both provide the same value and they differ, stop and ask which source is authoritative. If they match, use the azd value and avoid rewriting the duplicate on future metadata writes.
| Effective Value | Preferred Source | Used By |
|---|---|---|
| Project endpoint | azd env | deploy, invoke, observe, trace, troubleshoot |
| Agent name/version | azd agent variables, then azure.yaml | invoke, observe, trace, troubleshoot |
| ACR | azd env | deploy |
| Evaluation suites and cache paths | .foundry/agent-metadata*.yaml | observe, eval-datasets |
| Local seed dataset/evaluator intent | eval.yaml | observe, eval-datasets |
Step 6: Write Metadata Overlay (Create/Deploy/Observe Only)
On any metadata write (deploy, auto-setup, dataset refresh, or trace-to-dataset update), persist only non-derivable overlay/cache state in the selected metadata file:
azd binding (
azd.environmentName,azd.service) when useful for future resolutionevaluationSuites[]with remote suite/dataset/evaluator references and local cache pathslastEval, result files, comparison summaries, or explicit non-azd overrides
Do not copy azd-owned deployment values into metadata when azd already provides them. If the selected file is a preferred single-environment file, rewrite only that one environment block. If the selected file is a legacy multi-environment file, rewrite only the selected environment block. Never copy or merge environments across sibling metadata files automatically. If the selected environment still uses older testSuites[] or legacy testCases[], rewrite it to evaluationSuites[] and remove migrated priority fields from the rewritten entries.
Step 7: Collect Missing Values
Use the ask_user or askQuestions tool only for values not resolved from the user's message, session context, metadata, or azd bootstrap. Common values skills may need:
Agent root — Target azd service project folder or folder containing
.foundry/agent-metadata*.yamlMetadata file —
agent-metadata.yamlfor local/dev, or an explicit sidecar such asagent-metadata.prod.yamlEnvironment — azd environment,
dev,prod, or another environment key from metadataProject endpoint — Microsoft Foundry project endpoint URL
Agent name — Name of the target agent
💡 Tip: If the user already provides the agent path, environment, project endpoint, or agent name, extract it directly — do not ask again.
Agent: Agent Types
Agent workflows distinguish four first-class agent types:
| Type | Kind | Description |
|---|---|---|
| Prompt | "prompt" | LLM-based agents backed by a model deployment; managed via Foundry MCP or SDK |
| Hosted | "hosted" | Container-based agents running custom code; developed and deployed via azd |
| Managed Harness Agent | "prompt" with harness.type: "microsoft_copilot_preview" for new authoring | Prompt Agent running on the Foundry-managed Copilot harness; developed and deployed via azd |
| Voice | "voice" | Managed real-time Voice Agent — either Prompt Voice (1 agent, modelType: managed or self_deployed) or Hosted Voice (2 agents: kind: voice wrapper with conversationEngine.type: hosted_agent + kind: hosted target over invocations_ws 1.0.0 and Voice Live Bridge 1.0); developed and deployed via azd and verified over the voice WebSocket endpoint |
Classify an azure.yaml service by its definition in this exact order, not by host alone:
kind: voice-> Voice. For compatibility, silently classify an existingkind: prompt-voiceservice as Voice, then normalize it when editing its YAML. Classify the subtype:conversationEngine.type: hosted_agent-> Hosted Voice wrapper (paired with a namedkind: hostedtarget service).modelType: managedormodelType: self_deployed-> Prompt Voice (Foundry infers native speech-to-speech vs cascaded STT -> LLM -> TTS frommodel.id).Having both
modelType/modelandconversationEngineis invalid (stop and fixazure.yaml); having neither is incomplete (do not guess). Never use obsoletemodelType: hosted_agent,targetAgent, or a nestedconfig:block.
kind: hosted-> Hosted. When it declaresprotocols: [{ protocol: invocations_ws, version: 1.0.0 }]andmetadata.voiceLiveCompatible: "true"alongside akind: voicewrapper, it is a Hosted Voice target; otherwise treat a standaloneinvocations_wsservice as a custom Hosted real-time/audio agent.kind: promptplusharness.type: microsoft_copilot_previewor legacygithub_copilot_preview-> Managed Harness Agent.kind: promptwithout that harness -> ordinary Prompt Agent.
Use agent_get only when the type cannot be resolved from project context. Preserve the harness discriminator already authored on an existing Managed Harness Agent; do not migrate it during ordinary edits or redeploys. Do not convert an existing Agent between Prompt, Hosted, Managed Harness Agent, and Voice types; create a new Agent instead. Before creating any Voice Agent, determine the model strategy first per create-voice.
Tool Usage Conventions
Use the
ask_useroraskQuestionstool whenever collecting information from the userUse the
taskorrunSubagenttool to delegate long-running or independent sub-tasks (e.g., env var scanning, status polling, Dockerfile generation)Prefer azd for Hosted Agents, Managed Harness Agents, and Voice Agents; prefer Foundry MCP for ordinary Prompt Agents.
Reference official Microsoft documentation URLs instead of embedding CLI command syntax
Azure Authentication
Additional Resources
Network Isolation Errors
Applies to any call against a Foundry project or its parent Foundry account — Foundry MCP tools, azd, az CLI, curl, REST, or SDK.
If an error matches Public access is disabled / PublicNetworkAccessDisabled / 403 Forbidden from a private endpoint / connection timeout / the project endpoint FQDN resolves to a public IP, this typically means the parent Foundry account has publicNetworkAccess=Disabled or Enabled from selected IP addresses, and the current shell is outside its VNet.
Only if the error is ambiguous, confirm against the Foundry account using a management-plane call (works from anywhere with reader access):
az cognitiveservices account show \
--name <account> --resource-group <rg> \
--query "properties.{publicNetworkAccess:publicNetworkAccess, networkAcls:networkAcls, privateEndpointConnections:privateEndpointConnections[].properties.privateLinkServiceConnectionState.status}"publicNetworkAccess: "Disabled" — or "Enabled" together with non-empty networkAcls.ipRules / virtualNetworkRules — confirms isolation. If publicNetworkAccess: "Enabled" and networkAcls is empty, the failure is a caller-side network issue (e.g. Private DNS resolving the FQDN to a public IP from inside a VNet with a private endpoint), not an account-config issue.
If it's indeed a network isolation issue, supported connection options are documented in Choose a secure connection method to Foundry.
ℹ️ Foundry MCP tools cannot reach a VNet-isolated project even from inside the VNet.
Files
- .gitignore0 B
- ATTRIBUTION.mdAdded by AutoGineer983 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md30.4 KiB
- foundry-agent/agent-optimizer/agent-optimizer.md3.3 KiB
- foundry-agent/agent-optimizer/references/azd-setup.md1.2 KiB
- foundry-agent/agent-optimizer/references/eval-yaml.md3.2 KiB
- foundry-agent/agent-optimizer/references/optimize-workflow.md2.1 KiB
- foundry-agent/agent-optimizer/references/python-patterns.md4.0 KiB
- foundry-agent/agent-optimizer/references/scaffold.md3.3 KiB
- foundry-agent/azd-guidance/azd-guidance.md1.2 KiB
- foundry-agent/azd-guidance/references/azd-ai-cli.md10.3 KiB
- foundry-agent/cicd/cicd.md301 B
- foundry-agent/create/create-hosted.md33.8 KiB
- foundry-agent/create/create-managed-harness.md7.2 KiB
- foundry-agent/create/create-prompt.md4.6 KiB
- foundry-agent/create/create-voice.md13.1 KiB
- foundry-agent/create/quick-start-hosted.md23.6 KiB
- foundry-agent/create/references/enable-incoming-a2a.md3.7 KiB
- foundry-agent/create/references/foundry-model.md1.6 KiB
- foundry-agent/create/references/foundry-tool-catalog.md42.9 KiB
- foundry-agent/create/references/guardrails/guardrail-api-create.md3.8 KiB
- foundry-agent/create/references/guardrails/guardrail-attach.md3.8 KiB
- foundry-agent/create/references/guardrails/guardrail-manage.md2.1 KiB
- foundry-agent/create/references/hosted-voice-yaml.md1.7 KiB
- foundry-agent/create/references/langchain-langgraph-hosting.md2.2 KiB
- foundry-agent/create/references/local-run.md11.5 KiB
- foundry-agent/create/references/managed-harness-agent.md3.5 KiB
- foundry-agent/create/references/re-host.md2.6 KiB
- foundry-agent/create/references/sdk-operations.md2.2 KiB
- foundry-agent/create/references/skills/managed-harness-agent-skill-attach.md1.3 KiB
- foundry-agent/create/references/skills/skill-attach.md7.0 KiB
- foundry-agent/create/references/skills/skill-manage.md5.4 KiB
- foundry-agent/create/references/skills/skill-toolbox-attach.md5.1 KiB
- foundry-agent/create/references/tools/managed-harness-agent/agent-tools.md1.8 KiB
- foundry-agent/create/references/tools/managed-harness-agent/tool-a2a.md1.1 KiB
- foundry-agent/create/references/tools/managed-harness-agent/tool-azure-ai-search.md1.2 KiB
- foundry-agent/create/references/tools/managed-harness-agent/tool-code-interpreter.md391 B
- foundry-agent/create/references/tools/managed-harness-agent/tool-fabric-iq.md1.1 KiB
- foundry-agent/create/references/tools/managed-harness-agent/tool-file-search.md526 B
- foundry-agent/create/references/tools/managed-harness-agent/tool-github-copilot-toolset.md1.2 KiB
- foundry-agent/create/references/tools/managed-harness-agent/tool-mcp.md1.7 KiB
- foundry-agent/create/references/tools/managed-harness-agent/tool-openapi.md1.2 KiB
- foundry-agent/create/references/tools/managed-harness-agent/tool-toolbox.md2.1 KiB
- foundry-agent/create/references/tools/managed-harness-agent/tool-web-search.md387 B
- foundry-agent/create/references/tools/managed-harness-agent/tool-work-iq.md1.3 KiB
- foundry-agent/create/references/tools/prompt-agent/agent-tools.md4.5 KiB
- foundry-agent/create/references/tools/prompt-agent/tool-a2a.md675 B
- foundry-agent/create/references/tools/prompt-agent/tool-azure-ai-search.md3.3 KiB
- foundry-agent/create/references/tools/prompt-agent/tool-bing-grounding.md2.8 KiB
- foundry-agent/create/references/tools/prompt-agent/tool-code-interpreter.md1.0 KiB
- foundry-agent/create/references/tools/prompt-agent/tool-fabric-iq.md1.9 KiB
- foundry-agent/create/references/tools/prompt-agent/tool-file-search.md2.6 KiB
- foundry-agent/create/references/tools/prompt-agent/tool-function-calling.md842 B
- foundry-agent/create/references/tools/prompt-agent/tool-mcp.md3.4 KiB
- foundry-agent/create/references/tools/prompt-agent/tool-memory.md4.8 KiB
- foundry-agent/create/references/tools/prompt-agent/tool-openapi.md1.5 KiB
- foundry-agent/create/references/tools/prompt-agent/tool-web-search.md3.6 KiB
- foundry-agent/create/references/tools/prompt-agent/tool-work-iq.md1.7 KiB
- foundry-agent/create/references/use-toolbox-in-hosted-agent.md10.4 KiB
- foundry-agent/create/references/voice-agent-common.md1.6 KiB
- foundry-agent/create/references/voice-agent-hosted-bridge.md8.1 KiB
- foundry-agent/create/references/voice-agent-prompt-yaml.md3.9 KiB
- foundry-agent/create/references/voice-agent-settings.md5.8 KiB
- foundry-agent/create/references/voice-agent-smoke-test.md7.8 KiB
- foundry-agent/create/scripts/check-copilot-app-entry.ps1Script5.5 KiB
- foundry-agent/create/scripts/check-copilot-app-entry.shScript4.2 KiB
- foundry-agent/create/scripts/resolve-project-id.ps1Script5.8 KiB
- foundry-agent/create/scripts/resolve-project-id.shScript9.0 KiB
- foundry-agent/create/scripts/smoke-test-voice.ps1Script2.6 KiB
- foundry-agent/create/scripts/smoke-test-voice.shScript966 B
- foundry-agent/create/scripts/smoke_test_voice.pyScript14.5 KiB
- foundry-agent/create/scripts/verify-environment.ps1Script8.2 KiB
- foundry-agent/create/scripts/verify-environment.shScript6.5 KiB
- foundry-agent/deploy/deploy.md25.7 KiB
- foundry-agent/deploy/references/container-deploy.md2.1 KiB
- foundry-agent/deploy/references/voice-deploy.md2.2 KiB
- foundry-agent/eval-datasets/eval-datasets.md11.2 KiB
- foundry-agent/eval-datasets/references/dataset-comparison.md4.7 KiB
- foundry-agent/eval-datasets/references/dataset-curation.md4.1 KiB
- foundry-agent/eval-datasets/references/dataset-organization.md4.7 KiB
- foundry-agent/eval-datasets/references/dataset-versioning.md7.3 KiB
- foundry-agent/eval-datasets/references/eval-lineage.md4.0 KiB
- foundry-agent/eval-datasets/references/eval-regression.md6.9 KiB
- foundry-agent/eval-datasets/references/eval-trending.md4.8 KiB
- foundry-agent/eval-datasets/references/generate-seed-dataset.md8.7 KiB
- foundry-agent/eval-datasets/references/trace-to-dataset.md17.0 KiB
- foundry-agent/insights/insights.md4.5 KiB
- foundry-agent/insights/references/tool-contract.md3.4 KiB
- foundry-agent/invocations-ws/invocations-ws.md10.4 KiB
- foundry-agent/invocations-ws/references/invocations-ws-protocol.md7.8 KiB
- foundry-agent/invoke/invoke.md11.8 KiB
- foundry-agent/invoke/references/file-operations.md2.8 KiB
- foundry-agent/invoke/references/invocations-protocol.md3.4 KiB
- foundry-agent/invoke/references/session-management.md3.6 KiB
- foundry-agent/observe/observe.md15.3 KiB
- foundry-agent/observe/references/analyze-results.md6.3 KiB
- foundry-agent/observe/references/cicd-monitoring.md3.6 KiB
- foundry-agent/observe/references/compare-iterate.md3.3 KiB
- foundry-agent/observe/references/continuous-eval.md15.1 KiB
- foundry-agent/observe/references/deploy-and-setup.md5.5 KiB
- foundry-agent/observe/references/evaluate-step.md8.5 KiB
- foundry-agent/observe/references/evaluation-suite-generation.md12.3 KiB
- foundry-agent/observe/references/optimize-deploy.md1.5 KiB
- foundry-agent/routine/references/azure-yaml.md2.6 KiB
- foundry-agent/routine/references/cli-crud.md6.0 KiB
- foundry-agent/routine/routine.md8.0 KiB
- foundry-agent/toolbox/references/mcp-protocol.md3.2 KiB
- foundry-agent/toolbox/references/test-endpoint.md6.4 KiB
- foundry-agent/toolbox/references/tool-a2a.md2.2 KiB
- foundry-agent/toolbox/references/tool-azure-ai-search.md7.0 KiB
- foundry-agent/toolbox/references/tool-browser-automation.md3.5 KiB
- foundry-agent/toolbox/references/tool-code-interpreter.md3.5 KiB
- foundry-agent/toolbox/references/tool-fabric-iq.md4.4 KiB
- foundry-agent/toolbox/references/tool-file-search.md4.1 KiB
- foundry-agent/toolbox/references/tool-mcp-agent-identity.md7.8 KiB
- foundry-agent/toolbox/references/tool-mcp-custom-oauth-azure-starter.md4.0 KiB
- foundry-agent/toolbox/references/tool-mcp-custom-oauth.md7.9 KiB
- foundry-agent/toolbox/references/tool-mcp-key-auth.md4.2 KiB
- foundry-agent/toolbox/references/tool-mcp-managed-oauth.md6.3 KiB
- foundry-agent/toolbox/references/tool-mcp-noauth.md3.9 KiB
- foundry-agent/toolbox/references/tool-mcp-user-entra-token.md5.2 KiB
- foundry-agent/toolbox/references/tool-openapi.md6.2 KiB
- foundry-agent/toolbox/references/tool-tool-search.md5.9 KiB
- foundry-agent/toolbox/references/tool-web-search.md3.1 KiB
- foundry-agent/toolbox/references/tool-work-iq.md7.6 KiB
- foundry-agent/toolbox/references/toolbox-azd.md6.1 KiB
- foundry-agent/toolbox/scripts/get-catalog-inputs.ps1Script12.7 KiB
- foundry-agent/toolbox/scripts/get-catalog-inputs.shScript13.0 KiB
- foundry-agent/toolbox/toolbox.md7.8 KiB
- foundry-agent/trace/references/analyze-failures.md3.9 KiB
- foundry-agent/trace/references/analyze-latency.md3.8 KiB
- foundry-agent/trace/references/conversation-detail.md3.7 KiB
- foundry-agent/trace/references/eval-correlation.md2.5 KiB
- foundry-agent/trace/references/kql-templates.md10.6 KiB
- foundry-agent/trace/references/search-traces.md6.8 KiB
- foundry-agent/trace/trace.md6.5 KiB
- foundry-agent/troubleshoot/troubleshoot.md8.7 KiB
- foundry-agent/validate/references/default-rules.yaml18.1 KiB
- foundry-agent/validate/references/report-schema.json3.3 KiB
- foundry-agent/validate/references/report-template.md.tpl2.8 KiB
- foundry-agent/validate/references/rules-schema.json2.5 KiB
- foundry-agent/validate/validate.md7.4 KiB
- project/connections.md3.1 KiB
- project/create/create-foundry-project.md8.4 KiB
- quota/quota.md9.0 KiB
- quota/references/capacity-planning.md8.2 KiB
- quota/references/error-resolution.md4.9 KiB
- quota/references/optimization.md7.6 KiB
- quota/references/ptu-guide.md6.2 KiB
- quota/references/troubleshooting.md7.3 KiB
- quota/references/workflows.md6.9 KiB
- rbac/rbac.md7.1 KiB
- references/agent-metadata-contract.md8.7 KiB
- references/auth-best-practices.md6.5 KiB
- references/standard-agent-setup.md4.2 KiB
- resource/create/create-foundry-resource.md6.1 KiB
- resource/create/references/patterns.md3.9 KiB
- resource/create/references/troubleshooting.md2.4 KiB
- resource/create/references/workflows.md6.7 KiB
- resource/private-network/private-network.md6.3 KiB
- resource/private-network/references/custom-template-adaptation.md1.6 KiB
- resource/private-network/references/deploy.md3.7 KiB
- resource/private-network/references/end-to-end-test.md4.1 KiB
- resource/private-network/references/intake.md6.5 KiB
- resource/private-network/references/post-deployment-validation.md3.7 KiB
- resource/private-network/references/scaffold.md1.7 KiB
- resource/private-network/references/template-index.md1.6 KiB
- resource/private-network/references/vpn-dns-setup.bicep4.5 KiB
- resource/private-network/references/vpn-dns-setup.md6.4 KiB
- scripts/check-and-setup-dependencies.ps1Script1.2 KiB
- scripts/check-and-setup-dependencies.shScript845 B
foundry-agent/create/quick-start-hosted.md
Quick Start: Hosted Foundry Agent
Opinionated happy-path for first-time users creating their first Foundry hosted agent. Safe defaults, minimal decisions.
When to Use This Skill
Use this when the request is to create a new Foundry hosted agent end-to-end — scaffold, provision, deploy, and smoke-test. Common overrides (language, region, sample, topic, existing project, existing model) are fine. This skill supports only the responses and invocations protocols. When working on existing agents, using container deploy, using the activity protocol, or handling anything else not covered here, stop and read create-hosted.md.
Quick Reference
| Property | Standard path | Override |
|---|---|---|
| Sample | Foundry hosted agent samples for the chosen language (azd ai agent sample list --language <lang> --output json) | User may name a different sample |
| Model version | Whatever the sample's manifest declares | If user supplies a model version, edit azure.yaml. If user supplies a model deployment without model version, follow Foundry Model Reference to query model-related data. If provision fails, follow Foundry Model Reference to query model-related data. |
| Model quota | Skip the quota pre-check | If provision fails, follow Foundry Model Reference to query model-related data. |
| Stops at | Deployed agent + remote smoke invoke + eval generation submitted | — |
Workflow
Walk through every step in order.
Step 1 — Verify the environment
Run the bundled read-only Copilot app entry preflight without asking for approval; it locates the app's Copilot CLI and reports whether the microsoft-foundry canvas plugin needs installation:
./scripts/check-copilot-app-entry.sh # macOS / Linux
./scripts/check-copilot-app-entry.ps1 # Windows (pwsh)Act on the summary prefixes:
[OK]-- nothing to do.[WARN]-- non-blocking; continue.[ACTION]-- try to resolve by using the exact plugin install command emitted by the preflight; ask before installing in interactive mode, and install directly in non-interactive mode.On successful installation, you MUST print: "The
microsoft-foundrycanvas extension is installed and will be available in a new session." Then rerun the preflight.If installation is declined or fails, warn and continue; do not retry.
Then run the bundled verification script:
./scripts/verify-environment.sh # macOS / Linux
./scripts/verify-environment.ps1 # Windows (pwsh)Act on the summary prefixes:
[OK]-- nothing to do.[WARN]-- non-blocking; continue.[ACTION]-- resolve first, then rerun the script. Ifazorazdis missing, ask before installing in interactive mode; install directly in non-interactive mode. For how to installazd, see https://learn.microsoft.com/en-us/azure/developer/azure-developer-cli/install-azd. In any mode, never runaz loginorazd auth login; stop and ask the user to log in manually before any init, provision, or deploy command. Missingazure.ai.agents/azure.ai.projectsextensions may be resolved withazd extension install <name>.
Step 2 — Collect necessary information
Before asking, resolve values from the user's request, the workspace,
azure.yaml, the Step 1 verification output, and azd env get-values. For each
row, do not ask when its When to skip condition is met. Ask for all
remaining applicable values in one AskUserQuestion round. Do not ask for
values that are already resolved or irrelevant to the requested change.
Populate each question with the default option below.
| Value | When to skip | Default option | Notes |
|---|---|---|---|
| Project / agent name | The user provided one, or the existing code already defines one. | Project: ai-project-<random>; agent: the selected sample's agent name | Generate <random> using 6-8 lowercase alphanumeric characters. Pass the agent name to azd ai agent init with --agent-name; it sets the service key and agent name in azure.yaml. For a new Foundry project, set the project name after init with azd env set AZURE_AI_PROJECT_NAME "<project-name>" before running azd provision. |
| Language | The user provided one, or the existing code already determines it. | Python | Supported languages: Python and .NET. |
| Subscription | The active azd environment already contains the intended AZURE_SUBSCRIPTION_ID. | Active Azure subscription: <subscription-name> (<subscription-id>) | Resolve both values with az account show --query "{name:name,id:id}" -o json; the ID must be a subscription GUID. |
| Region | The active azd environment already contains the intended AZURE_LOCATION, or this change does not provision regional resources. | northcentralus | Azure resource location. |
| Foundry project | The workspace or azd environment is already configured with a Foundry project, or the user provided one. | New Foundry project | Offer a new or existing project. For a new project, do not pass --project-id; azd provision creates it. For an existing project, use its ARM resource ID with azd ai agent init --project-id. |
| Foundry model deployment | The user provided one. | Official sample's model selection | If the user specifies a model deployment, collect its deployment name. |
| Deploy mode | Always — resolve without asking. | code | Container deploy is not supported in this quick start. To use container deploy, follow create-hosted.md. |
If the user supplied only a Foundry project endpoint (not an ARM ID), resolve the ARM ID before Step 4:
./scripts/resolve-project-id.sh --endpoint "<foundry-project-endpoint>" # macOS / Linux
./scripts/resolve-project-id.ps1 -Endpoint "<foundry-project-endpoint>" # Windows (pwsh)Use the returned id value. Never guess or construct the ARM ID from the endpoint.
When creating a new agent in an existing Foundry project, verify that the selected Foundry model deployment exists by running:
az cognitiveservices account deployment list \
--resource-group "<rg-name>" \
--name "<foundry-account-name>" \
--output tableStep 3 — Pick the sample
azd ai agent sample list --language <lang> --output json
--languagehere takes the short form (python,dotnetCsharp) — not the runtime token (python_3_13fails withunknown language). The runtime tokens are only used in Step 4'sazd ai agent init --runtime ....
Capture the manifestUrl.
Important: Always select the best-matching sample from
azd ai agent sample listfor the capabilities the user explicitly requested. Use advanced tool samples only when the user explicitly asks for external actions, APIs, tools, connectors, or data lookup. Starting with the right sample helps ensure that the implementation follows the established code patterns and best practices for that type of Foundry hosted agent. Ifazd ai agent sample listdoes not return a suitable sample, choose one from the official Foundry samples repository and construct the manifest URL from its exactazure.yamlpath, following the URL format returned byazd ai agent sample list.
You should pick only one sample for azd ai agent init, but you can browse multiple samples relevant to user's task as code reference.
Important: When users want to create new LangChain/LangGraph agents, you MUST read and follow LangChain and LangGraph hosting before selecting a sample or changing agent code.
Step 4 needs --runtime and --entry-point values. These are CLI args, not fields in the manifest — use these standard defaults for the chosen language:
| Language | --runtime | --entry-point |
|---|---|---|
| Python | python_3_13 | main.py |
| .NET | dotnet_10 | MyAgent.dll |
Step 4 — Scaffold the agent
Run azd ai agent init. azd ai agent init is sufficient to create new Foundry projects (or reuse an existing one) and create new Foundry agents. By default, you do not need to run azd init unless the user has specific initialization requirements.
Pass --deploy-mode code by default to use code deploy.
azd ai agent init --no-prompt \
-m "<manifestUrl>" \
--deploy-mode code \
--runtime python_3_13 \
--entry-point main.py \
--agent-name "<agent-name>"After the azd ai agent init completes, go to the project folder and write the subscription and region collected in Step 2 to the active azd environment:
azd env set AZURE_SUBSCRIPTION_ID "<subscription-id>"
azd env set AZURE_LOCATION "<region>"When creating a new Foundry project, also set its name before provisioning:
azd env set AZURE_AI_PROJECT_NAME "<project-name>"Values you must substitute from Step 3 — do not pass placeholders or guesses:
--runtime: exactly one ofpython_3_13,python_3_14,dotnet_10(the bare valuepythonfails with--runtime must be one of: python_3_13, python_3_14, dotnet_10).--entry-point: the entry-point file the sample declares (e.g.main.py, notapp.py— a wrong value scaffolds correctly but breaks local run and deploy).
If using an existing Foundry project, add --project-id "<arm-id>".
⏳ May take time — init resolves the model catalog server-side. Wait for the prompt to return; do not interrupt.
init writes azure.yaml (appending the agent service), src/<agent-name>/.agentignore, and the sample source files under src/<agent-name>/.
Important: Do not chain
azd env setafterazd ai agent initon the same command line. The init command may scaffold the project into a subfolder, so runazd env setonly after initialization completes and after changing to the scaffolded project directory.
Step 5 — Customize the scaffolded sample (per user's original intent)
The scaffold is a generic working sample. Edit only what the user's original prompt asked for — touch tools, dependencies, or model config only when the user explicitly asked for external actions, APIs, tools, connectors, data lookup, or a specific model.
Typical changes:
The agent service's
description:inazure.yaml— update it to match the user's intent (this also feeds Step 13 eval generation).src/<agent-name>/<entry-point>— update the system prompt / instructions to match the user's intent.
Only when the user explicitly asked for it:
Add or modify tool / function-calling code in
<entry-point>.Add dependencies to
pyproject.toml/requirements.txt(Python) or*.csproj(.NET).Change the model in
azure.yaml services.ai-project.deployments[]before Step 8 provision.
If the user's original prompt was generic (no specific agent purpose described), skip customization and ship the sample as-is.
Step 6 — Write the agent instruction file (required)
Do not skip this. The project needs a marker in its AGENTS.md (or CLAUDE.md in Claude Code) so future prompts reload this skill. If no such file exists, create it with the marker below. If the file already exists, weave the marker into the existing content naturally so it matches the file's structure and tone, rather than bluntly appending a standalone line that reads as out of place. Never overwrite the file or create a second one.
This project was built with the microsoft-foundry skill. Before working on or answering questions about foundry agents, read the microsoft-foundry skill first.Step 7 — Sanity-check the scaffold
Verify all four before continuing. If any check fails, pick one recovery path, then re-verify:
| Check | Expected | If failed |
|---|---|---|
azure.yaml services.ai-project.deployments[] | Non-empty array with name, model.{name,format,version}, sku.{name,capacity} | Model resolution deferred — use recovery |
Agent service environmentVariables AZURE_AI_MODEL_DEPLOYMENT_NAME (in azure.yaml) | Literal name or ${AZURE_AI_MODEL_DEPLOYMENT_NAME} substitution | If literal {{AZURE_AI_MODEL_DEPLOYMENT_NAME}} (double braces): use recovery |
Agent service codeConfiguration.entryPoint: (in azure.yaml) | Matches a real file in src/<agent-name>/ (e.g. main.py and main.py exists) | If mismatch (e.g. entryPoint: app.py but only main.py exists): edit azure.yaml to the real filename, then re-verify. Most often caused by passing a wrong --entry-point in Step 4. |
azure.yaml services: keys | Only one <agent-name> entry | If <agent-name>-2 exists: init was re-run; use recovery |
Recovery paths (pick based on whether Step 5 has already customized src/<agent-name>/):
Hand-fix in place (use when Step 5 customization is already done — preserves user code) — edit
azure.yaml services.ai-project.deployments[]to add the model block, replace{{AZURE_AI_MODEL_DEPLOYMENT_NAME}}in the agent service'senvironmentVariableswith${AZURE_AI_MODEL_DEPLOYMENT_NAME}, thenazd env set AZURE_AI_MODEL_DEPLOYMENT_NAME <deployment-name>.Clean re-init (use only when Step 5 has not run yet — destructive: deletes
src/<agent-name>/) — deletesrc/<agent-name>/, remove theservices.<agent-name>:block fromazure.yaml, re-run Step 4.Interactive overwrite (loses Step 5 edits — re-resolves the model from the original manifest) — re-run Step 4 without
--no-prompt. When the collision prompt appears, arrow-up to "Overwrite existing" (default is not overwrite).
Never azd env set AI_PROJECT_DEPLOYMENTS '[...]' (single-escaped JSON breaks Bicep parse). Never az cognitiveservices account deployment create against this account (creates the deployment outside the azd lifecycle).
If recovery still fails → escape to create-hosted.md.
Step 8 — Provision Azure resources
🚦 Project-selection gate (align with Step 2). Only
azd provisiona new project when the user asked to create one. If the user gave an existing project, skip provision and use it. If the user didn't mention a project at all, stop and ask first — don't silently provision a new one.
azd provision --no-state --no-prompt--no-state skips the existing-deployment check; safe here because the golden path starts from a fresh environment (Step 4). Keep it for this quickstart; you can omit it later when re-provisioning the same environment.
⏳ May take time — creates the resource group, Foundry account + project, model deployment, App Insights, Log Analytics. Wait for the prompt to return; do not interrupt.
Step 9 — Wire local env vars
azd env get-valuesCapture FOUNDRY_PROJECT_ENDPOINT and AZURE_AI_MODEL_DEPLOYMENT_NAME. Write src/<agent-name>/.env:
FOUNDRY_PROJECT_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project-name>
AZURE_AI_MODEL_DEPLOYMENT_NAME=<deployment-name>Keep .env out of the deploy package: make sure src/<agent-name>/.agentignore lists .env (add it if missing). For Python, also list .venv/, __pycache__/, and *.pyc in .agentignore.
Also mirror them into the azd env (so azd ai agent run injects the right values — it reads azd env before .env):
azd env set AZURE_AI_PROJECT_ENDPOINT "<endpoint>"
azd env set AZURE_AI_MODEL_DEPLOYMENT_NAME "<deployment-name>"Step 10 — Local smoke test
Set up a venv with uv installed first. azd ai agent run installs Python dependencies on first start; with an activated venv that has uv available, it uses uv (seconds) instead of plain pip (minutes).
Important: the venv must live in
src/<agent-name>/(next topyproject.toml/requirements.txt).azd ai agent runresolves the venv relative to the service source directory; a venv at the project root is ignored and azd silently creates a second one withoutuv, wasting the speedup.Private package index: If the sample has a
uv.lock, the user has theUV_DEFAULT_INDEXenvironment variable set to a private index, and public PyPI is unreachable,azd ai agent runfails withuv.lock needs to be updated. Back upuv.lockfirst, then runuv lockinsrc/<agent-name>/and continue the local test. The re-locked file is for local run only; see Step 11 before deploying.
Python:
cd src/<agent-name>
python -m venv .venv
# Activate the venv — pick the line for your shell:
.\.venv\Scripts\Activate.ps1 # Windows pwsh
source .venv/bin/activate # macOS / Linux
python -m pip install uv
cd - # back to project root for the azd commands below.NET: no pre-install step — azd ai agent run runs dotnet restore itself on first start.
The examples below use the default port 8088. Confirm it is free; if occupied, choose another port and add the same --port <n> to both run and invoke --local below. Run the agent locally. For Python, do this with the service-dir venv still activated — activation is what lets azd ai agent run find uv for the fast dependency install. azd ai agent run is the local server — a foreground process holding the selected port that must stay alive from start, through every invoke --local, until you explicitly stop it.
Start it in a managed background session your shell tool can poll and stop (most tools detect a long-running foreground process and return a session/shell id — use that id). Do not use job operators (bash &, nohup, start /B, popped windows): on Linux/macOS the child gets SIGHUP and dies when its parent bash exits, so the next command sees could not connect even though ss from inside the same bash just showed :8088 bound.
azd ai agent run --no-clientReadiness gate — required before local invocation.
Start checking TCP connections to
localhost:<port>immediately after launching the agent in the background; retry failed connections every 2–5 seconds.In the same loop, check whether the
azd ai agent runprocess has exited. If it exited, stop polling immediately, read its output, and fix that specific cause (for example, a dependency install failure) before restarting.Keep each startup wait at 5 seconds or less, including sleeps and shell-tool output reads.
Proceed to the smoke invocation as soon as TCP connects, keeping the server running.
If the startup timeout expires before a connection succeeds, inspect the server logs and resolve the cause before retrying.
Smoke-invoke (local):
azd ai agent invoke --local "<short representative prompt for the agent's purpose>"Stop the local server via the managed session's stop primitive before continuing — a lingering process holds files in the project and breaks later cleanup.
Step 11 — Deploy
Once local invocation succeeds, if the user does not explicitly ask to deploy, tell them the agent is ready and ask if they want to deploy.
If you re-ran uv lock against a private index in Step 10, the remote build cannot use that lock. If dependencies did not change, restore the backed-up uv.lock before deploying. If dependencies changed, guide the user to regenerate uv.lock using the public PyPI index, or export the locked dependencies to a requirements.txt file with pinned versions, and then proceed with deployment.
To deploy:
azd deploy --no-prompt⏳ May take time — zips src/<agent-name>/ (respecting .agentignore), uploads to Foundry, builds runtime remotely, registers agent version. Wait for the prompt to return; do not interrupt.
Step 12 — Verify + remote smoke
azd ai agent show --output jsonExpect "status": "active" (or "deployed") and an agent_endpoints map.
Remote invoke (billed):
azd ai agent invoke "<short representative prompt>"Run the smoke invocation only as part of the requested deployment or test.
Step 13 — Submit eval suite generation (async, fire-and-forget)
⚠️ Pre-summary gate. Do not write the Step 14 final summary until this step has been submitted. The eval suite is part of the deployment artifact; skipping it ships an incomplete result.
Directly submit the eval suite generation asynchronously, do not ask the user for confirmation.
Read the agent service's description: from azure.yaml (the value you set in Step 5) and pass it as --gen-instruction:
azd ai agent eval generate --gen-instruction "<agent service description>" --no-wait --no-promptExpected output:
Eval generate submitted (async)
dataset generation: datagen-<id> (queued)
evaluator generation: evaluatorgen-<id> (in_progress)
Config written to: src/<agent-name>/eval.yaml
When ready, run:
azd ai agent eval runGeneration runs server-side and takes several minutes. Tell the user:
"Eval suite generation submitted. Run
azd ai agent eval runwhenever you're ready — it'll wait for generation to finish and execute the eval in one step."
Run azd ai agent eval run only after the user explicitly agrees.
Step 14 — Final summary
Produce a concise summary covering: agent name/version/status/endpoints, a Playground link, the resources created, the eval suite generation submission, and the three follow-up commands below. Read playground_url directly from azd ai agent show --output json. If it is absent, construct the Playground URL from azd env get-values:
https://ai.azure.com/nextgen/r/{encodedSubId},{resourceGroup},,{accountName},{projectName}/build/agents/{agentName}/build?version={agentVersion}encodedSubId = URL-safe base64 of the subscription GUID, padding stripped:
python -c "import base64,uuid;print(base64.urlsafe_b64encode(uuid.UUID('<SUBSCRIPTION_ID>').bytes).rstrip(b'=').decode())"Three follow-up commands to include:
azd ai agent invoke "<follow-up message>" # chat with the deployed agent (billed)
azd ai agent eval run # finalize + run the eval suite (Step 13)
azd down # tear down all resources when doneError Handling
| Symptom | Fix |
|---|---|
azd ai agent init fails with --runtime must be one of: python_3_13, python_3_14, dotnet_10 | You passed a bare value like python. Use the full runtime token (e.g. python_3_13). |
azd ai agent init fails with --entry-point is required when using --deploy-mode code with --no-prompt | Pass --entry-point <filename> matching the entry-point file the sample declares (from Step 3). |
codeConfiguration.entryPoint doesn't match any file in src/<agent-name>/ | You guessed the entry-point in Step 4. Edit the agent service in azure.yaml to the real filename (verify with ls src/<agent-name>/). No re-init needed. |
azd deploy postdeploy hook fails with missing AZURE_TENANT_ID | Run az account show --query tenantId -o tsv and azd env set AZURE_TENANT_ID <tenant-id>, then re-run azd deploy --no-prompt. The deployed agent version from the first deploy is still valid; the postdeploy hook just registers env vars. |
| Scaffold sanity check fails (Step 7) | Pick a recovery path from Step 7. If still failing → create-hosted.md. |
Local invoke returns model 404 / wrong deployment | Stale AZURE_AI_MODEL_DEPLOYMENT_NAME in azd env overrides .env. Re-run Step 9 to sync both. |
| Anything else | Escape to create-hosted.md. |
Escape Hatch
If any step fails in a way not covered above, the output looks unexpected, or the user's request drifts outside what this quickstart covers → stop improvising. Read create-hosted.md and follow its full workflow.
Requirements and compatibility
Written for: Claude Code
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: Names Claude Code tools, Needs a command-line tool, Needs Python
Security
What our scanner noticed· Low risk
- Phrasing that asks for actions without confirmation
- 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/azure-skills/skills/microsoft-foundry · commit 0696600
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from .github/plugins/azure-skills/LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
- Also distributed in
- microsoft/azure-skills
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 microsoft-foundry.zip