Generated banner for Microsoft Foundry
Generated logo for Microsoft Foundry

Microsoft Foundry

MicrosoftOfficialCreated by Microsoft

  • Skill
  • Workflow
  • Data and AI
  • MIT
  • Low risk
  • Has scripts

From the author

Build, deploy, evaluate, optimize, fine-tune, and manage Microsoft Foundry agents, models, and resources end to end. USE FOR: foundry, azd ai agent, azd provision/deploy, hosted agent scaffold/develop/run/deploy/troubleshoot, prompt agent, managed harness agent, Copilot harness, voice agent, create/update/invoke/evaluate agent, add tool to agent, agent insights, batch/continuous eval, continuous monitoring, agent CI/CD, optimize/improve prompt, optimize agent instructions, Agent Optimizer, dataset curation from traces, deploy model, model fine-tuning (SFT/DPO/RFT), Foundry project, RBAC, role assignment, permissions, quota, capacity, region, deployment failure, AI Services, create Foundry resource, knowledge index, customize deployment, onboard, availability, training-data, grader, distillation, large file upload. DO NOT USE FOR: Azure Functions, App Service, general Azure deploy (use azure-deploy), general Azure prep (use azure-prepare).
— the description by Microsoft

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

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/microsoft/microsoft-foundry/download
  2. Unzip 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-SkillWhen to UseReference
deployDeploy hosted agents to Foundry, smoke-test a deployment, create or update prompt agents, and manage agent versions and multi-environment deploys.deploy
cicdSet up a CI/CD deployment pipeline for a Foundry agent.cicd
invokeSend messages to an agent, single or multi-turn conversationsinvoke
routineSchedule 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-wsBuild, deploy, and connect to custom Hosted agents that use developer-defined duplex real-time or media streams over invocations_ws.invocations-ws
observeEvaluate agent quality, run batch evals, analyze failures, optimize prompts, improve agent instructions, compare versions, set up CI/CD monitoring, and enable continuous production evaluationobserve
insightsPull generated agent insights, evidence, and recommendations from an existing monitor; read-only retrieval, not a new analysis runinsights
traceQuery traces, analyze latency/failures, correlate eval results to specific responses via App Insights customEventstrace
troubleshootView hosted agent logs, query telemetry, diagnose failurestroubleshoot
validateUse 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
createUse 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 harnessCreate 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 voiceCreate, 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-optimizerMake 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-datasetsHarvest 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/createCreating 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/createCreating 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-networkAnswer 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-modelUnified 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
quotaManaging 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
rbacManaging 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
finetuningFine-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-guidanceProvide 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) or private-network (VNet isolation) → models/deploy-model → agent workflows (create → deploy → invoke).

💡 Fine-Tuning: Use finetuning for 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-model for 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_optimize MCP tool through that eval-driven workflow.

Infrastructure Lifecycle

Match user intent to the correct infrastructure workflow.

User IntentWorkflow
"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 isolationprivate-network
Create a Foundry project (public)project/create
Create a bare Foundry resourceresource/create

Agent Development Lifecycle

Match user intent to the correct agent workflow. Read each sub-skill in order before executing.

