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 disponibili 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 presentare funzionalità limitate. Per ulteriori informazioni, vedere Condizioni supplementari per l'uso delle versioni di anteprima di Microsoft Azure.
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 dispongono già dell'infrastruttura: gateway, insiemi di credenziali, criteri e osservabilità. Manca un'esperienza di sviluppo che trasformi questa infrastruttura in qualcosa di riutilizzabile, individuabile e gestito di default.
Toolbox offre quell'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.
Toolbox copre il ciclo di vita completo degli strumenti attraverso quattro pilastri: costruire e consumare sono attualmente disponibili.
| Pilastro | Condizione | Che 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 si creano in Foundry, ma la superficie di consumo è aperta. Qualsiasi client o runtime dell'agente compatibile con MCP può usare una casella degli strumenti, inclusi gli agenti creati con qualsiasi framework, gli IDE abilitati per MCP e il 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.
In questo articolo vengono illustrate le operazioni seguenti:
- Creare una casella degli strumenti con uno o più strumenti.
- Ottenere l'endpoint MCP del toolbox.
- Verificare che gli strumenti vengano caricati correttamente.
- Integrare una casella degli strumenti nell'agente ospitato.
- Gestire le versioni della toolbox e impostare una versione come 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à
| Feature | PYTHON SDK | REST API | .NET SDK | JavaScript SDK | azd (distribuire) | Kit di Strumenti per Fonderia |
|---|---|---|---|---|---|---|
| Aggiornare, elencare, recuperare ed eliminare la casella degli strumenti | ✔️ | ✔️ | ✔️ | ✔️ | N/A | ✔️ |
| Creazione della versione della casella degli strumenti | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Elenco delle versioni del Toolbox, ottenere ed eliminare | ✔️ | ✔️ | ✔️ | ✔️ | N/A | No. L'interfaccia utente mostra solo la versione più recente. |
| Strumento MCP | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Strumento di ricerca Web | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Strumento ricerca intelligenza artificiale di Azure | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Strumento Interprete di Codice | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Strumento di Ricerca file | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Strumento OpenAPI | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | No |
| Strumento tra agenti (A2A) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | No |
| Strumento di ricerca degli strumenti | ✔️ | ✔️ | No | No | ✔️ | No |
Prerequisiti
Progetto Microsoft Foundry attivo.
RBAC: concedi il ruolo Foundry User nel progetto Foundry a ogni identità pertinente per il tuo scenario:
Importante
I ruoli RBAC di Foundry sono stati recentemente rinominati. Foundry User, Foundry Owner, Foundry Account Owner e Foundry Project Manager erano precedentemente denominati Azure AI User, Azure AI Owner, Azure AI Account Owner e Azure AI Project Manager. È possibile che i nomi precedenti vengano visualizzati in alcune posizioni durante l'esecuzione della ridenominazione. Gli ID ruolo e le autorizzazioni di base sono invariati dalla ridenominazione.
- 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.
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.IdentityJavaScript SDK:
npm install @azure/ai-projects @azure/identityazd (deploy): installare l'interfaccia della riga di comando per sviluppatori di Azure e l'estensione agent:
azd extension install azure.ai.agents
Importante
- Una casella degli strumenti supporta al massimo uno strumento senza un
namecampo per tipo di strumento (Ricerca Web, Ricerca di intelligenza artificiale di Azure, 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 unnamerestituisce un erroreinvalid_payload. 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"
}
]
}
Note
Usare l'ambito del token https://ai.azure.com/.default quando si recupera il bearer token.
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 Strumenti .
- Selezionare Foundry Toolkit nella barra delle attività.
- Sotto Risorse personali, espandere Il nome del tuo progetto>Strumenti.
- 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.
Usando azd, si dichiarano le risorse del toolbox in un file agent.yaml anziché utilizzare l'SDK. Definire gli strumenti nella sezione resources e distribuire 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 uno dei seguenti:
-
Un file
agent.yamlspecifico: init copia tutti i file dalla stessa directory come 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 di 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 | Punto finale | Quando utilizzare |
|---|---|---|
| Sviluppatore 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 casella degli strumenti | {project_endpoint}/toolboxes/{toolbox_name}/mcp?api-version=v1 |
Connettere gli agenti alla casella degli strumenti. Serve sempre 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. Le chiamate che omettono questa intestazione non riescono. Includerla in tutti i client HTTP, i trasporti MCP e i wrapper SDK che chiamano l'endpoint della casella degli strumenti.
Note
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 Promuovere una versione a predefinita.
In Foundry Toolkit per Visual Studio Code copiare l'endpoint consumer della casella degli strumenti dalla vista Caselle degli strumenti.
- Selezionare Foundry Toolkit nella barra delle attività.
- Sotto Risorse personali, espandere Il nome del tuo progetto>Strumenti.
- Nella scheda Barra degli strumenti, trova la tua barra degli strumenti.
- Nella colonna ENDPOINT URL copiare l'endpoint.
Il valore URL 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 agli strumenti ed elencarli
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())
Note
Usare la scheda API REST per verificare la disponibilità degli strumenti da .NET o usare Python MCP Client SDK.
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 agli strumenti ed elencarli
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 con un esempio di agente ospitato sottoposto a scaffolding per convalidare il caricamento della casella degli strumenti in VS Code.
- In Foundry Toolkit, sotto Le mie risorse>Il nome del progetto>Strumenti, individua la casella degli strumenti che vuoi testare.
- Selezionare Modello di codice scaffold.
- 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 API REST o Python in questo passaggio.
Note
Usare la scheda API REST per verificare la disponibilità degli strumenti o usare Python MCP Client SDK.
Controllare : inizializzare: HTTP 200. Se si ignora il passaggio di inizializzazione, le chiamate successive hanno esito negativo.
Controllare: 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.
Verifica - tools/call:
- Nessun campo di primo livello
error. Se presente, esaminareerror.code. Per i codici di errore MCP standard, vedere la specifica MCP:-
-32007→ è necessario il consenso OAuth (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 in
result.content[].resource._metaverificare la presenza di metadati in blocchi (title,file_id,document_chunk_id,score). - Per Ricerca Web, in
result.content[].resource._meta.annotations[]verificare la presenza di citazioni URL (type,url,title,start_index,end_index). - Presta attenzione a
"ServerError"nel contenuto di testo: lo strumento è stato eseguito, ma ha riscontrato un errore interno.
Esempi di argomenti specifici tools/call dello strumento:
| Tipo di strumento | Argomenti |
|---|---|
| Ricerca IA | {"query": "search text"} |
| Ricerca file | {"queries": ["search text"]} |
| Interprete di codice | {"code": "print(2 ** 100)"} |
| Web Search | {"search_query": "weather in seattle"} |
| A2A | {"message": {"parts": [{"type": "text", "text": "Hello"}]}} |
| MCP | {"query": "what is agent service"} |
Passaggio 4: Integrare la toolbox 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
Utilizzare MCPStreamableHTTPTool dall'Agent Framework SDK per connettersi direttamente all'endpoint MCP del toolbox.
.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 GitHub Copilot SDK per creare un agente basato sulla casella degli strumenti che collega la chiamata dello strumento di Copilot all'endpoint MCP della casella degli strumenti Foundry.
Note
Copilot SDK 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"],
)
Microsoft Agent Framework
Usare ResponsesServer da Agent Framework SDK con un ToolboxMcpClient personalizzato per individuare e richiamare gli strumenti della casella 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 avvolge le chiamate dirette JSON-RPC verso l'endpoint MCP.
ToolboxHandler connette le chiamate dello strumento LLM al client MCP usando un ciclo standard per la chiamata degli strumenti. Per l'implementazione completa di entrambe le classi, vedere l'esempio completo.
Note
Gli esempi di integrazione per questo passaggio sono disponibili solo per Python e .NET.
Note
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à.
- Sotto Risorse personali, espandere Il nome del tuo progetto>Strumenti.
- Nella scheda Caselle degli strumenti, individuare la casella degli strumenti da usare, quindi selezionare Scaffolding modello di codice.
- Nel riquadro comandi scegliere una cartella di progetto quando richiesto.
- Aprire il file generato
README.mde seguire i passaggi di installazione, esecuzione locale e distribuzione per il scaffold.
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 di scaffolding gestisce automaticamente l'intestazione Foundry-Features: Toolboxes=V1Preview.
Se si vuole integrare una casella degli strumenti in un progetto dell'agente ospitato esistente anziché generare un nuovo esempio, usare l'endpoint copiato dal passaggio 2 con i modelli Python o .NET in questa sezione.
Distribuire con azd
Usare l'interfaccia della riga di comando per sviluppatori di Azure (azd) per dichiarare le risorse della casella degli strumenti direttamente in un agent.yaml file e distribuire l'agente con un singolo comando. Usando questo approccio, non è necessario creare la casella degli strumenti separatamente tramite SDK o REST.
azd esegue il provisioning della casella degli strumenti, delle connessioni e della distribuzione modello.
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 manifesto (main.py, Dockerfile, requirements.txt e così via) vengono copiati testualmente nel progetto di 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 (Esempio di Ricerca Web + GitHub MCP):
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
Note
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. Il tuo main.py legge la variabile per toolbox 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. Utilizzando azd, FOUNDRY_AGENT_TOOLBOX_ENDPOINT e TOOLBOX_{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 oggetto _meta.tool_configuration in ogni voce 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'applicazione è interamente responsabilità del runtime dell'agente.
Leggere require_approval da tools/list
Ogni voce di strumento in una risposta tools/list include un blocco _meta 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"
}
}
}
Valore della proprietà require_approval |
Comportamento |
|---|---|
"always" |
L'agente deve chiedere conferma all'utente prima di ogni chiamata. |
"never" |
L'agente può richiamare liberamente lo strumento. |
Implementare il controllo di approvazione (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"]
Note
- Il rilevamento avviene all'avvio. Il controllo dell'approvazione viene eseguito una sola volta quando l'agente viene inizializzato. Non c'è alcun sovraccarico associato a ciascuna 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 eseguetools/callindipendentemente da questa impostazione. Il runtime dell'agente è responsabile del controllo della chiamata.
Configurare require_approval su uno strumento
Impostare require_approval quando si crea una versione della casella degli strumenti. Gli esempi di strumenti MCP nel passaggio 1 mostrano entrambi "always" e "never" valori. È 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 del Foundry Toolkit in questo articolo si concentra sulla creazione e l'utilizzo della toolbox 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
Note
È possibile gestire le versioni della casella degli strumenti (elenco, ottenere, promuovere, 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 degli strumenti di una casella. Ogni chiamata all'endpoint 'create' produce un nuovo ToolboxVersionObject oggetto. 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 promossa automaticamente: sei tu a decidere 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 | Description |
|---|---|---|
ToolboxObject |
id, name, default_version |
Contenitore della casella degli strumenti.
default_version indica la versione attiva. |
ToolboxVersionObject |
id, name, version, descriptioncreated_at, , tools[]policies |
Snapshot non modificabile dell'elenco degli strumenti della casella 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 crei la prima versione di una nuova casella degli strumenti, la versione predefinita è v1 finché non viene 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 descritto in questo articolo è incentrato sulla creazione di una toolbox e sulla generazione della struttura di base di un agente Hosted che la utilizza.
Questa operazione non è supportata con azd. Per creare una versione della casella degli strumenti, usare la scheda Python, .NET, API REST 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, API REST 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, API REST o JavaScript .
Promuovere una versione a predefinita
L'endpoint MCP serve sempre il 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 impostare la versione della casella degli strumenti come impostazione predefinita.
Questa operazione non è supportata con azd. Per impostare una versione come predefinita, usare la scheda Python, .NET, API 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, API REST 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, Ricerca intelligenza artificiale di Azure 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"
}
]
}
Note
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 una sola istanza di ciascun tipo di strumento predefinito in una casella degli strumenti senza un campo name. 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 campo name per includere più istanze dello stesso tipo di strumento in un toolbox. 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 authType determina il flusso di 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à agente (ENTRA ID):
Usare questo modello per i server MCP che supportano l'autenticazione di 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
Note
È necessario assegnare all'identità dell'agente il ruolo RBAC richiesto nella risorsa di destinazione prima che il server MCP accetti le richieste.
Token Entra utente (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
Note
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 -32007) con un URL di consenso:
{
"error": {
"code": -32007,
"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 riescono senza nuovi prompt.
Ricerca Web
Importante
- Ricerca Web utilizza il Grounding con Ricerca Bing e il Grounding con Ricerca Personalizzata Bing, che sono Servizi di Consumo Primari regolati da questi Termini di Utilizzo di Grounding con Bing e dall'Informativa sulla Privacy di Microsoft.
- Il Microsoft Data Protection Addendum non si applica ai dati inviati a Grounding con Ricerca Bing e Grounding con Ricerca personalizzata Bing. Quando si usa Grounding con Ricerca Bing e Grounding con Ricerca personalizzata Bing, i trasferimenti di dati avvengono al di fuori dei limiti geografici e di conformità.
- L'uso di Grounding con Ricerca Bing e di Grounding con Ricerca personalizzata Bing comporta dei costi. Per informazioni dettagliate, vedere i prezzi.
- Vedere la sezione relativa alla gestione per informazioni su come gli amministratori di 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 Grounding con Ricerca personalizzata Bing, aggiungere un oggetto web_search.custom_search_configuration che fa riferimento a una connessione Grounding con 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 Grounding 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 Grounding con 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
Note
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
}
}
Ricerca di intelligenza artificiale di Azure
{
"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 |
Yes | ID risorsa della connessione del progetto a Azure AI Search. |
index_name |
Yes | Nome dell'indice nella risorsa di Ricerca di intelligenza artificiale di Azure. |
top_k |
No | Assume il valore predefinito 5. |
query_type |
No | Il valore predefinito è vector_semantic_hybrid. Valori supportati: simple, vector, semantic, vector_simple_hybrid, vector_semantic_hybrid. |
filter |
No | Si applica a tutte le query che l'agente effettua sull'indice. |
I risultati della ricerca includono metadati in blocchi in result.structuredContent.documents[]. Ogni documento include i campi title, url, id e score che è possibile usare per generare i dettagli della citazione nell'app.
Interprete di codice
Usare questo modello per consentire all'agente di scrivere ed eseguire codice Python. 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
Estrarre container_id da content[]._meta.container_id nella risposta di tools/call, quindi chiamare l'API dei File del 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 riferiti agli archivi vettoriali già creati nel progetto Foundry.
Per creare un file e un archivio vettoriale, usare l'API {project_endpoint}/openai/v1 :
- Carica il tuo file:
POST {project_endpoint}/openai/v1/filesconpurpose=assistants. - Creare un archivio di vettori:
POST {project_endpoint}/openai/v1/vector_storescon l'ID del 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"
Note
Quando la Ricerca file restituisce i risultati su MCP, i metadati del blocco vengono incorporati nel contenuto della risposta dello strumento come marcatori 【index†filename†file_id】. 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 blocco _meta all'interno di ogni elemento risorsa contiene title, file_id, document_chunk_id e la rilevanza score 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 utilizza l'autenticazione dell'identità gestita, è necessario assegnare il ruolo RBAC appropriato all'identità gestita del progetto Foundry sul servizio di destinazione. Ad esempio, assegnare il ruolo Lettore o superiore 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"
}
}
}
]
}
Autenticazione connessione progetto:
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 disponga del ruolo di controllo degli accessi in base ai ruoli necessario nel servizio di destinazione prima di usare questo schema.
{
"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
Agente-ad-Agente (A2A)
Utilizzare questo schema per richiamare 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
Ricerca degli strumenti
Usare questo modello per abilitare il routing degli strumenti basato sulle finalità. Quando toolbox_search_preview è incluso in una casella degli strumenti, la piattaforma seleziona gli strumenti più rilevanti per ogni richiesta anziché esporre tutti gli strumenti al modello contemporaneamente. Non è necessaria alcuna configurazione aggiuntiva.
{
"description": "Toolbox with intent-based tool routing",
"tools": [
{
"type": "toolbox_search_preview"
}
]
}
tools = [
{"type": "toolbox_search_preview"}
]
Note
toolbox_search_preview è una direttiva di configurazione che attiva la ricerca degli strumenti. Non viene visualizzato nelle risposte tools/list e non viene conteggiato ai fini del limite di strumenti senza nome per tipo.
Troubleshoot
| Sintomo | Causa possibile | 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 utilizza l'identità gestita (PMI, identità agente o MI), verificare le corrette assegnazioni di ruolo RBAC per il chiamante sulla 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 utilizza l'autenticazione tramite identità gestita, verificare anche le assegnazioni di ruoli RBAC sul 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 attrezzi non è stata completamente configurata o il tipo di strumento non è supportato nella regione. 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 -32007) |
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 MCPStreamableHTTPTool._ensure_connected()Agent Framework), 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 tools/call non in streaming |
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 | ✅ Sostenuto | Tramite la subnet della rete virtuale |
| Ricerca di intelligenza artificiale di Azure | ✅ Sostenuto | Tramite l'endpoint privato |
| Interprete di codice | ✅ Sostenuto | rete backbone di Microsoft |
| Ricerca Web | ✅ Sostenuto | Endpoint pubblico |
| OpenAPI | ✅ Sostenuto | Dipende dalla configurazione di rete dell'API di destinazione |
| Ricerca file | ❌ Non supportato | Non ancora disponibile |
| Agente-ad-Agente (A2A) | ✅ Sostenuto | Tramite l'endpoint privato |
Per istruzioni complete sulla configurazione dell'isolamento della rete, tra cui l'inserimento della rete virtuale per il client dell'agente, la configurazione DNS e i requisiti degli endpoint privati, 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.