Kuratera avsiktsbaserad verktygslåda i Foundry (förhandsversion)

Viktigt

Objekt markerade (förhandsversion) i den här artikeln är för närvarande i offentlig förhandsversion. Den här förhandsversionen tillhandahålls utan ett serviceavtal och vi rekommenderar det inte för produktionsarbetsbelastningar. Vissa funktioner kanske inte stöds eller har begränsade funktioner. Mer information finns i Supplemental Terms of Use for Microsoft Azure Previews.

En enda agent kan vara beroende av flera verktyg – API:er, MCP-servrar (Model Context Protocol), anslutningsappar och flöden – var och en med sin egen autentiseringsmodell och sitt ägande team. När du skalar över en organisation implementerar teamen om samma verktyg oberoende av varandra, autentiseringsuppgifter dupliceras, styrningen blir inkonsekvent och det finns liten insyn i vilka verktyg som finns eller vem som använder dem. Utvecklarna stannar upp, inte för att modellerna inte är kompatibla, utan för att verktygsintegrering blir flaskhalsen.

Diagram som visar flera agenter som var och en kopplar sina egna verktyg med olika autentiseringsmodeller och duplicerade inloggningsuppgifter.

Företag har redan infrastrukturen: gatewayer, valv för autentiseringsuppgifter, principer och observerbarhet. Det som har saknats är en utvecklarupplevelse som paketera infrastrukturen i något som kan återanvändas, upptäckas och styras som standard.

Verktygslådan tillhandahåller den upplevelsen. Definiera en kuraterad uppsättning verktyg en gång, hantera dem centralt i Foundry och exponera dem via en enda MCP-kompatibel slutpunkt som alla agenter kan använda. Plattformen hanterar inmatning av autentiseringsuppgifter, tokenuppdatering och företagsprinciptillämpning vid körningstid.

Verktygslådan omfattar hela verktygslivscykeln genom fyra pelare – Build and Consume är tillgängliga idag:

Grundpelare Status Vad den aktiverar
Bygga Tillgänglig idag Välj verktyg, konfigurera autentisering centralt och publicera en återanvändbar verktygslåda som alla team kan använda.
Konsumera Tillgänglig idag Anslut alla agenter till en enda MCP-kompatibel slutpunkt för att dynamiskt identifiera och anropa alla verktyg i verktygslådan.

Diagram som visar verktygslådor i Foundry-arkitekturen: Skapa och förbruka pelare som används av LangGraph, Microsoft Agent Framework, GitHub Copilot, Claude Code och Microsoft Copilot Studio, som styrs av default.

Du skapar verktygslådor i Foundry, men förbrukningsytan är öppen. Alla MCP-kompatibla agentkörningar eller -klienter kan använda en verktygslåda – inklusive agenter som skapats med alla ramverk, MCP-aktiverade IDE:er och anpassad kod.

Eftersom en verktygslåda är en hanterad resurs kan du lägga till, ta bort eller konfigurera om verktyg utan att ändra kod i din agent. Din agent ansluter alltid till en enda slutpunkt. Versionshantering i verktygslådan ger dig explicit kontroll över när ändringarna börjar gälla – skapa och testa en ny version och höj sedan upp den till standard när du är redo. Varje agent som pekar på verktygslådan plockar upp den upphöjda versionen automatiskt, utan kodändringar och ingen omdistribution.

I den här artikeln lär du dig att:

  • Skapa en verktygslåda med ett eller flera verktyg.
  • Hämta MCP-slutpunkten för verktygsuppsättningen.
  • Kontrollera att verktygen läses in korrekt.
  • Integrera en verktygslåda i din värdbaserade agent.
  • Hantera verktygslådeversioner och höj upp en version till standard.

Information om verktygskonfigurationssyntax och autentiseringsalternativ för varje verktygstyp finns i Konfigurera verktyg.

Funktionsstöd

Funktion Python SDK REST API .NET SDK JavaScript SDK azd (distribuera) Gjuteri Verktygslåda
Uppdatera, lista, hämta och ta bort verktygslådan ✔️ ✔️ ✔️ ✔️ Ej tillämpligt ✔️
Skapa verktygslådeversion ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Lista över verktygslådasversioner, hämta och ta bort ✔️ ✔️ ✔️ ✔️ Ej tillämpligt Nej. Användargränssnittet visar endast den senaste versionen.
MCP-verktyg ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Webbsökningsverktyg ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Azure AI-sökning-verktyg ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Kodtolkarverktyg ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Filsökningsverktyg ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
OpenAPI-verktyg ✔️ ✔️ ✔️ ✔️ ✔️ Nej
A2A-verktyg (Agent-till-Agent) ✔️ ✔️ ✔️ ✔️ ✔️ Nej

Förutsättningar

  • Ett aktivt Microsoft Foundry-projekt.
  • RBAC: Bevilja rollen Azure AI User i Foundry-projektet till varje identitet som gäller för ditt scenario:
    • Utvecklare (krävs alltid) – den identitet som skapar, uppdaterar och hanterar verktygslådeversioner.
    • Agentidentitet (krävs om du använder en värdbaserad agent) – agentens hanterade identitet som anropar verktyg vid körning.
    • Slutanvändare (krävs endast för OAuth-flöden) – alla användare vars identitet överförs via OAuth- eller UserEntraToken-anslutningar (till exempel OAuth-baserade MCP- eller 1P OBO-flöden).
  • Ditt Foundry-projekt måste finnas i en av de regioner som stöds. Enskilda verktygstyper i en verktygslåda begränsas ytterligare av region och modell – alla verktygstyper är inte tillgängliga i varje region eller med varje modell. Se Region- och modellkompatibilitet.
  • Visual Studio Code (VS Code).
  • Installera Microsoft Foundry Toolkit för Visual Studio Code (tidigare AI Toolkit för VS Code) från Visual Studio Code Marketplace. Stöd för verktygslådan i Foundry Toolkit är för närvarande i förhandsversion.
  • Python SDK: pip install azure-ai-projects azure-identity
  • .NET SDK: dotnet add package Azure.AI.Projects --prerelease och dotnet add package Azure.Identity
  • JavaScript SDK: npm install @azure/ai-projects @azure/identity
  • azd (deploy): Installera Azure Developer CLI och agenttillägget: azd extension install azure.ai.agents

Viktigt

  • En verktygslåda stöder högst ett verktyg utan ett name fält per verktygstyp (webbsökning, Azure AI-sökning, kodtolkare, filsökning). Om du vill inkludera fler än en instans av samma verktygstyp anger du en unik name för varje instans för att särskilja dem. Att inkludera två instanser av samma typ utan ett name returnerar ett invalid_payload fel. Mer information finns i Flera verktygstyper.
  • Lägg till ett description i varje verktyg i verktygslådan för att hjälpa modellen att välja rätt verktyg för varje begäran.
  • Granska noggrant varje verktygs dokumentation för att lära dig mer om konfiguration, begränsningar och varningar för enskilda verktyg.

Steg 1: Skapa en verktygslådeversion

Skapa en verktygslåda baserat på de verktyg du behöver.

from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import MCPTool, WebSearchTool

# Create Foundry project client
endpoint = "https://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>"
project = AIProjectClient(
    endpoint=endpoint,
    credential=DefaultAzureCredential(),
)

# Create toolbox version with web search and MCP tools
toolbox_version = project.beta.toolboxes.create_toolbox_version(
    toolbox_name="my-toolbox",
    description="Toolbox with web search and an MCP server",
    tools=[
        WebSearchTool(),
        MCPTool(
            server_label="myserver",
            server_url="https://your-mcp-server.example.com",
            require_approval="never",
            project_connection_id="my-key-auth-connection",
        ),
    ],
)
print(f"Created toolbox: {toolbox_version.name}, version: {toolbox_version.version}")
using Azure.Identity;
using Azure.AI.Projects;

// Create Foundry project client
var projectEndpoint = "https://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>";
AIProjectClient projectClient = new(new Uri(projectEndpoint), new DefaultAzureCredential());
AgentToolboxes toolboxClient = projectClient.AgentAdministrationClient.GetAgentToolboxes();

ProjectsAgentTool webTool = ProjectsAgentTool.AsProjectTool(
    ResponseTool.CreateWebSearchTool());

ProjectsAgentTool mcpTool = ProjectsAgentTool.AsProjectTool(ResponseTool.CreateMcpTool(
    serverLabel: "myserver",
    serverUri: new Uri("https://your-mcp-server.example.com"),
    toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
        GlobalMcpToolCallApprovalPolicy.NeverRequireApproval
    )
));

ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "my-toolbox",
    tools: [webTool, mcpTool],
    description: "Toolbox with web search and an MCP server"
);
Console.WriteLine($"Created toolbox: {toolboxVersion.Name}, version: {toolboxVersion.Version}");
POST {project_endpoint}/toolboxes/my-toolbox/versions?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json

{
  "description": "Toolbox with web search and an MCP server",
  "tools": [
    {
      "type": "web_search",
      "description": "Search the web for current information"
    },
    {
      "type": "mcp",
      "server_label": "myserver",
      "server_url": "https://your-mcp-server.example.com",
      "require_approval": "never",
      "project_connection_id": "my-key-auth-connection"
    }
  ]
}

Observera

Använd tokenomfång https://ai.azure.com/.default när du hämtar bärartoken.

import { DefaultAzureCredential } from "@azure/identity";
import { AIProjectClient } from "@azure/ai-projects";

// Create Foundry project client
const projectEndpoint = "https://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>";

const project = new AIProjectClient(projectEndpoint, new DefaultAzureCredential());

const toolboxVersion = await project.beta.toolboxes.createVersion(
  "my-toolbox",
  [
    {
      type: "web_search",
      description: "Search the web for current information",
    },
    {
      type: "mcp",
      server_label: "myserver",
      server_url: "https://your-mcp-server.example.com",
      require_approval: "never",
      project_connection_id: "my-key-auth-connection",
    },
  ],
  {
    description: "Toolbox with web search and an MCP server",
  },
);
console.log(`Created toolbox: ${toolboxVersion.name}, version: ${toolboxVersion.version}`);

