Curare la casella degli strumenti basata sulle finalità in Foundry (anteprima)

Importante

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

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

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

Le aziende hanno già l'infrastruttura: gateway, insiemi di credenziali delle credenziali, criteri e osservabilità. Manca un'esperienza di sviluppo che inserisce l'infrastruttura in un'infrastruttura riutilizzabile, individuabile e governata per impostazione predefinita.

La casella degli strumenti offre tale esperienza. Definire un set curato di strumenti una sola volta, gestirli centralmente in Foundry ed esporli tramite un singolo endpoint compatibile con MCP che qualsiasi agente può utilizzare. La piattaforma gestisce l'inserimento delle credenziali, l'aggiornamento dei token e l'applicazione dei criteri aziendali in fase di esecuzione.

La casella degli strumenti illustra il ciclo di vita completo degli strumenti attraverso quattro pilastri: la compilazione e l'utilizzo sono attualmente disponibili:

Pilastro Stato Cosa abilita
Costruire Disponibile oggi Selezionare gli strumenti, configurare l'autenticazione centralmente e pubblicare una casella degli strumenti riutilizzabile utilizzabile da qualsiasi team.
Consumare Disponibile oggi Connettere qualsiasi agente a un singolo endpoint compatibile con MCP per individuare e richiamare in modo dinamico tutti gli strumenti nella casella degli strumenti.

Diagramma che mostra gli strumenti nell'architettura foundry: Compilazione e utilizzo dei pilastri utilizzati da LangGraph, framework agente Microsoft, GitHub Copilot, Claude Code e Microsoft Copilot Studio, regolati da default.

Le caselle degli strumenti vengono create in Foundry, ma la superficie di consumo è aperta. Qualsiasi runtime o client compatibile con MCP può usare una casella degli strumenti, inclusi gli agenti compilati con qualsiasi framework, ID abilitati per MCP e codice personalizzato.

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

Questo articolo illustra come:

  • Creare una casella degli strumenti con uno o più strumenti.
  • Ottenere l'endpoint MCP della casella degli strumenti.
  • Verificare che gli strumenti vengano caricati correttamente.
  • Integrare una casella degli strumenti nell'agente ospitato.
  • Gestire le versioni della casella degli strumenti e alzare di livello una versione per impostazione predefinita.

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

Supporto delle funzionalità

Funzionalità PYTHON SDK REST API .NET SDK JavaScript SDK azd (deploy) Foundry Toolkit
Aggiornamento, elenco, recupero ed eliminazione della casella degli strumenti ✔️ ✔️ ✔️ ✔️ N/D ✔️
Creazione della versione della casella degli strumenti ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Elenco delle versioni della casella degli strumenti, recupero ed eliminazione ✔️ ✔️ ✔️ ✔️ N/D No. L'interfaccia utente mostra solo la versione più recente.
Strumento MCP ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Strumento di ricerca Web ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
strumento Azure AI Search ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Strumento Interprete codice ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Strumento Ricerca file ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Strumento OpenAPI ✔️ ✔️ ✔️ ✔️ ✔️ No
Strumento da agente a agente (A2A) ✔️ ✔️ ✔️ ✔️ ✔️ No

Prerequisiti

  • Progetto Foundry attivo Microsoft.
  • RBAC: concedere il ruolo Azure utente di intelligenza artificiale nel progetto Foundry a ogni identità applicabile allo scenario:
    • Sviluppatore (sempre obbligatorio): identità che crea, aggiorna e gestisce le versioni della casella degli strumenti.
    • Identità dell'agente (obbligatoria se si usa un agente ospitato): identità gestita dell'agente che chiama gli strumenti in fase di esecuzione.
    • Utente finale (obbligatorio solo per i flussi OAuth): qualsiasi utente la cui identità viene inoltrata tramite proxy tramite connessioni OAuth o UserEntraToken (ad esempio, flussi OBO basati su OAuth o 1P).
  • Il progetto Foundry deve trovarsi in una delle aree supportate. I singoli tipi di strumenti all'interno di una casella degli strumenti sono ulteriormente limitati dall'area e dal modello. Non tutti i tipi di strumento sono disponibili in ogni area o con ogni modello. Vedere Compatibilità tra area e modello.
  • Visual Studio Code (VS Code).
  • Installare Microsoft Foundry Toolkit for Visual Studio Code (in precedenza AI Toolkit for VS Code) da Visual Studio Code Marketplace. Il supporto della casella degli strumenti in Foundry Toolkit è attualmente disponibile in anteprima.
  • Python SDK: pip install azure-ai-projects azure-identity
  • .NET SDK: dotnet add package Azure.AI.Projects --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 Azure/c1> e l'estensione dell'agente:

Importante

  • Una casella degli strumenti supporta al massimo one senza un campo name per tipo di strumento (Ricerca Web, Azure AI Search, Interprete del codice, Ricerca file). Per includere più istanze dello stesso tipo di strumento, impostare un valore univoco name in ogni istanza per distinguerle. L'inclusione di due istanze dello stesso tipo senza restituisce name un invalid_payload errore. 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"
    }
  ]
}

Nota

Usare l'ambito https://ai.azure.com/.default del token quando si ottiene il token di connessione.

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

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

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

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

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

  1. Selezionare Foundry Toolkit nella barra delle attività.
  2. In Risorse personali espandere Il nome> del progettoStrumenti.
  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 of Foundry Toolkit in Visual Studio Code che mostra la visualizzazione Compila una casella degli strumenti personalizzata con campi per il nome, la descrizione e gli strumenti della casella degli strumenti, oltre a Publish action.

azdUsando , si dichiarano le risorse della casella degli strumenti in un agent.yaml file anziché chiamare l'SDK. Definire gli strumenti nella resources sezione e distribuirsi usando azd ai agent init. Per agent.yaml esempi per ogni tipo di strumento, vedere Configurare gli strumenti. Per il flusso di lavoro di distribuzione completo, vedere Distribuire con azd.

Importante

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

-m può puntare a:

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

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

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

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

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

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

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

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

Agent.yaml:

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

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

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

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

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

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

Esistono due modelli di endpoint a seconda del ruolo:

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

Importante

Ogni richiesta all'endpoint MCP della casella degli strumenti deve includere l'intestazione Foundry-Features: Toolboxes=V1Preview. Chiamate che omettono questa intestazione hanno esito negativo. Includerlo in tutti i client HTTP, i trasporti MCP e i wrapper SDK che chiamano l'endpoint della casella degli strumenti.

Nota

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

In Foundry Toolkit for Visual Studio Code copiare l'endpoint consumer della casella degli strumenti dalla visualizzazione Toolboxes.

  1. Selezionare Foundry Toolkit nella barra delle attività.
  2. In Risorse personali espandere Il nome> del progettoStrumenti.
  3. Nella scheda Casella degli strumenti individuare la casella degli strumenti.
  4. Nella colonna ENDPOINT URL copiare l'endpoint.

Il valore dell'URL dell'endpoint è l'endpoint consumer della casella degli strumenti. Per costruire un endpoint specifico della versione, usare il modello di sviluppo illustrato nella tabella precedente.

Screenshot of Foundry Toolkit in Visual Studio Code che mostra la visualizzazione Casella degli strumenti con l'URL dell'endpoint della casella degli strumenti e l'azione del modello di codice Scaffold.

Passaggio 3: Verificare la disponibilità degli strumenti

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

Installare l'SDK client MCP:

pip install mcp

Connettersi alla casella degli strumenti e agli strumenti elenco

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

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

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

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

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

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

asyncio.run(verify_toolbox())

Nota

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

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

1. Inizializzare la sessione MCP:

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

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

2. Inviare la notifica inizializzata:

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

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

3. Elencare gli strumenti disponibili:

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

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

4. Chiamare uno strumento:

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

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

Installare l'SDK client MCP:

npm install @modelcontextprotocol/sdk

Connettersi alla casella degli strumenti e agli strumenti elenco

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

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

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

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

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

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

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

await client.close();

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

  1. In Foundry Toolkit, in Risorse> personali Ilnome> del progettoStrumenti individuare la casella degli strumenti da testare.
  2. Selezionare Modello di codice di scaffolding.
  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 Python o API REST in questo passaggio.

Nota

Usare la scheda API REST per verificare la disponibilità degli strumenti o usare l'SDK client MCP Python.

Controllare : inizializzare: HTTP 200. Se si ignora il passaggio di inizializzazione, le chiamate successive hanno esito negativo.

Check — tools/list:

  • len(tools) > 0 - vuoto indica che il provisioning della versione della casella degli strumenti non è stato eseguito correttamente.
  • Ogni strumento ha name, 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.

Check - tools/call:

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

Esempi di argomenti specifici tools/call dello strumento:

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

Passaggio 4: Integrare la casella degli strumenti nell'agente

LangGraph

.env file:

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

main.py (modello chiave):

from langchain_azure_ai.tools import AzureAIProjectToolbox

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

Vedere l'esempio completo per l'implementazione completa.

Importante

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

Microsoft Agent Framework

Usare MCPStreamableHTTPTool Agent Framework SDK per connettersi direttamente all'endpoint MCP della casella degli strumenti.

