Organizar a caixa de ferramentas baseada em intenções no Foundry (versão preliminar)

Importante

Os itens marcados (pré-visualização) neste artigo encontram-se atualmente em pré-visualização pública. Esta pré-visualização é fornecida sem um acordo de nível de serviço, e não a recomendamos para cargas de trabalho em produção. Certas funcionalidades podem não ser suportadas ou podem ter capacidades limitadas. Para mais informações, consulte Termos de Utilização Suplementares para Microsoft Azure Pré-visualizações.

Um único agente pode depender de múltiplas ferramentas – APIs, servidores Model Context Protocol (MCP), conectores e fluxos – cada um com o seu próprio modelo de autenticação e equipa proprietária. À medida que se escala numa organização, as equipas reimplementam as mesmas ferramentas de forma independente, as credenciais duplicam-se, a governação torna-se inconsistente e há pouca visibilidade sobre que ferramentas existem ou quem as utiliza. Os programadores atrasam, não porque os modelos não sejam capazes, mas porque a integração com ferramentas se torna o gargalo.

Diagrama mostrando vários agentes, cada um a ligar as suas próprias ferramentas, com modelos de autenticação diferentes e credenciais duplicadas.

As empresas já têm a infraestrutura: gateways, cofres de credenciais, políticas e observabilidade. O que tem faltado é uma experiência de desenvolvedor que empacote esta infraestrutura em algo reutilizável, descobrível e gerido por definição.

A Toolbox proporciona essa experiência. Defina um conjunto selecionado de ferramentas uma vez, gere centralizadamente no Foundry e expõe-as através de um único endpoint compatível com MCP que qualquer agente possa consumir. A plataforma gere a injeção de credenciais, atualização de tokens e aplicação de políticas empresariais em tempo de execução.

A Toolbox cobre todo o ciclo de vida da ferramenta através de quatro pilares - Construir e Consumir estão disponíveis hoje:

Pilar Estado O que isso possibilita
Construir Disponível atualmente Selecione ferramentas, configure a autenticação centralmente e publique uma caixa de ferramentas reutilizável que qualquer equipa possa consumir.
Consume Disponível atualmente Ligue qualquer agente a um único endpoint compatível com MCP para descobrir e invocar dinamicamente todas as ferramentas da caixa de ferramentas.

Diagrama mostrando Caixas de Ferramentas na arquitetura Foundry: os pilares de Construção e Consumo utilizados pelo LangGraph, Microsoft Agent Framework, GitHub Copilot, Claude Code e Microsoft Copilot Studio, governados por padrão.

Crias caixas de ferramentas no Foundry, mas a superfície de consumo está aberta. Qualquer runtime ou cliente de agente compatível com MCP pode usar uma caixa de ferramentas – incluindo agentes construídos com qualquer framework, IDEs com MCP e código personalizado.

Como uma caixa de ferramentas é um recurso gerido, pode adicionar, remover ou reconfigurar ferramentas sem alterar código no seu agente. O teu agente liga-se sempre a um único endpoint. O versionamento do toolbox dá-te controlo explícito sobre quando as alterações entram em vigor – cria e testa uma nova versão, depois promove-a para o padrão quando estiveres pronto. Cada agente que aponta para a caixa de ferramentas recolhe automaticamente a versão promovida, sem alterações de código nem redistribuição.

Neste artigo, aprende como:

  • Crie uma caixa de ferramentas com uma ou mais ferramentas.
  • Obtenha o endpoint MCP da caixa de ferramentas.
  • Verifica se as ferramentas carregam corretamente.
  • Integra uma caixa de ferramentas no teu agente alojado.
  • Gerir as versões das ferramentas e definir uma versão como padrão.

Para a sintaxe de configuração da ferramenta e opções de autenticação para cada tipo de ferramenta, consulte Configurar ferramentas.

Suporte a funcionalidades

Destaque Python SDK API REST .NET SDK JavaScript SDK azd (deploy) Kit de Ferramentas da Fundição
Ferramentas: atualizar, listar, obter e eliminar ✔️ ✔️ ✔️ ✔️ N/A ✔️
Criar versão da Toolbox ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Lista de versões do Toolbox, obter e eliminar ✔️ ✔️ ✔️ ✔️ N/A Não. A interface mostra apenas a versão mais recente.
Ferramenta MCP ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Ferramenta de Pesquisa Web ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Pesquisa de IA do Azure ferramenta ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Ferramenta de Interpretador de Código ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Ferramenta de Pesquisa de Ficheiros ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Ferramenta OpenAPI ✔️ ✔️ ✔️ ✔️ ✔️ Não
Ferramenta Agent-para-Agente (A2A) ✔️ ✔️ ✔️ ✔️ ✔️ Não