User IntentWorkflow (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 agentdependency 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 agentdependency 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 changesdependency check and setup → azd-guidance → deploy (includes eval-suite setup) → invoke → observe (evaluate/optimize)
Set up a CI/CD deployment pipeline for a hosted agentdependency check and setup → azd-guidance → cicd
Invoke/test/chat with an agentdependency check and setup → azd-guidance → invoke
Schedule/event-trigger an agent, or CRUD/enable/disable/dispatch a routinedependency check and setup → azd-guidance → routine
Optimize / improve agent prompt or instructionsobserve (Step 4: Optimize)
Evaluate and optimize agent (full loop)observe
Enable continuous evaluation monitoringobserve (Step 6: CI/CD & Monitoring)
Pull agent insights / list generated issues and recommendationsdependency check and setup → insights (all pages with expanded evidence; read-only)
Troubleshoot an agent issuedependency 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.yaml plus azd env get-values; do not duplicate those values in metadata when azd already provides them.

  • agent-metadata.yaml is 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 as agent-metadata.prod.yaml can hold a single prod or CI-targeted overlay without mixing multiple environments in one file.

  • suites/, datasets/, and evaluators/ 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 agent flow uses Basic Agent Setup and does not provision capabilityHosts/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, and conversationEngine, then use that service's project folder or the azure.yaml directory as the agent root.

  • Multiple azd agent services -> check whether a Voice wrapper references a kind: hosted service via conversationEngine.name:

    • Selecting the Hosted Voice wrapper implies its named kind: hosted target as an upstream dependency (uses: [<target>], conversationEngine.name: <target>); deploy and verification must report both services separately.

    • Selecting the kind: hosted target 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 contain agent-metadata.yaml or agent-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:

  1. Environment explicitly named by the user

  2. AZURE_ENV_NAME from azd env get-values

  3. azd default environment from .azure/config.json

  4. Environment 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 VariableResolves To
AZURE_AI_PROJECT_ENDPOINT or AZURE_AIPROJECT_ENDPOINTProject endpoint
AGENT_<SERVICE>_NAMEAgent name for the selected azd service
AGENT_<SERVICE>_VERSIONAgent version for the selected azd service
AZURE_CONTAINER_REGISTRY_NAME or AZURE_CONTAINER_REGISTRY_ENDPOINTACR registry name / image URL prefix
APPLICATIONINSIGHTS_CONNECTION_STRINGApp Insights connection string for trace workflows
AZURE_SUBSCRIPTION_ID, AZURE_RESOURCE_GROUP, AZURE_AI_ACCOUNT_NAME, AZURE_AI_PROJECT_NAMEAzure 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:

  1. Metadata filename or path explicitly provided by the user or workflow

  2. If an explicit environment is already known and .foundry/agent-metadata.<env>.yaml exists, use that file

  3. .foundry/agent-metadata.yaml

  4. If 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:

  1. Environment explicitly named by the user

  2. If the selected metadata file defines exactly one environment, use it

  3. Environment already selected earlier in the session

  4. defaultEnvironment from 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; legacy dataset_file may be normalized in memory.

  • dataset.name / dataset.version -> registered dataset candidate.

  • validation_dataset -> optional validation dataset candidate.

  • evaluators[] -> candidate Foundry evaluator names; verify with evaluator_catalog_get before treating them as remote evaluators.

  • name -> local eval/suite candidate; verify remotely before persisting as suiteName.

  • options.eval_model, options.optimization_model, options.max_candidates, options.optimization_config.model_search_space, options.pass_threshold, max_samples, trace_days, and generation_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:

  1. Explicit user input and values already selected in the session

  2. azd environment values for deployment context

  3. .foundry/agent-metadata*.yaml overlay values and remote suite/cache references

  4. azure.yaml and eval.yaml local source configuration

  5. User 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 ValuePreferred SourceUsed By
Project endpointazd envdeploy, invoke, observe, trace, troubleshoot
Agent name/versionazd agent variables, then azure.yamlinvoke, observe, trace, troubleshoot
ACRazd envdeploy
Evaluation suites and cache paths.foundry/agent-metadata*.yamlobserve, eval-datasets
Local seed dataset/evaluator intenteval.yamlobserve, 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 resolution

  • evaluationSuites[] with remote suite/dataset/evaluator references and local cache paths

  • lastEval, 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*.yaml

  • Metadata file — agent-metadata.yaml for local/dev, or an explicit sidecar such as agent-metadata.prod.yaml

  • Environment — azd environment, dev, prod, or another environment key from metadata

  • Project 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:

TypeKindDescription
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 authoringPrompt 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:

  1. kind: voice -> Voice. For compatibility, silently classify an existing kind: prompt-voice service as Voice, then normalize it when editing its YAML. Classify the subtype:

    • conversationEngine.type: hosted_agent -> Hosted Voice wrapper (paired with a named kind: hosted target service).

    • modelType: managed or modelType: self_deployed -> Prompt Voice (Foundry infers native speech-to-speech vs cascaded STT -> LLM -> TTS from model.id).

    • Having both modelType/model and conversationEngine is invalid (stop and fix azure.yaml); having neither is incomplete (do not guess). Never use obsolete modelType: hosted_agent, targetAgent, or a nested config: block.

  2. kind: hosted -> Hosted. When it declares protocols: [{ protocol: invocations_ws, version: 1.0.0 }] and metadata.voiceLiveCompatible: "true" alongside a kind: voice wrapper, it is a Hosted Voice target; otherwise treat a standalone invocations_ws service as a custom Hosted real-time/audio agent.

  3. kind: prompt plus harness.type: microsoft_copilot_preview or legacy github_copilot_preview -> Managed Harness Agent.

  4. kind: prompt without 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_user or askQuestions tool whenever collecting information from the user

  • Use the task or runSubagent tool 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

foundry-agent/deploy/deploy.md

Deploy a Foundry Agent

Provision Azure resources when needed, deploy the agent, and smoke-test it. For hosted agents (custom container or code), use azd deploy. For Voice Agents, use azd deploy and smoke-test over the voice WebSocket endpoint. For Managed Harness Agents (kind: prompt plus the Copilot harness), use azd deploy. For ordinary prompt agents, use the Foundry MCP agent_update tool.

Quick Reference

PropertyValue
Hosted (recommended)azd provision when needed, code deploy via azd deploy (codeConfiguration present), then verify and invoke
Hosted (container)azd provision when needed, container deploy via azd deploy (remote builds require a Dockerfile and ACR; local builds also require Docker; no codeConfiguration: in the azure.yaml service block)
Voice (Prompt Voice)azd provision when needed, declarative azd deploy, then verify over the voice WebSocket endpoint (azd ai agent invoke is not supported)
Voice (Hosted Voice)azd provision when needed, azd deploy for both the kind: hosted target and kind: voice wrapper, report both versions separately, and smoke-test the wrapper over the voice WebSocket endpoint
Managed Harness Agentazd provision when needed, then declarative azd deploy; no code/container packaging
Prompt MCPagent_definition_schema_get, agent_update, agent_get, agent_delete
VersioningEach successful azd deploy creates an immutable agent version
Endpoint-only patchazd ai agent endpoint update (no new version)
Local devcreate-hosted, create-voice, local-run

Route by Agent Type

  • Voice Agent (single-agent Prompt Voice or two-agent Hosted Voice wrapper + kind: hosted target) -> Voice (azd Voice workflow below).

  • Shipping Python / .NET code (kind: hosted) -> Hosted (azd workflow below).

  • Explicit kind: prompt plus harness.type: microsoft_copilot_preview or legacy github_copilot_preview -> Managed Harness Agent (azd workflow below).

  • Ordinary Prompt Agent model / instructions / tools -> Prompt (MCP workflow below).

Deploy Mode Selection -- Hosted agents

Follow the user's explicit deploy mode preference or the existing project configuration. Otherwise, use code deploy through azd by default (no Docker/ACR required): the agent's azure.yaml service block must contain codeConfiguration:, so azd deploy will zip the source and let Foundry build it. If azd deploy prints Packaging container for an agent that does not need container-specific behavior, add or fix codeConfiguration and retry.

When the agent depends on Dockerfile behavior, system packages, or a pre-built image, or when the user explicitly asks to build or deploy a container image, mentions Container/Docker Image/Azure Container Registry (ACR), or supplies a pre-built image, use container deploy.

Before running azd deploy, inspect the agent's service block in azure.yaml.

Service block stateDeployment path
codeConfiguration: presentCode deploy through azd deploy; no Docker/ACR build.
No codeConfiguration: with language: dockerContainer deploy through azd deploy.

codeConfiguration: example in the azure.yaml service block:

services:
  <agent-name>:
    host: azure.ai.agent
    codeConfiguration:
      runtime: python_3_13
      entryPoint: main.py
      dependencyResolution: remote_build

Remote ACR build example in the azure.yaml service block:

services:
  <agent-name>:
    host: azure.ai.agent
    language: docker
    docker:
      remoteBuild: true

Workflow -- Hosted agent (azd)

Prerequisite: project scaffolded with azd ai agent init. If not, start at create-hosted.

Step 1 -- Resolve azd environment

If the user provided an existing project endpoint, project ARM ID, or model deployment, set those values before deploy:

azd env set AZURE_AI_PROJECT_ENDPOINT "<project-endpoint>"
azd env set AZURE_AI_PROJECT_ID "<project-arm-id>"
azd env set AZURE_AI_MODEL_DEPLOYMENT_NAME "<model-deployment-name>"

If using container deploy and the user provided an existing ACR, set:

azd env set AZURE_CONTAINER_REGISTRY_NAME "<acr-name>"
azd env set AZURE_CONTAINER_REGISTRY_ENDPOINT "<acr-login-server>"
azd env set AZURE_CONTAINER_REGISTRY_RESOURCE_ID "<acr-resource-id>"

Verify the azd environment with azd env get-values.

Run:

azd ai project show --output json
azd ai agent show --output json

Branch on output: not_deployed -> Step 2. active / deployed -> redeploy (skip Step 2, go to Step 3). If azd ai project show fails with missing_project_endpoint, do Step 2 first -- azd provision will create the project.

Important: Before deploy, also make sure the agent's azure.yaml service block and the azd environment are aligned with the user's provided configuration values.

Step 2 -- Provision Azure resources (one-time per env)

🚦 Project-selection gate. If no foundry project endpoint is configured (not in the message, azd env, or .env) and the user hasn't asked to create one, stop and ask them to pick an existing foundry project or confirm creating a new one — don't silently select.

Skip azd provision when the user gave you an existing AZURE_AI_PROJECT_ENDPOINT or FOUNDRY_PROJECT_ENDPOINT and no infrastructure changes are needed. If container deploy needs a new ACR, run azd provision even when using an existing Foundry project.

Run provision only for new projects or real infrastructure changes:

azd provision --no-prompt

Optional: run azd provision --preview --no-prompt first to preview the resource changes (a what-if) before applying them.

Optional: add --no-state on a fresh azd environment to skip the existing-deployment check and provision faster; omit it when re-provisioning an existing one.

What this does:

  • Creates the Foundry project (if not present) and supporting resources under infra/.

  • Creates connections declared as top-level azure.ai.connection services. ${PARAM_*} placeholders resolve from the active azd env.

  • Wires model deployments, AI Search, ACR, etc. infra/layers/ provision in parallel when present.

After provision completes for a new project, run azd env get-values and set missing required azd env values, especially AZURE_AI_PROJECT_ID and AZURE_TENANT_ID, before local run or the first azd deploy.

Step 3 -- Pre-deployment check

Branch by deploy mode.

Code deploy

Run azd env get-values and verify that these values are set for the intended environment:

  • AZURE_AI_PROJECT_ENDPOINT

  • AZURE_AI_PROJECT_ID

  • AZURE_AI_MODEL_DEPLOYMENT_NAME

  • AZURE_TENANT_ID

For Python, verify that <service-dir>/.agentignore excludes .venv/, adding the rule if missing.

Container deploy

Complete the Container Deploy Precheck before continuing.

Step 4 -- Deploy the agent

Private package index: If azd deploy fails and the user's uv.lock points to a private Python package index, the Foundry service might be unable to access the index when installing dependencies. 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 retry the deployment.

azd deploy --no-prompt
# Multi-service:
azd deploy <service-name> --no-prompt

What deploy does:

  • Reads the agent's azure.yaml service block, packages the agent, uploads it, and registers a new immutable version.

  • Code deploy (codeConfiguration present): zips source, excludes .agentignore, and lets Foundry build the runtime image.

  • Container deploy (no code configuration): builds the Dockerfile, pushes to the project's ACR, registers the version. When the service block has image: set, azd reuses the pre-built image.

After deploy, azd writes AGENT_<SVC>_NAME, AGENT_<SVC>_VERSION, and AGENT_<SVC>_<PROTO>_ENDPOINT (one per protocol) into the active env.

For agents with Activity protocol, azd deploy also generates <service-dir>/TEAMS_APP_SETUP.md; read it and explain the remaining post-deployment steps to the user.

Re-deploying an identical build still creates a new version; azd prints Agent version <n> is already active. and skips the poll.

If deploy reports Done for the service and then fails only in postdeploy with Agent <service-name> with version <n> not found, the azure.yaml service key and the service's name: were mismatched. Rename the azure.yaml services key to the deployed agent name and rerun azd deploy --no-prompt; do not switch deploy mode.

Step 5 -- Verify and invoke
azd ai agent show --output json

Expect "status": "active" (or "deployed") and an agent_endpoints map. Inspect the selected service protocols in azure.yaml, then smoke-test:

For the Responses or Invocations protocol, smoke-test with azd:

azd ai agent invoke "hello, are you up?"

For a multi-protocol service, pass --protocol explicitly.

Remote invocation can incur model usage charges. Run it only as part of the requested deployment or test.

For the Activity protocol, azd ai agent invoke won't work; follow invoke to invoke the agent.

Run one remote invocation only unless the user explicitly asked to test multi-turn/session behavior. A single successful response is enough for the deployment smoke test. Anything other than a completed/successful response -> run azd ai agent doctor --output json, then follow troubleshoot.

Step 6: Auto-Generate Evaluation Suite (MANDATORY — RUNS AUTOMATICALLY)

⚠️ Pre-summary gate. If you are about to write a deployment summary or Playground link and Step 6 has not run, you are violating this skill. Run Step 6 first.

This step runs automatically after deploy. Ask the user which source to use and start it right after deploy succeeds — with --no-wait, generate returns in seconds and generation runs server-side, so it overlaps with invoke/test steps and finishes faster overall.

"Your agent is deployed. Want me to set up an evaluation suite now? (a) Yes — current agent instructions (synthetic Q&A), (b) Yes — historical traces (last 3 days), (c) Yes — use existing eval.yaml, (d) No / later."

ChoiceCommandWhat's next
(a) Agent instructionsazd ai agent eval generate --gen-instruction "<agent purpose>" --no-wait --no-prompt — --gen-instruction is required (hosted agents don't auto-derive it); use the service's description: in azure.yaml.Generation runs server-side. Tell the user: "Suite submitted. Run azd ai agent eval run whenever you're ready — it'll finalize eval.yaml and execute the eval in one step."
(b) Historical tracesazd ai agent eval generate --trace-days 3 --max-samples 50 --no-wait --no-promptSame as (a).
(c) Existing eval.yamlSkip generate.Tell the user: "Using existing eval.yaml. Run azd ai agent eval run when ready."
(d) No / laterSkip.Tell the user: "You can run azd ai agent eval generate (and then eval run) anytime."

Other useful flags on generate: --dataset <path-or-name> to reuse an existing dataset instead of generating one, --evaluator <name> (repeatable) to pin built-in or custom evaluators, --eval-model <name> to choose the model used for generation and evaluation, --reset-defaults to overwrite an existing eval config, --name <suite-name> and --out-file <path> (default eval.yaml).

Then proceed to Step 7. See After Deployment — Auto-Generate Evaluation Suite for run/refresh details. Run azd ai agent eval run only after the user explicitly agrees.

Step 7 -- Hand off

.agentignore

azd ai agent init writes a default <service-dir>/.agentignore for code deploy projects (gitignore syntax) that excludes tooling files, secrets, language artifacts, and Docker files from the deploy ZIP. Only the root file is read; use !path to force-include.

Endpoint or card edits -- no new version

When only agentEndpoint: or agentCard: changed in the azure.yaml service block:

azd ai agent endpoint update          # patch in place
azd ai agent endpoint update --force  # skip confirmation for breaking changes

Idempotent.

Multi-environment deploys

azd env list
azd env select prod
azd deploy --no-prompt

Each env has its own AGENT_<SVC>_* vars.

Common failure modes -- Hosted

ErrorFix
missing_project_endpointRun azd env set AZURE_AI_PROJECT_ENDPOINT <url>, or run azd provision for a new project.
invalid_agent_manifestazd ai agent doctor; fix the named field.
invalid_connectionInspect with azd ai connection show <name>.
Docker daemon not runningYou are on the container path. Add/fix codeConfiguration and retry code deploy. Only install Docker or try remote image build if you specifically need container deploy.
ACR push 403Foundry project RBAC is missing AcrPush for your identity. Consider switching to code deploy to avoid ACR entirely.
[ImageError] Container registry authentication failedThe Foundry project managed identity lacks AcrPull, or Container Registry Repository Reader on an ABAC registry. Grant it before retrying.
container registry endpoint not foundACR is not configured. Use azd env set AZURE_CONTAINER_REGISTRY_ENDPOINT <url>, or switch to code deploy.
Agent version poll times outBuild still running; retry azd ai agent show after a minute.
session_not_ready (424)Cold start or readiness delay. Wait 15-30 seconds and retry. If persistent, use 1 CPU / 2Gi memory minimum, verify the model deployment name, capability host, and agent identity role.
invalid value "json" for --output from azd ai agent invokeInvoke supports only default and raw currently. Retry without --output json.
could not resolve agent service in azd project: no azure.ai.agent service named '<agentName>' found in azure.yaml from azd ai agent invokeName mismatch. Use the service name, update the azure.yaml service block, or use --agent-endpoint when invoking outside the project.
subscription quota exceededAsk user to request quota; do not auto-retry.
Bicep deploy errorsForward error.details[] verbatim to the user.
RoleAssignmentUpdateNotPermitted during provisionA role assignment already exists but conflicts. Check for existing role assignments with az role assignment list --scope <resource-scope>. The provision may have succeeded for all resources except RBAC — verify with azd ai project show and manually assign the Cognitive Services User role to the agent identity if needed.
eval generate: one of --gen-instruction ... is requiredRetry with --gen-instruction "<agent purpose>" (Step 6 option (a)).
unknown command "init" for "azd ai agent eval"Command was renamed: use azd ai agent eval generate (requires azd CLI with azure.ai.agents extension up to date).

For deeper logs, see troubleshoot.

Workflow -- Managed Harness Agent (azd)

A Microsoft Foundry Managed Harness Agent is a declarative Prompt Agent configuration that this workflow deploys with azd. Read create-managed-harness before creating or editing it.

Step 1: Resolve and validate

Inside the azd project, select the service and verify that it is a Prompt Agent using either recognized Copilot harness discriminator. New authoring uses:

host: azure.ai.agent
kind: prompt
harness:
  type: microsoft_copilot_preview

Existing services may use legacy github_copilot_preview; preserve the authored harness and toolset discriminator family. Reject Hosted-only code/container fields. Do not convert an ordinary Prompt or Hosted Agent in place.

Resolve the active environment:

azd env get-values
azd ai project show --output json
azd ai agent show --output json

If the Agent is not deployed, continue to provisioning. If active/deployed, skip provisioning unless infrastructure changed.

Step 2: Provision when required

Run azd provision --no-prompt only for a new Foundry project, a new model deployment, or another real infrastructure change. If no project is configured and the user did not select a new or existing project, stop and ask.

A Managed Harness Agent does not require Hosted Agent source packaging, Docker, ACR, runtime, protocol, or container configuration.

Step 3: Deploy
azd deploy <service-name> --no-prompt

Deployment reads the Prompt Agent definition from azure.yaml and creates a new immutable version. It must not package source or build a container.

Step 4: Verify and invoke
azd ai agent show --output json

Verify the version is active/deployed and the published definition retains:

  • kind: prompt

  • New definitions use harness.type: microsoft_copilot_preview.

  • Existing definitions retain their authored Microsoft or legacy GitHub harness/toolset discriminator family.

  • Requested direct tools

  • Exact versioned Toolbox MCP endpoint and matching short project_connection_id, when explicitly configured

  • Versioned Skill references, when explicitly configured

A successful deploy that drops the harness is a failure. A redeploy that silently changes an existing Copilot harness or toolset discriminator family is also a failure.

Run one remote smoke invocation:

azd ai agent invoke <service-name> "hello, are you up?"

Follow the Managed Harness Agent branch in invoke. Do not use Hosted sessions/files/monitor and do not start evaluation generation in Phase 1.

Step 5: Hand off

Show Agent name, version, project, model, harness, tools, optional Toolbox, deployment status, and smoke-test status.

Common failure modes -- Managed Harness Agent

ErrorFix
Deploy packages code/containerRemove Hosted-only fields and verify kind: prompt
Published definition lacks harnessFix harness.type, verify the extension version, and redeploy
Tool shape rejectedRead the matching Managed Harness Agent tool reference and preserve REST field names
Connection missingUse a user-supplied/existing configured connection, or create it only on explicit request
Toolbox MCP returns 401Verify the MCP tool has a matching UserEntraToken project connection with audience https://ai.azure.com and target equal to the exact versioned Toolbox endpoint

Workflow -- Voice Agent (azd)

Follow Voice Agent deployment for Prompt Voice and Hosted Voice provisioning, deployment order, and two-stage verification.

Workflow -- Prompt agent (MCP)

Ordinary Prompt Agents are not containerized -- they are a model + instructions + optional tools, created through the Foundry MCP server. Do not use this branch for a Managed Harness Agent.

MCP tools
ToolPurpose
agent_definition_schema_getGet the schema (schemaType: "prompt").
agent_updateCreate or update; supports isCloneRequest + cloneTargetAgentName.
agent_getList or fetch one.
agent_deleteDelete an agent.
Steps
  1. Collect config -- resolve endpoint from azd env get-values or ask. Then ask for agent name, model deployment (e.g. gpt-4o), and optional instructions, temperature, tools.

  2. Get schema -- agent_definition_schema_get with schemaType: "prompt".

  3. Create -- agent_update with {"kind": "prompt", "model": "<deployment>", "instructions": "...", "temperature": 0.7}.

  4. Smoke test -- follow invoke.

  5. Auto-generate evaluation suite -- see Step 5: Auto-Generate Evaluation Suite (Prompt) below.

  6. Hand off -- evaluate via observe; clone via agent_update + isCloneRequest; delete via agent_delete.

Step 5: Auto-Generate Evaluation Suite (Prompt) (MANDATORY — RUNS AUTOMATICALLY)

⚠️ Pre-summary gate. If you are about to write a deployment summary or Playground link and Step 5 has not run, you are violating this skill. Run Step 5 first.

This step runs automatically after deploy. Ask the user which source to use and start it right after deploy succeeds — with --no-wait, generate returns in seconds and generation runs server-side, so it overlaps with invoke/test steps and finishes faster overall.

"Your agent is deployed. Want me to set up an evaluation suite now? (a) Yes — current agent instructions (synthetic Q&A), (b) Yes — historical traces (last 3 days), (c) Yes — use existing eval.yaml, (d) No / later."

ChoiceCommandWhat's next
(a) Agent instructionsazd ai agent eval generate --gen-instruction "<agent purpose>" --no-wait --no-promptGeneration runs server-side. Tell the user: "Suite submitted. Run azd ai agent eval run whenever you're ready — it'll finalize eval.yaml and execute the eval in one step."
(b) Historical tracesazd ai agent eval generate --trace-days 3 --max-samples 50 --no-wait --no-promptSame as (a).
(c) Existing eval.yamlSkip generate.Tell the user: "Using existing eval.yaml. Run azd ai agent eval run when ready."
(d) No / laterSkip.Tell the user: "You can run azd ai agent eval generate (and then eval run) anytime."

Common failure modes -- Prompt

ErrorFix
Schema fetch failedVerify endpoint format: https://<resource>.services.ai.azure.com/api/projects/<project>.
Agent creation failedUse agent_definition_schema_get to verify the definition.
Permission deniedUser needs Foundry User role on the project.
Model not foundDeploy the model first via models/deploy-model.

Display agent details

After a successful deploy, show the agent's name, version, status, and endpoints in a table. Include a Playground link:

https://ai.azure.com/nextgen/r/{encodedSubId},{resourceGroup},,{accountName},{projectName}/build/agents/{agentName}/build?version={agentVersion}

encodedSubId is the subscription GUID as URL-safe base64 (no =):

python -c "import base64,uuid;print(base64.urlsafe_b64encode(uuid.UUID('<SUBSCRIPTION_ID>').bytes).rstrip(b'=').decode())"

For hosted agents, playground_url is in azd ai agent show --output json.

After Deployment — Auto-Generate Evaluation Suite

Reference for Step 6 options (a) and (b) — start generate right after deploy so its server-side generation overlaps with invoke/test steps and finishes faster. Options (c) and (d) skip generate and go straight to section 3 (run) or stop.

1. Inspect existing eval.yaml

Check the selected agent root for eval.yaml:

  • Exists and matches the selected agent → skip generate; go to step 3 (run).

  • Missing or stale → continue to step 2.

2. Submit generation (asynchronous, server-side)

Run azd ai agent eval generate --no-wait with the user's chosen flags (see the Step 6 table). The command:

  • Submits dataset + evaluator generation jobs server-side.

  • Returns in seconds.

  • Writes pending operation IDs to local azd state.

  • Writes a placeholder eval.yaml at the agent root (override with --out-file <path>).

No skill-side polling, terminal handle, or later-turn re-check is needed. azd ai agent eval run (section 3) automatically resumes a pending generation, downloads artifacts, finalizes eval.yaml, then runs the eval.

If the user wants to wait synchronously instead (e.g., to inspect eval.yaml before running), drop --no-wait — generate will then submit the jobs, wait for completion, download review artifacts, and write the finalized eval.yaml before returning (typically several minutes).

3. Run the suite
azd ai agent eval run

Use azd ai agent eval show -O results.json to inspect run details, or azd ai agent eval list to see history.

4. Refresh datasets/evaluators (later)

When local files under datasets/<suite>/ or evaluators/<suite>/ change, run azd ai agent eval update --dataset-only or --evaluator-only to upload new versions. azd bumps the version fields in eval.yaml.

5. Prompt User

"Your agent is deployed and evaluation suite generation is submitted server-side (still running, takes several minutes). Would you like to run an evaluation now? azd ai agent eval run will wait for generation to finish, then execute the eval."

  • Yes → run azd ai agent eval run (this resumes the pending generation, then runs the eval — may take several minutes the first time), then follow the observe skill to interpret results.

  • No → stop. The user can return later via azd ai agent eval run — it will pick up wherever the pending generation is.

  • Production trace analysis → follow the trace skill.

Non-Interactive / YOLO Mode

Even in --no-prompt / --yolo mode: if the user named a foundry project or asked to create one, go ahead; otherwise stop and ask before provisioning.

  • Hosted: always pass --no-prompt.

  • Prompt: all required values (project endpoint, agent name, model deployment) must come from the user message or azd env get-values; missing values should fail loudly rather than prompt.

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