Använd Foundry Toolkit i Visual Studio Code för att skapa och publicera en verktygslåda från vyn Tools.

  1. Välj Foundry Toolkit i aktivitetsfältet.
  2. Under Mina resurser expanderar du Din projektnamn>Verktyg.
  3. Välj ikonen + Lägg till verktygslåda .
  4. På fliken Skapa ett anpassat verktyg anger du verktygslådans namn och beskrivning, lägger till de verktyg du vill använda och väljer sedan Publicera.

När du publicerar en ny verktygslåda skapas den första versionen. Den versionen blir standardversionen automatiskt.

Screenshot av Foundry Toolkit i Visual Studio Code som visar vyn Skapa en anpassad verktygslåda med fält för verktygslådans namn, beskrivning och verktyg, plus åtgärden Publicera.

Med hjälp azdav deklarerar du verktygslåderesurser i en agent.yaml fil i stället för att anropa SDK:et. Definiera dina verktyg i avsnittet resources och distribuera med hjälp av azd ai agent init. Exempel agent.yaml för varje verktygstyp finns i Konfigurera verktyg. Det fullständiga distributionsarbetsflödet finns i Distribuera med azd.

Viktigt

Flaggan -m (eller --manifest) krävs för azd ai agent init. Den talar om för kommandot var du hittar agentdefinitionen och källfilerna.

-m kan peka på något av följande:

  • En specifik agent.yaml fil – init kopierar alla filer från samma katalog som manifestet
  • En mapp som innehåller agent.yaml — init kopierar alla filer från den mappen

Alla filer i manifestkatalogen (main.py, Dockerfile, requirements.txt, setup.py och så vidare) kopieras till det scaffolded-projektet under src/<agent-name>/.

# 1. Create a manifest directory with your agent.yaml + source files
mkdir my-agent/manifest
# Copy agent.yaml, main.py, Dockerfile, requirements.txt into my-agent/manifest/

# 2. Initialize the azd project (note: -m is REQUIRED)
cd my-agent
$PROJECT_ID = "/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.CognitiveServices/accounts/<account>/projects/<project>"
azd ai agent init -m https://github.com/microsoft/hosted-agents-vnext-private-preview/main/samples/python/toolbox/azd/agent.yaml --project-id $PROJECT_ID -e my-env
# Or equivalently: azd ai agent init -m manifest/ --project-id $PROJECT_ID -e my-env
# ↑ If your agent.yaml declares {{ param }} secrets (e.g., github_pat), you will be prompted to enter
#   them interactively HERE — before init completes. This is the only safe time to supply credentials.
# NOTE: Do NOT use --no-prompt here — it skips the prompt and leaves {{ param }} credentials empty (see Troubleshooting: Credentials Empty with --no-prompt)

# 3. CRITICAL post-init fixes (see "Post-Init Checklist" below)
azd env set enableHostedAgentVNext "true" -e my-env
azd env set AZURE_AI_MODEL_DEPLOYMENT_NAME "gpt-4o" -e my-env  # must match the deployment name in azure.yaml

# 4. Provision infrastructure (creates connections via Bicep)
azd provision -e my-env

# 5. Deploy agent (creates toolboxes, container image, agent version)
azd deploy -e my-env

# 6. Invoke the agent (MUST run from the scaffolded project directory)
azd ai agent invoke --new-session "tell me about the latest news in Microsoft Foundry" --timeout 120

Agent.yaml:

kind: hosted
name: toolbox-azd-test
description: LangGraph agent wired for toolbox MCP.
metadata:
  tags:
    - AI Agent Hosting
    - LangGraph

# template: contains the ContainerAgent definition (kind: hosted).
# These fields are used to generate src/<agent>/agent.yaml during init.
template:
  kind: hosted
  protocols:
    - protocol: responses
      version: 1.0.0
  environment_variables:
    # FOUNDRY_PROJECT_ENDPOINT and FOUNDRY_AGENT_TOOLBOX_* are injected
    # automatically by the platform at runtime — do NOT declare them here.
    - name: AZURE_OPENAI_ENDPOINT
      value: ${AZURE_OPENAI_ENDPOINT}
    - name: AZURE_AI_MODEL_DEPLOYMENT_NAME
      value: ${AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o}
    - name: TOOLBOX_NAME
      value: ${TOOLBOX_NAME=agent-tools}

# parameters: secret values prompted at init time (or set via azd env).
# azd uppercases the param name to find the env var: github_pat → GITHUB_PAT.
parameters:
  github_pat:
    secret: true
    description: GitHub Personal Access Token (classic ghp_... or fine-grained github_pat_...)

# resources: connections and toolboxes scaffolded into azure.yaml by azd ai agent init.
resources:
  - kind: connection
    name: github-mcp-conn
    target: https://api.githubcopilot.com/mcp
    category: remoteTool
    credentials:
      type: CustomKeys
      keys:
        Authorization: "Bearer {{ github_pat }}"

  - kind: toolbox
    name: agent-tools
    tools:
      - type: web_search
      - type: mcp
        server_label: github
        server_url: https://api.githubcopilot.com/mcp
        project_connection_id: github-mcp-conn

Steg 2: Hämta verktygslådans MCP-slutpunkt

Det finns två slutpunktsmönster beroende på din roll:

Roll Slutpunkt När du ska använda
Verktygslådeutvecklare {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1 Testa eller verifiera en viss version innan du befordrar den till standardversion.
Konsument av verktygssvit {project_endpoint}/toolboxes/{toolbox_name}/mcp?api-version=v1 Anslut agenter till verktygslådan. Serverar alltid default_version. Den första versionen som du skapar anges automatiskt som standard.

Viktigt

Varje begäran till verktygslådans MCP-slutpunkt måste innehålla rubriken Foundry-Features: Toolboxes=V1Preview. Anrop som utelämnar den här headern misslyckas. Inkludera det i alla HTTP-klienter, MCP-transporter och SDK-omslutningar som anropar verktygslådans slutpunkt.

Observera

Den första versionen av en ny verktygslåda höjs automatiskt upp till default_version (v1). Om du behöver ändra standardvärdet senare kan du läsa Höja upp en version till standard.

I Foundry Toolkit for Visual Studio Code kopierar du konsumentslutpunkten för verktygslådan från vyn Toolboxes.

  1. Välj Foundry Toolkit i aktivitetsfältet.
  2. Under Mina resurser expanderar du Din projektnamn>Verktyg.
  3. Leta upp verktygslådan på fliken Verktygslådor .
  4. Kopiera slutpunkten i kolumnen Slutpunkts-URL .

Slutpunkts-URL-värdet är verktygslådekonsumentens slutpunkt. Om du vill skapa en versionsspecifik slutpunkt använder du utvecklarmönstret som visas i föregående tabell.

Skärmbild av Foundry Toolkit i Visual Studio Code som visar verktygslådans vy med verktygslådans slutpunkts-URL och kodmallsåtgärden Scaffold.

Steg 3: Verifiera verktygets tillgänglighet

Innan du kör den fullständiga agenten kontrollerar du att verktygslådan läser in de förväntade verktygen med hjälp av en MCP-klient-SDK mot slutpunkten. Använd den versionsspecifika slutpunkten för att verifiera en version innan du befordrar den till standard.

Installera MCP-klient-SDK:

pip install mcp

Ansluta till verktygslådan och listverktygen

import asyncio
from azure.identity import DefaultAzureCredential
from mcp.client.streamable_http import streamablehttp_client
from mcp import ClientSession

url = "https://<account>.services.ai.azure.com/api/projects/<proj>/toolboxes/<name>/versions/<version>/mcp?api-version=v1"

token = DefaultAzureCredential().get_token("https://ai.azure.com/.default").token
headers = {
    "Authorization": f"Bearer {token}",
    "Foundry-Features": "Toolboxes=V1Preview",
}

async def verify_toolbox():
    async with streamablehttp_client(url, headers=headers) as (read, write, _):
        async with ClientSession(read, write) as session:
            await session.initialize()

            # List available tools
            tools_result = await session.list_tools()
            print(f"Tools found: {len(tools_result.tools)}")
            for tool in tools_result.tools:
                print(f"  - {tool.name}: {(tool.description or '')[:80]}")

            # Call a tool (replace with actual tool name and arguments)
            result = await session.call_tool("<tool_name>", arguments={})
            print(result)

asyncio.run(verify_toolbox())

Observera

Använd fliken REST API för att verifiera verktygets tillgänglighet från .NET eller använd Python MCP-klient-SDK.

Använd den versionsspecifika slutpunkten (/versions/{version}/mcp) för att verifiera en version innan du marknadsför den.

1. Initiera MCP-sessionen:

POST {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
Foundry-Features: Toolboxes=V1Preview

{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}

2. Skicka det initierade meddelandet:

POST {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
Foundry-Features: Toolboxes=V1Preview

{"jsonrpc":"2.0","method":"notifications/initialized"}

3. Lista tillgängliga verktyg:

POST {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
Foundry-Features: Toolboxes=V1Preview

{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}

4. Anropa ett verktyg:

POST {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
Foundry-Features: Toolboxes=V1Preview

{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"<TOOL_NAME>","arguments":{}}}

Installera MCP-klient-SDK:

npm install @modelcontextprotocol/sdk

Ansluta till verktygslådan och listverktygen

import { DefaultAzureCredential } from "@azure/identity";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
import { Client } from "@modelcontextprotocol/sdk/client/index.js";

const url = "https://<account>.services.ai.azure.com/api/projects/<proj>/toolboxes/<name>/versions/<version>/mcp?api-version=v1";

const credential = new DefaultAzureCredential();
const token = await credential.getToken("https://ai.azure.com/.default");

const transport = new StreamableHTTPClientTransport(
  new URL(url),
  {
    requestInit: {
      headers: {
        Authorization: `Bearer ${token.token}`,
        "Foundry-Features": "Toolboxes=V1Preview",
      },
    },
  },
);

const client = new Client({ name: "test", version: "1.0" });
await client.connect(transport);

// List available tools
const toolsResult = await client.listTools();
console.log(`Tools found: ${toolsResult.tools.length}`);
for (const tool of toolsResult.tools) {
  console.log(`  - ${tool.name}: ${(tool.description || "").slice(0, 80)}`);
}

// Call a tool (replace with actual tool name and arguments)
const result = await client.callTool({ name: "<tool_name>", arguments: {} });
console.log(result);

await client.close();

Använd slutpunkten från steg 2 tillsammans med ett förberett värdbaserat agentexempel för att testa inläsning av verktygslådan i VS Code.

  1. I Foundry Toolkit, under Mina resurser>Ditt projektnamn>Verktyg, letar du upp den verktygslåda som du vill testa.
  2. Välj Scaffold-kodmall.
  3. Välj en projektmapp när du uppmanas att göra det.
  4. Följ de genererade README.md för att installera beroenden, konfigurera miljövariabler och kör exemplet lokalt.
  5. Använd Agent Inspector eller kör python main.py för att bekräfta att verktygslådan läser in och svarar.

Använd fliken Python eller REST API i det här steget för versionsspecifik validering innan du höjer upp en ny verktygslåda.

Observera

Använd fliken REST API för att verifiera verktygets tillgänglighet eller använd Python MCP-klient-SDK.

Kontrollera – initiera: HTTP 200. Om du hoppar över initieringssteget misslyckas efterföljande anrop.

Kontrollera – tools/list:

  • len(tools) > 0 – tom innebär att toolbox-versionen inte har konfigurerats korrekt.
  • Varje verktyg har name, descriptionoch inputSchema. Information om namngivningskonventioner för verktyg finns i MCP-specifikationen.
  • inputSchema har ett properties fält (vissa MCP-servrar utelämnar det här fältet, vilket bryter OpenAI).
  • För MCP-verktyg är namn prefixet server_label med - till exempel myserver.some_tool. För alla andra verktygstyper är name namnet fältvärdet eller standardverktygets namn.
  • MCP-verktyg innehåller ett _meta.tool_configuration block som innehåller körningsinställningar som require_approval. Se Hantera krav för godkännande av verktyg.
  • Observera de exakta parameternamnen för anropssteget (till exempel query vs queries).

Kontrollera - tools/call:

  • Inget fält på den översta nivån error . Om närvarande, inspektera error.code. Vanliga MCP-felkoder finns i MCP-specifikationen:
    • -32006 → OAuth-medgivande krävs (extrahera URL från error.message).
    • Andra koder → fel på serversidan.
  • result.content[] innehåller poster med "type": "text" – detta är verktygets utdata.
  • För AI Search, kontrollera result.structuredContent.documents[] för chunkmetadata (title, url, id, score).
  • För filsökning, kontrollera result.content[].resource._meta segmentmetadata (title, file_id, document_chunk_id, score).
  • För Webbsökning, kontrollera result.content[].resource._meta.annotations[] för URL-referenser (type, url, title, start_index, end_index).
  • Leta efter "ServerError" i textinnehåll – verktyget kördes men stötte på ett internt fel.

Exempel på verktygsspecifika tools/call argument:

Verktygstyp Argumenten
AI-sökning {"query": "search text"}
Filsökning {"queries": ["search text"]}
Kodtolkare {"code": "print(2 ** 100)"}
Webbsökning {"search_query": "weather in seattle"}
A2A {"message": {"parts": [{"type": "text", "text": "Hello"}]}}
MCP {"query": "what is agent service"}

Steg 4: Integrera verktygslådan i din agent

LangGraph

.env fil:

FOUNDRY_PROJECT_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>
FOUNDRY_AGENT_TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1
TOOLBOX_NAME=agent-tools
FOUNDRY_AGENT_TOOLBOX_FEATURES=Toolboxes=V1Preview
AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o

main.py (nyckelmönster):

from langchain_azure_ai.tools import AzureAIProjectToolbox

toolbox = AzureAIProjectToolbox(toolbox_name=TOOLBOX_NAME)
tools = await toolbox.get_tools()

Se det fullständiga exemplet för den fullständiga implementeringen.

Viktigt

Klassen langchain_azure_ai.tools.AzureAIProjectToolbox kräver langchain-azure-ai[tools]>1.2.3.

Microsoft Agent Framework

Använd MCPStreamableHTTPTool från Agent Framework SDK för att ansluta direkt till mcp-slutpunkten för verktygslådan.

.env fil:

FOUNDRY_PROJECT_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>
FOUNDRY_AGENT_TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1
FOUNDRY_AGENT_TOOLBOX_FEATURES=Toolboxes=V1Preview
AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o

main.py (nyckelmönster):

# Auth: wrap token provider in an httpx.Auth subclass
credential = DefaultAzureCredential()
token_provider = get_bearer_token_provider(credential, "https://ai.azure.com/.default")
http_client = httpx.AsyncClient(
    auth=_ToolboxAuth(token_provider),
    headers={"Foundry-Features": "Toolboxes=V1Preview"},
    timeout=120.0,
)

# Toolbox MCP endpoint (platform-injected at runtime via FOUNDRY_AGENT_TOOLBOX_ENDPOINT)
TOOLBOX_ENDPOINT = "https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1"

# Connect MCPStreamableHTTPTool to the toolbox endpoint
mcp_tool = MCPStreamableHTTPTool(
    name="toolbox",
    url=TOOLBOX_ENDPOINT,
    http_client=http_client,
    load_prompts=False,
)

agent = chat_client.as_agent(
    name="my-toolbox-agent",
    instructions="You are a helpful assistant with access to Foundry toolbox tools.",
    tools=[mcp_tool],
)
ResponsesAgentServerHost().run()

Se det fullständiga exemplet för den fullständiga implementeringen.

Copilot SDK

Använd GitHub Copilot SDK för att skapa en agent driven av verktygslåda som kopplar ihop Copilots verktygsanrop med MCP-slutpunkten för Foundry-verktygslådan.

Observera

Copilot SDK avvisar verktygsnamn som innehåller punkter. Bryggan ersätter automatiskt . med _ i verktygsnamn. Blir till exempel myserver.get_infomyserver_get_info.

.env fil:

GITHUB_TOKEN=<your-github-token>
FOUNDRY_AGENT_TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1

agent.py (nyckelmönster – MCP-brygga):

# 1. Open an MCP session to the toolbox endpoint
bridge = McpBridge(endpoint=TOOLBOX_ENDPOINT, token=_get_toolbox_token())
await bridge.initialize()
mcp_tools = await bridge.list_tools()

# 2. Map MCP tool list to Copilot SDK tool definitions
#    Dots in tool names are replaced with underscores (Copilot SDK requirement)
copilot_tools = [
    {
        "name": t["name"].replace(".", "_"),
        "description": t.get("description", ""),
        "parameters": t.get("inputSchema", {}),
    }
    for t in mcp_tools
]

# 3. Wire tool calls back to the MCP session
async def tool_handler(name: str, arguments: dict) -> str:
    return await bridge.call_tool(name.replace("_", ".", 1), arguments)

# 4. Run the Copilot SDK agent
agent = Agent(
    tools=copilot_tools,
    tool_handler=tool_handler,
    token=os.environ["GITHUB_TOKEN"],
)

Se det fullständiga exemplet för den fullständiga implementeringen.

Microsoft Agent Framework

Använd ResponsesServer från Agent Framework SDK med en anpassad ToolboxMcpClient för att identifiera och anropa verktygslådan via MCP-slutpunkten.

Miljövariabler:

AZURE_OPENAI_ENDPOINT=https://<account>.services.ai.azure.com
AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o
TOOLBOX_MCP_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1

Program.cs (nyckelmönster):

using Azure.AI.AgentServer.Responses;
using Azure.AI.AgentServer.Responses.Models;
using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Extensions.DependencyInjection;
using OpenAI.Chat;

// Azure OpenAI endpoint and model deployment
var openAiEndpoint = "https://<account>.services.ai.azure.com";
var deployment = "gpt-4o";  // supports all toolbox tool types

// Toolbox MCP endpoint (platform-injected at runtime via TOOLBOX_MCP_ENDPOINT)
var toolboxEndpoint = "https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1";

// Azure OpenAI client
var credential = new DefaultAzureCredential();
var openAIClient = new AzureOpenAIClient(new Uri(openAiEndpoint), credential);
var chatClient = openAIClient.GetChatClient(deployment);

// Toolbox MCP client — discovers tools via tools/list, calls them via tools/call
var toolboxClient = new ToolboxMcpClient(toolboxEndpoint, credential);

ResponsesServer.Run<ToolboxHandler>(configure: builder =>
{
    builder.Services.AddSingleton(new AgentConfig(chatClient, toolboxClient));
});

ToolboxMcpClient omsluter direkta JSON-RPC-anrop till MCP-slutpunkten. ToolboxHandler ansluter anrop från LLM-verktyg tillbaka till MCP-klienten genom att använda en standardanropsslinga. Fullständig implementering av båda klasserna finns i det fullständiga exemplet.

Observera

Integreringsexempel för det här steget är endast tillgängliga för Python och .NET.

Observera

Integreringsexempel för det här steget är endast tillgängliga för Python och .NET.

Använd Foundry Toolkit för att strukturera ett värdbaserat agentexempel som redan är integrerat med din verktygslåda.

  1. Välj Foundry Toolkit i aktivitetsfältet.
  2. Under Mina resurser expanderar du Din projektnamn>Verktyg.
  3. På fliken Verktygslådor letar du upp den verktygslåda som du vill använda och väljer sedan Kodmall för ställning.
  4. I kommandopaletten väljer du en projektmapp när du uppmanas att göra det.
  5. Öppna den genererade README.md och följ anvisningarna för konfiguration, lokal körning och distribution för grundstrukturen.

Det genererade projektet innehåller den värdbaserade agentens startpunkt, distributionsfiler och en README.md med de exakta installations-, körnings- och distributionsstegen. Agenten med scaffolding hanterar Foundry-Features: Toolboxes=V1Preview-huvudet åt dig.

Om du vill integrera en verktygslåda i ett befintligt värdbaserat agentprojekt i stället för att generera ett nytt exempel använder du den kopierade slutpunkten från steg 2 med Python eller .NET mönster i det här avsnittet.

Driftsätt med azd

Använd Azure Developer CLI (azd) för att deklarera verktygslåderesurser direkt i en agent.yaml-fil och distribuera agenten med ett enda kommando. Med den här metoden behöver du inte skapa verktygslådan separat via SDK eller REST. azd etablerar verktygslådan, anslutningarna och modelldistributionen tillsammans.

Viktigt

Flaggan -m (eller --manifest) krävs för azd ai agent init. Den talar om för kommandot var du hittar agentdefinitionen och källfilerna. -m kan peka på antingen en specifik agent.yaml fil eller en mapp som innehåller en. Alla filer i manifestkatalogen (main.py, Dockerfile, requirements.txt och liknande) kopieras ordagrant till det skaffoldade projektet under src/<agent-name>/.

Mappstruktur:

my-agent/
├── agent.yaml          # Agent, toolbox, and connection declarations
├── main.py             # LangGraph agent
├── requirements.txt    # All dependencies (Azure SDK + PyPI packages)
├── Dockerfile          # Container build

agent.yaml (webbsökning + GitHub MCP-exempel):

name: my-toolbox-agent
description: LangGraph agent with Azure AI Foundry toolbox MCP.
metadata:
  tags:
    - AI Agent Hosting
    - LangGraph
template:
  name: my-toolbox-agent
  kind: hosted
  protocols:
    - protocol: responses
      version: 1.0.0
  environment_variables:
    # FOUNDRY_PROJECT_ENDPOINT and FOUNDRY_AGENT_TOOLBOX_* are injected
    # automatically by the platform at runtime — do NOT declare them here.
    - name: AZURE_AI_MODEL_DEPLOYMENT_NAME
      value: ${AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o}
    - name: TOOLBOX_NAME
      value: ${TOOLBOX_NAME=agent-tools}
parameters:
  github_pat:
    secret: true
    description: GitHub Personal Access Token for MCP connection
resources:
  - kind: connection
    name: github-mcp-conn
    target: https://api.githubcopilot.com/mcp
    category: RemoteTool
    authType: CustomKeys
    credentials:
      keys:
        Authorization: "Bearer {{ github_pat }}"
  - kind: toolbox
    name: agent-tools
    description: Web search and GitHub MCP tools
    tools:
      - type: web_search
      - type: mcp
        server_label: github
        server_url: https://api.githubcopilot.com/mcp
        project_connection_id: github-mcp-conn

Observera

När du distribuerar med resurser från verktygslådan i agent.yaml sätter plattformen in FOUNDRY_AGENT_TOOLBOX_ENDPOINT (bas-URL) och TOOLBOX_{toolbox_name}_MCP_ENDPOINT (fullständig slutpunkt för varje verktygslåda) som miljövariabler. För verktygslådan med namnet agent-toolsblir variabeln per verktygslåda TOOLBOX_AGENT_TOOLS_MCP_ENDPOINT. Din main.py läser per-verktygslådvariabeln eller konstruerar URL:en från FOUNDRY_AGENT_TOOLBOX_ENDPOINT och TOOLBOX_NAME vid körning.

main.py följer samma LangGraph-mönster som visades tidigare. Med hjälp av azdoch FOUNDRY_AGENT_TOOLBOX_ENDPOINTTOOLBOX_{toolbox_name}_MCP_ENDPOINT matas in automatiskt – ingen extra slutpunktskonfiguration krävs i koden.

Distribuera:

# 1. Place agent.yaml and source files in a manifest directory
mkdir my-agent/manifest
# Copy agent.yaml, main.py, Dockerfile, requirements.txt into my-agent/manifest/

# 2. Initialize the azd project (-m is required)
cd my-agent
PROJECT_ID="/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.CognitiveServices/accounts/<account>/projects/<project>"
azd ai agent init -m manifest/ --project-id $PROJECT_ID -e my-env
# If agent.yaml declares {{ param }} secrets (for example, github_pat), you are prompted
# to enter them interactively here. Do NOT use --no-prompt — it leaves credentials empty.

# 3. Set required environment variables
azd env set enableHostedAgentVNext "true" -e my-env
azd env set AZURE_AI_MODEL_DEPLOYMENT_NAME "gpt-4o" -e my-env

# 4. Provision infrastructure (creates connections via Bicep)
azd provision -e my-env

# 5. Deploy agent (creates toolboxes, container image, agent version)
azd deploy -e my-env

# 6. Invoke the agent
azd ai agent invoke --new-session "Hello, what tools do you have?" --timeout 120

Hantera krav för godkännande av verktyg

Verktygslådan returnerar ett _meta.tool_configuration objekt till varje verktygspost som returneras av tools/list. När ett verktyg har require_approval angetts till "always"måste agentkörningen presentera den väntande åtgärden för användaren och vänta på bekräftelse innan verktyget anropas. MCP-slutpunkten blockerar tools/call – tillämpningen är helt agentkörningens ansvar.

Läsa require_approval från tools/list

Varje verktygspost i ett tools/list svar innehåller ett _meta block som returneras av verktygslådan :

{
  "name": "myserver.my_tool",
  "description": "...",
  "inputSchema": { "type": "object" },
  "_meta": {
    "tool_configuration": {
      "type": "mcp",
      "server_label": "myserver",
      "server_url": "https://your-mcp-server.example.com",
      "require_approval": "always"
    }
  }
}
require_approval Värde Beteende
"always" Agenten måste be användaren om bekräftelse före varje anrop.
"never" Agenten kan anropa verktyget fritt.

Implementera godkännandeprocess (LangGraph)

Fråga tools/list vid start för att skapa en godkännandekarta och mata sedan in en begränsning i systemprompten för alla verktyg som kräver godkännande:

async def _fetch_require_approval_tools(
    endpoint: str,
    auth: httpx.Auth,
    extra_headers: dict,
) -> dict[str, str]:
    async with httpx.AsyncClient(auth=auth, headers=extra_headers, timeout=30.0) as hc:
        payload = {"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}
        resp = await hc.post(endpoint, json=payload)
        resp.raise_for_status()
    return {
        t["name"]: t["_meta"]["tool_configuration"]["require_approval"]
        for t in resp.json().get("result", {}).get("tools", [])
        if t.get("_meta", {}).get("tool_configuration", {}).get("require_approval")
    }

När du har läst in verktyg från MCP-klienten identifierar du vilka verktyg som kräver godkännande och justerar systemprompten:

approval_map = await _fetch_require_approval_tools(
    TOOLBOX_ENDPOINT, toolbox_auth, extra_headers
)
always_approval = [name for name, val in approval_map.items() if val == "always"]

Observera

  • Identifiering sker vid start. Godkännandekontrollen körs en gång när agenten initieras. Det finns inga kostnader per samtal.
  • Graciös reserv. Om inga verktyg har require_approval: "always"är systemprompten oförändrad och agenten beter sig som tidigare.
  • require_approval är framtvingat av agent. McP-proxyn för verktygslådan tools/call körs oavsett den här inställningen. Din agent-runtime ansvarar för att styra anropet.

Konfigurera require_approval på ett verktyg

Ange require_approval när du skapar en verktygslådeversion. MCP-verktygsexemplen i steg 1 visar både "always" och "never" värden. Du kan också ange det via SDK:et:

from azure.ai.projects.models import MCPTool

# Set require_approval on an MCP tool
toolbox_version = project.beta.toolboxes.create_toolbox_version(
    toolbox_name="my-toolbox",
    tools=[
        MCPTool(
            server_label="myserver",
            server_url="https://your-mcp-server.example.com",
            require_approval="always",  # "always" | "never"
            project_connection_id="my-connection",
        )
    ],
)
{
  "tools": [
    {
      "type": "mcp",
      "server_label": "myserver",
      "server_url": "https://your-mcp-server.example.com",
      "require_approval": "always",
      "project_connection_id": "my-connection"
    }
  ]
}
ProjectsAgentTool mcpTool = ProjectsAgentTool.AsProjectTool(ResponseTool.CreateMcpTool(
    serverLabel: "myserver",
    serverUri: new Uri("https://your-mcp-server.example.com"),
    toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
        GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval
    )
));
const tools = [
  {
    type: "mcp",
    server_label: "myserver",
    server_url: "https://your-mcp-server.example.com",
    require_approval: "always",
    project_connection_id: "my-connection",
  },
];

Använd fliken Python, .NET, JavaScript, REST API eller azd för att konfigurera require_approval i verktygslådans definition. Foundry Toolkit-arbetsflödet i den här artikeln fokuserar på att skapa och använda verktygslådan i Visual Studio Code.

resources:
  - kind: toolbox
    name: my-toolbox
    tools:
      - type: mcp
        server_label: myserver
        server_url: https://your-mcp-server.example.com
        require_approval: always
        project_connection_id: my-connection

Steg 5: Hantera verktygslådeversioner

Observera

Du kan hantera verktygslådeversioner (lista, hämta, höja upp, ta bort) via Python SDK, .NET SDK, JavaScript SDK och REST API. Azd CLI har endast stöd för att skapa verktygslådeversioner under distributionen.

Verktygslådans versioner är oföränderliga ögonblicksbilder av verktygslådans verktygskonfiguration. Varje anrop till skapa-slutpunkten genererar en ny ToolboxVersionObject. Den överordnade ToolboxObject har ett default_version fält som styr vilken version MCP-slutpunkten ska ha. När du skapar en ny version marknadsförs den inte automatiskt – du bestämmer när du ska uppdatera default_version. Med den här processen kan du mellanlagra ändringar, testa en ny version oberoende av varandra och flytta upp den till produktion enligt ditt eget schema.

Objekt Viktiga fält Beskrivning
ToolboxObject id, name, default_version Verktygslådans container. default_version pekar på den aktiva versionen.
ToolboxVersionObject id, name, version, description, created_at, tools[], policies En oföränderlig ögonblicksbild av verktygslådans verktygslista vid en tidpunkt.

Skapa en ny version

Varje anrop skapar en ny version. Om verktygslådan inte finns ännu skapar processen den automatiskt. När du skapar den första versionen av en ny verktygslåda är v1 standardversionen tills du manuellt uppdaterar till en annan version.

# Create a new toolbox version
toolbox_version = project.beta.toolboxes.create_toolbox_version(
    toolbox_name="my-toolbox",
    description="Updated tools v2",
    tools=[...],
)
print(f"Created version: {toolbox_version.version}")
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "my-toolbox",
    tools: [tool],
    description: "Updated tools v2"
);
Console.WriteLine($"Created version: {toolboxVersion.Version}");

POST {project_endpoint}/toolboxes/my-toolbox/versions?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json

{
  "description": "Updated tools v2",
  "tools": [...]
}
const toolboxVersion = await project.beta.toolboxes.createVersion(
  "my-toolbox",
  [/* tools array */],
  { description: "Updated tools v2" },
);
console.log(`Created version: ${toolboxVersion.version}`);

Använd fliken Python, .NET, JavaScript eller REST API för att skapa en ny verktygslåda. Foundry Toolkit-arbetsflödet i den här artikeln fokuserar på att skapa en verktygslåda och skapa en värdbaserad agent som använder den.

Den här åtgärden stöds inte med azd. Om du vill skapa en verktygslåda använder du fliken Python, .NET, REST API eller JavaScript.

Svaret är en ToolboxVersionObject som innehåller den nya version identifieraren.

Lista versioner

# List all toolbox versions
versions = list(project.beta.toolboxes.list_toolbox_versions(toolbox_name="my-toolbox"))
for v in versions:
    print(f"{v.version} — created {v.created_at}")
List<ToolboxVersion> versions = await toolboxClient
    .GetToolboxVersionsAsync("my-toolbox")
    .ToListAsync();
Console.WriteLine($"Found {versions.Count} toolbox version(s).");
foreach (ToolboxVersion v in versions)
{
    Console.WriteLine($"  - {v.Name} ({v.Version})");
}
GET {project_endpoint}/toolboxes/my-toolbox/versions?api-version=v1
Authorization: Bearer {token}
const versions = project.beta.toolboxes.listVersions("my-toolbox");
for await (const v of versions) {
  console.log(`${v.version} — created ${v.createdAt}`);
}

Använd fliken Python, .NET, JavaScript eller REST API för att visa verktygslådans versioner.

Den här åtgärden stöds inte med azd. Använd fliken Python, .NET, REST API eller JavaScript för att lista verktygslådans versioner.

Hämta en specifik version

# Get a specific toolbox version
version_obj = project.beta.toolboxes.get_toolbox_version(
    toolbox_name="my-toolbox",
    version="<version_id>",
)
ToolboxVersion versionObj = await toolboxClient.GetToolboxVersionAsync(
    "my-toolbox",
    "<version_id>"
);
Console.WriteLine($"Retrieved toolbox: {versionObj.Name} ({versionObj.Id})");
GET {project_endpoint}/toolboxes/my-toolbox/versions/{version}?api-version=v1
Authorization: Bearer {token}
const versionObj = await project.beta.toolboxes.getVersion(
  "my-toolbox",
  "<version_id>",
);
console.log(`Retrieved version: ${versionObj.version}`);

Använd fliken Python, .NET, JavaScript eller REST API för att hämta en specifik version av verktygslådan.

Den här åtgärden stöds inte med azd. Om du vill hämta en specifik verktygslåda använder du fliken Python, .NET, REST API eller JavaScript.

Höja upp en version till standard

MCP-slutpunkten hanterar alltid default_version. Om du vill växla vilken version som är aktiv uppdaterar du verktygslådan:

# Promote a version to default
toolbox = project.beta.toolboxes.update(
    toolbox_name="my-toolbox",
    default_version="<version_id>",
)
print(f"Active version: {toolbox.default_version}")
ToolboxRecord record = await toolboxClient.UpdateToolboxAsync(
    "my-toolbox",
    "<version_id>"
);
Console.WriteLine($"Active version: {record.DefaultVersion}");
PATCH {project_endpoint}/toolboxes/my-toolbox?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json

{
  "default_version": "<version_id>"
}

default_version kan inte vara tom. Ersätt den med en ny version.

const toolbox = await project.beta.toolboxes.update(
  "my-toolbox",
  "<version_id>",
);
console.log(`Active version: ${toolbox.defaultVersion}`);

Använd fliken Python, .NET, JavaScript eller REST API för att höja upp en verktygslådeversion till standard.

Den här åtgärden stöds inte med azd. Om du vill höja upp en version till standard använder du fliken Python, .NET, REST eller JavaScript.

Ta bort en version

# Delete a toolbox version
project.beta.toolboxes.delete_toolbox_version(
    toolbox_name="my-toolbox",
    version="<version_id>",
)
await toolboxClient.DeleteToolboxVersionAsync(
    "my-toolbox",
    "<version_id>"
);
DELETE {project_endpoint}/toolboxes/my-toolbox/versions/{version}?api-version=v1
Authorization: Bearer {token}
await project.beta.toolboxes.deleteVersion(
  "my-toolbox",
  "<version_id>",
);

Använd fliken Python, .NET, JavaScript eller REST API för att ta bort en verktygslådeversion.

Den här åtgärden stöds inte med azd. Om du vill ta bort en verktygslåda använder du fliken Python, .NET, REST API eller JavaScript.

Konfigurera verktyg

Välj det verktygstyp och autentiseringsmönster som matchar ditt scenario. Välj fliken för önskad SDK eller distributionsmetod.

Flera verktygstyper

En enda verktygslåda kan samla olika verktygstyper. I följande exempel kombineras webbsökning, Azure AI-sökning och en MCP-server i en verktygslåda:

{
  "description": "Web search, knowledge base search, and custom MCP server",
  "tools": [
    {
      "type": "web_search",
      "description": "Search the web for current information"
    },
    {
      "type": "azure_ai_search",
      "name": "my_aisearch",
      "description": "Search internal product documentation",
      "azure_ai_search": {
        "indexes": [
          {
            "index_name": "<INDEX_NAME>",
            "project_connection_id": "<CONNECTION_NAME>"
          }
        ]
      }
    },
    {
      "type": "mcp",
      "server_label": "myserver",
      "server_url": "https://your-mcp-server.example.com",
      "require_approval": "never",
      "project_connection_id": "my-key-auth-connection"
    }
  ]
}

Observera

Varje verktygstyp (web_search, azure_ai_search, code_interpreter, file_search) kan visas högst en gång utan fält name . Om du vill inkludera flera instanser av samma typ anger du ett unikt name för varje instans – se nästa exempel.

Begränsningar för flera verktyg

Du kan ta med högst en instans av varje inbyggd verktygstyp utan ett name fält i en verktygslåda. Om du inkluderar två instanser av samma typ utan en namereturnerar API:et:

400 invalid_payload: Multiple tools without identifiers found...

Två instanser av samma verktygstyp

Använd name fältet för att inkludera flera instanser av samma verktygstyp i en och samma verktygslåda. Varje namngiven instans behandlas som ett separat verktyg och måste ha ett unikt namn.

{
  "description": "Two Azure AI Search indexes in a single toolbox",
  "tools": [
    {
      "type": "azure_ai_search",
      "name": "product-search",
      "description": "Search product catalog and specifications",
      "azure_ai_search": {
        "indexes": [
          {
            "index_name": "<PRODUCT_INDEX_NAME>",
            "project_connection_id": "<PRODUCT_CONNECTION_NAME>"
          }
        ]
      }
    },
    {
      "type": "azure_ai_search",
      "name": "support-search",
      "description": "Search support tickets and troubleshooting guides",
      "azure_ai_search": {
        "indexes": [
          {
            "index_name": "<SUPPORT_INDEX_NAME>",
            "project_connection_id": "<SUPPORT_CONNECTION_NAME>"
          }
        ]
      }
    }
  ]
}

I följande avsnitt visas konfigurationen för varje verktygstyp i detalj.

McP (Model Context Protocol)

Nyckelbaserad autentisering:

{
  "description": "my-mcp-toolbox",
  "tools": [
    {
      "type": "mcp",
      "server_label": "myserver",
      "server_url": "https://your-mcp-server.example.com",
      "project_connection_id": "my-mcp-connection"
    }
  ]
}

Ingen autentisering (offentlig MCP-server):

{
  "description": "Public MCP server",
  "tools": [
    {
      "type": "mcp",
      "server_label": "myserver",
      "server_url": "https://your-mcp-server.example.com"
    }
  ]
}

OAuth eller identitetsbaserad autentisering:

För OAuth (hanterad anslutning, anpassad registrering av app), agentidentitet eller Entra-tokenautentisering för användare skapar du först lämplig anslutning i Foundry-projektet och refererar sedan till den med project_connection_id:

{
  "description": "MCP server with OAuth/identity auth",
  "tools": [
    {
      "type": "mcp",
      "server_label": "myserver",
      "server_url": "https://your-mcp-server.example.com",
      "project_connection_id": "<OAUTH_OR_IDENTITY_CONNECTION_NAME>"
    }
  ]
}

Anslutningens authType avgör autentiseringsflödet. Anslutningsautentiseringstyper som stöds för MCP omfattar CustomKeys, OAuth2 (hanterad eller anpassad), AgenticIdentityoch UserEntraToken. Se fliken azd för anslutningskonfigurationsexempel för varje autentiseringstyp.

from azure.ai.projects.models import MCPTool

tools = [
    MCPTool(
        server_label="myserver",
        server_url="https://your-mcp-server.example.com",
        project_connection_id="my-mcp-connection",
    )
]
ProjectsAgentTool tool = ProjectsAgentTool.AsProjectTool(ResponseTool.CreateMcpTool(
    serverLabel: "myserver",
    serverUri: new Uri("https://your-mcp-server.example.com")
));

ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "my-toolbox",
    tools: [tool],
    description: "my-mcp-toolbox"
);
const tools = [
  {
    type: "mcp",
    server_label: "myserver",
    server_url: "https://your-mcp-server.example.com",
    project_connection_id: "my-mcp-connection",
  },
];

Ingen autentisering:

resources:
  - kind: toolbox
    name: mcp-tools
    description: Public MCP server tools
    tools:
      - type: mcp
        server_label: myserver
        server_url: https://your-mcp-server.example.com

Nyckelbaserad autentisering:

parameters:
  mcp_api_key:
    secret: true
    description: API key for the MCP server
resources:
  - kind: connection
    name: mcp-conn
    target: https://your-mcp-server.example.com
    category: RemoteTool
    authType: CustomKeys
    credentials:
      keys:
        Authorization: "Bearer {{ mcp_api_key }}"
  - kind: toolbox
    name: mcp-tools
    description: MCP server tools with key auth
    tools:
      - type: mcp
        server_label: myserver
        server_url: https://your-mcp-server.example.com
        project_connection_id: mcp-conn

OAuth – hanterad anslutning:

Använd det här mönstret för MCP-servrar som stöder Foundrys hanterade OAuth-flöde. Värdet connectorName måste matcha en hanterad anslutning som är tillgänglig i Foundry Tools-katalogen.

resources:
  - kind: connection
    name: github-oauth-conn
    category: RemoteTool
    authType: OAuth2
    target: https://api.githubcopilot.com/mcp
    connectorName: foundrygithubmcp
  - kind: toolbox
    name: oauth-tools
    description: GitHub OAuth MCP toolbox
    tools:
      - type: mcp
        server_label: github
        project_connection_id: github-oauth-conn

OAuth – anpassad applikationsregistrering:

Använd det här mönstret när du tar med din egen OAuth-appregistrering för MCP-servern.

parameters:
  oauth_client_id:
    secret: true
    description: OAuth client ID
  oauth_client_secret:
    secret: true
    description: OAuth client secret
resources:
  - kind: connection
    name: mcp-oauth-custom-conn
    category: RemoteTool
    authType: OAuth2
    target: https://your-mcp-server.example.com
    authorizationUrl: https://auth.example.com/authorize
    tokenUrl: https://auth.example.com/token
    refreshUrl: https://auth.example.com/token
    scopes: []
    credentials:
      clientID: "{{ oauth_client_id }}"
      clientSecret: "{{ oauth_client_secret }}"
  - kind: toolbox
    name: oauth-custom-tools
    description: MCP toolbox with custom OAuth
    tools:
      - type: mcp
        server_label: myserver
        project_connection_id: mcp-oauth-custom-conn

Agent-identitet (Entra ID):

Använd det här mönstret för MCP-servrar som stöder Microsoft Entra ID autentisering. Foundry-agentidentiteten autentiserar sig mot målresursen.

resources:
  - kind: connection
    name: language-mcp
    category: RemoteTool
    authType: AgenticIdentity
    audience: <entra-audience>
    target: https://<resource>.cognitiveservices.azure.com/language/mcp?api-version=2025-11-15-preview
  - kind: toolbox
    name: agent-identity-tools
    description: MCP toolbox with agent identity auth
    tools:
      - type: mcp
        server_label: language
        project_connection_id: language-mcp

Observera

Du måste tilldela agentidentiteten den RBAC-roll som krävs för målresursen innan MCP-servern accepterar begäranden.

Användarens Entra-token (1P OBO):

Använd det här mönstret för MCP-servrar som kräver användaridentitet via OBO-flödet (On-Behalf-Of). Foundry proxyservrar användarens Entra-token till MCP-servern.

resources:
  - kind: connection
    name: workiq-mail-conn
    category: RemoteTool
    authType: UserEntraToken
    audience: <entra-app-id>
    target: https://agent365.svc.cloud.microsoft/agents/servers/mcp_MailTools
  - kind: toolbox
    name: workiq-tools
    description: MCP toolbox with user Entra token auth
    tools:
      - type: mcp
        server_label: workiq
        project_connection_id: workiq-mail-conn

Observera

Fältet audience krävs för UserEntraToken anslutningar. Utan den tools/list returnerar noll verktyg.

Viktigt

Första gången en användare anropar en verktygslåda med en OAuth-baserad MCP i ett projekt returnerar MCP-slutpunkten ett CONSENT_REQUIRED fel (kod -32006) med en medgivande-URL:

{
  "error": {
    "code": -32006,
    "message": "User consent is required. Please visit: https://..."
  }
}

Det här felet förväntas. Öppna medgivande-URL:en i en webbläsare, slutför OAuth-auktoriseringsflödet och försök sedan igen med agentanropet. Efterföljande anrop lyckas utan att uppmana igen.

Viktigt

  • Webbsökning använder koppling med Bing Search och koppling med anpassad Bing-sökning, som är First Party Consumption Services som styrs av dessa villkor för användning av Bing och Microsofts sekretesspolicy.
  • Microsoft Data Protection Addendum gäller inte för data som skickas till Grounding med Bing Search och Grounding med anpassad Bing-sökning. När du använder Grounding med Bing Search och Grounding med Bing Custom Search sker dataöverföringar utanför efterlevnads- och geografiska gränser.
  • Användning av Grounding med Bing Search och Grounding med Bing Custom Search medför kostnader. Mer information finns i priser.
  • Mer information om hur Azure administratörer kan hantera åtkomst till webbsökning finns i avsnittet management.

Använd det här mönstret för att lägga till webbsökning. Ingen projektanslutning krävs för webbsökningen med Grounding med Bing. Om du vill använda en grounding med en anpassad Bing Search-instans lägger du till ett web_search.custom_search_configuration objekt som pekar på din anslutning för grounding med anpassad Bing-sökning.

{
  "description": "Built-in web search",
  "tools": [
    {
      "type": "web_search",
      "name": "<OPTIONAL_TOOL_NAME>",
      "description": "<Optional description for the model>"
    }
  ]
}

Med en anslutning för Bing Custom Search:

{
  "description": "Custom Bing Search instance",
  "tools": [
    {
      "type": "web_search",
      "name": "<OPTIONAL_TOOL_NAME>",
      "description": "<Optional description for the model>",
      "web_search": {
        "custom_search_configuration": {
          "project_connection_id": "<BING_CONNECTION_NAME>",
          "instance_name": "<BING_INSTANCE_NAME>"
        }
      }
    }
  ]
}
from azure.ai.projects.models import WebSearchTool

tools = [
    WebSearchTool()
]
ProjectsAgentTool tool = ProjectsAgentTool.AsProjectTool(
    ResponseTool.CreateWebSearchTool()
);

ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "my-toolbox",
    tools: [tool],
    description: "Built-in web search"
);
const tools = [
  {
    type: "web_search",
    name: "<OPTIONAL_TOOL_NAME>",
    description: "<Optional description for the model>",
  },
];
resources:
  - kind: toolbox
    name: websearch-tools
    description: Web search toolbox
    tools:
      - type: web_search

Genom att använda grundning med anpassad Bing-sökning:

parameters:
  bing_api_key:
    secret: true
    description: Bing API key
resources:
  - kind: connection
    name: bing-custom-conn
    category: GroundingWithCustomSearch
    authType: ApiKey
    target: ""
    credentials:
      key: "{{ bing_api_key }}"
    metadata:
      ResourceId: /subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.Bing/accounts/<bing-account>
      type: bing_custom_search
  - kind: toolbox
    name: bing-custom-tools
    description: Bing Custom Search toolbox
    tools:
      - type: bing_custom_search
        custom_search_configuration:
          instance_name: your-bing-custom-instance
        project_connection_id: bing-custom-conn

Observera

När Webbsökning returnerar resultat via MCP är svaret ett resource innehållsobjekt som innehåller det syntetiserade svaret med infogade Markdown-källlänkar. URL-citat finns i content[].resource._meta.annotations[]. Till exempel:

{
  "jsonrpc": "2.0",
  "id": "ws-call-1",
  "result": {
    "_meta": {
      "tool_configuration": {
        "type": "web_search",
        "name": "web-search-default"
      }
    },
    "content": [
      {
        "type": "resource",
        "resource": {
          "uri": "about:web-search-answer",
          "mimeType": "text/plain",
          "text": "Here are the latest updates on Azure OpenAI Service...\n\n- **GPT-image-1 Release (January 7, 2026)** Microsoft introduced GPT-image-1 ([serverless-solutions.com](https://...)).\n\n..."
        },
        "annotations": {
          "audience": ["assistant"]
        },
        "_meta": {
          "annotations": [
            {
              "type": "url_citation",
              "url": "https://www.serverless-solutions.com/blog/...",
              "title": "Microsoft Expands Azure AI Foundry with Powerful New OpenAI Models",
              "start_index": 741,
              "end_index": 879
            }
          ],
          "action": {
            "type": "search",
            "query": "Azure OpenAI service updates 2026",
            "queries": ["Azure OpenAI service updates 2026"]
          },
          "response_id": "resp_001fcebcc300..."
        }
      }
    ],
    "isError": false
  }
}
{
  "description": "Azure AI Search over my data",
  "tools": [
    {
      "type": "azure_ai_search",
      "name": "<OPTIONAL_TOOL_NAME>",
      "description": "<Optional description for the model>",
      "azure_ai_search": {
        "indexes": [
          {
            "index_name": "<INDEX_NAME>",
            "project_connection_id": "<CONNECTION_NAME>"
          }
        ]
      }
    }
  ]
}
from azure.ai.projects.models import AzureAISearchTool

tools = [
    AzureAISearchTool(
        index_name="<INDEX_NAME>",
        project_connection_id="<CONNECTION_NAME>",
    )
]
ProjectsAgentTool tool = new AzureAISearchTool(
    new AzureAISearchToolOptions(
        indexes: [
            new AzureAISearchIndexResource(
                indexName: "<INDEX_NAME>",
                projectConnectionId: "<CONNECTION_NAME>"
            )
        ]
    )
);

ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "my-toolbox",
    tools: [tool],
    description: "Azure AI Search over my data"
);
const tools = [
  {
    type: "azure_ai_search",
    name: "<OPTIONAL_TOOL_NAME>",
    description: "<Optional description for the model>",
    azure_ai_search: {
      indexes: [
        {
          index_name: "<INDEX_NAME>",
          project_connection_id: "<CONNECTION_NAME>",
        },
      ],
    },
  },
];
parameters:
  ai_search_key:
    secret: true
    description: Azure AI Search admin key