Pré-requisitos

  • Um projeto ativo do Microsoft Foundry.
  • RBAC: Conceda o papel Azure AI User no projeto Foundry a cada identidade que se aplique ao seu cenário:
    • Desenvolvedor (sempre obrigatório) — a identidade que cria, atualiza e gere as versões da caixa de ferramentas.
    • Identidade do agente (necessária se estiver a usar um agente alojado) — a identidade gerida do agente que chama ferramentas em tempo de execução.
    • Utilizador final (necessário apenas para fluxos OAuth) — qualquer utilizador cuja identidade é proxiada através de ligações OAuth ou UserEntraToken (por exemplo, fluxos MCP ou OBO 1P baseados em OAuth).
  • O seu projeto Foundry tem de estar numa das regiões suportadas. Os tipos individuais de ferramentas dentro de uma caixa de ferramentas são ainda mais limitados por região e modelo – nem todos os tipos de ferramentas estão disponíveis em todas as regiões ou com cada modelo. Veja Região e compatibilidade do modelo.
  • Visual Studio Code (VS Code).
  • Instale o Microsoft Foundry Toolkit para Visual Studio Code (anteriormente AI Toolkit para VS Code) a partir do Marketplace do Visual Studio Code. O suporte da caixa de ferramentas no Foundry Toolkit está atualmente em versão de pré-visualização.
  • Python SDK: pip install azure-ai-projects azure-identity
  • .NET SDK: dotnet add package Azure.AI.Projects --prerelease e dotnet add package Azure.Identity
  • SDK JavaScript: npm install @azure/ai-projects @azure/identity
  • azd (deploy): Instala a Azure Developer CLI e a extensão agente: azd extension install azure.ai.agents

Importante

  • Uma caixa de ferramentas suporta, no máximo, uma ferramenta sem um campo name por tipo de ferramenta (Pesquisa Web, Pesquisa de IA do Azure, Interpretador de Código, Pesquisa de Ficheiros). Para incluir mais do que uma instância do mesmo tipo de ferramenta, defina uma única name para cada instância para as diferenciar. Incluir duas instâncias do mesmo tipo sem um name resulta num erro invalid_payload. Para detalhes, veja Múltiplos tipos de ferramentas.
  • Adicione um description a todas as ferramentas da sua caixa de ferramentas para ajudar o modelo a selecionar a ferramenta certa para cada pedido.
  • Reveja cuidadosamente a documentação de cada ferramenta para saber mais sobre a configuração individual, limitações e avisos.

Passo 1: Criar uma versão para a caixa de ferramentas

Cria uma versão da caixa de ferramentas com base nas ferramentas de que precisas.

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