.env file:

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

main.py (modello chiave):

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

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

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

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

Vedere l'esempio completo per l'implementazione completa.

COPILOT SDK

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

Nota

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

.env file:

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

agent.py (modello chiave — bridge MCP):

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

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

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

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

Vedere l'esempio completo per l'implementazione completa.

Microsoft Agent Framework

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

Variabili di ambiente:

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

Program.cs (modello chiave):

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

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

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

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

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

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

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

Nota

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

Nota

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

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

  1. Selezionare Foundry Toolkit nella barra delle attività.
  2. In Risorse personali espandere Il nome> del progettoStrumenti.
  3. Nella scheda Casella degli strumenti individuare la casella degli strumenti da utilizzare e quindi selezionare Modello di codice di Scaffolding.
  4. Nel riquadro comandi scegliere una cartella di progetto quando richiesto.
  5. Aprire il file generato README.md e seguire la procedura di installazione, esecuzione locale e distribuzione per lo scaffolding.

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

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

Eseguire la distribuzione con azd

Usare l'interfaccia della riga di comando Azure Developer () per dichiarare le risorse della casella degli strumenti direttamente in un file /> azd effettua il provisioning della casella degli strumenti, delle connessioni e della distribuzione del modello insieme.

Importante

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

Struttura delle cartelle:

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

agent.yaml (ricerca Web + GitHub MCP di esempio):

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

Nota

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

main.py segue lo stesso modello LangGraph illustrato in precedenza. azdUsando e FOUNDRY_AGENT_TOOLBOX_ENDPOINTTOOLBOX_{toolbox_name}_MCP_ENDPOINT vengono inseriti automaticamente: nel codice non è necessaria alcuna configurazione dell'endpoint aggiuntiva.

Distribuire:

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

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

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

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

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

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

Gestire i requisiti di approvazione degli strumenti

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

Leggere require_approval da tools/list

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

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

Implementare l'approvazione gating (LangGraph)

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

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

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

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

Nota

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

Configurare require_approval in uno strumento

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

from azure.ai.projects.models import MCPTool

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

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

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

Passaggio 5: Gestire le versioni della casella degli strumenti

Nota

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

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

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

Creare una nuova versione

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

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

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

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

Usare la scheda Python, .NET, JavaScript o API REST per creare una nuova versione della casella degli strumenti. Il flusso di lavoro di Foundry Toolkit in questo articolo è incentrato sulla creazione di una casella degli strumenti e sullo scaffolding di un agente ospitato che lo utilizza.

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

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

Elencare le versioni

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

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

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

Ottenere una versione specifica

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

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

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

Alzare di livello una versione per impostazione predefinita

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

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

{
  "default_version": "<version_id>"
}

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

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

Usare la scheda Python, .NET, JavaScript o API REST per alzare di livello una versione della casella degli strumenti per impostazione predefinita.

Questa operazione non è supportata con azd. Per alzare di livello una versione per impostazione predefinita, usare la scheda Python, .NET, REST o JavaScript.

Eliminare una versione

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

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

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

Configurare gli strumenti

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

Più tipi di strumento

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

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

Nota

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

Restrizioni per più strumenti

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

400 invalid_payload: Multiple tools without identifiers found...

Due istanze dello stesso tipo di strumento

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

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

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

Model Context Protocol (MCP)

Autenticazione basata su chiave:

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

Nessuna autenticazione (server MCP pubblico):

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

Autenticazione OAuth o basata su identità:

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

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

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

from azure.ai.projects.models import MCPTool

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

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

Nessuna autenticazione:

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

Autenticazione basata su chiave:

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

OAuth - Connettore gestito:

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

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

OAuth - Registrazione dell'app personalizzata:

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

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

identità Agent (Entra ID):

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

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

Nota

È necessario assegnare all'identità dell'agente il ruolo controllo degli accessi in base al ruolo richiesto nella risorsa di destinazione prima che il server MCP accetti le richieste.

User Entra token (1P OBO):

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

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

Nota

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

Importante

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

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

Questo errore è previsto. Aprire l'URL di consenso in un browser, completare il flusso di autorizzazione OAuth e quindi ripetere la chiamata dell'agente. Le chiamate successive hanno esito positivo senza richiedere di nuovo.