resources:
  - kind: connection
    name: aisearch-conn
    category: CognitiveSearch
    authType: ApiKey
    target: https://your-search-service.search.windows.net/
    credentials:
      key: "{{ ai_search_key }}"
  - kind: toolbox
    name: search-tools
    description: Azure AI Search toolbox
    tools:
      - type: azure_ai_search
        index_name: your-index-name
        project_connection_id: aisearch-conn

Konfigurera verktygsparametrar

Azure AI-sökning-verktygsparameter Krävs Anteckningar
project_connection_id Ja Resurs-ID för projektanslutningen till Azure AI-sökning.
index_name Ja Namnet på indexet i din Azure AI-sökning resurs.
top_k Nej Standardvärdet är 5.
query_type Nej Standardvärdet är vector_semantic_hybrid. Värden som stöds: simple, vector, semantic, vector_simple_hybrid, vector_semantic_hybrid.
filter Nej Gäller för alla frågor som agenten gör till indexet.

Sökresultaten innehåller segmentmetadata i result.structuredContent.documents[]. Varje dokument innehåller titlefälten , url, idoch score som du kan använda för att generera källhänvisningsinformation i ditt program.

Kodtolkare

Använd det här mönstret för att låta agenten skriva och köra Python kod. Mönstret kräver ingen projektanslutning eller extra konfiguration.