Use o escopo do token https://ai.azure.com/.default ao obter o token de portador.

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}`);

Use o Foundry Toolkit em Visual Studio Code para criar e publicar uma caixa de ferramentas a partir da vista Tools.

  1. Selecione Foundry Toolkit na barra de atividades.
  2. Na secção Meus Recursos, expanda o nome> do seuprojeto Ferramentas.
  3. Selecione o ícone + Adicionar Caixa de Ferramentas .
  4. No separador Construir uma Caixa de Ferramentas Personalizada , introduza o nome e a descrição da caixa de ferramentas, adicione as ferramentas que quiser e depois selecione Publicar.

Publicar uma nova caixa de ferramentas cria a sua primeira versão. Essa versão torna-se automaticamente a versão padrão.

Captura de ecrã do Foundry Toolkit em Visual Studio Code mostrando a vista Construir uma Caixa de Ferramentas Personalizada com campos para o nome, descrição e ferramentas, além da ação Publicar.

Ao usar azd, declara os recursos da toolbox num agent.yaml ficheiro em vez de chamar o SDK. Defina as suas ferramentas na resources secção e implemente usando azd ai agent init. Para agent.yaml exemplos para cada tipo de ferramenta, veja Configurar ferramentas. Para o fluxo de trabalho completo de implantação, consulte Deploy with azd.

Importante

A -m (ou --manifest) bandeira é necessária para azd ai agent init. Indica ao comando onde encontrar a definição do agente e os ficheiros fonte.

-m pode apontar para qualquer um dos dois:

  • Um ficheiro específico agent.yaml — init copia todos os ficheiros do mesmo diretório que o manifesto
  • Uma pasta contendo agent.yaml — init copia todos os ficheiros dessa pasta

Todos os ficheiros no diretório manifest (main.py, Dockerfile, requirements.txt, setup.py, e assim sucessivamente) são copiados para o projeto estruturado sob 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

Passo 2: Obter o endpoint MCP da caixa de ferramentas

Existem dois padrões de endpoint dependendo do seu cargo:

Função Ponto final Quando usar
Desenvolvedor de Kit de ferramentas {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1 Teste ou valide uma versão específica antes de a promover como padrão.
Utilizador do Toolbox {project_endpoint}/toolboxes/{toolbox_name}/mcp?api-version=v1 Liga os agentes à caixa de ferramentas. Serve sempre o default_version. A primeira versão que crias é automaticamente definida como predefinida.

Importante

Cada pedido ao endpoint MCP da toolbox deve incluir o cabeçalho Foundry-Features: Toolboxes=V1Preview. Chamadas que omitam este cabeçalho falham. Inclua-o em todos os clientes HTTP, transportes MCP e wrappers de SDK que chamam o endpoint da toolbox.

Nota

A primeira versão de uma nova caixa de ferramentas é automaticamente promovida para default_version (v1). Se precisares de alterar o padrão mais tarde, vê Promover uma versão para padrão.

No Foundry Toolkit para Visual Studio Code, copie o endpoint de consumo da caixa de ferramentas da vista Toolboxes.

  1. Selecione Foundry Toolkit na barra de atividades.
  2. Na secção Meus Recursos, expanda o nome> do seuprojeto Ferramentas.
  3. No separador Caixas de Ferramentas , localiza a tua caixa de ferramentas.
  4. Na coluna URL do Endpoint, copie o endpoint.

O valor Endpoint URL é o endpoint consumidor da toolbox. Para construir um endpoint específico de cada versão, utilize o padrão de desenvolvimento mostrado na tabela anterior.

Captura de ecrã do Foundry Toolkit no Visual Studio Code mostrando a vista das Caixas de Ferramentas com a URL do endpoint da caixa de ferramentas e a ação do modelo de código Scaffold.

Passo 3: Verificar a disponibilidade da ferramenta

Antes de executar o agente completo, confirme que a caixa de ferramentas carrega as ferramentas esperadas usando um SDK cliente MCP contra o endpoint. Use o endpoint específico da versão para validar uma versão antes de a promover como padrão.

Instalar o SDK do cliente MCP:

pip install mcp

Liga-te à caixa de ferramentas e lista ferramentas

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

Use o separador API REST para verificar a disponibilidade da ferramenta a partir de .NET, ou use o SDK cliente Python MCP.

Use o endpoint específico da versão (/versions/{version}/mcp) para validar uma versão antes de a promover.

1. Inicializar a sessão 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. Enviar a notificação inicializada:

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. Listar as ferramentas disponíveis:

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. Chamar uma ferramenta:

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":{}}}

Instalar o SDK do cliente MCP:

npm install @modelcontextprotocol/sdk

Liga-te à caixa de ferramentas e lista ferramentas

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();

Use o endpoint do Passo 2 juntamente com um exemplo de agente hospedado e estruturado para validar o carregamento da toolbox no VS Code.

  1. No Foundry Toolkit, em Os Meus Recursos>O nome do seu projeto>Ferramentas, localize a caixa de ferramentas que pretende testar.
  2. Selecione o modelo de código do andaime.
  3. Escolha uma pasta de projeto quando solicitado.
  4. Siga o gerado README.md para instalar dependências, configurar variáveis de ambiente e executar a amostra localmente.
  5. Usa o Agent Inspector ou executa python main.py para confirmar que as ferramentas da consola carregam e respondem.

Para validação específica da versão antes de promover uma nova versão da toolbox, use o separador Python ou REST API neste passo.

Nota

Use o separador da API REST para verificar a disponibilidade da ferramenta, ou utilize o SDK do cliente Python MCP.

Verificar — inicializar: HTTP 200. Se saltar a etapa de inicialização, as chamadas subsequentes falham.

Verificar — tools/list:

  • len(tools) > 0 — vazio significa que a versão da caixa de ferramentas não foi provisionada corretamente.
  • Cada ferramenta tem name, description, e inputSchema. Para convenções de nomenclatura de ferramentas, consulte a especificação MCP.
  • inputSchema tem um properties campo (alguns servidores MCP omitem este campo, o que quebra o OpenAI).
  • Para ferramentas MCP, os nomes são prefixados com o server_label - por exemplo, myserver.some_tool. Para todos os outros tipos de ferramenta, o nome é o valor do name campo ou o nome padrão da ferramenta.
  • As ferramentas MCP incluem um _meta.tool_configuration bloco contendo definições de tempo de execução, como require_approval. Consulte como lidar com os requisitos de aprovação de ferramentas.
  • Note os nomes exatos dos parâmetros para o passo de chamada (por exemplo query vs queries).

Verificar - tools/call:

  • Sem campo de nível superior error. Se estiver presente, inspecione error.code. Para códigos de erro padrão MCP, consulte a especificação MCP:
    • -32006 → requer consentimento OAuth (extrair URL de error.message).
    • Outros códigos → falhas do lado do servidor.
  • result.content[] contém entradas com "type": "text" - esta é a saída da ferramenta.
  • Para o AI Search, verifique o result.structuredContent.documents[] para metadados de blocos (title, url, id, score).
  • Para a Pesquisa de Ficheiros, verifique result.content[].resource._meta para metadados de blocos (title, file_id, document_chunk_id, score).
  • Para a Pesquisa na Web, verifique as result.content[].resource._meta.annotations[] citações de URL (type, url, title, start_index, end_index).
  • Fique atento ao "ServerError" texto do conteúdo – a ferramenta executou, mas encontrou um erro interno.

Exemplos de argumentos específicos para ferramentas tools/call:

Tipo de ferramenta Argumentos
Pesquisa por IA {"query": "search text"}
Pesquisa de ficheiros {"queries": ["search text"]}
Interpretador de Código {"code": "print(2 ** 100)"}
Pesquisa na Web {"search_query": "weather in seattle"}
A2A {"message": {"parts": [{"type": "text", "text": "Hello"}]}}
MCP {"query": "what is agent service"}

Passo 4: Integre a caixa de ferramentas no seu agente

LangGraph

.env ficheiro:

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 (padrão-chave):

from langchain_azure_ai.tools import AzureAIProjectToolbox

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

Veja a amostra completa para a implementação completa.

Importante

A classe langchain_azure_ai.tools.AzureAIProjectToolbox requer langchain-azure-ai[tools]>1.2.3.

Microsoft Agent Framework

Use MCPStreamableHTTPTool a partir do Agent Framework SDK para se ligar diretamente ao endpoint MCP da toolbox.

.env ficheiro:

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 (padrão-chave):

# 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()

Veja a amostra completa para a implementação completa.

Copilot SDK

Use o GitHub Copilot SDK para construir um agente alimentado por toolbox que liga a invocação de ferramentas do Copilot ao endpoint MCP da Foundry toolbox.

Nota

O SDK Copilot rejeita nomes de ferramentas que contêm pontos. A ponte substitui automaticamente . por _ nos nomes das ferramentas. Por exemplo, myserver.get_info torna-se myserver_get_info.

.env ficheiro:

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 (padrão de chave — ponte 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"],
)

Veja a amostra completa para a implementação completa.

Microsoft Agent Framework

Use ResponsesServer a partir do SDK do Agent Framework com um personalizado ToolboxMcpClient para descobrir e invocar ferramentas da caixa de ferramentas através do endpoint MCP.

Variáveis de 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 (padrão-chave):

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 encapsula chamadas JSON-RPC diretamente para o endpoint MCP. ToolboxHandler liga chamadas de ferramentas LLM de volta ao cliente MCP usando um ciclo padrão de chamada de ferramenta. Para a implementação completa de ambas as classes, veja a amostra completa.

Nota

Exemplos de integração para esta etapa estão disponíveis apenas para Python e .NET.

Nota

Exemplos de integração para esta etapa estão disponíveis apenas para Python e .NET.

Utilize o Foundry Toolkit para criar uma amostra de agente hospedado que já está integrada na sua caixa de ferramentas.

  1. Selecione Foundry Toolkit na barra de atividades.
  2. Na secção Meus Recursos, expanda o nome> do seuprojeto Ferramentas.
  3. No separador Caixas de Ferramentas , localize a caixa de ferramentas que pretende consumir e depois selecione modelo de código de andaime.
  4. Na Paleta de Comandos, escolha uma pasta de projeto quando solicitado.
  5. Abra o ficheiro gerado README.md e siga os passos de configuração, execução local e implementação da estrutura inicial.

O projeto gerado inclui o ponto de entrada do agente alojado, os ficheiros de implementação e um README.md com os passos exatos de configuração, execução e implementação. O agente com andaimes trata do Foundry-Features: Toolboxes=V1Preview cabeçalho por si.

Se quiser integrar uma caixa de ferramentas num projeto de agente hospedado existente em vez de gerar uma nova amostra, use o endpoint copiado do Step 2 com os padrões Python ou .NET desta secção.

Implementar com azd

Use a CLI de Desenvolvedor Azure (azd) para declarar recursos da caixa de ferramentas diretamente num ficheiro agent.yaml e implante o seu agente com um único comando. Ao usar esta abordagem, não precisa de criar a caixa de ferramentas separadamente através do SDK ou REST. azd Provisiona a caixa de ferramentas, as ligações e a implementação do modelo em conjunto.

Importante

A -m (ou --manifest) bandeira é necessária para azd ai agent init. Indica ao comando onde encontrar a definição do agente e os ficheiros fonte. -m pode apontar para um ficheiro específico agent.yaml ou uma pasta que o contenha. Todos os ficheiros no diretório manifest (main.py, Dockerfile, requirements.txt, e assim sucessivamente) são copiados literalmente para o projeto estruturado sob src/<agent-name>/.

Estrutura da pasta:

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 (Exemplo de Pesquisa 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

Nota

Quando implementas com recursos da toolbox em agent.yaml, a plataforma injeta FOUNDRY_AGENT_TOOLBOX_ENDPOINT (URL base) e TOOLBOX_{toolbox_name}_MCP_ENDPOINT (endpoint completo por toolbox) como variáveis de ambiente. Para a caixa de ferramentas nomeada agent-tools, a variável por caixa de ferramentas torna-se TOOLBOX_AGENT_TOOLS_MCP_ENDPOINT. O seu main.py lê a variável por caixa de ferramentas ou constrói a URL a partir de FOUNDRY_AGENT_TOOLBOX_ENDPOINT e TOOLBOX_NAME em tempo de execução.

main.py segue o mesmo padrão LangGraph mostrado anteriormente. Ao usar azd, FOUNDRY_AGENT_TOOLBOX_ENDPOINT e TOOLBOX_{toolbox_name}_MCP_ENDPOINT são injetados automaticamente – não é necessária configuração adicional de endpoint no código.

Implementar:

# 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

Gerir requisitos para a aprovação de ferramentas

A caixa de ferramentas retorna um objeto _meta.tool_configuration em cada entrada de ferramenta devolvida por tools/list. Quando uma ferramenta está require_approval definida para "always", o tempo de execução do agente deve apresentar a ação pendente ao utilizador e aguardar confirmação antes de invocar a ferramenta. O endpoint MCP não bloqueia tools/call — a implementação é inteiramente responsabilidade da execução do agente.

Leia require_approval de tools/list

Cada entrada de ferramenta numa tools/list resposta inclui um _meta bloco retornado pela caixa de ferramentas :

{
  "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 Valor Comportamento
"always" O agente deve pedir confirmação ao utilizador antes de cada invocação.
"never" O agente pode invocar a ferramenta livremente.

Implementar o bloqueio de aprovação (LangGraph)

Consulte tools/list no arranque para construir um mapa de aprovação e depois injete uma restrição no prompt do sistema para qualquer ferramenta que exija aprovação:

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")
    }

Depois de carregar as ferramentas do cliente MCP, deteta quais as ferramentas que necessitam de aprovação e ajusta o prompt do 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

  • A deteção acontece no arranque. A verificação de aprovação ocorre uma vez quando o agente inicializa. Não há custos gerais por chamada.
  • Alternativa graciosa. Se nenhuma ferramenta tiver require_approval: "always", o prompt do sistema mantém-se inalterado e o agente comporta-se como antes.
  • require_approval é imposto pelo agente. O proxy MCP da toolbox executa-se tools/call independentemente desta definição. O runtime do seu agente é responsável por controlar o acesso à chamada.

Configurar require_approval numa ferramenta

Define require_approval quando crias uma versão da caixa de ferramentas. Os exemplos da ferramenta MCP no Passo 1 mostram os valores de ambas as opções "always" e "never". Também pode defini-lo através do 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",
  },
];

Usa o separador Python, .NET, JavaScript, REST API ou azd para configurar require_approval na definição da tua caixa de ferramentas. O fluxo de trabalho do Foundry Toolkit neste artigo foca-se na criação e consumo da caixa de ferramentas no 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

Passo 5: Gerir versões da caixa de ferramentas

Nota

Pode gerir versões do toolbox (listar, obter, promover, eliminar) através do SDK Python, SDK .NET, SDK JavaScript e API REST. A CLI azd só suporta a criação de versões do toolbox durante a implementação.

As versões da caixa de ferramentas são capturas imutáveis da configuração das suas ferramentas. Cada chamada ao endpoint create produz um novo ToolboxVersionObject. O pai ToolboxObject tem um default_version campo que controla a versão que o endpoint MCP serve. Criar uma nova versão não a promove automaticamente – você decide quando atualizar default_version. Este processo permite-lhe encenar as alterações, testar uma nova versão de forma independente e promovê-la para produção ao seu próprio ritmo.

Objetivo Campos-chave Descrição
ToolboxObject id, name, default_version O recipiente da caixa de ferramentas. default_version aponta para a versão ativa.
ToolboxVersionObject id, name, version, description, created_at, tools[], policies Um instantâneo imutável da lista de ferramentas da caixa de ferramentas num dado momento.

Criar uma nova versão

Cada chamada de criação produz uma nova versão. Se a caixa de ferramentas ainda não existir, o processo cria-a automaticamente. Quando crias a primeira versão de uma nova caixa de ferramentas, a versão padrão é v1 até atualizares manualmente para outra versão.

# 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}`);

