Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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.
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. |
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 --prereleaseochdotnet 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
namefä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 uniknameför varje instans för att särskilja dem. Att inkludera två instanser av samma typ utan ettnamereturnerar ettinvalid_payloadfel. Mer information finns i Flera verktygstyper. - Lägg till ett
descriptioni 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.
- Välj Foundry Toolkit i aktivitetsfältet.
- Under Mina resurser expanderar du Din projektnamn>Verktyg.
- Välj ikonen + Lägg till verktygslåda .
- 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.
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.yamlfil – 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.
- Välj Foundry Toolkit i aktivitetsfältet.
- Under Mina resurser expanderar du Din projektnamn>Verktyg.
- Leta upp verktygslådan på fliken Verktygslådor .
- 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.
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.
- I Foundry Toolkit, under Mina resurser>Ditt projektnamn>Verktyg, letar du upp den verktygslåda som du vill testa.
- Välj Scaffold-kodmall.
- Välj en projektmapp när du uppmanas att göra det.
- Följ de genererade
README.mdför att installera beroenden, konfigurera miljövariabler och kör exemplet lokalt. - Använd Agent Inspector eller kör
python main.pyfö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,descriptionochinputSchema. Information om namngivningskonventioner för verktyg finns i MCP-specifikationen. -
inputSchemahar ettpropertiesfält (vissa MCP-servrar utelämnar det här fältet, vilket bryter OpenAI). - För MCP-verktyg är namn prefixet
server_labelmed - till exempelmyserver.some_tool. För alla andra verktygstyper ärnamenamnet fältvärdet eller standardverktygets namn. - MCP-verktyg innehåller ett
_meta.tool_configurationblock som innehåller körningsinställningar somrequire_approval. Se Hantera krav för godkännande av verktyg. - Observera de exakta parameternamnen för anropssteget (till exempel
queryvsqueries).
Kontrollera - tools/call:
- Inget fält på den översta nivån
error. Om närvarande, inspekteraerror.code. Vanliga MCP-felkoder finns i MCP-specifikationen:-
-32006→ OAuth-medgivande krävs (extrahera URL frånerror.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._metasegmentmetadata (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.
- Välj Foundry Toolkit i aktivitetsfältet.
- Under Mina resurser expanderar du Din projektnamn>Verktyg.
- På fliken Verktygslådor letar du upp den verktygslåda som du vill använda och väljer sedan Kodmall för ställning.
- I kommandopaletten väljer du en projektmapp när du uppmanas att göra det.
- Öppna den genererade
README.mdoch 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ådantools/callkö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.
Webbsökning
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
}
}
Azure AI-sökning
{
"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.
Filsökning
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 :
- Ladda upp filen:
POST {project_endpoint}/openai/v1/filesmedpurpose=assistants. - Skapa ett vektorlager:
POST {project_endpoint}/openai/v1/vector_storesmed 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). |
500 på send_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. |
500 på prompts/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. |
500 på tools/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.