Curare il set di strumenti basato su intenti in Foundry (anteprima)

Importante

Gli elementi contrassegnati (anteprima) in questo articolo sono attualmente disponibili in anteprima pubblica. Questa anteprima viene fornita senza un contratto di servizio e non è consigliabile per i carichi di lavoro di produzione. Alcune funzionalità potrebbero non essere supportate o potrebbero presentare funzionalità limitate. Per ulteriori informazioni, vedere Condizioni supplementari per l'uso delle versioni di anteprima di Microsoft Azure.

Un singolo agente può dipendere da più strumenti: API, server MCP (Model Context Protocol), connettori e flussi, ognuno con il proprio modello di autenticazione e il proprio team proprietario. Man mano che si esegue il ridimensionamento in un'organizzazione, i team implementano di nuovo gli stessi strumenti in modo indipendente, le credenziali vengono duplicate, la governance diventa incoerente e non è disponibile visibilità sugli strumenti esistenti o sugli utenti che li usano. Gli sviluppatori si bloccano, non perché i modelli non sono in grado, ma perché l'integrazione degli strumenti diventa il collo di bottiglia.

Diagramma che mostra più agenti che associano i propri strumenti con modelli di autenticazione diversi e credenziali duplicate.

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.

Diagramma che mostra gli strumenti nell'architettura Foundry: pilastri 'Build' e 'Consume' utilizzati da LangGraph, Microsoft Agent Framework, GitHub Copilot, Claude Code e Microsoft Copilot Studio, gestiti di default.

Le caselle degli strumenti si creano in Foundry, ma la superficie di consumo è aperta. Qualsiasi client o runtime dell'agente compatibile con MCP può usare una casella degli strumenti, inclusi gli agenti creati con qualsiasi framework, gli IDE abilitati per MCP e il codice personalizzato.

Poiché una casella degli strumenti è una risorsa gestita, è possibile aggiungere, rimuovere o riconfigurare gli strumenti senza modificare il codice nell'agente. L'agente si connette sempre a un singolo endpoint. Il controllo delle versioni della casella degli strumenti consente di controllare esplicitamente quando le modifiche diventano effettive: creare e testare una nuova versione, quindi alzarla di livello all'impostazione predefinita quando si è pronti. Ogni agente che punta alla casella degli strumenti preleva automaticamente la versione alzata di livello, senza modifiche al codice e senza ridistribuzione.

In questo articolo vengono illustrate le operazioni seguenti:

  • Creare una casella degli strumenti con uno o più strumenti.
  • Ottenere l'endpoint MCP del toolbox.
  • Verificare che gli strumenti vengano caricati correttamente.
  • Integrare una casella degli strumenti nell'agente ospitato.
  • Gestire le versioni della toolbox e impostare una versione come predefinita.

Per la sintassi di configurazione degli strumenti e le opzioni di autenticazione per ogni tipo di strumento, vedere Configurare gli strumenti.

Supporto delle funzionalità

Feature PYTHON SDK REST API .NET SDK JavaScript SDK azd (distribuire) Kit di Strumenti per Fonderia
Aggiornare, elencare, recuperare ed eliminare la casella degli strumenti ✔️ ✔️ ✔️ ✔️ N/A ✔️
Creazione della versione della casella degli strumenti ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Elenco delle versioni del Toolbox, ottenere ed eliminare ✔️ ✔️ ✔️ ✔️ N/A No. L'interfaccia utente mostra solo la versione più recente.
Strumento MCP ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Strumento di ricerca Web ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Strumento ricerca intelligenza artificiale di Azure ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Strumento Interprete di Codice ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Strumento di Ricerca file ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Strumento OpenAPI ✔️ ✔️ ✔️ ✔️ ✔️ No
Strumento tra agenti (A2A) ✔️ ✔️ ✔️ ✔️ ✔️ No
Strumento di ricerca degli strumenti ✔️ ✔️ No No ✔️ No

Prerequisiti

  • Progetto Microsoft Foundry attivo.

  • RBAC: concedi il ruolo Foundry User nel progetto Foundry a ogni identità pertinente per il tuo scenario:

    Importante

    I ruoli RBAC di Foundry sono stati recentemente rinominati. Foundry User, Foundry Owner, Foundry Account Owner e Foundry Project Manager erano precedentemente denominati Azure AI User, Azure AI Owner, Azure AI Account Owner e Azure AI Project Manager. È possibile che i nomi precedenti vengano visualizzati in alcune posizioni durante l'esecuzione della ridenominazione. Gli ID ruolo e le autorizzazioni di base sono invariati dalla ridenominazione.

    • Sviluppatore (sempre obbligatorio): identità che crea, aggiorna e gestisce le versioni della casella degli strumenti.
    • Identità dell'agente (obbligatoria se si usa un agente ospitato): identità gestita dell'agente che chiama gli strumenti in fase di esecuzione.
    • Utente finale (obbligatorio solo per i flussi OAuth): qualsiasi utente la cui identità viene inoltrata tramite proxy tramite connessioni OAuth o UserEntraToken (ad esempio, flussi OBO basati su OAuth o 1P).
  • Il progetto Foundry deve trovarsi in una delle aree supportate. I singoli tipi di strumenti all'interno di una casella degli strumenti sono ulteriormente limitati dall'area e dal modello. Non tutti i tipi di strumento sono disponibili in ogni area o con ogni modello. Vedere Compatibilità tra area e modello.

  • Visual Studio Code (VS Code).

  • Installare Microsoft Foundry Toolkit for Visual Studio Code (in precedenza AI Toolkit for VS Code) da Visual Studio Code Marketplace. Il supporto della casella degli strumenti in Foundry Toolkit è attualmente disponibile in anteprima.

  • Python SDK: pip install azure-ai-projects azure-identity

  • .NET SDK: dotnet add package Azure.AI.Projects --prerelease e dotnet add package Azure.Identity

  • JavaScript SDK: npm install @azure/ai-projects @azure/identity

  • azd (deploy): installare l'interfaccia della riga di comando per sviluppatori di Azure e l'estensione agent: azd extension install azure.ai.agents