Use o separador Python, .NET, JavaScript ou API REST para criar uma nova versão da caixa de ferramentas. O fluxo de trabalho do Foundry Toolkit neste artigo foca-se na criação de uma caixa de ferramentas e na estruturação de um agente hospedado que a consome.

Esta operação não é suportada pelo azd. Para criar uma versão da caixa de ferramentas, use o separador Python, .NET, REST ou JavaScript.

A resposta é o ToolboxVersionObject que contém o novo identificador version.

Listar versões

# 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}`);
}

Use o separador Python, .NET, JavaScript ou API REST para listar versões da toolbox.

Esta operação não é suportada pelo azd. Para listar versões das ferramentas, use o separador Python, .NET, API REST, ou JavaScript.

Obtenha uma versão específica

# 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}`);

Use o separador Python, .NET, JavaScript ou API REST para obter uma versão específica da caixa de ferramentas.

Esta operação não é suportada pelo azd. Para obter uma versão específica da caixa de ferramentas, use o separador Python, .NET, REST ou JavaScript.

Definir uma versão como padrão

O endpoint MCP serve sempre o default_version. Para mudar a versão ativa, atualize a caixa de ferramentas:

# 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 Não pode estar vazio. Substitua-o por uma nova versão.

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

Utilize o separador Python, .NET, JavaScript ou REST API para promover uma versão da caixa de ferramentas para predefinição.

