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.
Avvertimento
Quando ci si connette a strumenti esterni a Foundry, si potrebbero sostenere costi e i dati potrebbero essere inviati al di fuori del perimetro di conformità di Foundry e trattati in conformità ai termini applicabili e alle politiche di trattamento dei dati. Per informazioni su come gestire l'accesso allo strumento, vedere la documentazione dello strumento.
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.
- Applicare una protezione (criteri RAI) a una versione della casella degli strumenti.
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 | 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 Fabric IQ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Barriera di sicurezza (criteri RAI) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Riferimenti alle competenze | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | No |
| Strumento di ricerca degli strumenti | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Strumento IQ di lavoro | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Strumento di automazione browser | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | No |
Prerequisiti
Progetto Microsoft Foundry attivo.
RBAC: concedi il ruolo Foundry User nel progetto Foundry a ogni identità pertinente per il tuo 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 instradata tramite proxy attraverso connessioni OAuth o UserEntraToken (ad esempio, flussi MCP basati su OAuth o flussi di token Entra utente (pass-through dell'identità utente gestita)).
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 l'estensione Microsoft Foundry Toolkit per Visual Studio Code da Visual Studio Code Marketplace.
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/identityAzure Developer CLI: Installare l'interfaccia della riga di comando per sviluppatori di Azure (
azd, 1.25 o versione successiva) e il bundle di estensione dell'interfaccia della riga di comando di Foundry unificata:# Install the unified bundle (provides azd ai agent, connection, inspector, # project, routine, skill, and toolbox). azd ext install microsoft.foundry
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.
Tip
Se si usa GitHub Copilot per Azure per eseguire lo scaffolding di un agente ospitato che utilizza la casella degli strumenti, i riferimenti di competenza seguenti descrivono lo stesso contratto endpoint (env var, intestazioni, protocollo MCP, modelli di citazione e risoluzione dei problemi) che l'agente deve implementare:
- informazioni di riferimento Toolbox — formato dell'endpoint, protocollo MCP, gestione del consenso OAuth, modelli di citazione e risoluzione dei problemi.
- Usare una casella degli strumenti su un agente ospitato: risoluzione degli endpoint, contratto delle variabili di ambiente, struttura del payload, modelli di integrazione del codice e tracciamento.
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, ToolboxSearchPreviewTool, 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.toolboxes.create_toolbox_version(
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",
),
ToolboxSearchPreviewTool(),
],
)
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
)
));
ToolboxSearchPreviewTool searchTool = new() { Name = "ToolBoxSearch" };
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
toolboxName: "my-toolbox",
tools: [webTool, mcpTool, searchTool],
description: "Toolbox with web search, MCP, and tool search"
);
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, MCP, and tool search",
"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"
},
{
"type": "toolbox_search_preview"
}
]
}
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.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",
},
{ type: "toolbox_search_preview" },
],
{
description: "Toolbox with web search, MCP, and tool search",
},
);
console.log(`Created toolbox: ${toolboxVersion.name}, version: ${toolboxVersion.version}`);
Usare l'estensione Microsoft Foundry Toolkit for Visual Studio Code per creare e pubblicare una casella degli strumenti dalla visualizzazione Tools.
- 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 casella degli strumenti personalizzata immettere il nome e la descrizione della casella degli strumenti e aggiungere gli strumenti desiderati.
- Per abilitare il routing degli strumenti basato sulle finalità, selezionare Ricerca degli strumenti.
- Seleziona Pubblica.
La pubblicazione di una nuova casella degli strumenti crea la prima versione. Tale versione diventa automaticamente la versione predefinita.
Con il bundle di estensioni unificato microsoft.foundry (vedere Prerequisiti), creare una casella degli strumenti in due passaggi:
- Usare
azd ai connection createper registrare ogni connessione di progetto a cui fa riferimento la casella degli strumenti (una chiamata per ogni record di credenziali). - Usare
azd ai toolbox create --from-file <toolbox.yaml>per creare la casella degli strumenti. YAML fa riferimento alle connessioni in base al nome e non incorpora mai le credenziali.
Il modello è lo stesso per ogni tipo di connessione e tipo di autenticazione:
Impostare il progetto attivo una volta per ogni shell:
azd ai project set $PROJECT_ENDPOINTCreare una connessione con
azd ai connection create. I flag differiscono per tipo di autenticazione, ma la forma del comando è sempre:azd ai connection create <name> \ --kind <remote-tool|remote-a2a|cognitive-search|GroundingWithCustomSearch> \ --target <endpoint-url> \ --auth-type <none|custom-keys|api-key|oauth2|user-entra-token|project-managed-identity|agentic-identity> \ [--custom-key "Header=Value" | --key <key> | --client-id ... --client-secret ... --authorization-url ... --token-url ... | --audience <aad-resource-uri>]Usare
azd ai connection listeazd ai connection show <name>per controllare le connessioni eazd ai connection delete <name> --forcerimuoverle.Creare uno standard YAML della casella degli strumenti che faccia riferimento a una o più connessioni esistenti in base al nome. Il file YAML non include mai credenziali:
# my-toolbox.yaml description: <human-readable description> connections: - name: <project-connection-name> # must already exist in the project # Optional: add connectionless built-in tools and policies. tools: - type: web_search name: web - type: code_interpreter container: { type: auto } name: code # Tool search is connectionless. - type: toolbox_search_preview # For Azure AI Search, set the index in the tool entry: # - type: azure_ai_search # name: search # azure_ai_search: # indexes: # - project_connection_id: <azure-ai-search-connection-name> # index_name: <search-index-name> # For Bing Custom Search, set the instance in the tool entry: # - type: bing_custom_search # name: bing # custom_search_configuration: # project_connection_id: <bing-connection-name> # instance_name: <bing-instance-name> # Optional: attach existing project skills as MCP resources. skills: - name: <skill-name> # uses the skill's default version - name: <other-skill> version: "2" # pin to a specific skill version (string) policies: rai_config: rai_policy_name: <policy-name> # must already exist on the projectAlmeno uno di
connections,skillsotoolsdeve essere non vuoto. I riferimenti alle competenze devono puntare alle competenze già esistenti nello stesso progetto Foundry; vedere Usare le competenze in Foundry per crearle conazd ai skill create. Per informazioni dettagliate sulla configurazione della ricerca degli strumenti end-to-end, vedere Usare la ricerca degli strumenti.Crea la cassetta degli attrezzi da quel file:
azd ai toolbox create <toolbox-name> --from-file ./my-toolbox.yamlLa prima versione diventa automaticamente l'impostazione predefinita. Usare
azd ai toolbox list,azd ai toolbox show <name>azd ai toolbox version list <name>, eazd ai toolbox delete <name> --forceper gestire le caselle degli strumenti.
Esempio: server MCP con autenticazione basata su chiave
# 1. Create the connection
azd ai connection create my-gh-conn \
--kind remote-tool \
--target https://api.githubcopilot.com/mcp/ \
--auth-type custom-keys \
--custom-key "Authorization=Bearer $GITHUB_PAT"
# 2. Create the toolbox
azd ai toolbox create my-toolbox \
--from-file ./my-toolbox.yaml \
--no-prompt
# my-toolbox.yaml
description: GitHub MCP toolbox
connections:
- name: my-gh-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. |
Sostituire i segnaposto con i propri valori:
-
{project_endpoint}è l'endpoint del progetto Foundry, nel formatohttps://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>. Copialo dalla pagina Panoramica del tuo progetto nel portale Foundry oppure dalla colonna URL dell'endpoint nella visualizzazione Toolboxes di Microsoft Foundry Toolkit for Visual Studio Code. -
{toolbox_name}e{version}sono il nome e la versione della casella degli strumenti creati nel passaggio 1.
Tip
Connettere gli agenti all'endpoint consumer del toolbox. Serve sempre il default_version, così puoi promuovere nuove versioni senza modificare il codice dell'agente né distribuirlo nuovamente. Riserva l'endpoint developer toolbox (specifico della versione) per testare una versione prima di promuoverla.
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.
Nell'estensione Microsoft Foundry Toolkit for Visual Studio Code, copiare l'endpoint consumer della casella degli strumenti dalla visualizzazione 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}",
}
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
{"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
{"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
{"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
{"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}`,
},
},
},
);
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).I nomi degli strumenti sono organizzati per spazio dei nomi in base al tipo di strumento:
Tipo di strumento Formato del nome dello strumento Example MCP {server_label}.{tool_name}myserver.some_toolOpenAPI {openapi_name}.{operationId}weatherapi.getForecastA2A Il nome dello namestrumento (nome agente) o il nome della connessione senameviene omessomyagentTutti gli altri tipi di strumenti Il namevalore del campo o il nome predefinito dello strumentoweb_searchGli 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:-
-32006→ è 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). - Per Fabric IQ, verifica
result.structuredContent.documents[]per individuare i blocchi di citazione. Ogni documento include i campititleeurlche rimandano all'elemento di Fabric (ontologia, agente dati o modello semantico di Power BI) usato come base per la risposta. - 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"}]}} |
| Fabric IQ | Varia in base agli strumenti esposti — tipicamente {"query": "..."} per gli strumenti di query |
| IQ lavoro | {"message": {"parts": [{"type": "text", "text": "Hello"}]}} |
| MCP | {"query": "what is agent service"} |
Passaggio 4: Integrare la toolbox nell'agente
LangGraph
Vedere l'esempio completo per l'implementazione completa.
File .env:
FOUNDRY_PROJECT_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>
TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1
TOOLBOX_NAME=agent-tools
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()
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.
File .env:
FOUNDRY_PROJECT_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>
TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1
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),
timeout=120.0,
)
# Toolbox MCP endpoint (platform-injected at runtime via 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.
File .env:
GITHUB_TOKEN=<your-github-token>
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 l'estensione Microsoft Foundry Toolkit for Visual Studio Code 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.
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.
Passa l'endpoint del toolbox al tuo agente
Dopo aver creato la casella degli strumenti nel passaggio 1, recuperare l'endpoint MCP con azd ai toolbox show e passare tale endpoint al codice dell'agente come variabile di ambiente. L'agente legge la variabile all'avvio e la usa per connettersi alla casella degli strumenti.
Recupera l'endpoint di Toolbox:
azd ai toolbox show <toolbox-name> --output jsonIl campo
mcp_endpointnella risposta è l'endpoint consumer che si risolve sempre nelladefault_versiondella casella degli strumenti.Impostare l'endpoint come variabile di ambiente che l'agente legge all'avvio:
# .env (or however your runtime loads environment variables) TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/mcp?api-version=v1Nel codice dell'agente, leggi
TOOLBOX_ENDPOINTe connettiti ad esso con un client MCP. Usa i modelli di integrazione di Python o di .NET presentati in precedenza in questa sezione come riferimento per la configurazione del client e per il token Entra (ambitohttps://ai.azure.com/.default).
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.toolboxes.create_toolbox_version(
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 dell'estensione Microsoft Foundry Toolkit per Visual Studio Code 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
Note
È possibile eliminare le versioni della casella degli strumenti tramite Python SDK, .NET SDK, JavaScript SDK e solo API REST. La CLI di azd supporta le operazioni list, get e publish (promozione della versione predefinita).
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.
Note
Per l'interfaccia della riga di comando Azure Developer, ogni operazione di modifica destinata alla versione predefinita corrente, azd ai toolbox connection add/remove e azd ai toolbox skill add/remove, crea una versione della casella degli strumenti new che inoltra tutte le connessioni e le competenze precedentemente collegate con la modifica richiesta applicata. Nessuno di questi comandi cambia default_versionautomaticamente . Eseguire azd ai toolbox publish <toolbox-name> <version> quando si è pronti per rendere attiva la nuova versione. Per esaminare una versione in sospeso (non predefinita), usare azd ai toolbox show <name> --version <n>.
| 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.
policies.rai_config.rai_policy_name specifica la protezione facoltativa applicata a questa versione. |
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.toolboxes.create_toolbox_version(
name="my-toolbox",
description="Updated tools v2",
tools=[...],
)
print(f"Created version: {toolbox_version.version}")
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
toolboxName: "<toolbox-name>",
tools: [tool],
description: "Updated tools v2"
);
Console.WriteLine($"Created version: {toolboxVersion.Version}");
POST {project_endpoint}/toolboxes/<toolbox-name>/versions?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
{
"description": "Updated tools v2",
"tools": [...]
}
const toolboxVersion = await project.toolboxes.createVersion(
"<toolbox-name>",
[/* 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 dell'estensione Microsoft Foundry Toolkit per Visual Studio Code 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 l'interfaccia della riga di comando per sviluppatori Azure. 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.toolboxes.list_toolbox_versions(name="<toolbox-name>"))
for v in versions:
print(f"{v.version} — created {v.created_at}")
List<ToolboxVersion> versions = await toolboxClient
.GetToolboxVersionsAsync("<toolbox-name>")
.ToListAsync();
Console.WriteLine($"Found {versions.Count} toolbox version(s).");
foreach (ToolboxVersion v in versions)
{
Console.WriteLine($" - {v.Name} ({v.Version})");
}
GET {project_endpoint}/toolboxes/<toolbox-name>/versions?api-version=v1
Authorization: Bearer {token}
const versions = project.toolboxes.listVersions("<toolbox-name");
for await (const v of versions) {
console.log(`${v.version} — created ${v.created_at}`);
}
Usare la scheda Python, .NET, JavaScript o API REST per elencare le versioni della casella degli strumenti.
# The current default version is marked with *
azd ai toolbox version list <toolbox-name>
Ottenere una versione specifica
# Get a specific toolbox version
version_obj = project.toolboxes.get_toolbox_version(
toolbox_name="<toolbox-name>",
version="<version_id>",
)
ToolboxVersion versionObj = await toolboxClient.GetToolboxVersionAsync(
"<toolbox-name>",
"<version_id>"
);
Console.WriteLine($"Retrieved toolbox: {versionObj.Name} ({versionObj.Id})");
GET {project_endpoint}/toolboxes/<toolbox-name>/versions/{version}?api-version=v1
Authorization: Bearer {token}
const versionObj = await project.toolboxes.getVersion(
"<toolbox-name>",
"<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.
azd ai toolbox version get <toolbox-name> <version_id>
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.toolboxes.update(
toolbox_name="<toolbox-name>",
default_version="<version_id>",
)
print(f"Active version: {toolbox.default_version}")
ToolboxRecord record = await toolboxClient.UpdateToolboxAsync(
"<toolbox-name>",
"<version_id>"
);
Console.WriteLine($"Active version: {record.DefaultVersion}");
PATCH {project_endpoint}/toolboxes/<toolbox-name>?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.toolboxes.update(
"<toolbox-name>",
"<version_id>",
);
console.log(`Active version: ${toolbox.default_version}`);
Usare la scheda Python, .NET, JavaScript o API REST per impostare la versione della casella degli strumenti come impostazione predefinita.
Le versioni della casella degli strumenti non sono modificabili. Usare publish per rendere qualsiasi versione esistente il nuovo valore predefinito:
# Roll back or forward to a specific version
azd ai toolbox publish <toolbox-name> <version_id> --no-prompt
publish è l'unico percorso che cambia default_version dall'interfaccia della riga di comando; la modifica dei verbi (connection add/remove, skill add/remove) crea sempre una nuova versione senza promuoverla.
Eliminare una versione
# Delete a toolbox version
project.toolboxes.delete_toolbox_version(
toolbox_name="<toolbox-name>",
version="<version_id>",
)
await toolboxClient.DeleteToolboxVersionAsync(
"<toolbox-name>",
"<version_id>"
);
DELETE {project_endpoint}/toolboxes/<toolbox-name>/versions/{version}?api-version=v1
Authorization: Bearer {token}
await project.toolboxes.deleteVersion(
"<toolbox-name>",
"<version_id>",
);
Usare la scheda Python, .NET, JavaScript o API REST per eliminare una versione della casella degli strumenti.
Questa operazione non è supportata con l'interfaccia della riga di comando per sviluppatori Azure. 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.
La scheda azd sotto ogni strumento mostra il set di strumenti YAML dichiarativo. Per creare una casella degli strumenti in modo imperativo senza un progetto agente, usare il flusso di lavoro generico in quattro passaggi azd ai toolbox create --from-file e applicare i dati per ogni strumento illustrati nelle sezioni seguenti. Per distribuire una toolbox con un agente ospitato, definirla come servizio azure.ai.toolbox in azure.yaml e collegare l'agente a tale servizio con uses: o toolboxes:.
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)
Note
L'endpoint MCP della casella degli strumenti supporta operazioni a esecuzione prolungata tramite attività MCP, disponibile in anteprima. Per usare strumenti a esecuzione prolungata, assicurati che il framework dell'agente supporti le attività 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), AgenticIdentityTokene 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",
},
];
Crea una connessione di progetto per il tuo server MCP con il tipo di autenticazione adatto al tuo scenario, quindi fai riferimento a essa in un file YAML minimale del toolbox.
Passaggio 1: Creare la connessione
Note
Esportare l'endpoint del progetto e impostarlo come progetto attivo per i azd ai comandi:
PROJECT_ENDPOINT="https://<account>.services.ai.azure.com/api/projects/<project>"
azd ai project set $PROJECT_ENDPOINT
Selezionare la variante di autenticazione necessaria:
# No auth — public MCP server
azd ai connection create my-mcp-conn \
--kind remote-tool \
--target https://learn.microsoft.com/api/mcp \
--auth-type none
# Custom-keys header (for example, GitHub PAT)
azd ai connection create my-mcp-conn \
--kind remote-tool \
--target https://api.githubcopilot.com/mcp/ \
--auth-type custom-keys \
--custom-key "Authorization=Bearer $GITHUB_PAT"
# OAuth — bring your own app registration
azd ai connection create my-mcp-conn \
--kind remote-tool \
--target https://your-mcp-server.example.com \
--auth-type oauth2 \
--authorization-url https://auth.example.com/authorize \
--token-url https://auth.example.com/token \
--client-id <oauth-client-id> \
--client-secret <oauth-client-secret> \
--scopes "<scope1> <scope2>"
# User Entra token (managed user identity passthrough; for example, Microsoft Fabric)
azd ai connection create my-mcp-conn \
--kind remote-tool \
--target https://api.fabric.microsoft.com/v1/mcp/fabricaihub/integrations/m365 \
--auth-type user-entra-token \
--audience https://analysis.windows.net/powerbi/api
# Project managed identity — the project's system-assigned MI
azd ai connection create my-mcp-conn \
--kind remote-tool \
--target https://<resource>.cognitiveservices.azure.com/language/mcp \
--auth-type project-managed-identity \
--audience https://cognitiveservices.azure.com
# Agentic identity — the agent's per-project identity
azd ai connection create my-mcp-conn \
--kind remote-tool \
--target https://<resource>.cognitiveservices.azure.com/language/mcp \
--auth-type agentic-identity \
--audience https://cognitiveservices.azure.com
--auth-type |
Flag aggiuntive |
|---|---|
none |
— |
custom-keys |
--custom-key "Header=Value" (ripetibile) |
oauth2 |
--authorization-url, --token-url, --client-id, --client-secret--scopes |
user-entra-token |
--audience <entra-audience> |
project-managed-identity |
--audience <entra-audience> (facoltativo) |
agentic-identity |
--audience <entra-audience> |
Per l'autenticazione basata sull'identità (user-entra-token, project-managed-identity, agentic-identity), assegnare all'identità corrispondente il ruolo RBAC richiesto sulla risorsa di destinazione prima di chiamare la casella degli strumenti.
Passaggio 2: Definire la casella degli strumenti
# my-toolbox.yaml
description: MCP server tools
connections:
- name: my-mcp-conn
Passaggio 3. Creare la casella degli strumenti
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml
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 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>",
},
];
Predefinito (ancoraggio con Ricerca Bing, nessuna connessione necessaria):
# my-toolbox.yaml
description: Web search toolbox
tools:
- type: web_search
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml
Grounding con Ricerca personalizzata Bing:
# Step 1. Create the Bing Custom Search connection
azd ai connection create my-bing-custom \
--kind GroundingWithCustomSearch \
--target https://api.bing.microsoft.com/ \
--auth-type api-key \
--key "<bing-custom-search-key>"
--kind GroundingWithCustomSearch richiede l'uso esatto delle maiuscole e minuscole (PascalCase).
# Step 2. Define the toolbox (my-toolbox.yaml)
description: Bing Custom Search toolbox
connections:
- name: my-bing-custom
instance_name: your-bing-custom-instance
# Step 3. Create the toolbox
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml
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>",
},
],
},
},
];
# Step 1. Create the Azure AI Search connection
azd ai connection create my-search \
--kind cognitive-search \
--target "https://<your-search>.search.windows.net/" \
--auth-type api-key \
--key "<aisearch-admin-key>"
cognitive-search connessioni accettano anche --auth-type project-managed-identity (senza chiave). Quando si usa l'identità gestita del progetto, assegnare all'identità gestita assegnata dal sistema del progetto il ruolo Search Index Data Reader nel servizio di ricerca.
# Step 2. Define the toolbox (my-toolbox.yaml)
description: Azure AI Search toolbox
connections:
- name: my-search
index: your-index-name
# Step 3. Create the toolbox
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml
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 tramite una casella degli strumenti, caricare il file nell'endpoint Files a livello di risorsa (POST {account_endpoint}/openai/v1/files) con l'intestazione x-aml-project-id. A differenza del flusso dell’agente basato su prompt, i file caricati tramite l’endpoint Files con ambito di progetto (/api/projects/{name}/openai/v1/files) ricevono un oggetto owner_id che il contenitore casella degli strumenti non può verificare, quindi tools/call ha esito negativo per errore di verifica della titolarità.
Ottenere il GUID del progetto da Azure Resource Manager. Usare
properties.amlWorkspace.internalId(formato UUID con trattini), nonproperties.internalId(senza trattini, non accettato dal contenitore casella degli strumenti):ARM_TOKEN=$(az account get-access-token --query accessToken -o tsv) PROJECT_GUID=$(curl -s -H "Authorization: Bearer $ARM_TOKEN" \ "https://management.azure.com/subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.CognitiveServices/accounts/{account}/projects/{project}?api-version=2025-06-01" \ | jq -r '.properties.amlWorkspace.internalId')Caricare il file a livello di account (risorsa) con l'intestazione
x-aml-project-id:TOKEN=$(az account get-access-token --resource https://ai.azure.com/.default --query accessToken -o tsv) curl -X POST "https://{account}.services.ai.azure.com/openai/v1/files" \ -H "Authorization: Bearer $TOKEN" \ -H "x-aml-project-id: $PROJECT_GUID" \ -F "purpose=assistants" \ -F "file=@your-file.csv"
Il file id restituito è il valore fornito come <FILE_ID> nella configurazione dello strumento. I file vengono montati nella sandbox in /mnt/data/{file-id}-{original-filename}. Per altri esempi di caricamento e esempi specifici del linguaggio, 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>"],
},
},
];
L'interprete del codice è senza connessione. Dichiararlo direttamente sotto tools:.
# my-toolbox.yaml
description: Code interpreter toolbox
tools:
- type: code_interpreter
container: { type: auto }
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml
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 database vettoriale da usare con un toolbox, carica il file nell'endpoint Files di livello di risorsa con l'intestazione x-aml-project-id (lo stesso requisito di Code Interpreter: vedi la sezione precedente per informazioni su come ottenere il GUID del progetto da properties.amlWorkspace.internalId):
- Carica il tuo file:
POST {account_endpoint}/openai/v1/filesconpurpose=assistantse intestazionex-aml-project-id: {project-guid}. - Crea un archivio di vettori:
POST {account_endpoint}/openai/v1/vector_storescon l'ID del file restituito e lo stessox-aml-project-idheader.
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>"],
},
},
];
Ricerca file è senza connessione, ma richiede un ID archivio vettoriale esistente. Dichiararlo direttamente sotto tools:.
# my-toolbox.yaml
description: File search toolbox
tools:
- type: file_search
vector_store_ids:
- vs_xxxxxxxxxxxx
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml
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",
},
},
},
];
Gli strumenti OpenAPI incorporano la specifica direttamente in tools:. L'autenticazione basata sulla connessione (connection_auth) fa riferimento a una connessione di progetto. Gli strumenti OpenAPI anonimi non necessitano di alcuna connessione.
Passaggio 1: (Facoltativo) Creare la connessione di autenticazione
Ignorare questo passaggio per gli strumenti OpenAPI anonimi.
# API-key auth (passed by the platform on every call)
azd ai connection create my-api-conn \
--kind remote-tool \
--target https://api.example.com \
--auth-type custom-keys \
--custom-key "Authorization=Bearer <token>"
Gli strumenti OpenAPI accettano anche connessioni --auth-type oauth2. Vedere la sezione MCP precedente per il set completo di azd ai connection create flag.
Passaggio 2: Definire la casella degli strumenti
La specifica OpenAPI è in linea sotto tools[].openapi.spec.
# my-toolbox.yaml
description: OpenAPI toolbox
tools:
- type: openapi
name: my-api
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: my-api-conn
Per le API anonime, sostituire il auth: blocco con:
auth:
type: anonymous
security_scheme:
type: anonymous
Passaggio 3. Creare la casella degli strumenti
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml
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>",
},
];
Creare una connessione remote-a2a per l'agente remoto, quindi farvi riferimento in un file YAML minimale della casella degli strumenti.
Passaggio 1: Creare la connessione
Selezionare la variante di autenticazione necessaria:
# No auth
azd ai connection create my-a2a-conn \
--kind remote-a2a \
--target https://your-remote-agent.azurecontainerapps.io \
--auth-type none
# Custom-keys header
azd ai connection create my-a2a-conn \
--kind remote-a2a \
--target https://your-remote-agent.azurecontainerapps.io \
--auth-type custom-keys \
--custom-key "Authorization=Bearer <token>"
# OAuth — bring your own app registration
azd ai connection create my-a2a-conn \
--kind remote-a2a \
--target https://your-remote-agent.azurecontainerapps.io \
--auth-type oauth2 \
--authorization-url https://auth.example.com/authorize \
--token-url https://auth.example.com/token \
--client-id <oauth-client-id> \
--client-secret <oauth-client-secret> \
--scopes "<scope1> <scope2>"
# User Entra token (managed user identity passthrough)
azd ai connection create my-a2a-conn \
--kind remote-a2a \
--target https://your-remote-agent.azurecontainerapps.io \
--auth-type user-entra-token \
--audience "<entra-audience>"
# Project managed identity
azd ai connection create my-a2a-conn \
--kind remote-a2a \
--target https://your-remote-agent.azurecontainerapps.io \
--auth-type project-managed-identity \
--audience "<entra-audience>"
# Agentic identity
azd ai connection create my-a2a-conn \
--kind remote-a2a \
--target https://your-remote-agent.azurecontainerapps.io \
--auth-type agentic-identity \
--audience "<entra-audience>"
--auth-type |
Flag aggiuntive |
|---|---|
none |
— |
custom-keys |
--custom-key "Header=Value" (ripetibile) |
oauth2 |
--authorization-url, --token-url, --client-id, --client-secret--scopes |
user-entra-token |
--audience <entra-audience> |
project-managed-identity |
--audience <entra-audience> (facoltativo) |
agentic-identity |
--audience <entra-audience> |
Passaggio 2: Definire la casella degli strumenti
# my-toolbox.yaml
description: Agent-to-Agent toolbox
connections:
- name: my-a2a-conn
Passaggio 3. Creare la casella degli strumenti
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml
Fabric IQ
Usare questo modello per concedere all'agente l'accesso ai dati Microsoft Fabric, ovvero ontlogi, agenti dati e modelli semantici Power BI, tramite Fabric IQ. Specificare la connessione al progetto, l'URL del server MCP e l'etichetta del server per l'elemento Fabric di destinazione.
{
"description": "Fabric IQ for enterprise Fabric data access",
"tools": [
{
"type": "fabric_iq_preview",
"project_connection_id": "<CONNECTION_NAME>",
"server_label": "<SERVER_LABEL>",
"server_url": "<SERVER_URL>"
}
]
}
tools = [
{
"type": "fabric_iq_preview",
"project_connection_id": "<CONNECTION_NAME>",
"server_label": "<SERVER_LABEL>",
"server_url": "<SERVER_URL>",
}
]
Fabric IQ è gestito come endpoint MCP. Crea una connessione remote-tool al server Fabric IQ con user-entra-token (opzione consigliata; l'identità del chiamante viene inoltrata a Fabric), quindi fai riferimento a essa da un file YAML minimo del toolbox.
# Step 1. Create the Fabric IQ connection
azd ai connection create my-fabric-conn \
--kind remote-tool \
--target https://api.fabric.microsoft.com/v1/mcp/fabricaihub/integrations/m365 \
--auth-type user-entra-token \
--audience https://analysis.windows.net/powerbi/api
Le connessioni remote-tool accettano anche --auth-type oauth2. Per il set di flag completo, vedere la sezione MCP precedente.
# Step 2. Define the toolbox (my-toolbox.yaml)
description: Fabric IQ (semantic model)
tools:
- type: fabric_iq_preview
project_connection_id: my-fabric-conn
# Step 3. Create the toolbox
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml
Per i modelli server_url per tipo di elemento di Fabric, vedi Trova i dettagli del server Fabric IQ.
I blocchi di annotazione vengono restituiti in result.structuredContent.documents[]. Ogni documento include i campi title e url che puoi usare per generare le informazioni di citazione nella tua applicazione.
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"}
]
La ricerca degli strumenti è senza connessione. Dichiararlo direttamente sotto tools:.
# my-toolbox.yaml
description: Toolbox with intent-based tool routing
tools:
- type: toolbox_search_preview
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml
Note
toolbox_search_preview è una direttiva di configurazione che attiva la ricerca degli strumenti. Non compare nelle risposte tools/list e non viene conteggiato ai fini del limite di strumenti senza nome per tipo.
Quando la ricerca degli strumenti è abilitata, Foundry inserisce due meta-strumenti insieme agli strumenti della casella degli strumenti: tool_search e call_tool. Il call_tool meta-strumento funge da proxy che consente ai framework agente di richiamare qualsiasi strumento individuato in base al nome tramite un singolo punto di ingresso dichiarato. In questo modo si evitano errori di convalida dello schema che si verificano quando un framework tenta di chiamare uno strumento che non era presente nell'oggetto iniziale tools/list. Se il framework supporta chiamate dirette agli strumenti senza convalida preliminare dello schema, è anche possibile chiamare uno strumento individuato direttamente dopo averlo trovato con tool_search.
In Foundry Toolkit for Visual Studio Code selezionare Tool search nella scheda Build a Custom Toolbox quando si crea o si modifica una casella degli strumenti. Per altre informazioni, vedere Abilitare la ricerca degli strumenti in una casella degli strumenti.
IQ lavoro
Usa questo schema per consentire all'agente di accedere al contesto lavorativo di Microsoft 365 dell'utente, ovvero e-mail, riunioni, file e chat, tramite Work IQ. Fornire una connessione di progetto all'endpoint di IQ aziendale.
{
"description": "Work IQ for Microsoft 365 data access",
"tools": [
{
"type": "work_iq_preview",
"project_connection_id": "<CONNECTION_NAME>"
}
]
}
tools = [
{
"type": "work_iq_preview",
"project_connection_id": "<CONNECTION_NAME>",
}
]
Work IQ è gestito come endpoint A2A. Crea una connessione remote-a2a al server Work IQ con oauth2, quindi fai riferimento a essa da un file YAML minimo del toolbox.
# Step 1. Create the Work IQ connection
azd ai connection create my-workiq-conn \
--kind remote-a2a \
--target https://agent365.svc.cloud.microsoft/agents/agents/workiq \
--auth-type oauth2 \
--authorization-url https://login.microsoftonline.com/common/oauth2/v2.0/authorize \
--token-url https://login.microsoftonline.com/common/oauth2/v2.0/token \
--client-id <oauth-client-id> \
--client-secret <oauth-client-secret> \
--scopes "<scope1> <scope2>"
# Step 2. Define the toolbox (my-toolbox.yaml)
description: Work IQ toolbox
tools:
- type: work_iq_preview
project_connection_id: my-workiq-conn
# Step 3. Create the toolbox
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml
Automazione del browser
{
"description": "Perform actions using a real web browser",
"tools": [
{
"type": "browser_automation_preview",
"name": "<OPTIONAL_TOOL_NAME>",
"description": "<Optional description for the model>",
"browser_automation_preview": {
"connection": {
"project_connection_id": "<BROWSER_AUTOMATION_PROJECT_CONNECTION_ID>"
}
}
}
]
}
from azure.ai.projects.models import (
BrowserAutomationPreviewTool,
BrowserAutomationToolParameters,
BrowserAutomationToolConnectionParameters,
)
tools = [
BrowserAutomationPreviewTool(
browser_automation_preview=BrowserAutomationToolParameters(
connection=BrowserAutomationToolConnectionParameters(
project_connection_id="<BROWSER_AUTOMATION_PROJECT_CONNECTION_ID>",
)
)
)
]
ProjectsAgentTool tool = new BrowserAutomationPreviewTool(
new BrowserAutomationToolOptions(
new BrowserAutomationToolConnectionParameters("<BROWSER_AUTOMATION_PROJECT_CONNECTION_ID>")
)
);
const tools = [
{
type: "browser_automation_preview",
name: "<OPTIONAL_TOOL_NAME>",
description: "<Optional description for the model>",
browser_automation_preview: {
connection: {
project_connection_id: "<BROWSER_AUTOMATION_PROJECT_CONNECTION_ID>"
}
}
},
];
# Step 1. Create the Playwright Workspace connection
azd ai connection create my-browser-conn \
--kind PlaywrightWorkspace \
--target wss://your-browser-endpoint.api.playwright.microsoft.com/playwrightworkspaces/browsers \
--auth-type api-key \
--key "<playwright-workspaces-access-token>"
--kind PlaywrightWorkspace richiede l'uso esatto delle maiuscole e minuscole (PascalCase).
# Step 2. Define the toolbox (my-toolbox.yaml)
description: Browser Automation toolbox
tools:
- type: browser_automation_preview
project_connection_id: my-browser-conn
# Step 3. Create the toolbox
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml
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 -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 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. |
Configurare protezioni
Applicare criteri di protezione denominati a una versione della casella degli strumenti per garantire un filtraggio responsabile dei contenuti generati dall'IA in entrata e in uscita dallo strumento. Il meccanismo di protezione opera a livello del toolbox, indipendentemente da qualsiasi filtro dei contenuti a livello di modello.
Una protezione viene identificata dal nome del criterio, che si configura nel portale Foundry alla voce Guardrails. Quando si crea una versione della casella degli strumenti, impostare policies.rai_config.rai_policy_name sul nome del criterio.
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import WebSearchTool
endpoint = "https://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>"
project = AIProjectClient(endpoint=endpoint, credential=DefaultAzureCredential())
toolbox_version = project.beta.toolboxes.create_version(
name="my-toolbox",
description="Toolbox with guardrail",
tools=[WebSearchTool()],
policies={
"rai_config": {
"rai_policy_name": "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account-name>/raiPolicies/<policy-name>"
}
},
)
print(f"Created version: {toolbox_version.version}")
POST {endpoint}/toolboxes/{toolbox_name}/versions?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
{
"description": "Toolbox with guardrail",
"tools": [{ "type": "web_search" }],
"policies": {
"rai_config": {
"rai_policy_name": "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account-name>/raiPolicies/<policy-name>"
}
}
}
#pragma warning disable AAIP001
using Azure.AI.Projects;
using Azure.AI.Projects.Agents;
using Azure.Identity;
var projectEndpoint = Environment.GetEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT");
DefaultAzureCredential credential = new();
AIProjectClient projectClient = new(endpoint: new Uri(projectEndpoint), tokenProvider: credential);
AgentToolboxes toolboxClient = projectClient.AgentAdministrationClient.GetAgentToolboxes();
var toolboxVersion = toolboxClient.CreateToolboxVersion(
toolboxName: "my-toolbox",
description: "Toolbox with guardrail",
tools: [new WebSearchTool()],
policies: new ToolboxPolicies
{
RaiConfig = new RaiConfig { RaiPolicyName = "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account-name>/raiPolicies/<policy-name>" }
});
Console.WriteLine($"Created version: {toolboxVersion.Version}");
const toolboxVersion = await project.beta.toolboxes.createVersion(
"my-toolbox",
[{ type: "web_search" }],
{
description: "Toolbox with guardrail",
policies: {
rai_config: {
rai_policy_name: "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account-name>/raiPolicies/<policy-name>",
},
},
},
);
console.log(`Created version: ${toolboxVersion.version}`);
name: my-toolbox
description: Toolbox with guardrail
policies:
rai_config:
rai_policy_name: /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account-name>/raiPolicies/<policy-name>
tools:
- type: web_search
La configurazione di Guardrail non è ancora disponibile nell'estensione VS Code. Usare l'API REST, l'SDK o azd per configurare le protezioni.
Associare competenze a una cassetta degli strumenti
Associare le competenze a una versione della casella degli strumenti per renderle disponibili agli agenti tramite l'endpoint MCP della casella degli strumenti. Ogni riferimento di competenza specifica il nome della competenza e una versione facoltativa. Omettere version per usare la default_versiondella skill; aggiungere una stringa version per usare uno snapshot immutabile.
Una versione della casella degli strumenti può contenere strumenti, competenze o entrambi. Gli esempi seguenti creano una versione della casella degli strumenti che contiene un riferimento a una singola competenza. Per aggiungere abilità a una cassetta degli strumenti che contiene già strumenti, includi lo stesso tools usato nel Passaggio 1 insieme all'array skills.
Importante
Le skill associate a una toolbox devono trovarsi nello stesso progetto Foundry. I riferimenti tra progetti non sono supportati.
Quando un agente o un client MCP si connette all'endpoint della casella degli strumenti, le competenze vengono esposte come risorse MCP. Il framework client o agente MCP deve supportare il protocollo MCP Resources per individuare e caricare automaticamente le competenze. Per verificare che le skill siano individuabili, inviare una richiesta resources/list all'endpoint MCP della casella degli strumenti e controllare che i nomi delle skill compaiano nella risposta.
POST {endpoint}/toolboxes/{toolbox_name}/versions?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
Accept: application/json
Foundry-Features: Skills=V1Preview
{
"description": "Toolbox with a skill reference",
"tools": [],
"skills": [
{
"type": "skill_reference",
"name": "greeting"
}
]
}
Per aggiungere una versione specifica:
{
"skills": [
{
"type": "skill_reference",
"name": "greeting",
"version": "v1"
}
]
}
from azure.ai.projects.models import ToolboxSkillReference
toolbox_version = project.beta.toolboxes.create_version(
name="my-toolbox",
description="Toolbox with a skill reference",
tools=[],
skills=[
ToolboxSkillReference(name="greeting"), # use default version
# ToolboxSkillReference(name="greeting", version="v1"), # pin to v1
],
)
print(f"Created toolbox version: {toolbox_version.id}")
#pragma warning disable AAIP001
// Reuse the AgentToolboxes client (toolboxClient) from Step 1.
ToolboxSkillReference skillRef = new("greeting");
// To pin a version: new ToolboxSkillReference("greeting") { Version = "v1" }
ToolboxVersion toolboxVersion = toolboxClient.CreateToolboxVersion(
name: "my-toolbox",
tools: [],
skills: [skillRef],
description: "Toolbox with a skill reference"
);
Console.WriteLine($"Created toolbox version: {toolboxVersion.Id}");
const toolboxVersion = await project.beta.toolboxes.createVersion(
"my-toolbox",
[],
{
description: "Toolbox with a skill reference",
skills: [
{ type: "skill_reference", name: "greeting" },
// { type: "skill_reference", name: "greeting", version: "v1" }, // pin to v1
],
},
);
console.log(`Created toolbox version: ${toolboxVersion.id}`);
La CLI di Azure Developer supporta i riferimenti alle skill in due punti: in modo dichiarativo come blocco skills: di primo livello nel file YAML azd ai toolbox create --from-file e in modo imperativo tramite i verbi azd ai toolbox skill add/list/remove. Ogni riferimento richiede un name (obbligatorio) e un version facoltativo (stringa). Omettere version per seguire la default_version della skill; specificare una stringa di versione per bloccare la casella degli strumenti su uno snapshot immutabile.
Dichiarare le competenze quando si crea la casella degli strumenti
# my-toolbox.yaml
description: Toolbox with skill references
connections:
- name: my-gh-conn
skills:
- name: greeting # follows the skill's default version
- name: review-checklist
version: "2" # pin to skill version 2
azd ai toolbox create my-toolbox --from-file ./my-toolbox.yaml --no-prompt
Aggiungere, elencare e rimuovere competenze in una casella degli strumenti esistente
# Add a skill (follows default version)
azd ai toolbox skill add my-toolbox greeting
# Add a skill pinned to a specific version
azd ai toolbox skill add my-toolbox review-checklist@2
# Add multiple skills from a file (same shape as the create YAML's skills block)
azd ai toolbox skill add my-toolbox --from-file ./skills.yaml
# List skill references on the current default version
azd ai toolbox skill list my-toolbox --output table
# Remove a skill (--force skips the confirmation prompt; multiple names allowed)
azd ai toolbox skill remove my-toolbox greeting --force
skill list mostra solo la versione predefinita. Le skill aggiunte mostrano la propria versione; quelle non aggiunte mostrano la dicitura (default). Per esaminare le skill in una versione in attesa, eseguire azd ai toolbox show <toolbox> --version <n> --output json e leggere la matrice skills.
Importante
skill add e skill remove creano entrambi una nuova versione della toolbox che mantiene tutte le connessioni e le competenze precedentemente associate, applicando la modifica richiesta.
Non impostano la nuova versione come predefinita, quindi le modifiche non sono visibili ai client MCP finché non si esegue azd ai toolbox publish <toolbox> <version>. Per modificare la versione bloccata di una skill già associata — ad esempio, aggiornare greeting da v1 a v2 — esegui tre comandi in ordine: skill remove, publish la nuova versione, quindi skill add <name>@<new-version> (skill add blocca i duplicati quando vengono controllati rispetto alla versione predefinita corrente).
I nomi delle competenze devono corrispondere ^[a-z0-9]([a-z0-9\-]*[a-z0-9])?$ (lettere minuscole, cifre e trattini, massimo 64 caratteri; nessun trattino iniziale o finale). Un @ finale in <name>@<version> (una versione vuota) è rifiutato.
I riferimenti alle competenze non sono attualmente configurabili tramite l'estensione VS Code. Usare l'API REST o l'SDK per configurare le competenze.
Convalidare l'individuazione delle competenze
Dopo aver collegato le competenze a una versione della casella degli strumenti, verificare che siano individuabili tramite l'endpoint MCP della casella degli strumenti usando MCP Python SDK:
import asyncio
from azure.identity import DefaultAzureCredential
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
async def list_skills():
credential = DefaultAzureCredential()
token = credential.get_token("https://ai.azure.com/.default").token
toolbox_url = "{endpoint}/toolboxes/my-toolbox/mcp?api-version=v1"
headers = {
"Authorization": f"Bearer {token}",
}
async with streamablehttp_client(toolbox_url, headers=headers) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
resources = await session.list_resources()
for resource in resources.resources:
print(f"Skill: {resource.uri} - {resource.name}")
asyncio.run(list_skills())
Le competenze vengono visualizzate come risorse MCP con URI nel formato skill://{name}.
Usare le skill di un agente (Microsoft Agent Framework, .NET)
In .NET usare AgentSkillsProviderBuilder().UseMcpSkills(mcpClient) da Microsoft Agent Framework SDK per individuare le competenze basate su MCP da un endpoint della casella degli strumenti e inserirle come AIContextProviders nell'agente. L'agente carica quindi, in fase di esecuzione, le istruzioni di ciascuna abilità quando il modello stabilisce che è rilevante. Di seguito è Program.cs ospitato l'agente con il livello di hosting Responses (AddFoundryResponses e MapFoundryResponses).
using System.Net.Http.Headers;
using Azure.AI.Projects;
using Azure.Core;
using Azure.Identity;
using DotNetEnv;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Foundry.Hosting;
using Microsoft.Extensions.AI;
using ModelContextProtocol.Client;
// Load .env file if present (for local development).
Env.TraversePath().Load();
string projectEndpoint = Environment.GetEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT")
?? throw new InvalidOperationException("FOUNDRY_PROJECT_ENDPOINT environment variable is not set.");
string deployment = Environment.GetEnvironmentVariable("AZURE_AI_MODEL_DEPLOYMENT_NAME")
?? throw new InvalidOperationException("AZURE_AI_MODEL_DEPLOYMENT_NAME environment variable is not set.");
string toolboxName = Environment.GetEnvironmentVariable("TOOLBOX_NAME")
?? throw new InvalidOperationException("TOOLBOX_NAME environment variable is not set.");
// Build the Foundry Toolbox MCP URL from the project endpoint and toolbox name.
string toolboxMcpServerUrl = $"{projectEndpoint.TrimEnd('/')}/toolboxes/{toolboxName}/mcp?api-version=v1";
TokenCredential credential = new DefaultAzureCredential();
// HttpClient that attaches a fresh Foundry bearer token to every request.
// CheckCertificateRevocationList = true satisfies CA5399.
using var httpClient = new HttpClient(
new BearerTokenHandler(credential, "https://ai.azure.com/.default")
{
CheckCertificateRevocationList = true,
});
Console.WriteLine($"Connecting to Foundry Toolbox '{toolboxName}' MCP server...");
// Connect to the Foundry Toolbox MCP endpoint.
await using var mcpClient = await McpClient.CreateAsync(
new HttpClientTransport(
new HttpClientTransportOptions
{
Endpoint = new Uri(toolboxMcpServerUrl),
Name = toolboxName,
TransportMode = HttpTransportMode.StreamableHttp,
},
httpClient));
// AgentSkillsProvider implements progressive disclosure over the MCP-discovered skills:
// names and descriptions are advertised in the system prompt, and the full skill body
// (and any supplementary resources) is loaded on demand when the model decides it is
// relevant.
var skillsProvider = new AgentSkillsProviderBuilder()
.UseMcpSkills(mcpClient)
.Build();
AIAgent agent = new AIProjectClient(new Uri(projectEndpoint), credential)
.AsAIAgent(new ChatClientAgentOptions
{
Name = "foundry-toolbox-mcp-skills",
Description = "Agent that discovers MCP-based skills from a Foundry Toolbox and exposes them via AgentSkillsProvider.",
ChatOptions = new ChatOptions
{
ModelId = deployment,
Instructions = "You are a helpful assistant.",
},
AIContextProviders = [skillsProvider],
});
var builder = AgentHost.CreateBuilder(args);
builder.Services.AddFoundryResponses(agent);
builder.RegisterProtocol("responses", endpoints => endpoints.MapFoundryResponses());
var app = builder.Build();
app.Run();
// HttpClientHandler that attaches a fresh Foundry bearer token to every outgoing request.
internal sealed class BearerTokenHandler(TokenCredential credential, string scope) : HttpClientHandler
{
private readonly TokenRequestContext _tokenContext = new([scope]);
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
AccessToken token = await credential.GetTokenAsync(this._tokenContext, cancellationToken).ConfigureAwait(false);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.Token);
return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
}
}
Per l'esempio completo, inclusi i file di progetto e i passaggi di distribuzione, vedere l'esempio Competenze nella casella degli strumenti.
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 |
| Fabric IQ | ❌ Non supportato | Non ancora disponibile |
| IQ lavoro | ❌ Non supportato | Non ancora disponibile |
| Automazione del browser | ❌ Non supportato | Non ancora disponibile |
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.
Contenuti correlati
- Connettere gli agenti ai server Model Context Protocol
- Aggiungere l'autenticazione del server MCP
- Strumento di ricerca Web
- Strumento ricerca intelligenza artificiale di Azure
- Panoramica dei guardrail
- Gestire le competenze
- Distribuire un agente ospitato
- Aggiungere una connessione al progetto
- Configurare l'isolamento di rete per Microsoft Foundry