Importante

  • Una casella degli strumenti supporta al massimo uno strumento senza un name campo 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 univoco name in ogni istanza per distinguerle. L'inclusione di due istanze dello stesso tipo senza un name restituisce un errore invalid_payload. Per informazioni dettagliate, vedere Più tipi di strumenti.
  • Aggiungere un oggetto description a ogni strumento nella casella degli strumenti per consentire al modello di selezionare lo strumento appropriato per ogni richiesta.
  • Esaminare attentamente la documentazione di ogni strumento per altre informazioni sulla configurazione, le limitazioni e gli avvisi dei singoli strumenti.

Passaggio 1: Creare una versione della casella degli strumenti

Creare una versione della casella degli strumenti in base agli strumenti necessari.

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

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

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

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

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

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

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

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

Note

Usare l'ambito del token https://ai.azure.com/.default quando si recupera il bearer token.

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

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

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

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

Usare Foundry Toolkit in Visual Studio Code per creare e pubblicare una casella degli strumenti dalla visualizzazione Strumenti .

  1. Selezionare Foundry Toolkit nella barra delle attività.
  2. Sotto Risorse personali, espandere Il nome del tuo progetto>Strumenti.
  3. Selezionare l'icona + Aggiungi casella degli strumenti .
  4. Nella scheda Compila una casella degli strumenti personalizzata immettere il nome e la descrizione della casella degli strumenti, aggiungere gli strumenti desiderati e quindi selezionare Pubblica.

La pubblicazione di una nuova casella degli strumenti crea la prima versione. Tale versione diventa automaticamente la versione predefinita.

Screenshot di Foundry Toolkit in Visual Studio Code che mostra la vista Crea casella degli attrezzi personalizzata con campi per il nome, la descrizione e gli strumenti, oltre all'azione Pubblica.

Usando azd, si dichiarano le risorse del toolbox in un file agent.yaml anziché utilizzare l'SDK. Definire gli strumenti nella sezione resources e distribuire usando azd ai agent init. Per agent.yaml esempi per ogni tipo di strumento, vedere Configurare gli strumenti. Per il flusso di lavoro di distribuzione completo, vedere Distribuire con azd.

Importante

Il -m flag (o --manifest) è obbligatorio per azd ai agent init. Indica al comando dove trovare la definizione dell'agente e i file di origine.

-m può puntare a uno dei seguenti:

  • Un file agent.yaml specifico: init copia tutti i file dalla stessa directory come manifesto
  • Cartella contenente agent.yaml — init copia tutti i file da tale cartella

Tutti i file nella directory manifesto (main.py, Dockerfile, requirements.txt, setup.py e così via) vengono copiati nel progetto di scaffolding in src/<agent-name>/.

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

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

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

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

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

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

Agent.yaml:

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

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

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

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

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

Passaggio 2: Ottenere l'endpoint MCP della casella degli strumenti

Esistono due modelli di endpoint a seconda del ruolo:

Ruolo Punto finale Quando utilizzare
Sviluppatore casella degli strumenti {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1 Testare o convalidare una versione specifica prima di promuoverla come predefinita.
Consumer casella degli strumenti {project_endpoint}/toolboxes/{toolbox_name}/mcp?api-version=v1 Connettere gli agenti alla casella degli strumenti. Serve sempre default_version. La prima versione creata viene impostata automaticamente come predefinita.

Importante

Ogni richiesta all'endpoint MCP della casella degli strumenti deve includere l'intestazione Foundry-Features: Toolboxes=V1Preview. Le chiamate che omettono questa intestazione non riescono. Includerla in tutti i client HTTP, i trasporti MCP e i wrapper SDK che chiamano l'endpoint della casella degli strumenti.

Note

La prima versione di una nuova casella degli strumenti viene promossa automaticamente a default_version (v1). Se è necessario modificare il valore predefinito in un secondo momento, vedere Promuovere una versione a predefinita.

In Foundry Toolkit per Visual Studio Code copiare l'endpoint consumer della casella degli strumenti dalla vista Caselle degli strumenti.

  1. Selezionare Foundry Toolkit nella barra delle attività.
  2. Sotto Risorse personali, espandere Il nome del tuo progetto>Strumenti.
  3. Nella scheda Barra degli strumenti, trova la tua barra degli strumenti.
  4. 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.

Screenshot di Foundry Toolkit in Visual Studio Code che mostra la vista Caselle degli strumenti con l'URL endpoint della casella degli strumenti e l'azione Scaffolding modello di codice.

Passaggio 3: Verificare la disponibilità degli strumenti

Prima di eseguire l'agente completo, verificare che la casella degli strumenti carichi gli strumenti previsti usando un SDK client MCP sull'endpoint. Usare l'endpoint specifico della versione per convalidare una versione prima di promuoverla come predefinita.

Installare l'SDK client MCP:

pip install mcp

Connettersi agli strumenti ed elencarli

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

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

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

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

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

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

asyncio.run(verify_toolbox())

Note

Usare la scheda API REST per verificare la disponibilità degli strumenti da .NET o usare Python MCP Client SDK.

Usare l'endpoint specifico della versione (/versions/{version}/mcp) per convalidare una versione prima di promuoverla.

1. Inizializzare la sessione MCP:

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

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

2. Inviare la notifica inizializzata:

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

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

3. Elencare gli strumenti disponibili:

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

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

4. Chiamare uno strumento:

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

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

Installare l'SDK client MCP:

npm install @modelcontextprotocol/sdk

Connettersi agli strumenti ed elencarli

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

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

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

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

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

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

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

await client.close();

Usare l'endpoint del passaggio 2 con un esempio di agente ospitato sottoposto a scaffolding per convalidare il caricamento della casella degli strumenti in VS Code.

  1. In Foundry Toolkit, sotto Le mie risorse>Il nome del progetto>Strumenti, individua la casella degli strumenti che vuoi testare.
  2. Selezionare Modello di codice scaffold.
  3. Scegliere una cartella del progetto quando richiesto.
  4. Seguire le istruzioni README.md generate per installare le dipendenze, configurare le variabili di ambiente ed eseguire l'esempio in locale.
  5. Usare Agent Inspector o eseguire python main.py per 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, descriptione inputSchema. Per le convenzioni di denominazione degli strumenti, vedere la specifica MCP.
  • inputSchema ha un properties campo (alcuni server MCP omettono questo campo, che interrompe OpenAI).
  • Per gli strumenti MCP, i nomi sono preceduti da server_label , myserver.some_toolad esempio . Per tutti gli altri tipi di strumenti, il nome è il valore del name campo o il nome predefinito dello strumento.
  • Gli strumenti MCP includono un _meta.tool_configuration blocco 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 query vs queries.

Verifica - tools/call:

  • Nessun campo di primo livello error. Se presente, esaminare error.code. Per i codici di errore MCP standard, vedere la specifica MCP:
    • -32007 → è necessario il consenso OAuth (estrarre l'URL da error.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._meta verificare la presenza di metadati in blocchi (title, file_id, document_chunk_id, score).
  • Per Ricerca Web, in result.content[].resource._meta.annotations[] verificare la presenza di citazioni URL (type, url, title, start_index, end_index).
  • Presta attenzione a "ServerError" nel contenuto di testo: lo strumento è stato eseguito, ma ha riscontrato un errore interno.

Esempi di argomenti specifici tools/call dello strumento:

Tipo di strumento Argomenti
Ricerca IA {"query": "search text"}
Ricerca file {"queries": ["search text"]}
Interprete di codice {"code": "print(2 ** 100)"}
Web Search {"search_query": "weather in seattle"}
A2A {"message": {"parts": [{"type": "text", "text": "Hello"}]}}
MCP {"query": "what is agent service"}

Passaggio 4: Integrare la toolbox nell'agente

LangGraph

.env file:

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

main.py (modello chiave):

from langchain_azure_ai.tools import AzureAIProjectToolbox

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

Vedere l'esempio completo per l'implementazione completa.

Importante

La classe langchain_azure_ai.tools.AzureAIProjectToolbox richiede langchain-azure-ai[tools]>1.2.3.

Microsoft Agent Framework

Utilizzare MCPStreamableHTTPTool dall'Agent Framework SDK per connettersi direttamente all'endpoint MCP del toolbox.

.env file:

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

main.py (modello chiave):

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

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

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

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

Vedere l'esempio completo per l'implementazione completa.

COPILOT SDK

Usare GitHub Copilot SDK per creare un agente basato sulla casella degli strumenti che collega la chiamata dello strumento di Copilot all'endpoint MCP della casella degli strumenti Foundry.

Note

Copilot SDK rifiuta i nomi degli strumenti contenenti punti. Il bridge sostituisce . automaticamente con _ nei nomi degli strumenti. Ad esempio, myserver.get_info diventa myserver_get_info.

.env file:

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

agent.py (modello chiave — bridge MCP):

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

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

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

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

Microsoft Agent Framework

Usare ResponsesServer da Agent Framework SDK con un ToolboxMcpClient personalizzato per individuare e richiamare gli strumenti della casella tramite l'endpoint MCP.

Variabili di ambiente:

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

Program.cs (modello chiave):

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

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

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

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

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

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

ToolboxMcpClient avvolge le chiamate dirette JSON-RPC verso l'endpoint MCP. ToolboxHandler connette le chiamate dello strumento LLM al client MCP usando un ciclo standard per la chiamata degli strumenti. Per l'implementazione completa di entrambe le classi, vedere l'esempio completo.

Note

Gli esempi di integrazione per questo passaggio sono disponibili solo per Python e .NET.

Note

Gli esempi di integrazione per questo passaggio sono disponibili solo per Python e .NET.

Usare Foundry Toolkit per eseguire lo scaffolding di un esempio di agente ospitato già collegato alla casella degli strumenti.

  1. Selezionare Foundry Toolkit nella barra delle attività.
  2. Sotto Risorse personali, espandere Il nome del tuo progetto>Strumenti.
  3. Nella scheda Caselle degli strumenti, individuare la casella degli strumenti da usare, quindi selezionare Scaffolding modello di codice.
  4. Nel riquadro comandi scegliere una cartella di progetto quando richiesto.
  5. Aprire il file generato README.md e seguire i passaggi di installazione, esecuzione locale e distribuzione per il scaffold.

Il progetto generato include il punto di ingresso dell'agente ospitato, i file di distribuzione e un oggetto README.md con la procedura esatta di installazione, esecuzione e distribuzione. L'agente di scaffolding gestisce automaticamente l'intestazione Foundry-Features: Toolboxes=V1Preview.

Se si vuole integrare una casella degli strumenti in un progetto dell'agente ospitato esistente anziché generare un nuovo esempio, usare l'endpoint copiato dal passaggio 2 con i modelli Python o .NET in questa sezione.

Distribuire con azd

Usare l'interfaccia della riga di comando per sviluppatori di Azure (azd) per dichiarare le risorse della casella degli strumenti direttamente in un agent.yaml file e distribuire l'agente con un singolo comando. Usando questo approccio, non è necessario creare la casella degli strumenti separatamente tramite SDK o REST. azd esegue il provisioning della casella degli strumenti, delle connessioni e della distribuzione modello.

Importante

Il -m flag (o --manifest) è obbligatorio per azd ai agent init. Indica al comando dove trovare la definizione dell'agente e i file di origine. -m può puntare a un file specifico agent.yaml o a una cartella contenente uno. Tutti i file nella directory manifesto (main.py, Dockerfile, requirements.txt e così via) vengono copiati testualmente nel progetto di scaffolding in src/<agent-name>/.

Struttura delle cartelle:

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

agent.yaml (Esempio di Ricerca Web + GitHub MCP):

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

Note

Quando si distribuisce con le risorse della casella degli strumenti in agent.yaml, la piattaforma inserisce FOUNDRY_AGENT_TOOLBOX_ENDPOINT (URL di base) e TOOLBOX_{toolbox_name}_MCP_ENDPOINT (endpoint completo per casella degli strumenti) come variabili di ambiente. Per la casella degli strumenti denominata agent-tools, la variabile per casella degli strumenti diventa TOOLBOX_AGENT_TOOLS_MCP_ENDPOINT. Il tuo main.py legge la variabile per toolbox o costruisce l'URL da FOUNDRY_AGENT_TOOLBOX_ENDPOINT e TOOLBOX_NAME in fase di esecuzione.

main.py segue lo stesso modello LangGraph illustrato in precedenza. Utilizzando azd, FOUNDRY_AGENT_TOOLBOX_ENDPOINT e TOOLBOX_{toolbox_name}_MCP_ENDPOINT vengono inseriti automaticamente - nel codice non è necessaria alcuna configurazione dell'endpoint aggiuntiva.

Distribuire:

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

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

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

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

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

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

Gestire i requisiti di approvazione degli strumenti

La casella degli strumenti restituisce un oggetto _meta.tool_configuration in ogni voce restituita da tools/list. Quando uno strumento è require_approval impostato su "always", il runtime dell'agente deve presentare l'azione in sospeso all'utente e attendere la conferma prima di richiamare lo strumento. L'endpoint MCP non blocca tools/call. L'applicazione è interamente responsabilità del runtime dell'agente.

Leggere require_approval da tools/list

Ogni voce di strumento in una risposta tools/list include un blocco _meta restituito dalla casella degli strumenti:

{
  "name": "myserver.my_tool",
  "description": "...",
  "inputSchema": { "type": "object" },
  "_meta": {
    "tool_configuration": {
      "type": "mcp",
      "server_label": "myserver",
      "server_url": "https://your-mcp-server.example.com",
      "require_approval": "always"
    }
  }
}
Valore della proprietà require_approval Comportamento
"always" L'agente deve chiedere conferma all'utente prima di ogni chiamata.
"never" L'agente può richiamare liberamente lo strumento.

Implementare il controllo di approvazione (LangGraph)

Eseguire una query tools/list all'avvio per compilare una mappa di approvazione, quindi inserire un vincolo nella richiesta di sistema per qualsiasi strumento che richiede l'approvazione:

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

Dopo il caricamento degli strumenti dal client MCP, rilevare quali strumenti richiedono l'approvazione e regolare la richiesta di sistema:

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

Note

  • Il rilevamento avviene all'avvio. Il controllo dell'approvazione viene eseguito una sola volta quando l'agente viene inizializzato. Non c'è alcun sovraccarico associato a ciascuna chiamata.
  • Fallback normale. Se non sono presenti require_approval: "always"strumenti , il prompt di sistema rimane invariato e l'agente si comporta come prima.
  • require_approval viene applicato dall'agente. Il proxy MCP della casella degli strumenti esegue tools/call indipendentemente da questa impostazione. Il runtime dell'agente è responsabile del controllo della chiamata.

Configurare require_approval su uno strumento

Impostare require_approval quando si crea una versione della casella degli strumenti. Gli esempi di strumenti MCP nel passaggio 1 mostrano entrambi "always" e "never" valori. È anche possibile impostarlo tramite l'SDK:

from azure.ai.projects.models import MCPTool

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

Usare la scheda Python, .NET, JavaScript, API REST o azd per configurare require_approval nella definizione della casella degli strumenti. Il flusso di lavoro del Foundry Toolkit in questo articolo si concentra sulla creazione e l'utilizzo della toolbox in Visual Studio Code.

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

Passaggio 5: Gestire le versioni della casella degli strumenti

Note

È possibile gestire le versioni della casella degli strumenti (elenco, ottenere, promuovere, eliminare) tramite Python SDK, .NET SDK, JavaScript SDK e API REST. L'interfaccia della riga di comando azd supporta solo la creazione di versioni della casella degli strumenti durante la distribuzione.

Le versioni della casella degli strumenti sono snapshot non modificabili della configurazione degli strumenti di una casella. Ogni chiamata all'endpoint 'create' produce un nuovo ToolboxVersionObject oggetto. L'elemento padre ToolboxObject dispone di un default_version campo che controlla la versione usata dall'endpoint MCP. La creazione di una nuova versione non viene promossa automaticamente: sei tu a decidere quando aggiornare default_version. Questo processo consente di preparare le modifiche, testare una nuova versione in modo indipendente e promuoverla alla produzione in base alla propria pianificazione.

Oggetto Campi chiave Description
ToolboxObject id, name, default_version Contenitore della casella degli strumenti. default_version indica la versione attiva.
ToolboxVersionObject id, name, version, descriptioncreated_at, , tools[]policies Snapshot non modificabile dell'elenco degli strumenti della casella in un momento specifico.

Creare una nuova versione

Ogni chiamata di creazione produce una nuova versione. Se la casella degli strumenti non esiste ancora, il processo lo crea automaticamente. Quando crei la prima versione di una nuova casella degli strumenti, la versione predefinita è v1 finché non viene aggiornata manualmente a un'altra versione.

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

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

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

Usare la scheda Python, .NET, JavaScript o API REST per creare una nuova versione della casella degli strumenti. Il flusso di lavoro di Foundry Toolkit descritto in questo articolo è incentrato sulla creazione di una toolbox e sulla generazione della struttura di base di un agente Hosted che la utilizza.

Questa operazione non è supportata con azd. Per creare una versione della casella degli strumenti, usare la scheda Python, .NET, API REST o JavaScript .

La risposta è un oggetto ToolboxVersionObject contenente il nuovo version identificatore.

Elencare le versioni

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

Usare la scheda Python, .NET, JavaScript o API REST per elencare le versioni della casella degli strumenti.

Questa operazione non è supportata con azd. Per elencare le versioni della casella degli strumenti, usare la scheda Python, .NET, API REST o JavaScript .

Ottenere una versione specifica

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

Usare la scheda Python, .NET, JavaScript o API REST per ottenere una versione specifica della casella degli strumenti.

Questa operazione non è supportata con azd. Per ottenere una versione specifica della casella degli strumenti, usare la scheda Python, .NET, API REST o JavaScript .

Promuovere una versione a predefinita

L'endpoint MCP serve sempre il default_version. Per cambiare la versione attiva, aggiornare la casella degli strumenti:

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

{
  "default_version": "<version_id>"
}

default_version non può essere vuoto. Sostituirlo con una nuova versione.

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

Usare la scheda Python, .NET, JavaScript o API REST per impostare la versione della casella degli strumenti come impostazione predefinita.

Questa operazione non è supportata con azd. Per impostare una versione come predefinita, usare la scheda Python, .NET, API REST o JavaScript.

Eliminare una versione

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

Usare la scheda Python, .NET, JavaScript o API REST per eliminare una versione della casella degli strumenti.

Questa operazione non è supportata con azd. Per eliminare una versione della casella degli strumenti, usare la scheda Python, .NET, API REST o JavaScript .

Configurare gli strumenti

Scegliere il tipo di strumento e il modello di autenticazione che corrispondono allo scenario. Selezionare la scheda per il metodo di distribuzione o l'SDK preferito.

Più tipi di strumento

Una singola casella degli strumenti può aggregare diversi tipi di strumenti. L'esempio seguente combina Ricerca Web, Ricerca intelligenza artificiale di Azure e un server MCP in una casella degli strumenti:

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

Note

Ogni tipo di strumento (web_search, azure_ai_search, code_interpreter, file_search) può essere visualizzato al massimo una volta senza un name campo. Per includere più istanze dello stesso tipo, impostare un valore univoco name in ogni istanza. Vedere l'esempio successivo.

Restrizioni per più strumenti

È possibile includere al massimo una sola istanza di ciascun tipo di strumento predefinito in una casella degli strumenti senza un campo name. Se si includono due istanze dello stesso tipo senza un name, l'API restituisce:

400 invalid_payload: Multiple tools without identifiers found...

Due istanze dello stesso tipo di strumento

Usare il campo name per includere più istanze dello stesso tipo di strumento in un toolbox. Ogni istanza denominata viene considerata come uno strumento separato e deve avere un nome univoco.

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

Le sezioni seguenti illustrano in dettaglio la configurazione di ogni tipo di strumento.

Model Context Protocol (MCP)

Autenticazione basata su chiave:

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

Nessuna autenticazione (server MCP pubblico):

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

Autenticazione OAuth o basata su identità:

Per OAuth (connettore gestito, registrazione app personalizzata), identità dell'agente o autenticazione del token Entra utente, creare prima di tutto la connessione appropriata nel progetto Foundry, quindi farvi riferimento con project_connection_id:

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

La connessione authType determina il flusso di autenticazione. I tipi di autenticazione di connessione supportati per MCP includono CustomKeys, OAuth2 (gestito o personalizzato), AgenticIdentitye UserEntraToken. Vedere la scheda azd per esempi di configurazione della connessione per ogni tipo di autenticazione.

from azure.ai.projects.models import MCPTool

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

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

Nessuna autenticazione:

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

Autenticazione basata su chiave:

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

OAuth - Connettore gestito:

Usare questo modello per i server MCP che supportano il flusso OAuth gestito di Foundry. Il connectorName valore deve corrispondere a un connettore gestito disponibile nel catalogo degli strumenti foundry.

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

OAuth - Registrazione dell'app personalizzata:

Usare questo modello quando si usa la registrazione dell'app OAuth personalizzata per il server MCP.

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

Identità agente (ENTRA ID):

Usare questo modello per i server MCP che supportano l'autenticazione di Microsoft Entra ID. L'identità dell'agente Foundry esegue l'autenticazione sulla risorsa di destinazione.

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

Note

È necessario assegnare all'identità dell'agente il ruolo RBAC richiesto nella risorsa di destinazione prima che il server MCP accetti le richieste.

Token Entra utente (1P OBO):

Usare questo modello per i server MCP che richiedono l'identità utente tramite il flusso OBO (On-Behalf-Of). Foundry esegue il proxy del token Entra dell'utente al server MCP.

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

Note

Il audience campo è obbligatorio per UserEntraToken le connessioni. Senza di esso, tools/list restituisce zero strumenti.

Importante

La prima volta che un utente chiama una casella degli strumenti con un MCP basato su OAuth in un progetto, l'endpoint MCP restituisce un CONSENT_REQUIRED errore (codice -32007) con un URL di consenso:

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

Questo errore è previsto. Aprire l'URL di consenso in un browser, completare il flusso di autorizzazione OAuth e quindi ripetere la chiamata dell'agente. Le chiamate successive riescono senza nuovi prompt.

Importante

  • Ricerca Web utilizza il Grounding con Ricerca Bing e il Grounding con Ricerca Personalizzata Bing, che sono Servizi di Consumo Primari regolati da questi Termini di Utilizzo di Grounding con Bing e dall'Informativa sulla Privacy di Microsoft.
  • Il Microsoft Data Protection Addendum non si applica ai dati inviati a Grounding con Ricerca Bing e Grounding con Ricerca personalizzata Bing. Quando si usa Grounding con Ricerca Bing e Grounding con Ricerca personalizzata Bing, i trasferimenti di dati avvengono al di fuori dei limiti geografici e di conformità.
  • L'uso di Grounding con Ricerca Bing e di Grounding con Ricerca personalizzata Bing comporta dei costi. Per informazioni dettagliate, vedere i prezzi.
  • Vedere la sezione relativa alla gestione per informazioni su come gli amministratori di Azure possono gestire l'accesso all'uso della ricerca Web.

Usare questo modello per aggiungere la ricerca Web. Non è necessaria alcuna connessione di progetto per la ricerca Web con Grounding con Bing. Per usare un'istanza di Grounding con Ricerca personalizzata Bing, aggiungere un oggetto web_search.custom_search_configuration che fa riferimento a una connessione Grounding con Ricerca personalizzata Bing.

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

Con una connessione Grounding con Ricerca personalizzata Bing:

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

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

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

Con Grounding con Ricerca personalizzata Bing:

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

Note

Quando Ricerca Web restituisce risultati su MCP, la risposta è un resource elemento di contenuto contenente la risposta sintetizzata con collegamenti di origine Markdown inline. Le citazioni URL sono in content[].resource._meta.annotations[]. Per esempio:

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

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

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

Configurare i parametri dello strumento

parametro dello strumento Azure AI Search Obbligatorio Note
project_connection_id Yes ID risorsa della connessione del progetto a Azure AI Search.
index_name Yes Nome dell'indice nella risorsa di Ricerca di intelligenza artificiale di Azure.
top_k No Assume il valore predefinito 5.
query_type No Il valore predefinito è vector_semantic_hybrid. Valori supportati: simple, vector, semantic, vector_simple_hybrid, vector_semantic_hybrid.
filter No Si applica a tutte le query che l'agente effettua sull'indice.

I risultati della ricerca includono metadati in blocchi in result.structuredContent.documents[]. Ogni documento include i campi title, url, id e score che è possibile usare per generare i dettagli della citazione nell'app.

Interprete di codice

Usare questo modello per consentire all'agente di scrivere ed eseguire codice Python. Il modello non richiede una connessione di progetto o una configurazione aggiuntiva.

Per caricare un file per l'interprete di codice da usare, chiamare POST {project_endpoint}/openai/v1/files con purpose=assistants. L'ID file restituito è il valore fornito come <FILE_ID> nella configurazione dello strumento. Per esempi di caricamento completo, vedere Interprete di codice .

Importante

Quando l'interprete del codice viene usato tramite una casella degli strumenti in un agente ospitato, l'isolamento utente non è supportato. Tutti gli utenti nello stesso progetto condividono lo stesso contesto del contenitore.

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

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

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

Scaricare i file di output dall'interprete del codice

Quando l'interprete del codice produce file di output (ad esempio, un file CSV o un grafico generato), seguire questa procedura per elencarli e scaricarli.

Passaggio 1: Elencare i file usando l'API contenitore

Estrarre container_id da content[]._meta.container_id nella risposta di tools/call, quindi chiamare l'API dei File del Contenitore per elencare tutti i file nel contenitore.

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

La risposta restituisce un elenco di file con i relativi nomi e ID.

Passaggio 2: Scaricare il file usando l'API File

Usare il nome file restituito dal passaggio 1 per scaricare il file tramite l'endpoint di download dell'API file.

Usare questo modello per consentire all'agente di cercare i file caricati archiviati in un archivio vettoriale. Specificare vector_store_ids riferiti agli archivi vettoriali già creati nel progetto Foundry.

Per creare un file e un archivio vettoriale, usare l'API {project_endpoint}/openai/v1 :

  1. Carica il tuo file: POST {project_endpoint}/openai/v1/files con purpose=assistants.
  2. Creare un archivio di vettori: POST {project_endpoint}/openai/v1/vector_stores con l'ID del file restituito.

L'ID dell'archivio vettoriale risultante è il valore fornito come <VECTOR_STORE_ID>. Vedere Ricerca file per esempi completi in ogni lingua.

Importante

Quando la ricerca file viene usata tramite una casella degli strumenti in un agente ospitato, l'isolamento utente non è supportato. Tutti gli utenti dello stesso progetto condividono l'accesso allo stesso archivio vettoriale.

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

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

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

Impostare l'ID dell'archivio vettoriale prima della distribuzione:

azd env set FILE_SEARCH_VECTOR_STORE_ID "vs_xxxxxxxxxxxx"

Note

Quando la Ricerca file restituisce i risultati su MCP, i metadati del blocco vengono incorporati nel contenuto della risposta dello strumento come marcatori 【index†filename†file_id】. Per esempio:

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

Il blocco _meta all'interno di ogni elemento risorsa contiene title, file_id, document_chunk_id e la rilevanza score per il blocco corrispondente. Usare questi campi di metadati nell'applicazione per generare i dettagli della citazione o il collegamento diretto al file di origine.

OpenAPI

Usare questo modello per esporre qualsiasi API REST descritta da una specifica OpenAPI. Scegliere l'oggetto auth.type corrispondente al modello di sicurezza dell'API.

Importante

Quando si utilizza l'autenticazione dell'identità gestita, è necessario assegnare il ruolo RBAC appropriato all'identità gestita del progetto Foundry sul servizio di destinazione. Ad esempio, assegnare il ruolo Lettore o superiore nella risorsa di Azure di destinazione. Senza questa assegnazione, l'agente riceve una 401 Unauthorized risposta quando chiama l'API. Per la procedura di configurazione completa, vedere Eseguire l'autenticazione usando l'identità gestita.

Autenticazione anonima:

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

Autenticazione connessione progetto:

Usare questo modello quando l'API richiede una chiave o un token archiviato in una connessione di progetto Foundry.

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

Autenticazione dell'identità gestita:

Usare questo modello quando l'API di destinazione esegue l'autenticazione tramite Microsoft Entra ID. L'identità gestita del progetto Foundry chiama l'API per conto dell'agente. Assicurarsi che l'identità gestita disponga del ruolo di controllo degli accessi in base ai ruoli necessario nel servizio di destinazione prima di usare questo schema.

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

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

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

Autenticazione basata su chiave:

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

Agente-ad-Agente (A2A)

Utilizzare questo schema per richiamare un altro agente come strumento. Specificare l'URL di base dell'agente remoto e, se richiede l'autenticazione, una connessione al progetto.

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

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

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

Usare questo modello per abilitare il routing degli strumenti basato sulle finalità. Quando toolbox_search_preview è incluso in una casella degli strumenti, la piattaforma seleziona gli strumenti più rilevanti per ogni richiesta anziché esporre tutti gli strumenti al modello contemporaneamente. Non è necessaria alcuna configurazione aggiuntiva.

{
  "description": "Toolbox with intent-based tool routing",
  "tools": [
    {
      "type": "toolbox_search_preview"
    }
  ]
}
tools = [
    {"type": "toolbox_search_preview"}
]

Note

toolbox_search_preview è una direttiva di configurazione che attiva la ricerca degli strumenti. Non viene visualizzato nelle risposte tools/list e non viene conteggiato ai fini del limite di strumenti senza nome per tipo.

Troubleshoot

Sintomo Causa possibile Correzione
tools/list restituisce zero strumenti per gli strumenti MCP o A2A Credenziali di connessione non valide o mancanti per il server MCP remoto o l'agente A2A. La casella degli strumenti non può recuperare i manifesti degli strumenti dall'endpoint remoto senza l'autenticazione valida. Verificare che project_connection_id esista nel progetto Foundry e che le credenziali siano corrette. Provare a connettersi al server MCP direttamente per testare l'installazione dell'autenticazione. Se si utilizza l'identità gestita (PMI, identità agente o MI), verificare le corrette assegnazioni di ruolo RBAC per il chiamante sulla risorsa di destinazione.
tools/list restituisce zero strumenti per gli strumenti OpenAPI Specifica OpenAPI non valida. La casella degli strumenti costruisce il manifesto dello strumento dalla specifica, che ha esito negativo se la specifica non è valida. Convalidare il contenuto della specifica OpenAPI. Verificare che sia conforme a OpenAPI 3.0 o 3.1 e includa schemi validi paths, operationId valori e parametri. Se si utilizza l'autenticazione tramite identità gestita, verificare anche le assegnazioni di ruoli RBAC sul servizio di destinazione.
tools/list restituisce meno strumenti del previsto Il allowed_tools filtro contiene nomi di strumenti non corretti o con errori di ortografia. I nomi degli strumenti fanno distinzione tra maiuscole e minuscole e devono seguire la specifica MCP per i nomi degli strumenti (senza spazi vuoti o caratteri speciali). Rimuovere allowed_tools temporaneamente e chiamare tools/list per ottenere l'elenco completo degli strumenti. Usare i nomi esatti della risposta per impostare i valori per allowed_tools.
tools/list restituisce zero strumenti (altri tipi di strumenti) La casella degli attrezzi non è stata completamente configurata o il tipo di strumento non è supportato nella regione. Per gli strumenti predefiniti (Ricerca Web, Ricerca intelligenza artificiale, Interprete del codice, Ricerca file), i manifesti degli strumenti vengono costruiti sul lato server e non richiedono l'autenticazione. Se restituiscono vuoti, la versione della casella degli strumenti potrebbe non essere ancora sottoposto a provisioning. Attendere 10 secondi e riprovare.
400 Multiple tools without identifiers Due tipi di strumenti senza nome in una casella degli strumenti Mantenere al massimo un tipo senza nome; aggiungere server_label a tutti gli strumenti MCP.
CONSENT_REQUIRED (codice -32007) La connessione OAuth richiede il consenso dell'utente Aprire l'URL del consenso in un browser e completare il flusso OAuth, quindi riprovare.
401 nelle chiamate MCP Token scaduto o ambito errato Usare l'ambito https://ai.azure.com/.default e aggiornare il token.
Nomi degli strumenti non corrispondenti I nomi degli strumenti MCP sono preceduti dal prefisso server_label Usare il {server_label}.{tool_name} formato , ad esempio myserver.get_info.
500 su send_ping() Il server MCP della casella degli strumenti non implementa il metodo MCP ping . Non chiamare send_ping(). Se il framework lo chiama automaticamente (ad esempio, Microsoft MCPStreamableHTTPTool._ensure_connected()Agent Framework), disabilitare il controllo ping o eseguire l'override del metodo con un no-op.
500 su prompts/list Il server MCP Foundry non implementa prompts/list. Passare load_prompts=False (o equivalente) al costruttore client MCP.
500 con tools/call non in streaming La modalità non di streaming (stream=False) non è supportata per gli endpoint MCP della casella degli strumenti. Usare stream=True sempre quando si chiamano gli strumenti MCP della casella degli strumenti.
500 su tools/list Errore temporaneo del server Riprovare dopo alcuni secondi.
Variabili di ambiente sovrascritte in fase di esecuzione La piattaforma riserva tutte le variabili di ambiente precedute FOUNDRY_ da e potrebbe sovrascrivere automaticamente i valori definiti dall'utente. Rinominare le variabili di ambiente personalizzate per evitare il FOUNDRY_ prefisso , ad esempio usare TOOLBOX_MCP_ENDPOINT anziché FOUNDRY_TOOLBOX_ENDPOINT.

Supporto della rete virtuale

Quando il progetto Foundry usa l'isolamento di rete (collegamento privato), non tutti i tipi di strumenti della casella degli strumenti sono supportati. La tabella seguente illustra lo stato di supporto per ogni tipo di strumento e il flusso del traffico in un ambiente isolato dalla rete.

Tipo di strumento Supporto della rete virtuale Flusso del traffico
MCP ✅ Sostenuto Tramite la subnet della rete virtuale
Ricerca di intelligenza artificiale di Azure ✅ Sostenuto Tramite l'endpoint privato
Interprete di codice ✅ Sostenuto rete backbone di Microsoft
Ricerca Web ✅ Sostenuto Endpoint pubblico
OpenAPI ✅ Sostenuto Dipende dalla configurazione di rete dell'API di destinazione
Ricerca file ❌ Non supportato Non ancora disponibile
Agente-ad-Agente (A2A) ✅ Sostenuto Tramite l'endpoint privato

Per istruzioni complete sulla configurazione dell'isolamento della rete, tra cui l'inserimento della rete virtuale per il client dell'agente, la configurazione DNS e i requisiti degli endpoint privati, vedere Configurare l'isolamento di rete per Microsoft Foundry.

Compatibilità tra area e modello

La disponibilità della casella degli strumenti dipende da due fattori oltre l'area del progetto:

  • Area: alcuni tipi di strumento non sono disponibili in ogni area che supporta il servizio agente. Ad esempio, un'area che supporta l'endpoint della casella degli strumenti potrebbe non supportare tutti i tipi di strumenti predefiniti.

Prima di distribuire una casella degli strumenti, verificare che l'area di destinazione supporti i tipi di strumento che si prevede di usare. Per le tabelle di compatibilità complete, vedere Supporto degli strumenti in base all'area e al modello.