Esta operação não é suportada pelo azd. Para promover uma versão para o padrão, use o separador Python, .NET, REST ou JavaScript.

Eliminar uma versão

# 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>",
);

Use o separador Python, .NET, JavaScript ou REST API para eliminar uma versão da toolbox.

Esta operação não é suportada pelo azd. Para eliminar uma versão de toolbox, use o separador Python, .NET, REST API, ou JavaScript.

Configurar ferramentas

Escolha o tipo de ferramenta e o padrão de autenticação que correspondam ao seu cenário. Selecione o separador do seu SDK ou método de implementação preferido.

Múltiplos tipos de ferramentas

Uma única caixa de ferramentas pode agrupar diferentes tipos de ferramentas. O exemplo seguinte combina Web Search, Pesquisa de IA do Azure e um servidor MCP numa única caixa de ferramentas:

{
  "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

Cada tipo de ferramenta (web_search, azure_ai_search, code_interpreter, file_search) pode aparecer no máximo uma vez sem um name campo. Para incluir múltiplas instâncias do mesmo tipo, defina uma única name para cada instância – veja o exemplo seguinte.

Restrições a múltiplas ferramentas

Pode incluir, no máximo, uma instância de cada tipo de ferramenta integrada sem o campo name numa caixa de ferramentas. Se incluir duas instâncias do mesmo tipo sem um name, a API retorna:

400 invalid_payload: Multiple tools without identifiers found...

Duas instâncias do mesmo tipo de ferramenta

Use o name campo para incluir múltiplas instâncias do mesmo tipo de ferramenta numa única caixa de ferramentas. Cada instância nomeada é tratada como uma ferramenta separada e deve ter um nome único.

{
  "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>"
          }
        ]
      }
    }
  ]
}