Om du vill ladda upp en fil som kodtolkaren ska använda anropar du POST {project_endpoint}/openai/v1/files med purpose=assistants. Det returnerade fil-ID:t är det värde som du anger som <FILE_ID> i verktygskonfigurationen. Se Kodtolkare för fullständiga uppladdningsexempel.

Viktigt

När kodtolkare används via en verktygslåda i en värdbaserad agent stöds inte användarisolering. Alla användare i samma projekt delar samma containerkontext.

{
  "description": "Code interpreter for data analysis",
  "tools": [
    {
      "type": "code_interpreter",
      "name": "<OPTIONAL_TOOL_NAME>",
      "description": "<Optional description for the model>",
      "container": {
            "type": "auto",
            "file_ids": ["<FILE_ID>"]
        }
    }
  ]
}
from azure.ai.projects.models import CodeInterpreterTool

tools = [
    CodeInterpreterTool()
]
ProjectsAgentTool tool = ProjectsAgentTool.AsProjectTool(
    ResponseTool.CreateCodeInterpreterTool(
        new CodeInterpreterToolContainer()
    )
);

ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "my-toolbox",
    tools: [tool],
    description: "Code interpreter for data analysis"
);
const tools = [
  {
    type: "code_interpreter",
    name: "<OPTIONAL_TOOL_NAME>",
    description: "<Optional description for the model>",
    container: {
      type: "auto",
      file_ids: ["<FILE_ID>"],
    },
  },
];
resources:
  - kind: toolbox
    name: codeinterp-tools
    description: Code interpreter toolbox
    tools:
      - type: code_interpreter