Importante

  • Ricerca Web usa il grounding con Ricerca Bing e il grounding con Ricerca personalizzata Bing, che sono First Party Consumption Services regolati da questi Grounding con condizioni per l'utilizzo di Bing e l'Informativa sulla privacy Microsoft.
  • Il Microsoft Data Protection Addendum non si applica ai dati inviati a Grounding con Ricerca Bing e il grounding con Ricerca personalizzata Bing. Quando si usa Il grounding con Ricerca Bing e il grounding con Ricerca personalizzata Bing, i trasferimenti di dati si verificano al di fuori della conformità e dei limiti geografici.
  • L'uso del grounding con Ricerca Bing e il grounding con Ricerca personalizzata Bing comporta costi. Per informazioni dettagliate, vedere i prezzi .
  • Vedere la sezione management per informazioni su come gli amministratori Azure possono gestire l'accesso all'uso della ricerca Web.

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

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

Con una connessione Di base con Ricerca personalizzata Bing:

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

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

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

Con la base di Ricerca personalizzata Bing:

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

Nota

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

{
  "jsonrpc": "2.0",
  "id": "ws-call-1",
  "result": {
    "_meta": {
      "tool_configuration": {
        "type": "web_search",
        "name": "web-search-default"
      }
    },
    "content": [
      {
        "type": "resource",
        "resource": {
          "uri": "about:web-search-answer",
          "mimeType": "text/plain",
          "text": "Here are the latest updates on Azure OpenAI Service...\n\n- **GPT-image-1 Release (January 7, 2026)** Microsoft introduced GPT-image-1 ([serverless-solutions.com](https://...)).\n\n..."
        },
        "annotations": {
          "audience": ["assistant"]
        },
        "_meta": {
          "annotations": [
            {
              "type": "url_citation",
              "url": "https://www.serverless-solutions.com/blog/...",
              "title": "Microsoft Expands Azure AI Foundry with Powerful New OpenAI Models",
              "start_index": 741,
              "end_index": 879
            }
          ],
          "action": {
            "type": "search",
            "query": "Azure OpenAI service updates 2026",
            "queries": ["Azure OpenAI service updates 2026"]
          },
          "response_id": "resp_001fcebcc300..."
        }
      }
    ],
    "isError": false
  }
}
{
  "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 ID risorsa della connessione del progetto a Azure AI Search.
index_name Nome dell'indice nella risorsa Azure AI Search.
top_k No Il valore predefinito è 5.
query_type No Il valore predefinito è vector_semantic_hybrid. Valori supportati: simple, vectorsemantic, vector_simple_hybrid, , vector_semantic_hybrid.
filter No Si applica a tutte le query eseguite dall'agente all'indice.

I risultati della ricerca includono metadati blocchi in result.structuredContent.documents[]. Ogni documento include titlecampi , url, ide score che è possibile usare per generare i dettagli della citazione nell'applicazione.

Interprete di codice

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

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

Importante

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

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

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

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

Scaricare i file di output dall'interprete del codice

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

Passaggio 1: Elencare i file usando l'API contenitore

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

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

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

Passaggio 2: Scaricare il file usando l'API File

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

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

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

  1. Caricare il file: POST {project_endpoint}/openai/v1/files con purpose=assistants.
  2. Creare un archivio vettoriale: POST {project_endpoint}/openai/v1/vector_stores con l'ID file restituito.

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

Importante

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

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

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

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

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

azd env set FILE_SEARCH_VECTOR_STORE_ID "vs_xxxxxxxxxxxx"

Nota

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

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

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

OpenAPI

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

Importante

Quando si usa l'autenticazione dell'identità gestita, è necessario assegnare il ruolo controllo degli accessi in base al ruolo appropriato all'identità gestita del progetto Foundry nel servizio di destinazione. Ad esempio, assegnare Lettore o versione successiva nella risorsa di Azure di destinazione. Senza questa assegnazione, l'agente riceve una 401 Unauthorized risposta quando chiama l'API. Per la procedura di configurazione completa, vedere Eseguire l'autenticazione usando l'identità gestita.

Autenticazione anonima:

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

Project connessione auth:

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

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

Autenticazione dell'identità gestita:

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

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

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

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

Autenticazione basata su chiave:

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

Da agente a agente (A2A)

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

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

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

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

Risolvere

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

Supporto della rete virtuale

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

Tipo di strumento Supporto della rete virtuale Flusso del traffico
MCP ✅ Supportati Tramite la subnet della rete virtuale
Azure AI Search ✅ Supportati Tramite l'endpoint privato
Interprete di codice ✅ Supportati Microsoft rete backbone
Ricerca Web ✅ Supportati Endpoint pubblico
OpenAPI ✅ Supportati Dipende dalla configurazione di rete dell'API di destinazione
Ricerca file ❌ Non supportato Non ancora disponibile
Da agente a agente (A2A) ✅ Supportati Tramite l'endpoint privato

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

Compatibilità tra area e modello

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

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

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