As secções seguintes mostram em detalhe a configuração de cada tipo de ferramenta.

Protocolo de Contexto do Modelo (MCP)

Autenticação baseada em teclas:

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

Sem autenticação (servidor MCP público):

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

OAuth ou autenticação baseada em identidade:

Para OAuth (conector gerido, registo personalizado de app), identidade de agente ou autenticação do token Entra do utilizador, crie primeiro a ligação apropriada no seu projeto Foundry, depois referencia-a com 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>"
    }
  ]
}

A ligação authType determina o fluxo de autenticação. Os tipos de autenticação de ligação suportados para MCP incluem CustomKeys, OAuth2 (gerida ou personalizada), AgenticIdentity, e UserEntraToken. Consulte o separador azd para exemplos de configuração de ligação para cada tipo de autenticação.

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",
  },
];

Sem autorização:

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

Autenticação baseada em teclas:

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 - conector gerido:

Use este padrão para servidores MCP que suportam o fluxo OAuth gerido pela Foundry. O valor connectorName deve corresponder a um conector administrado disponível no Catálogo de Ferramentas 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 - registo personalizado de aplicações:

Use este padrão quando levar o seu próprio registo na aplicação OAuth para o servidor 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

Identidade do agente (Entra ID):

Use este padrão para servidores MCP que suportam autenticação Microsoft Entra ID. A identidade do agente Foundry autentica-se perante o recurso alvo.

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

Deve atribuir à identidade do seu agente a função RBAC exigida no recurso alvo antes que o servidor MCP aceite pedidos.

Token de Entrada de Utilizador (1P OBO):

Use este padrão para servidores MCP que requerem identidade de utilizador através do fluxo On-Behalf-Of (OBO). A Foundry intermedia o token Entra do utilizador ao servidor 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

O campo audience é obrigatório para ligações UserEntraToken. Sem ele, tools/list não devolve nenhuma ferramenta.

Importante

A primeira vez que um utilizador chama uma caixa de ferramentas com um MCP baseado em OAuth num projeto, o endpoint MCP devolve um CONSENT_REQUIRED erro (código -32006) com uma URL de consentimento:

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

Este erro é esperado. Abra o URL de consentimento num navegador, complete o fluxo de autorização OAuth e depois tente novamente a chamada ao agente. As chamadas subsequentes são bem-sucedidas sem necessidade de re-solicitação.

Importante

  • A Pesquisa Web utiliza o Grounding com Bing Search e o Grounding com Bing Custom Search, que são Serviços de Consumo de Primeira Parte regidos por estes termos de uso do Grounding com Bing e pela Declaração de Privacidade da Microsoft.
  • O Adendo Microsoft Proteção de Dados não se aplica a dados enviados para Grounding com Bing Search e Grounding com Bing Custom Search. Quando utiliza Grounding com Bing Search e Grounding com Bing Custom Search, as transferências de dados ocorrem fora dos limites de conformidade e geográficos.
  • A utilização de Grounding com Bing Search e Grounding com Bing Custom Search implica custos. Consulte os preços para mais detalhes.
  • Consulte a secção management para informações sobre como os administradores Azure podem gerir o acesso à pesquisa web.

Use este padrão para adicionar pesquisa na web. Não é necessária ligação ao projeto para a pesquisa na web com Grounding com Bing. Para usar um Grounding com uma instância personalizada do Bing Search, adicione um web_search.custom_search_configuration objeto que aponte para o seu Grounding com a ligação Bing Custom Search.

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

Com uma ligação ao Bing Pesquisa Personalizada:

{
  "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

Integração com a Pesquisa Personalizada do 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 a Web Search retorna resultados através do MCP, a resposta é um resource item de conteúdo contendo a resposta sintetizada com links de origem Markdown inline. As citações de URL encontram-se em content[].resource._meta.annotations[]. Por exemplo:

{
  "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

Configurar parâmetros da ferramenta

Parâmetro da ferramenta Pesquisa de IA do Azure Obrigatório Notas
project_connection_id Sim O identificador do recurso da ligação do projeto ao Pesquisa de IA do Azure.
index_name Sim O nome do índice no seu recurso Pesquisa de IA do Azure.
top_k Não O valor por defeito é 5.
query_type Não O valor padrão é vector_semantic_hybrid. Valores suportados: simple, vector, semantic, vector_simple_hybrid, vector_semantic_hybrid.
filter Não Aplica-se a todas as consultas que o agente faz ao índice.

Os resultados da pesquisa incluem metadados de blocos em result.structuredContent.documents[]. Cada documento inclui title, url, id, , e score campos que pode usar para gerar detalhes de citação na sua candidatura.

Interpretador de Código

Use este padrão para permitir que o agente escreva e execute código em Python. O padrão não requer ligação ao projeto nem configuração extra.

Para carregar um ficheiro para que o Code Interpreter o utilize, chame POST {project_endpoint}/openai/v1/files com purpose=assistants. O ID do ficheiro devolvido é o valor que fornece como <FILE_ID> na configuração da ferramenta. Consulte Code Interpreter para exemplos completos de upload.

Importante

Quando o Interpretador de Código é usado através de uma caixa de ferramentas num agente hospedado, o isolamento do utilizador não é suportado. Todos os utilizadores do mesmo projeto partilham o mesmo contexto de contentor.

{
  "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

Descarregue ficheiros de saída a partir do Code Interpreter

Quando o Interpretador de Código produz ficheiros de saída (por exemplo, um CSV ou gráfico gerado), use os passos seguintes para listá-los e descarregá-los.

Passo 1: Listar ficheiros usando a API do Container

Extrai o container_id de content[]._meta.container_id na tools/call resposta, depois chama a API Container Files para listar todos os ficheiros no contentor:

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

A resposta devolve uma lista de ficheiros com os seus nomes e IDs.

Passo 2: Descarregue o ficheiro usando a API do ficheiro

Use o nome do ficheiro devolvido do Passo 1 para descarregar o ficheiro através do endpoint de transferência da API do Ficheiro.

Use este padrão para permitir que o agente pesquise ficheiros carregados armazenados numa loja vetorial. Forneça vector_store_ids armazenamentos vetoriais de referência já criados no seu projeto Foundry.

Para criar uma loja de ficheiros e vetores, use a {project_endpoint}/openai/v1 API:

  1. Carregue o seu ficheiro: POST {project_endpoint}/openai/v1/files com purpose=assistants.
  2. Crie um armazenamento vetorial: POST {project_endpoint}/openai/v1/vector_stores com o ID do ficheiro devolvido.

O ID de armazenamento vetorial resultante é o valor que fornece como <VECTOR_STORE_ID>. Consulte Pesquisa de Ficheiros para exemplos completos em cada língua.

Importante

Quando a Pesquisa de Ficheiros é usada através de uma caixa de ferramentas num agente alojado, o isolamento do utilizador não é suportado. Todos os utilizadores do mesmo projeto partilham acesso à mesma loja vetorial.

{
  "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}

Defina o ID da loja vetorial antes de implementar:

azd env set FILE_SEARCH_VECTOR_STORE_ID "vs_xxxxxxxxxxxx"

Nota

Quando a Pesquisa de Ficheiros devolve resultados através do MCP, os metadados dos fragmentos são incorporados no conteúdo da resposta da ferramenta como marcadores 【index†filename†file_id】. Por exemplo:

{
  "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..."
        }
      }
    ]
  }
}

O bloco _meta dentro de cada item de recurso contém os title, file_id, document_chunk_id, e relevância score para o bloco correspondente. Use estes campos de metadados na sua aplicação para gerar detalhes de citação ou para fazer um deep link de volta ao ficheiro de origem.

OpenAPI

Use este padrão para expor qualquer API REST descrita por uma especificação OpenAPI. Escolha o auth.type modelo que corresponde ao modelo de segurança da sua API.

Importante

Quando é usada autenticação de identidade gerida, deve atribuir o papel RBAC apropriado à identidade gerida do seu projeto Foundry no serviço-alvo. Por exemplo, atribua a função Leitor ou superior ao recurso Azure de destino. Sem esta atribuição, o agente recebe uma 401 Unauthorized resposta ao chamar a API. Para os passos completos de configuração, consulte Autenticar usando identidade gerida.

Autorização anónima:

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

Autenticação de ligação do projeto:

Use este padrão quando a API exigir uma chave ou token armazenado numa conexão de projeto do 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>"
          }
        }
      }
    }
  ]
}

Autenticação de identidade gerida:

Utilize este padrão quando a API de destino se autenticar através do Microsoft Entra ID. A identidade gerida do projeto Foundry chama a API em nome do agente. Certifique-se de que a identidade gerida tem o papel RBAC exigido no serviço alvo antes de usar este padrão.

{
  "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",
      },
    },
  },
];

Autenticação baseada em teclas:

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-para-Agente (A2A)

Use este padrão para chamar outro agente como ferramenta. Forneça a URL base do agente remoto e, se exigir autenticação, uma ligação ao projeto.