Ladda ned utdatafiler från kodtolk

När Kodtolkaren skapar utdatafiler (till exempel en genererad CSV eller ett diagram) använder du följande steg för att lista och ladda ned dem.

Steg 1: Lista filer med hjälp av container-API:et

Extrahera container_id från content[]._meta.container_id i tools/call-svaret och anropa sedan Container Files API för att lista alla filer i containern.

GET {project_endpoint}/containers/{container_id}/files?api-version=v1
Authorization: Bearer {token}

Svaret returnerar en lista över filer med deras namn och ID:n.

Steg 2: Ladda ned filen med hjälp av fil-API:et

Använd filnamnet som returneras från steg 1 för att ladda ned filen via fil-API:ets nedladdningsslutpunkt.

Använd det här mönstret för att låta agenten söka efter uppladdade filer som lagras i ett vektorlager. Ange vector_store_ids referensvektorlager som redan har skapats i ditt Foundry-projekt.

Om du vill skapa en fil och ett vektorarkiv använder du API:et {project_endpoint}/openai/v1 :

  1. Ladda upp filen: POST {project_endpoint}/openai/v1/files med purpose=assistants.
  2. Skapa ett vektorlager: POST {project_endpoint}/openai/v1/vector_stores med det returnerade fil-ID:t.

