Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Importante
Gli elementi contrassegnati (anteprima) in questo articolo sono attualmente in anteprima pubblica. Questa anteprima viene fornita senza un contratto di servizio e non è consigliabile per i carichi di lavoro di produzione. Alcune funzionalità potrebbero non essere supportate o potrebbero avere funzionalità limitate. Per altre informazioni, vedere Condizioni per l'utilizzo Microsoft Azure anteprime.
Un singolo agente può dipendere da più strumenti: API, server MCP (Model Context Protocol), connettori e flussi, ognuno con il proprio modello di autenticazione e il proprio team proprietario. Man mano che si esegue il ridimensionamento in un'organizzazione, i team implementano di nuovo gli stessi strumenti in modo indipendente, le credenziali vengono duplicate, la governance diventa incoerente e non è disponibile visibilità sugli strumenti esistenti o sugli utenti che li usano. Gli sviluppatori si bloccano, non perché i modelli non sono in grado, ma perché l'integrazione degli strumenti diventa il collo di bottiglia.
Le aziende hanno già l'infrastruttura: gateway, insiemi di credenziali delle credenziali, criteri e osservabilità. Manca un'esperienza di sviluppo che inserisce l'infrastruttura in un'infrastruttura riutilizzabile, individuabile e governata per impostazione predefinita.
La casella degli strumenti offre tale esperienza. Definire un set curato di strumenti una sola volta, gestirli centralmente in Foundry ed esporli tramite un singolo endpoint compatibile con MCP che qualsiasi agente può utilizzare. La piattaforma gestisce l'inserimento delle credenziali, l'aggiornamento dei token e l'applicazione dei criteri aziendali in fase di esecuzione.
La casella degli strumenti illustra il ciclo di vita completo degli strumenti attraverso quattro pilastri: la compilazione e l'utilizzo sono attualmente disponibili:
| Pilastro | Stato | Cosa abilita |
|---|---|---|
| Costruire | Disponibile oggi | Selezionare gli strumenti, configurare l'autenticazione centralmente e pubblicare una casella degli strumenti riutilizzabile utilizzabile da qualsiasi team. |
| Consumare | Disponibile oggi | Connettere qualsiasi agente a un singolo endpoint compatibile con MCP per individuare e richiamare in modo dinamico tutti gli strumenti nella casella degli strumenti. |
Le caselle degli strumenti vengono create in Foundry, ma la superficie di consumo è aperta. Qualsiasi runtime o client compatibile con MCP può usare una casella degli strumenti, inclusi gli agenti compilati con qualsiasi framework, ID abilitati per MCP e codice personalizzato.
Poiché una casella degli strumenti è una risorsa gestita, è possibile aggiungere, rimuovere o riconfigurare gli strumenti senza modificare il codice nell'agente. L'agente si connette sempre a un singolo endpoint. Il controllo delle versioni della casella degli strumenti consente di controllare esplicitamente quando le modifiche diventano effettive: creare e testare una nuova versione, quindi alzarla di livello all'impostazione predefinita quando si è pronti. Ogni agente che punta alla casella degli strumenti preleva automaticamente la versione alzata di livello, senza modifiche al codice e senza ridistribuzione.
Questo articolo illustra come:
- Creare una casella degli strumenti con uno o più strumenti.
- Ottenere l'endpoint MCP della casella degli strumenti.
- Verificare che gli strumenti vengano caricati correttamente.
- Integrare una casella degli strumenti nell'agente ospitato.
- Gestire le versioni della casella degli strumenti e alzare di livello una versione per impostazione predefinita.
Per la sintassi di configurazione degli strumenti e le opzioni di autenticazione per ogni tipo di strumento, vedere Configurare gli strumenti.
Supporto delle funzionalità
| Funzionalità | PYTHON SDK | REST API | .NET SDK | JavaScript SDK | azd (deploy) | Foundry Toolkit |
|---|---|---|---|---|---|---|
| Aggiornamento, elenco, recupero ed eliminazione della casella degli strumenti | ✔️ | ✔️ | ✔️ | ✔️ | N/D | ✔️ |
| Creazione della versione della casella degli strumenti | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Elenco delle versioni della casella degli strumenti, recupero ed eliminazione | ✔️ | ✔️ | ✔️ | ✔️ | N/D | No. L'interfaccia utente mostra solo la versione più recente. |
| Strumento MCP | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Strumento di ricerca Web | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| strumento Azure AI Search | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Strumento Interprete codice | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Strumento Ricerca file | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Strumento OpenAPI | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | No |
| Strumento da agente a agente (A2A) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | No |
Prerequisiti
- Progetto Foundry attivo Microsoft.
-
RBAC: concedere il ruolo Azure utente di intelligenza artificiale nel progetto Foundry a ogni identità applicabile allo scenario:
- Sviluppatore (sempre obbligatorio): identità che crea, aggiorna e gestisce le versioni della casella degli strumenti.
- Identità dell'agente (obbligatoria se si usa un agente ospitato): identità gestita dell'agente che chiama gli strumenti in fase di esecuzione.
- Utente finale (obbligatorio solo per i flussi OAuth): qualsiasi utente la cui identità viene inoltrata tramite proxy tramite connessioni OAuth o UserEntraToken (ad esempio, flussi OBO basati su OAuth o 1P).
- Il progetto Foundry deve trovarsi in una delle aree supportate. I singoli tipi di strumenti all'interno di una casella degli strumenti sono ulteriormente limitati dall'area e dal modello. Non tutti i tipi di strumento sono disponibili in ogni area o con ogni modello. Vedere Compatibilità tra area e modello.
- Visual Studio Code (VS Code).
- Installare Microsoft Foundry Toolkit for Visual Studio Code (in precedenza AI Toolkit for VS Code) da Visual Studio Code Marketplace. Il supporto della casella degli strumenti in Foundry Toolkit è attualmente disponibile in anteprima.
-
Python SDK:
pip install azure-ai-projects azure-identity -
.NET SDK:
dotnet add package Azure.AI.Projects --prereleaseedotnet add package Azure.Identity -
JavaScript SDK:
npm install @azure/ai-projects @azure/identity azd (deploy) :Installare l'interfaccia della riga di comando per< sviluppatori Azure/c1> e l'estensione dell'agente:
Importante
- Una casella degli strumenti supporta al massimo one senza un campo
nameper tipo di strumento (Ricerca Web, Azure AI Search, Interprete del codice, Ricerca file). Per includere più istanze dello stesso tipo di strumento, impostare un valore univoconamein ogni istanza per distinguerle. L'inclusione di due istanze dello stesso tipo senza restituiscenameuninvalid_payloaderrore. Per informazioni dettagliate, vedere Più tipi di strumenti. - Aggiungere un oggetto
descriptiona ogni strumento nella casella degli strumenti per consentire al modello di selezionare lo strumento appropriato per ogni richiesta. - Esaminare attentamente la documentazione di ogni strumento per altre informazioni sulla configurazione, le limitazioni e gli avvisi dei singoli strumenti.
Passaggio 1: Creare una versione della casella degli strumenti
Creare una versione della casella degli strumenti in base agli strumenti necessari.
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"
}
]
}
Nota
Usare l'ambito https://ai.azure.com/.default del token quando si ottiene il token di connessione.
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}`);
Usare Foundry Toolkit in Visual Studio Code per creare e pubblicare una casella degli strumenti dalla visualizzazione Tools.
- Selezionare Foundry Toolkit nella barra delle attività.
- In Risorse personali espandere Il nome> del progettoStrumenti.
- Selezionare l'icona + Aggiungi casella degli strumenti .
- Nella scheda Compila una casella degli strumenti personalizzata immettere il nome e la descrizione della casella degli strumenti, aggiungere gli strumenti desiderati e quindi selezionare Pubblica.
La pubblicazione di una nuova casella degli strumenti crea la prima versione. Tale versione diventa automaticamente la versione predefinita.
azdUsando , si dichiarano le risorse della casella degli strumenti in un agent.yaml file anziché chiamare l'SDK. Definire gli strumenti nella resources sezione e distribuirsi usando azd ai agent init. Per agent.yaml esempi per ogni tipo di strumento, vedere Configurare gli strumenti. Per il flusso di lavoro di distribuzione completo, vedere Distribuire con azd.
Importante
Il -m flag (o --manifest) è obbligatorio per azd ai agent init.
Indica al comando dove trovare la definizione dell'agente e i file di origine.
-m può puntare a:
-
Un file specifico
agent.yaml: init copia tutti i file dalla stessa directory del manifesto -
Cartella contenente
agent.yaml— init copia tutti i file da tale cartella
Tutti i file nella directory manifesto (main.py, Dockerfile, requirements.txt, setup.py e così via) vengono copiati nel progetto con scaffolding in 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
Passaggio 2: Ottenere l'endpoint MCP della casella degli strumenti
Esistono due modelli di endpoint a seconda del ruolo:
| Ruolo | Endpoint | Quando usare |
|---|---|---|
| Sviluppatore della casella degli strumenti | {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1 |
Testare o convalidare una versione specifica prima di promuoverla come predefinita. |
| Consumer della casella degli strumenti | {project_endpoint}/toolboxes/{toolbox_name}/mcp?api-version=v1 |
Connettere gli agenti alla casella degli strumenti. Serve sempre l'oggetto default_version. La prima versione creata viene impostata automaticamente come predefinita. |
Importante
Ogni richiesta all'endpoint MCP della casella degli strumenti deve includere l'intestazione Foundry-Features: Toolboxes=V1Preview. Chiamate che omettono questa intestazione hanno esito negativo. Includerlo in tutti i client HTTP, i trasporti MCP e i wrapper SDK che chiamano l'endpoint della casella degli strumenti.
Nota
La prima versione di una nuova casella degli strumenti viene promossa automaticamente a default_version (v1). Se è necessario modificare il valore predefinito in un secondo momento, vedere Alzare di livello una versione per impostazione predefinita.
In Foundry Toolkit for Visual Studio Code copiare l'endpoint consumer della casella degli strumenti dalla visualizzazione Toolboxes.
- Selezionare Foundry Toolkit nella barra delle attività.
- In Risorse personali espandere Il nome> del progettoStrumenti.
- Nella scheda Casella degli strumenti individuare la casella degli strumenti.
- Nella colonna ENDPOINT URL copiare l'endpoint.
Il valore dell'URL dell'endpoint è l'endpoint consumer della casella degli strumenti. Per costruire un endpoint specifico della versione, usare il modello di sviluppo illustrato nella tabella precedente.
Passaggio 3: Verificare la disponibilità degli strumenti
Prima di eseguire l'agente completo, verificare che la casella degli strumenti carichi gli strumenti previsti usando un SDK client MCP sull'endpoint. Usare l'endpoint specifico della versione per convalidare una versione prima di promuoverla come predefinita.
Installare l'SDK client MCP:
pip install mcp
Connettersi alla casella degli strumenti e agli strumenti elenco
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())
Nota
Usare la scheda API REST per verificare la disponibilità degli strumenti da .NET o usare Python SDK client MCP.
Usare l'endpoint specifico della versione (/versions/{version}/mcp) per convalidare una versione prima di promuoverla.
1. Inizializzare la sessione MCP:
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. Inviare la notifica inizializzata:
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. Elencare gli strumenti disponibili:
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. Chiamare uno strumento:
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":{}}}
Installare l'SDK client MCP:
npm install @modelcontextprotocol/sdk
Connettersi alla casella degli strumenti e agli strumenti elenco
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();
Usare l'endpoint del passaggio 2 insieme a un esempio di agente ospitato con scaffolding per convalidare il caricamento della casella degli strumenti in VS Code.
- In Foundry Toolkit, in Risorse> personali Ilnome> del progettoStrumenti individuare la casella degli strumenti da testare.
- Selezionare Modello di codice di scaffolding.
- Scegliere una cartella del progetto quando richiesto.
- Seguire le istruzioni
README.mdgenerate per installare le dipendenze, configurare le variabili di ambiente ed eseguire l'esempio in locale. - Usare Agent Inspector o eseguire
python main.pyper confermare il caricamento e la risposta degli strumenti della casella degli strumenti.
Per la convalida specifica della versione prima di alzare di livello una nuova versione della casella degli strumenti, usare la scheda Python o API REST in questo passaggio.
Nota
Usare la scheda API REST per verificare la disponibilità degli strumenti o usare l'SDK client MCP Python.
Controllare : inizializzare: HTTP 200. Se si ignora il passaggio di inizializzazione, le chiamate successive hanno esito negativo.
Check — tools/list:
-
len(tools) > 0- vuoto indica che il provisioning della versione della casella degli strumenti non è stato eseguito correttamente. - Ogni strumento ha
name,descriptioneinputSchema. Per le convenzioni di denominazione degli strumenti, vedere la specifica MCP. -
inputSchemaha unpropertiescampo (alcuni server MCP omettono questo campo, che interrompe OpenAI). - Per gli strumenti MCP, i nomi sono preceduti da
server_label,myserver.some_toolad esempio . Per tutti gli altri tipi di strumenti, il nome è il valore delnamecampo o il nome predefinito dello strumento. - Gli strumenti MCP includono un
_meta.tool_configurationblocco contenente impostazioni di runtime,require_approvalad esempio . Vedere Gestire i requisiti di approvazione degli strumenti. - Si notino i nomi esatti dei parametri per il passaggio di chiamata , ad esempio
queryvsqueries.
Check - tools/call:
- Nessun campo di primo livello
error. Se presente, esaminareerror.code. Per i codici di errore MCP standard, vedere la specifica MCP:-
-32006→ il consenso OAuth necessario (estrarre l'URL daerror.message). - Altri codici → errore sul lato server.
-
-
result.content[]contiene voci con"type": "text": si tratta dell'output dello strumento. - Per Ricerca di intelligenza artificiale, verificare la presenza
result.structuredContent.documents[]di metadati in blocchi (title,url,id,score). - Per Ricerca file verificare
result.content[].resource._metala presenza di metadati in blocchi (title,file_id,document_chunk_id,score). - Per Ricerca Web, verificare
result.content[].resource._meta.annotations[]la presenza di citazioni URL (type,url,start_indextitle, ,end_index). -
"ServerError"Cerca nel contenuto di testo: lo strumento è stato eseguito ma ha generato un errore interno.
Esempi di argomenti specifici tools/call dello strumento:
| Tipo di strumento | Argomenti |
|---|---|
| Ricerca di intelligenza artificiale | {"query": "search text"} |
| Ricerca file | {"queries": ["search text"]} |
| Interprete di codice | {"code": "print(2 ** 100)"} |
| Ricerca Web | {"search_query": "weather in seattle"} |
| A2A | {"message": {"parts": [{"type": "text", "text": "Hello"}]}} |
| MCP | {"query": "what is agent service"} |
Passaggio 4: Integrare la casella degli strumenti nell'agente
LangGraph
.env file:
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 (modello chiave):
from langchain_azure_ai.tools import AzureAIProjectToolbox
toolbox = AzureAIProjectToolbox(toolbox_name=TOOLBOX_NAME)
tools = await toolbox.get_tools()
Vedere l'esempio completo per l'implementazione completa.
Importante
La classe langchain_azure_ai.tools.AzureAIProjectToolbox richiede langchain-azure-ai[tools]>1.2.3.
Microsoft Agent Framework
Usare MCPStreamableHTTPTool Agent Framework SDK per connettersi direttamente all'endpoint MCP della casella degli strumenti.
.env file:
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 (modello chiave):
# 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()
Vedere l'esempio completo per l'implementazione completa.
COPILOT SDK
Usare l'SDK di GitHub Copilot per creare un agente basato sulla casella degli strumenti che collega Copilot chiamata dello strumento all'endpoint MCP della casella degli strumenti Foundry.
Nota
L'SDK di Copilot rifiuta i nomi degli strumenti contenenti punti. Il bridge sostituisce . automaticamente con _ nei nomi degli strumenti. Ad esempio, myserver.get_info diventa myserver_get_info.
.env file:
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 (modello chiave — bridge MCP):
# 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"],
)
Vedere l'esempio completo per l'implementazione completa.
Microsoft Agent Framework
Usare ResponsesServer agent Framework SDK con un personalizzato ToolboxMcpClient per individuare e richiamare gli strumenti della casella degli strumenti tramite l'endpoint MCP.
Variabili di ambiente:
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 (modello chiave):
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 esegue il wrapping delle chiamate dirette JSON-RPC all'endpoint MCP.
ToolboxHandler connette le chiamate dello strumento LLM al client MCP usando un ciclo standard di chiamata degli strumenti. Per l'implementazione completa di entrambe le classi, vedere l'esempio completo.
Nota
Gli esempi di integrazione per questo passaggio sono disponibili solo per Python e .NET.
Nota
Gli esempi di integrazione per questo passaggio sono disponibili solo per Python e .NET.
Usare Foundry Toolkit per eseguire lo scaffolding di un esempio di agente ospitato già collegato alla casella degli strumenti.
- Selezionare Foundry Toolkit nella barra delle attività.
- In Risorse personali espandere Il nome> del progettoStrumenti.
- Nella scheda Casella degli strumenti individuare la casella degli strumenti da utilizzare e quindi selezionare Modello di codice di Scaffolding.
- Nel riquadro comandi scegliere una cartella di progetto quando richiesto.
- Aprire il file generato
README.mde seguire la procedura di installazione, esecuzione locale e distribuzione per lo scaffolding.
Il progetto generato include il punto di ingresso dell'agente ospitato, i file di distribuzione e un oggetto README.md con la procedura esatta di installazione, esecuzione e distribuzione. L'agente con scaffolding gestisce automaticamente l'intestazione Foundry-Features: Toolboxes=V1Preview .
Se si vuole integrare una casella degli strumenti in un progetto agente ospitato esistente anziché generare un nuovo esempio, usare l'endpoint copiato dal passaggio 2 con i modelli Python o .NET in questa sezione.
Eseguire la distribuzione con azd
Usare l'interfaccia della riga di comando Azure Developer (
Importante
Il -m flag (o --manifest) è obbligatorio per azd ai agent init. Indica al comando dove trovare la definizione dell'agente e i file di origine.
-m può puntare a un file specifico agent.yaml o a una cartella contenente uno. Tutti i file nella directory del manifesto (main.py, Dockerfile, requirements.txte così via) vengono copiati verbatim nel progetto con scaffolding in src/<agent-name>/.
Struttura delle cartelle:
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 (ricerca Web + GitHub MCP di esempio):
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
Nota
Quando si distribuisce con le risorse della casella degli strumenti in agent.yaml, la piattaforma inserisce FOUNDRY_AGENT_TOOLBOX_ENDPOINT (URL di base) e TOOLBOX_{toolbox_name}_MCP_ENDPOINT (endpoint completo per casella degli strumenti) come variabili di ambiente. Per la casella degli strumenti denominata agent-tools, la variabile per casella degli strumenti diventa TOOLBOX_AGENT_TOOLS_MCP_ENDPOINT. Legge main.py la variabile per casella degli strumenti o costruisce l'URL da FOUNDRY_AGENT_TOOLBOX_ENDPOINT e TOOLBOX_NAME in fase di esecuzione.
main.py segue lo stesso modello LangGraph illustrato in precedenza.
azdUsando e FOUNDRY_AGENT_TOOLBOX_ENDPOINTTOOLBOX_{toolbox_name}_MCP_ENDPOINT vengono inseriti automaticamente: nel codice non è necessaria alcuna configurazione dell'endpoint aggiuntiva.
Distribuire:
# 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
Gestire i requisiti di approvazione degli strumenti
La casella degli strumenti restituisce un _meta.tool_configuration oggetto in ogni voce dello strumento restituita da tools/list. Quando uno strumento è require_approval impostato su "always", il runtime dell'agente deve presentare l'azione in sospeso all'utente e attendere la conferma prima di richiamare lo strumento. L'endpoint MCP non blocca tools/call . L'imposizione è interamente responsabilità del runtime dell'agente.
Leggere require_approval da tools/list
Ogni voce di strumento in una tools/list risposta include un _meta blocco restituito dalla casella degli strumenti :
{
"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 Valore |
Comportamento |
|---|---|
"always" |
L'agente deve chiedere conferma all'utente prima di ogni chiamata. |
"never" |
L'agente può richiamare liberamente lo strumento. |
Implementare l'approvazione gating (LangGraph)
Eseguire una query tools/list all'avvio per compilare una mappa di approvazione, quindi inserire un vincolo nella richiesta di sistema per qualsiasi strumento che richiede l'approvazione:
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")
}
Dopo il caricamento degli strumenti dal client MCP, rilevare quali strumenti richiedono l'approvazione e regolare la richiesta di sistema:
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"]
Nota
- Il rilevamento avviene all'avvio. Il controllo dell'approvazione viene eseguito una sola volta quando l'agente viene inizializzato. Non è previsto alcun sovraccarico per chiamata.
- Fallback normale. Se non sono presenti
require_approval: "always"strumenti , il prompt di sistema rimane invariato e l'agente si comporta come prima. -
require_approvalviene applicato dall'agente. Il proxy MCP della casella degli strumenti vienetools/calleseguito indipendentemente da questa impostazione. Il runtime dell'agente è responsabile del controllo della chiamata.
Configurare require_approval in uno strumento
Impostare require_approval quando si crea una versione della casella degli strumenti. Gli esempi di strumento MCP nel passaggio 1 mostrano entrambi i "always" valori e "never" . È anche possibile impostarlo tramite l'SDK:
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",
},
];
Usare la scheda Python, .NET, JavaScript, API REST o azd per configurare require_approval nella definizione della casella degli strumenti. Il flusso di lavoro foundry Toolkit in questo articolo è incentrato sulla creazione e l'utilizzo della casella degli strumenti in 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
Passaggio 5: Gestire le versioni della casella degli strumenti
Nota
È possibile gestire le versioni della casella degli strumenti (elenco, ottenere, alzare di livello, eliminare) tramite Python SDK, .NET SDK, JavaScript SDK e API REST. L'interfaccia della riga di comando azd supporta solo la creazione di versioni della casella degli strumenti durante la distribuzione.
Le versioni della casella degli strumenti sono snapshot non modificabili della configurazione dello strumento di una casella degli strumenti. Ogni chiamata all'endpoint di creazione produce un nuovo ToolboxVersionObjectoggetto . L'elemento padre ToolboxObject dispone di un default_version campo che controlla la versione usata dall'endpoint MCP. La creazione di una nuova versione non viene alzata di livello automaticamente: si decide quando aggiornare default_version. Questo processo consente di preparare le modifiche, testare una nuova versione in modo indipendente e promuoverla alla produzione in base alla propria pianificazione.
| Oggetto | Campi chiave | Descrizione |
|---|---|---|
ToolboxObject |
id, name, default_version |
Contenitore della casella degli strumenti.
default_version punta alla versione attiva. |
ToolboxVersionObject |
id, name, version, descriptioncreated_at, , tools[]policies |
Snapshot non modificabile dell'elenco degli strumenti della casella degli strumenti in un momento specifico. |
Creare una nuova versione
Ogni chiamata di creazione produce una nuova versione. Se la casella degli strumenti non esiste ancora, il processo lo crea automaticamente. Quando si crea la prima versione di una nuova casella degli strumenti, la versione predefinita non viene v1 aggiornata manualmente a un'altra versione.
# 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}`);
Usare la scheda Python, .NET, JavaScript o API REST per creare una nuova versione della casella degli strumenti. Il flusso di lavoro di Foundry Toolkit in questo articolo è incentrato sulla creazione di una casella degli strumenti e sullo scaffolding di un agente ospitato che lo utilizza.
Questa operazione non è supportata con azd. Per creare una versione della casella degli strumenti, usare la scheda Python, .NETREST o JavaScript.
La risposta è un oggetto ToolboxVersionObject contenente il nuovo version identificatore.
Elencare le versioni
# 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}`);
}
Usare la scheda Python, .NET, JavaScript o API REST per elencare le versioni della casella degli strumenti.
Questa operazione non è supportata con azd. Per elencare le versioni della casella degli strumenti, usare la scheda Python, .NET, REST API o JavaScript.
Ottenere una versione specifica
# 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}`);
Usare la scheda Python, .NET, JavaScript o API REST per ottenere una versione specifica della casella degli strumenti.
Questa operazione non è supportata con azd. Per ottenere una versione specifica della casella degli strumenti, usare la scheda Python, .NET, REST API o JavaScript.
Alzare di livello una versione per impostazione predefinita
L'endpoint MCP serve sempre .default_version Per cambiare la versione attiva, aggiornare la casella degli strumenti:
# 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 non può essere vuoto. Sostituirlo con una nuova versione.
const toolbox = await project.beta.toolboxes.update(
"my-toolbox",
"<version_id>",
);
console.log(`Active version: ${toolbox.defaultVersion}`);
Usare la scheda Python, .NET, JavaScript o API REST per alzare di livello una versione della casella degli strumenti per impostazione predefinita.
Questa operazione non è supportata con azd. Per alzare di livello una versione per impostazione predefinita, usare la scheda Python, .NET, REST o JavaScript.
Eliminare una versione
# 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>",
);
Usare la scheda Python, .NET, JavaScript o API REST per eliminare una versione della casella degli strumenti.
Questa operazione non è supportata con azd. Per eliminare una versione della casella degli strumenti, usare la scheda Python, .NET, REST API o JavaScript.
Configurare gli strumenti
Scegliere il tipo di strumento e il modello di autenticazione che corrispondono allo scenario. Selezionare la scheda per il metodo di distribuzione o l'SDK preferito.
Più tipi di strumento
Una singola casella degli strumenti può aggregare diversi tipi di strumenti. L'esempio seguente combina Ricerca Web, Azure AI Search e un server MCP in una casella degli strumenti:
{
"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"
}
]
}
Nota
Ogni tipo di strumento (web_search, azure_ai_search, code_interpreter, file_search) può essere visualizzato al massimo una volta senza un name campo. Per includere più istanze dello stesso tipo, impostare un valore univoco name in ogni istanza. Vedere l'esempio successivo.
Restrizioni per più strumenti
È possibile includere al massimo un'istanza di ogni tipo di strumento predefinito senza un name campo in una casella degli strumenti. Se si includono due istanze dello stesso tipo senza un name, l'API restituisce:
400 invalid_payload: Multiple tools without identifiers found...
Due istanze dello stesso tipo di strumento
Usare il name campo per includere più istanze dello stesso tipo di strumento in una casella degli strumenti. Ogni istanza denominata viene considerata come uno strumento separato e deve avere un nome univoco.
{
"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>"
}
]
}
}
]
}
Le sezioni seguenti illustrano in dettaglio la configurazione di ogni tipo di strumento.
Model Context Protocol (MCP)
Autenticazione basata su chiave:
{
"description": "my-mcp-toolbox",
"tools": [
{
"type": "mcp",
"server_label": "myserver",
"server_url": "https://your-mcp-server.example.com",
"project_connection_id": "my-mcp-connection"
}
]
}
Nessuna autenticazione (server MCP pubblico):
{
"description": "Public MCP server",
"tools": [
{
"type": "mcp",
"server_label": "myserver",
"server_url": "https://your-mcp-server.example.com"
}
]
}
Autenticazione OAuth o basata su identità:
Per OAuth (connettore gestito, registrazione app personalizzata), identità dell'agente o autenticazione del token Entra utente, creare prima di tutto la connessione appropriata nel progetto Foundry, quindi farvi riferimento con 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>"
}
]
}
La connessione determina il flusso di authType autenticazione. I tipi di autenticazione di connessione supportati per MCP includono CustomKeys, OAuth2 (gestito o personalizzato), AgenticIdentitye UserEntraToken. Vedere la scheda azd per esempi di configurazione della connessione per ogni tipo di autenticazione.
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",
},
];
Nessuna autenticazione:
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
Autenticazione basata su chiave:
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 - Connettore gestito:
Usare questo modello per i server MCP che supportano il flusso OAuth gestito di Foundry. Il connectorName valore deve corrispondere a un connettore gestito disponibile nel catalogo degli strumenti foundry.
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 - Registrazione dell'app personalizzata:
Usare questo modello quando si usa la registrazione dell'app OAuth personalizzata per il server MCP.
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
identità Agent (Entra ID):
Usare questo modello per i server MCP che supportano l'autenticazione Microsoft Entra ID. L'identità dell'agente Foundry esegue l'autenticazione sulla risorsa di destinazione.
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
Nota
È necessario assegnare all'identità dell'agente il ruolo controllo degli accessi in base al ruolo richiesto nella risorsa di destinazione prima che il server MCP accetti le richieste.
User Entra token (1P OBO):
Usare questo modello per i server MCP che richiedono l'identità utente tramite il flusso OBO (On-Behalf-Of). Foundry esegue il proxy del token Entra dell'utente al server MCP.
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
Nota
Il audience campo è obbligatorio per UserEntraToken le connessioni. Senza di esso, tools/list restituisce zero strumenti.
Importante
La prima volta che un utente chiama una casella degli strumenti con un MCP basato su OAuth in un progetto, l'endpoint MCP restituisce un CONSENT_REQUIRED errore (codice -32006) con un URL di consenso:
{
"error": {
"code": -32006,
"message": "User consent is required. Please visit: https://..."
}
}
Questo errore è previsto. Aprire l'URL di consenso in un browser, completare il flusso di autorizzazione OAuth e quindi ripetere la chiamata dell'agente. Le chiamate successive hanno esito positivo senza richiedere di nuovo.
Ricerca Web
Importante
- Ricerca Web usa il grounding con Ricerca Bing e il grounding con Ricerca personalizzata Bing, che sono First Party Consumption Services regolati da questi Grounding con condizioni per l'utilizzo di Bing e l'Informativa sulla privacy Microsoft.
- Il Microsoft Data Protection Addendum non si applica ai dati inviati a Grounding con Ricerca Bing e il grounding con Ricerca personalizzata Bing. Quando si usa Il grounding con Ricerca Bing e il grounding con Ricerca personalizzata Bing, i trasferimenti di dati si verificano al di fuori della conformità e dei limiti geografici.
- L'uso del grounding con Ricerca Bing e il grounding con Ricerca personalizzata Bing comporta costi. Per informazioni dettagliate, vedere i prezzi .
- Vedere la sezione management per informazioni su come gli amministratori Azure possono gestire l'accesso all'uso della ricerca Web.
Usare questo modello per aggiungere la ricerca Web. Non è necessaria alcuna connessione di progetto per la ricerca Web con Grounding con Bing. Per usare un'istanza di Ricerca Bing personalizzata, aggiungere un web_search.custom_search_configuration oggetto che punta al grounding con la connessione Ricerca personalizzata Bing.
{
"description": "Built-in web search",
"tools": [
{
"type": "web_search",
"name": "<OPTIONAL_TOOL_NAME>",
"description": "<Optional description for the model>"
}
]
}
Con una connessione Di base con Ricerca personalizzata Bing:
{
"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
Con la base di Ricerca personalizzata Bing:
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
Nota
Quando Ricerca Web restituisce risultati su MCP, la risposta è un resource elemento di contenuto contenente la risposta sintetizzata con collegamenti di origine Markdown inline. Le citazioni URL sono in content[].resource._meta.annotations[]. Per esempio:
{
"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 Search
{
"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
Configurare i parametri dello strumento
| parametro dello strumento Azure AI Search | Obbligatorio | Note |
|---|---|---|
project_connection_id |
Sì | ID risorsa della connessione del progetto a Azure AI Search. |
index_name |
Sì | Nome dell'indice nella risorsa Azure AI Search. |
top_k |
No | Il valore predefinito è 5. |
query_type |
No | Il valore predefinito è vector_semantic_hybrid. Valori supportati: simple, vectorsemantic, vector_simple_hybrid, , vector_semantic_hybrid. |
filter |
No | Si applica a tutte le query eseguite dall'agente all'indice. |
I risultati della ricerca includono metadati blocchi in result.structuredContent.documents[]. Ogni documento include titlecampi , url, ide score che è possibile usare per generare i dettagli della citazione nell'applicazione.
Interprete di codice
Usare questo modello per consentire all'agente di scrivere ed eseguire Python codice. Il modello non richiede una connessione di progetto o una configurazione aggiuntiva.
Per caricare un file per l'interprete di codice da usare, chiamare POST {project_endpoint}/openai/v1/files con purpose=assistants. L'ID file restituito è il valore fornito come <FILE_ID> nella configurazione dello strumento. Per esempi di caricamento completo, vedere Interprete di codice .
Importante
Quando l'interprete del codice viene usato tramite una casella degli strumenti in un agente ospitato, l'isolamento utente non è supportato. Tutti gli utenti nello stesso progetto condividono lo stesso contesto del contenitore.
{
"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
Scaricare i file di output dall'interprete del codice
Quando l'interprete del codice produce file di output (ad esempio, un file CSV o un grafico generato), seguire questa procedura per elencarli e scaricarli.
Passaggio 1: Elencare i file usando l'API contenitore
container_id Estrarre da content[]._meta.container_id nella tools/call risposta, quindi chiamare l'API File contenitore per elencare tutti i file nel contenitore:
GET {project_endpoint}/containers/{container_id}/files?api-version=v1
Authorization: Bearer {token}
La risposta restituisce un elenco di file con i relativi nomi e ID.
Passaggio 2: Scaricare il file usando l'API File
Usare il nome file restituito dal passaggio 1 per scaricare il file tramite l'endpoint di download dell'API file.
Ricerca file
Usare questo modello per consentire all'agente di cercare i file caricati archiviati in un archivio vettoriale. Specificare vector_store_ids gli archivi vettoriali di riferimento già creati nel progetto Foundry.
Per creare un file e un archivio vettoriale, usare l'API {project_endpoint}/openai/v1 :
- Caricare il file:
POST {project_endpoint}/openai/v1/filesconpurpose=assistants. - Creare un archivio vettoriale:
POST {project_endpoint}/openai/v1/vector_storescon l'ID file restituito.
L'ID dell'archivio vettoriale risultante è il valore fornito come <VECTOR_STORE_ID>. Vedere Ricerca file per esempi completi in ogni lingua.
Importante
Quando la ricerca file viene usata tramite una casella degli strumenti in un agente ospitato, l'isolamento utente non è supportato. Tutti gli utenti dello stesso progetto condividono l'accesso allo stesso archivio vettoriale.
{
"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}
Impostare l'ID dell'archivio vettoriale prima della distribuzione:
azd env set FILE_SEARCH_VECTOR_STORE_ID "vs_xxxxxxxxxxxx"
Nota
Quando Ricerca file restituisce i risultati su MCP, i metadati del blocco vengono incorporati nel contenuto della risposta dello strumento come 【index†filename†file_id】 marcatori. Per esempio:
{
"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..."
}
}
]
}
}
Il _meta blocco all'interno di ogni elemento di risorsa contiene la titlepertinenza score , file_id, document_chunk_ide per il blocco corrispondente. Usare questi campi di metadati nell'applicazione per generare i dettagli della citazione o il collegamento diretto al file di origine.
OpenAPI
Usare questo modello per esporre qualsiasi API REST descritta da una specifica OpenAPI. Scegliere l'oggetto auth.type corrispondente al modello di sicurezza dell'API.
Importante
Quando si usa l'autenticazione dell'identità gestita, è necessario assegnare il ruolo controllo degli accessi in base al ruolo appropriato all'identità gestita del progetto Foundry nel servizio di destinazione. Ad esempio, assegnare Lettore o versione successiva nella risorsa di Azure di destinazione. Senza questa assegnazione, l'agente riceve una 401 Unauthorized risposta quando chiama l'API. Per la procedura di configurazione completa, vedere Eseguire l'autenticazione usando l'identità gestita.
Autenticazione anonima:
{
"description": "REST API via OpenAPI spec",
"tools": [
{
"type": "openapi",
"openapi": {
"name": "my-api",
"spec": { "<paste OpenAPI spec object here>" },
"auth": {
"type": "anonymous"
}
}
}
]
}
Project connessione auth:
Usare questo modello quando l'API richiede una chiave o un token archiviato in una connessione di progetto Foundry.
{
"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>"
}
}
}
}
]
}
Autenticazione dell'identità gestita:
Usare questo modello quando l'API di destinazione esegue l'autenticazione tramite Microsoft Entra ID. L'identità gestita del progetto Foundry chiama l'API per conto dell'agente. Assicurarsi che l'identità gestita abbia il ruolo controllo degli accessi in base al ruolo necessario nel servizio di destinazione prima di usare questo modello.
{
"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",
},
},
},
];
Autenticazione basata su chiave:
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
Da agente a agente (A2A)
Usare questo modello per chiamare un altro agente come strumento. Specificare l'URL di base dell'agente remoto e, se richiede l'autenticazione, una connessione al progetto.
{
"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
Risolvere
| Sintomo | Probabile causa | Correzione |
|---|---|---|
tools/list restituisce zero strumenti per gli strumenti MCP o A2A |
Credenziali di connessione non valide o mancanti per il server MCP remoto o l'agente A2A. La casella degli strumenti non può recuperare i manifesti degli strumenti dall'endpoint remoto senza l'autenticazione valida. | Verificare che project_connection_id esista nel progetto Foundry e che le credenziali siano corrette. Provare a connettersi al server MCP direttamente per testare l'installazione dell'autenticazione. Se si usa l'identità gestita (PMI, identità agente o MI), verificare le assegnazioni di ruolo corrette del controllo degli accessi in base al ruolo per il chiamante nella risorsa di destinazione. |
tools/list restituisce zero strumenti per gli strumenti OpenAPI |
Specifica OpenAPI non valida. La casella degli strumenti costruisce il manifesto dello strumento dalla specifica, che ha esito negativo se la specifica non è valida. | Convalidare il contenuto della specifica OpenAPI. Verificare che sia conforme a OpenAPI 3.0 o 3.1 e includa schemi validi paths, operationId valori e parametri. Se si usa l'autenticazione dell'identità gestita, verificare anche le assegnazioni di ruolo del controllo degli accessi in base al ruolo nel servizio di destinazione. |
tools/list restituisce meno strumenti del previsto |
Il allowed_tools filtro contiene nomi di strumenti non corretti o con errori di ortografia. I nomi degli strumenti fanno distinzione tra maiuscole e minuscole e devono seguire la specifica MCP per i nomi degli strumenti (senza spazi vuoti o caratteri speciali). |
Rimuovere allowed_tools temporaneamente e chiamare tools/list per ottenere l'elenco completo degli strumenti. Usare i nomi esatti della risposta per impostare i valori per allowed_tools. |
tools/list restituisce zero strumenti (altri tipi di strumenti) |
La casella degli strumenti non è completamente con provisioning o tipo di strumento non supportato nell'area. Per gli strumenti predefiniti (Ricerca Web, Ricerca intelligenza artificiale, Interprete del codice, Ricerca file), i manifesti degli strumenti vengono costruiti sul lato server e non richiedono l'autenticazione. Se restituiscono vuoti, la versione della casella degli strumenti potrebbe non essere ancora sottoposto a provisioning. | Attendere 10 secondi e riprovare. |
400 Multiple tools without identifiers |
Due tipi di strumenti senza nome in una casella degli strumenti | Mantenere al massimo un tipo senza nome; aggiungere server_label a tutti gli strumenti MCP. |
CONSENT_REQUIRED (codice -32006) |
La connessione OAuth richiede il consenso dell'utente | Aprire l'URL del consenso in un browser e completare il flusso OAuth, quindi riprovare. |
401 nelle chiamate MCP |
Token scaduto o ambito errato | Usare l'ambito https://ai.azure.com/.default e aggiornare il token. |
| Nomi degli strumenti non corrispondenti | I nomi degli strumenti MCP sono preceduti dal prefisso server_label |
Usare il {server_label}.{tool_name} formato , ad esempio myserver.get_info. |
500 su send_ping() |
Il server MCP della casella degli strumenti non implementa il metodo MCP ping . |
Non chiamare send_ping(). Se il framework lo chiama automaticamente (ad esempio, Microsoft Framework agent MCPStreamableHTTPTool._ensure_connected()), disabilitare il controllo ping o eseguire l'override del metodo con un no-op. |
500 su prompts/list |
Il server MCP Foundry non implementa prompts/list. |
Passare load_prompts=False (o equivalente) al costruttore client MCP. |
500 con non streaming tools/call |
La modalità non di streaming (stream=False) non è supportata per gli endpoint MCP della casella degli strumenti. |
Usare stream=True sempre quando si chiamano gli strumenti MCP della casella degli strumenti. |
500 su tools/list |
Errore temporaneo del server | Riprovare dopo alcuni secondi. |
| Variabili di ambiente sovrascritte in fase di esecuzione | La piattaforma riserva tutte le variabili di ambiente precedute FOUNDRY_ da e potrebbe sovrascrivere automaticamente i valori definiti dall'utente. |
Rinominare le variabili di ambiente personalizzate per evitare il FOUNDRY_ prefisso , ad esempio usare TOOLBOX_MCP_ENDPOINT anziché FOUNDRY_TOOLBOX_ENDPOINT. |
Supporto della rete virtuale
Quando il progetto Foundry usa l'isolamento di rete (collegamento privato), non tutti i tipi di strumenti della casella degli strumenti sono supportati. La tabella seguente illustra lo stato di supporto per ogni tipo di strumento e il flusso del traffico in un ambiente isolato dalla rete.
| Tipo di strumento | Supporto della rete virtuale | Flusso del traffico |
|---|---|---|
| MCP | ✅ Supportati | Tramite la subnet della rete virtuale |
| Azure AI Search | ✅ Supportati | Tramite l'endpoint privato |
| Interprete di codice | ✅ Supportati | Microsoft rete backbone |
| Ricerca Web | ✅ Supportati | Endpoint pubblico |
| OpenAPI | ✅ Supportati | Dipende dalla configurazione di rete dell'API di destinazione |
| Ricerca file | ❌ Non supportato | Non ancora disponibile |
| Da agente a agente (A2A) | ✅ Supportati | Tramite l'endpoint privato |
Per istruzioni complete sulla configurazione dell'isolamento della rete, tra cui l'inserimento della rete virtuale per i requisiti del client dell'agente, la configurazione DNS e l'endpoint privato, vedere Configurare l'isolamento di rete per Microsoft Foundry.
Compatibilità tra area e modello
La disponibilità della casella degli strumenti dipende da due fattori oltre l'area del progetto:
- Area: alcuni tipi di strumento non sono disponibili in ogni area che supporta il servizio agente. Ad esempio, un'area che supporta l'endpoint della casella degli strumenti potrebbe non supportare tutti i tipi di strumenti predefiniti.
Prima di distribuire una casella degli strumenti, verificare che l'area di destinazione supporti i tipi di strumento che si prevede di usare. Per le tabelle di compatibilità complete, vedere Supporto degli strumenti in base all'area e al modello.