{
  "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

Resolução de problemas

Sintoma Causa provável Corrigir
tools/list não retorna nenhuma ferramenta para ferramentas MCP ou A2A Credenciais de ligação inválidas ou em falta para o servidor MCP remoto ou agente A2A. A caixa de ferramentas não consegue recuperar manifestos de ferramentas do endpoint remoto sem uma autenticação válida. Verifica se project_connection_id existe no teu projeto Foundry e as credenciais estão corretas. Tenta ligar-te diretamente ao servidor MCP para testar a configuração da autenticação. Se usar identidade gerida (PMI, identidade do agente ou MI), verifique as atribuições corretas de papéis RBAC para o chamador no recurso alvo.
tools/list retorna zero ferramentas para ferramentas OpenAPI Especificação OpenAPI inválida. A caixa de ferramentas constrói o manifesto da ferramenta a partir da especificação, que falha se a especificação estiver mal formada. Valide o conteúdo da especificação da OpenAPI. Verifique se cumpre a OpenAPI 3.0 ou 3.1 e inclui valores válidos pathsoperationId e esquemas de parâmetros. Se usar autenticação de identidade gerida, verifique também as atribuições de funções RBAC no serviço de destino.
tools/list retorna menos ferramentas do que o esperado O allowed_tools filtro contém nomes de ferramentas incorretos ou mal escritos. Os nomes das ferramentas são sensíveis a maiúsculas e minúsculas e devem seguir a especificação MCP para nomes de ferramentas (sem espaços ou caracteres especiais). Remova allowed_tools temporariamente e ligue tools/list para obter a lista completa de ferramentas. Use os nomes exatos da resposta para definir valores para allowed_tools.
tools/list não retorna nenhuma ferramenta (outros tipos de ferramentas) Caixa de ferramentas não totalmente configurada ou tipo de ferramenta não suportado na região. Para ferramentas integradas (Web Search, AI Search, Code Interpreter, File Search), as manifestações de ferramentas são construídas no lado do servidor e não requerem autenticação — se devolverem resultados vazios, a versão da caixa de ferramentas pode ainda não estar configurada. Espera 10 segundos e tenta novamente.
400 Multiple tools without identifiers Dois tipos de ferramentas sem nome numa única caixa de ferramentas Manter no máximo um tipo sem nome; adicionar server_label a todas as ferramentas MCP.
CONSENT_REQUIRED (código -32006) A ligação OAuth requer consentimento do utilizador Abra o URL de consentimento num navegador e complete o fluxo OAuth, depois tente novamente.
401 nas chamadas MCP Token expirado ou escopo errado Usa o escopo https://ai.azure.com/.default e atualiza o token.
Nomes de ferramentas que não coincidem Os nomes das ferramentas MCP são prefixados por server_label Use o formato {server_label}.{tool_name} (por exemplo, myserver.get_info).
500 em send_ping() O servidor MCP do Toolbox não implementa o método MCP ping . Não ligues send_ping(). Se o seu framework o chamar automaticamente (por exemplo, o Microsoft Agent Framework MCPStreamableHTTPTool._ensure_connected()), desative a verificação de ping ou substitua o método por uma operação de passagem.
500 em prompts/list O servidor MCP da Foundry não implementa prompts/list. Passe load_prompts=False (ou equivalente) ao construtor de cliente MCP.
500 com não-transmissão contínua tools/call O modo não streaming (stream=False) não é suportado para os endpoints MCP da caixa de ferramentas. Usa stream=True sempre quando chamas ferramentas MCP da caixa de ferramentas.
500 em tools/list Erro transitório do servidor Tenta novamente após alguns segundos.
Variáveis de ambiente sobrescritas em tempo de execução A plataforma reserva todas as variáveis de ambiente com o prefixo FOUNDRY_ e pode sobrescrever silenciosamente os valores definidos pelo utilizador. Renomear variáveis de ambiente personalizadas para evitar o prefixo FOUNDRY_ (por exemplo, usar TOOLBOX_MCP_ENDPOINT em vez de FOUNDRY_TOOLBOX_ENDPOINT).

Suporte a redes virtuais

Quando o seu projeto Foundry usa isolamento de rede (ligação privada), nem todos os tipos de ferramentas de toolbox são suportados. A tabela seguinte mostra o estado do suporte para cada tipo de ferramenta e como o tráfego flui num ambiente isolado da rede.

Tipo de ferramenta Suporte a VNet Fluxo de tráfego
MCP ✅ Apoiado Através da sua sub-rede VNet
Pesquisa de IA do Azure ✅ Apoiado Através de um endpoint privado
Interpretador de Código ✅ Apoiado Rede backbone da Microsoft
Pesquisa na Web ✅ Apoiado Endpoint público
OpenAPI ✅ Apoiado Depende da configuração da rede API alvo
Pesquisa de ficheiros ❌ Não suportado Ainda não disponível
Agente-para-Agente (A2A) ✅ Apoiado Através de um endpoint privado

Para instruções completas de configuração de isolamento de rede, incluindo a injeção de VNet para o cliente do agente, a configuração de DNS e os requisitos de endpoints privados, consulte Configure isolamento de rede para Microsoft Foundry.

Compatibilidade de regiões e modelos

A disponibilidade da caixa de ferramentas depende de dois fatores para além da região do projeto:

  • Região: Alguns tipos de ferramentas não estão disponíveis em todas as regiões que suportam o serviço agente. Por exemplo, uma região que suporta o endpoint da caixa de ferramentas pode não suportar todos os tipos de ferramentas incorporadas.

Antes de implementar uma caixa de ferramentas, verifique se a sua região de destino suporta os tipos de ferramentas que pretende usar. Para as tabelas completas de compatibilidade, consulte Suporte à Ferramenta por região e modelo.