Det resulterande vektorlagrings-ID:t är det värde som du anger som <VECTOR_STORE_ID>. Se Filsökning för fullständiga exempel på varje språk.

Viktigt

När Filsökning används via en verktygslåda i en värdbaserad agent stöds inte användarisolering. Alla användare i samma projekt delar åtkomst till samma vektorarkiv.

{
  "description": "Search over uploaded documents",
  "tools": [
    {
      "type": "file_search",
      "name": "<OPTIONAL_TOOL_NAME>",
      "description": "<Optional description for the model>",
      "file_search": {
        "vector_store_ids": ["<VECTOR_STORE_ID>"]
      }
    }
  ]
}
from azure.ai.projects.models import FileSearchTool

tools = [
    FileSearchTool(
        vector_store_ids=["<VECTOR_STORE_ID>"]
    )
]
ProjectsAgentTool tool = ProjectsAgentTool.AsProjectTool(
    ResponseTool.CreateFileSearchTool(
        vectorStoreIds: ["<VECTOR_STORE_ID>"]
    )
);

ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "my-toolbox",
    tools: [tool],
    description: "Search over uploaded documents"
);
const tools = [
  {
    type: "file_search",
    name: "<OPTIONAL_TOOL_NAME>",
    description: "<Optional description for the model>",
    file_search: {
      vector_store_ids: ["<VECTOR_STORE_ID>"],
    },
  },
];
resources:
  - kind: toolbox
    name: filesearch-tools
    description: File search toolbox
    tools:
      - type: file_search
        vector_store_ids:
          - ${FILE_SEARCH_VECTOR_STORE_ID}

Ange vektorlagrings-ID:t innan du distribuerar:

azd env set FILE_SEARCH_VECTOR_STORE_ID "vs_xxxxxxxxxxxx"

Observera

När Filsökning returnerar resultat över MCP bäddas segmentmetadata in i verktygets svarsinnehåll som 【index†filename†file_id】 markörer. Till exempel:

{
  "jsonrpc": "2.0",
  "id": "fs-call-1",
  "result": {
    "content": [
      {
        "type": "resource",
        "resource": {
          "uri": "file://assistant-tvfqncbtruyffxkfewenyy/",
          "_meta": {
            "title": "mcp-test-file.txt",
            "file_id": "assistant-TVfQnCBtRuyfFxkfeweNYY",
            "document_chunk_id": "f7327b7f-5ed0-43c6-9bee-e8e9552afcb5",
            "score": 0.03333333507180214
          },
          "text": "# 【0†mcp-test-file.txt†assistant-TVfQnCBtRuyfFxkfeweNYY】\nContent Snippet:\nAzure OpenAI Service is a cloud service..."
        }
      }
    ]
  }
}

Blocket _meta inuti varje resursobjekt innehåller relevansen title, file_id, document_chunk_idoch score för det matchade segmentet. Använd dessa metadatafält i ditt program för att generera källhänvisningsinformation eller djuplänka tillbaka till källfilen.

OpenAPI

Använd det här mönstret för att exponera rest-API som beskrivs av en OpenAPI-specifikation. auth.type Välj det som matchar ditt API:s säkerhetsmodell.

Viktigt

När hanterad identitetsautentisering används måste du tilldela lämplig RBAC-roll till foundry-projektets hanterade identitet på måltjänsten. Du kan till exempel tilldela Läsare eller högre på målresursen Azure. Utan den här tilldelningen får agenten ett 401 Unauthorized svar när api:et anropas. Fullständiga installationssteg finns i Autentisera med hjälp av hanterad identitet.

Anonym autentisering:

{
  "description": "REST API via OpenAPI spec",
  "tools": [
    {
      "type": "openapi",
      "openapi": {
        "name": "my-api",
        "spec": { "<paste OpenAPI spec object here>" },
        "auth": {
          "type": "anonymous"
        }
      }
    }
  ]
}

Projektanslutningsautentisering:

Använd det här mönstret när API:et kräver en nyckel eller token som lagras i en Foundry-projektanslutning.

{
  "description": "REST API with connection-based auth",
  "tools": [
    {
      "type": "openapi",
      "openapi": {
        "name": "my-api",
        "spec": { "<paste OpenAPI spec object here>" },
        "auth": {
          "type": "connection",
          "security_scheme": {
            "project_connection_id": "<CONNECTION_NAME>"
          }
        }
      }
    }
  ]
}

Hanterad identitetsautentisering:

Använd det här mönstret när mål-API:et autentiseras via Microsoft Entra ID. Foundry-projektets hanterade identitet anropar API:et för agentens räkning. Kontrollera att den hanterade identiteten har den RBAC-roll som krävs för måltjänsten innan du använder det här mönstret.

{
  "description": "REST API with managed identity auth",
  "tools": [
    {
      "type": "openapi",
      "openapi": {
        "name": "my-api",
        "spec": { "<paste OpenAPI spec object here>" },
        "auth": {
          "type": "managed_identity",
          "security_scheme": {
            "audience": "<TARGET_SERVICE_AUDIENCE>"
          }
        }
      }
    }
  ]
}
from azure.ai.projects.models import OpenAPITool

tools = [
    OpenAPITool(
        name="my-api",
        spec={"<paste OpenAPI spec object here>"},
        auth={"type": "anonymous"},
    )
]
BinaryData specBytes = BinaryData.FromString("<OpenAPI spec JSON>");
ProjectsAgentTool tool = new OpenAPITool(
    new OpenApiFunctionDefinition(
        name: "my-api",
        spec: specBytes,
        openApiAuthentication: new OpenApiAnonymousAuthDetails()
    )
);

ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "my-toolbox",
    tools: [tool],
    description: "REST API via OpenAPI spec"
);
const tools = [
  {
    type: "openapi",
    openapi: {
      name: "my-api",
      spec: { /* paste OpenAPI spec object here */ },
      auth: {
        type: "anonymous",
      },
    },
  },
];

Nyckelbaserad autentisering:

parameters:
  api_key:
    secret: true
    description: API key for the target service
resources:
  - kind: connection
    name: api-conn
    category: CustomKeys
    authType: CustomKeys
    target: https://api.example.com
    credentials:
      keys:
        key: "{{ api_key }}"
  - kind: toolbox
    name: openapi-tools
    description: OpenAPI key-auth toolbox
    tools:
      - type: openapi
        openapi:
          name: my-api
          spec:
            openapi: "3.0.1"
            info:
              title: "My API"
              version: "1.0"
            servers:
              - url: https://api.example.com/v1
            paths:
              /search:
                get:
                  operationId: search
                  parameters:
                    - name: query
                      in: query
                      required: true
                      schema:
                        type: string
                  responses:
                    "200":
                      description: OK
          auth:
            type: connection_auth
            connection_id: api-conn

Agent-to-Agent (A2A)

Använd det här mönstret för att kontakta en annan agent som ett verktyg. Ange bas-URL:en för fjärragenten och, om den kräver autentisering, en projektanslutning.

{
  "description": "Delegate tasks to a specialist agent",
  "tools": [
    {
      "type": "a2a_preview",
      "name": "<AGENT_NAME>",
      "description": "<What this agent does>",
      "base_url": "<AGENT_BASE_URL>",
      "project_connection_id": "<CONNECTION_NAME>"
    }
  ]
}
from azure.ai.projects.models import A2APreviewTool

tools = [
    A2APreviewTool(
        name="<AGENT_NAME>",
        description="<What this agent does>",
        base_url="<AGENT_BASE_URL>",
        project_connection_id="<CONNECTION_NAME>",
    )
]
ProjectsAgentTool tool = new A2APreviewTool()
{
    ProjectConnectionId = "<CONNECTION_NAME>",
};

ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "my-toolbox",
    tools: [tool],
    description: "Delegate tasks to a specialist agent"
);
const tools = [
  {
    type: "a2a_preview",
    name: "<AGENT_NAME>",
    description: "<What this agent does>",
    base_url: "<AGENT_BASE_URL>",
    project_connection_id: "<CONNECTION_NAME>",
  },
];
resources:
  - kind: connection
    name: a2a-conn
    category: RemoteA2A
    authType: None
    target: https://your-remote-agent.azurecontainerapps.io
  - kind: toolbox
    name: a2a-tools
    description: Agent-to-Agent toolbox
    tools:
      - type: a2a_preview
        project_connection_id: a2a-conn

Felsöka

Symptom Sannolik orsak Åtgärda
tools/list returnerar nollverktyg för MCP- eller A2A-verktyg Ogiltiga eller saknade autentiseringsuppgifter för anslutning för den fjärranslutna MCP-servern eller A2A-agenten. Verktygslådan kan inte hämta verktygsmanifest från fjärrslutpunkten utan giltig autentisering. Kontrollera att det project_connection_id finns i foundry-projektet och att autentiseringsuppgifterna är korrekta. Prova att ansluta till MCP-servern direkt för att testa autentiseringskonfigurationen. Om du använder hanterad identitet (PMI, agentidentitet eller MI) kontrollerar du rätt RBAC-rolltilldelningar för anroparen på målresursen.
tools/list returnerar nollverktyg för OpenAPI-verktyg Ogiltig OpenAPI-specifikation. Verktygslådan konstruerar verktygsmanifestet från specifikationen, vilket misslyckas om specifikationen är felaktigt utformad. Verifiera ditt OpenAPI-specifikationsinnehåll. Kontrollera att den överensstämmer med OpenAPI 3.0 eller 3.1 och innehåller giltiga paths, operationId värden och parameterscheman. Om du använder hanterad identitetsautentisering kontrollerar du även RBAC-rolltilldelningar för måltjänsten.
tools/list returnerar färre verktyg än förväntat allowed_tools Filtret innehåller felaktiga eller felstavade verktygsnamn. Verktygsnamn är skiftlägeskänsliga och måste följa MCP-specifikationen för verktygsnamn (inga blanksteg eller specialtecken). Ta bort allowed_tools tillfälligt och anropa tools/list för att hämta den fullständiga verktygslistan. Använd de exakta namnen från svaret för att ange värden för allowed_tools.
tools/list returnerar noll verktyg (andra verktygstyper) Verktygslådan är inte helt etablerad eller så stöds inte verktygstypen i regionen. För inbyggda verktyg (webbsökning, AI-sökning, kodtolkare, filsökning) är verktygsmanifesten konstruerade på serversidan och kräver inte autentisering – om de returnerar tom kanske verktygslådans version inte har etablerats ännu. Vänta 10 sekunder och försök igen.
400 Multiple tools without identifiers Två icke namngivna verktygstyper i en verktygslåda Behåll högst en namnlös typ; lägg till server_label i alla MCP-verktyg.
CONSENT_REQUIRED (kod -32006) OAuth-anslutning kräver användarmedgivande Öppna medgivande-URL:en i en webbläsare och slutför OAuth-flödet och försök sedan igen.
401 på MCP-anrop Förfallen token eller fel behörighetsområde Använd omfång https://ai.azure.com/.default och uppdatera token.
Verktygsnamn matchar inte MCP-verktygsnamn prefixas med server_label Använd {server_label}.{tool_name} format (till exempel myserver.get_info).
500send_ping() Verktygslåda MCP-servern implementerar inte MCP-metoden ping . Ring inte send_ping(). Om ditt ramverk anropar det automatiskt (till exempel Microsoft Agent Frameworks MCPStreamableHTTPTool._ensure_connected()), inaktiverar du ping-kontrollen eller åsidosätter metoden med en no-op.
500prompts/list Den Foundry MCP-servern implementerar inte prompts/list. Skicka load_prompts=False (eller motsvarande) till mcp-klientkonstruktorn.
500 med icke-direktuppspelning tools/call Icke-direktuppspelningsläge (stream=False) stöds inte för MCP-slutpunkter för verktygslådan. Använd alltid stream=True när du anropar verktygslådans MCP-verktyg.
500tools/list Tillfälligt serverfel Försök igen efter några sekunder.
Miljövariabler som skrivs över vid körning Plattformen reserverar alla miljövariabler som är prefix med FOUNDRY_ och kan tyst skriva över användardefinierade värden. Byt namn på anpassade miljövariabler för att undvika prefixet FOUNDRY_ (till exempel använd TOOLBOX_MCP_ENDPOINT i stället FOUNDRY_TOOLBOX_ENDPOINTför ).

Stöd för virtuellt nätverk

När foundry-projektet använder nätverksisolering (privat länk) stöds inte alla verktygslådetyper. I följande tabell visas supportstatus för varje verktygstyp och hur trafiken flödar i en nätverksisolerad miljö.

Verktygstyp VNet-stöd Trafikflöde
MCP ✅ Stöds Via ditt VNet-undernät
Azure AI-sökning ✅ Stöds Via privat slutpunkt
Kodtolkare ✅ Stöds Microsoft stamnätverk
Webbsökning ✅ Stöds Offentlig slutpunkt
OpenAPI ✅ Stöds Beror på mål-API-nätverkskonfiguration
Filsökning ❌ Stöds inte Ännu inte tillgängligt
Agent-to-Agent (A2A) ✅ Stöds Via privat slutpunkt

Fullständiga instruktioner för konfiguration av nätverksisolering, inklusive VNet-inmatning för agentklienten, DNS-konfiguration och privata slutpunktskrav, finns i Konfigurera nätverksisolering för Microsoft Foundry.

Region- och modellkompatibilitet

Tillgängligheten för verktygslådan beror på två faktorer utanför projektregionen:

  • Region: Vissa verktygstyper är inte tillgängliga i varje region som stöder agenttjänsten. En region som har stöd för verktygslådans slutpunkt kanske till exempel inte stöder alla inbyggda verktygstyper.

Innan du distribuerar en verktygslåda kontrollerar du att målregionen stöder de verktygstyper som du planerar att använda. Fullständiga kompatibilitetstabeller finns i Verktygsstöd per region och modell.