Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Importante
Itens marcados (versão prévia) neste artigo estão atualmente em versão prévia pública. Essa versão prévia é fornecida sem um contrato de nível de serviço e não recomendamos isso para cargas de trabalho de produção. Alguns recursos podem não ter suporte ou ter recursos restritos. Para obter mais informações, consulte Supplemental Terms of Use for Microsoft Azure Previews.
Um único agente pode depender de várias ferramentas – APIs, servidores MCP (Model Context Protocol), conectores e fluxos – cada uma com seu próprio modelo de autenticação e equipe proprietária. À medida que você escala em uma organização, as equipes recriam as mesmas ferramentas de forma independente, as credenciais são duplicadas, a governança se torna inconsistente e há pouca visibilidade sobre quais ferramentas existem ou quem as está usando. Os desenvolvedores param, não porque os modelos não são capazes, mas porque a integração de ferramentas se torna o gargalo.
As empresas já têm a infraestrutura: gateways, cofres de credenciais, políticas e observabilidade. O que está faltando é uma experiência de desenvolvedor que empacota essa infraestrutura em algo reutilizável, detectável e regido por padrão.
A caixa de ferramentas fornece essa experiência. Defina um conjunto selecionado de ferramentas uma vez, gerencie-as centralmente no Foundry e exponha-as por meio de um ponto de extremidade único compatível com MCP, que pode ser consumido por qualquer agente. A plataforma lida com injeção de credencial, atualização de token e imposição de política empresarial em runtime.
A caixa de ferramentas abrange todo o ciclo de vida da ferramenta por meio de quatro pilares – Compilar e Consumir estão disponíveis hoje:
| Pilar | Status | O que habilita |
|---|---|---|
| Construir | Disponível hoje | Selecione ferramentas, configure a autenticação centralmente e publique uma caixa de ferramentas reutilizável que qualquer equipe possa consumir. |
| Consumir | Disponível hoje | Conecte qualquer agente a um único ponto de extremidade compatível com MCP para descobrir e invocar dinamicamente todas as ferramentas na caixa de ferramentas. |
Você cria conjuntos de ferramentas na Foundry, mas a plataforma de uso está aberta. Qualquer cliente ou runtime de agente compatível com MCP pode usar uma caixa de ferramentas, incluindo agentes criados com qualquer estrutura, IDEs habilitadas para MCP e código personalizado.
Como uma caixa de ferramentas é um recurso gerenciado, você pode adicionar, remover ou reconfigurar ferramentas sem alterar o código em seu agente. Seu agente sempre se conecta a um único endpoint. O controle de versão da caixa de ferramentas fornece controle explícito sobre quando as alterações entrarem em vigor – criar e testar uma nova versão e promovê-la para o padrão quando você estiver pronto. Cada agente que aponta para a caixa de ferramentas pega a versão promovida automaticamente, sem alterações de código e sem reimplantação.
Neste artigo, você aprenderá a:
- Crie uma caixa de ferramentas com uma ou mais ferramentas.
- Obtenha o endpoint MCP da caixa de ferramentas.
- Verifique se as ferramentas são carregadas corretamente.
- Integre um conjunto de ferramentas ao agente hospedado.
- Gerencie as versões da caixa de ferramentas e promova uma versão como padrão.
Para obter as opções de sintaxe e autenticação de configuração de ferramentas para cada tipo de ferramenta, consulte Configurar ferramentas.
Suporte a funcionalidades
| Funcionalidade | SDK do Python | API REST | SDK do .NET | JavaScript SDK | azd (implantar) | Kit de Ferramentas Foundry |
|---|---|---|---|---|---|---|
| Atualização, lista, obtenção e exclusão da caixa de ferramentas | ✔️ | ✔️ | ✔️ | ✔️ | N/A | ✔️ |
| Criação de versão da caixa de ferramentas | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Lista de versões da caixa de ferramentas, obter e excluir | ✔️ | ✔️ | ✔️ | ✔️ | N/A | Não. A interface do usuário mostra apenas a versão mais recente. |
| Ferramenta MCP | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Ferramenta de Pesquisa na Web | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Pesquisa de IA do Azure ferramenta | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Ferramenta interpretador de código | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Ferramenta de Pesquisa de Arquivos | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Ferramenta OpenAPI | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | Não |
| Ferramenta Agente para Agente (A2A) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | Não |
Pré-requisitos
- Um projeto ativo Microsoft Foundry.
-
RBAC: atribua a função Azure AI User no projeto Foundry para cada identidade relevante ao seu cenário.
- Desenvolvedor (sempre necessário) – a identidade que cria, atualiza e gerencia versões da caixa de ferramentas.
- Identidade do agente (necessária se estiver usando um agente hospedado) – a identidade gerenciada do agente que chama ferramentas em runtime.
- Usuário final (necessário apenas para fluxos OAuth) – qualquer usuário cuja identidade é proxy por meio de conexões OAuth ou UserEntraToken (por exemplo, fluxos MCP baseado em OAuth ou 1P OBO).
- Seu projeto Foundry precisa estar em uma das regiões com suporte. Tipos de ferramentas individuais em uma caixa de ferramentas são limitados ainda mais por região e modelo– nem todos os tipos de ferramentas estão disponíveis em todas as regiões ou em cada modelo. Consulte a compatibilidade de região e modelo.
- Visual Studio Code (VS Code).
- Instale o Microsoft Foundry Toolkit for Visual Studio Code (antigo Kit de Ferramentas de IA para VS Code) do Visual Studio Code Marketplace. O suporte à caixa de ferramentas no Foundry Toolkit está atualmente em versão prévia.
-
Python SDK:
pip install azure-ai-projects azure-identity -
.NET SDK:
dotnet add package Azure.AI.Projects --prereleaseedotnet add package Azure.Identity -
SDK do JavaScript:
npm install @azure/ai-projects @azure/identity -
azd (deploy): Instale a CLI do Desenvolvedor do Azure e a extensão do agente:
azd extension install azure.ai.agents
Importante
- Uma caixa de ferramentas dá suporte no máximo uma ferramenta sem um campo de
namepor tipo de ferramenta (Pesquisa na Web, Pesquisa de IA do Azure , Interpretador de Código, Pesquisa de Arquivos). Para incluir mais de uma instância do mesmo tipo de ferramenta, defina uma únicanameem cada instância para diferenciá-las. Incluir duas instâncias do mesmo tipo sem um `name` resulta em um erro `invalid_payload`. Para obter detalhes, consulte Vários tipos de ferramentas. - Adicione uma
descriptiona cada ferramenta em sua caixa de ferramentas para ajudar o modelo a selecionar a ferramenta certa para cada solicitação. - Examine cuidadosamente a documentação de cada ferramenta para saber mais sobre configuração de ferramentas individuais, limitações e avisos.
Etapa 1: Criar uma versão da caixa de ferramentas
Crie uma versão da caixa de ferramentas com base nas ferramentas necessárias.
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 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 na exibição Tools.
- Selecione o Foundry Toolkit na Barra de Atividades.
- Em Meus Recursos, expanda o nome do projeto>Ferramentas.
- Selecione o ícone + Adicionar Caixa de Ferramentas .
- Na guia Criar uma Caixa de Ferramentas Personalizada , insira o nome e a descrição da caixa de ferramentas, adicione as ferramentas desejadas e selecione Publicar.
A publicação de uma nova caixa de ferramentas cria sua primeira versão. Essa versão se torna a versão padrão automaticamente.
Ao usar azd, você declara recursos de caixa de ferramentas em um agent.yaml arquivo em vez de chamar o SDK. Defina suas ferramentas na resources seção e implante usando azd ai agent init. Para agent.yaml obter exemplos para cada tipo de ferramenta, consulte Configurar ferramentas. Para obter o fluxo de trabalho de implantação completo, consulte Implantar com o azd.
Importante
O -m sinalizador (ou --manifest) é necessário para azd ai agent init.
Ele informa ao comando onde encontrar a definição do agente e os arquivos de origem.
-m pode apontar para uma das seguintes opções:
-
Um arquivo específico
agent.yaml– init copia todos os arquivos do mesmo diretório que o manifesto -
Uma pasta que contém
agent.yaml— o init copia todos os arquivos dessa pasta
Todos os arquivos no diretório do manifesto (main.py, Dockerfile, requirements.txt, setup.py e assim por diante) são copiados para o projeto estruturado em 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
Etapa 2: Obter o ponto de extremidade MCP da caixa de ferramentas
Existem dois padrões de endpoint dependendo da sua função:
| Papel | Endpoint | Quando usar |
|---|---|---|
| Desenvolvedor da caixa de ferramentas | {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1 |
Teste ou valide uma versão específica antes de promovê-la para o padrão. |
| Usuário do Toolbox | {project_endpoint}/toolboxes/{toolbox_name}/mcp?api-version=v1 |
Conecte agentes à caixa de ferramentas. Sempre serve o default_version. A primeira versão criada é definida automaticamente como o padrão. |
Importante
Cada solicitação para o endpoint MCP da caixa de ferramentas deve incluir o cabeçalho Foundry-Features: Toolboxes=V1Preview. As chamadas que omitem esse cabeçalho falham. Inclua-o em todos os clientes HTTP, transportes MCP e wrappers do SDK que chamam o endpoint da ferramenta.
Nota
A primeira versão de uma nova caixa de ferramentas é promovida automaticamente para default_version (v1). Se você precisar alterar o padrão posteriormente, consulte Promover uma versão para padrão.
No Foundry Toolkit for Visual Studio Code, copie o ponto de extremidade do consumidor da caixa de ferramentas da exibição Toolboxes.
- Selecione o Foundry Toolkit na Barra de Atividades.
- Em Meus Recursos, expanda o nome do projeto>Ferramentas.
- Na guia Caixas de Ferramentas , localize sua caixa de ferramentas.
- Na coluna URL do Ponto de Extremidade , copie o ponto de extremidade.
O valor da URL do Endpoint é o endpoint de consumo da ferramenta. Para construir um endpoint específico para uma versão, use o padrão do desenvolvedor mostrado na tabela anterior.
Etapa 3: Verificar a disponibilidade da ferramenta
Antes de executar o agente completo, confirme se a caixa de ferramentas carrega as ferramentas esperadas usando um SDK do cliente MCP no endpoint. Use o ponto de extremidade específico da versão para validar uma versão antes de promovê-la como padrão.
Instale o SDK do cliente MCP:
pip install mcp
Conectar à caixa de ferramentas e listar 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 a guia API REST para verificar a disponibilidade da ferramenta no .NET, ou use o SDK do cliente MCP em Python.
Utilize o endpoint específico da versão (/versions/{version}/mcp) para validar uma versão antes de promovê-la.
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. Chame 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":{}}}
Instale o SDK do cliente MCP:
npm install @modelcontextprotocol/sdk
Conectar à caixa de ferramentas e listar 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 da etapa 2 junto com um exemplo de agente hospedado estruturado para validar o carregamento da caixa de ferramentas no VS Code.
- No Foundry Toolkit, em Meus Recursos>Seu nome de projeto>Ferramentas, localize a caixa de ferramentas que você deseja testar.
- Selecione o modelo de código Scaffold.
- Escolha uma pasta de projeto quando solicitado.
- Siga as dependências geradas
README.mdpara instalar, configurar variáveis de ambiente e executar o exemplo localmente. - Use o Inspetor do Agente ou execute
python main.pypara confirmar se as ferramentas da caixa de ferramentas carregam e respondem.
Para a validação de versão específica antes de promover uma nova versão da toolbox, use a aba Python ou API REST nesta etapa.
Nota
Use a guia API REST para verificar a disponibilidade da ferramenta ou use o SDK do cliente MCP Python.
Verificar – inicializar: HTTP 200. Se você ignorar a etapa de inicialização, as chamadas subsequentes falharão.
Verificação — tools/list:
-
len(tools) > 0— vazio significa que a versão da caixa de ferramentas não foi provisionada corretamente. - Cada ferramenta tem
name,descriptioneinputSchema. Para convenções de nomenclatura de ferramentas, consulte a especificação do MCP. -
inputSchematem um campoproperties(alguns servidores MCP omitem-no, 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 donamecampo ou o nome da ferramenta padrão. - As ferramentas MCP incluem um
_meta.tool_configurationbloco que contém configurações de runtime, comorequire_approval. Consulte os requisitos de aprovação da ferramenta Handle. - Observe os nomes de parâmetro exatos para a etapa de chamada (por exemplo
queryvsqueries).
Verificar - tools/call:
- Nenhum campo de nível
errorsuperior. Se estiver presente, inspecioneerror.code. Para obter códigos de erro MCP padrão, consulte a especificação do MCP:-
-32006→ É necessário consentimento OAuth (extraia a URL deerror.message). - Outros códigos → falha no lado do servidor.
-
-
result.content[]contém entradas com"type": "text"- esta é a saída da ferramenta. - Para a Pesquisa de IA, verifique
result.structuredContent.documents[]os metadados de fragmento (title,url,id,score). - Para Pesquisa de Arquivos, verifique
result.content[].resource._metase há metadados de pedaço (title,file_id,document_chunk_id,score). - Para Pesquisa na Web, verifique
result.content[].resource._meta.annotations[]se há citações de URL (type, ,url,title,start_index,end_index). -
"ServerError"Fique atento ao conteúdo do texto – a ferramenta foi executada, mas encontrou um erro interno.
Exemplos de argumentos específicos da ferramenta tools/call
| Tipo de ferramenta | Argumentos |
|---|---|
| Pesquisa de IA | {"query": "search text"} |
| Pesquisa de Arquivo | {"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"} |
Etapa 4: Integrar o conjunto de ferramentas ao seu agente
LangGraph
.env arquivo:
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 de chave):
from langchain_azure_ai.tools import AzureAIProjectToolbox
toolbox = AzureAIProjectToolbox(toolbox_name=TOOLBOX_NAME)
tools = await toolbox.get_tools()
Consulte o exemplo completo para a implementação completa.
Importante
A classe langchain_azure_ai.tools.AzureAIProjectToolbox requer langchain-azure-ai[tools]>1.2.3.
Estrutura do agente do Microsoft
Use MCPStreamableHTTPTool do SDK do Agent Framework para se conectar diretamente ao ponto de extremidade MCP da caixa de ferramentas.
.env arquivo:
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 de 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()
Consulte o exemplo completo para a implementação completa.
SDK do Copilot
Use o SDK do GitHub Copilot para criar um agente alimentado por caixas de ferramentas que conecta a invocação de ferramentas do Copilot ao ponto de extremidade MCP da caixa de ferramentas Foundry.
Nota
O SDK do Copilot rejeita nomes de ferramentas que contêm pontos. A ponte substitui automaticamente . por _ em nomes de ferramentas. Por exemplo, myserver.get_info torna-se myserver_get_info.
.env arquivo:
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"],
)
Consulte o exemplo completo para a implementação completa.
Estrutura do agente do Microsoft
Use ResponsesServer do SDK do Agent Framework com um ToolboxMcpClient personalizado para descobrir e invocar ferramentas do conjunto de ferramentas por meio do ponto de extremidade 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 de 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 envolve chamadas diretas JSON-RPC para o ponto de extremidade MCP.
ToolboxHandler conecta chamadas da ferramenta LLM de volta ao cliente MCP usando um loop de chamada de ferramenta padrão. Para obter a implementação completa de ambas as classes, consulte o exemplo completo.
Nota
Os exemplos de integração para esta etapa estão disponíveis apenas para Python e .NET.
Nota
Os exemplos de integração para esta etapa estão disponíveis apenas para Python e .NET.
Use o Foundry Toolkit para estruturar um exemplo de agente hospedado que já esteja conectado à caixa de ferramentas.
- Selecione o Foundry Toolkit na Barra de Atividades.
- Em Meus Recursos, expanda o nome do projeto>Ferramentas.
- Na guia Caixa de Ferramentas, localize a caixa de ferramentas que você deseja consumir e selecione Template de código scaffold.
- Na Paleta de Comandos, escolha uma pasta de projeto quando solicitado.
- Abra o arquivo gerado
README.mde siga as etapas de instalação, execução em ambiente local e implantação do scaffold.
O projeto gerado inclui o ponto de entrada do agente hospedado, os arquivos de implantação e uma README.md com as etapas exatas de configuração, execução e implantação. O agente estruturado manipula o cabeçalho Foundry-Features: Toolboxes=V1Preview para você.
Se você quiser integrar ferramentas a um projeto de agente hospedado existente em vez de gerar um novo exemplo, use o endpoint copiado da Etapa 2 com os padrões do Python ou .NET apresentados nesta seção.
Implantação com azd
Use a CLI do Desenvolvedor Azure (azd) para declarar recursos da caixa de ferramentas diretamente em um arquivo agent.yaml e implantar seu agente com um único comando. Usando essa abordagem, você não precisa criar a caixa de ferramentas separadamente por meio do SDK ou REST.
azd provisiona a caixa de ferramentas, as conexões e a implantação do modelo em conjunto.
Importante
O -m sinalizador (ou --manifest) é necessário para azd ai agent init. Ele informa ao comando onde encontrar a definição do agente e os arquivos de origem.
-m pode apontar para um arquivo específico agent.yaml ou uma pasta que contém um. Todos os arquivos no diretório do manifesto (main.py, Dockerfilee requirements.txtassim por diante) são copiados verbatim para o projeto scaffolded em src/<agent-name>/.
Estrutura de pastas:
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 na Web + MCP GitHub):
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 você implanta com recursos de toolbox agent.yaml, a plataforma injeta FOUNDRY_AGENT_TOOLBOX_ENDPOINT (URL base) e TOOLBOX_{toolbox_name}_MCP_ENDPOINT (endpoint completo para cada toolbox) como variáveis de ambiente. Para a caixa de ferramentas nomeada agent-tools, a variável por caixa de ferramentas se torna TOOLBOX_AGENT_TOOLS_MCP_ENDPOINT. Seu main.py lê a variável específica de cada caixa de ferramentas ou constrói a URL 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 - nenhuma configuração de ponto de extremidade extra é necessária no código.
Implantar:
# 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
Gerenciar os requisitos de aprovação da ferramenta
A caixa de ferramentas retorna um _meta.tool_configuration objeto para cada entrada de ferramenta retornada por tools/list. Quando uma ferramenta for require_approval definida como "always", o runtime do agente deverá apresentar a ação pendente ao usuário e aguardar a confirmação antes de invocar a ferramenta. O ponto de extremidade DO MCP não bloqueia tools/call – a imposição é inteiramente responsabilidade do runtime do agente.
Ler require_approval de tools/list
Cada entrada de ferramenta em uma 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 solicitar ao usuário a confirmação antes de cada invocação. |
"never" |
O agente pode invocar a ferramenta livremente. |
Implementar controle de aprovação (LangGraph)
tools/list Consulte na inicialização para criar um mapa de aprovação e, em seguida, insira 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 ferramentas do cliente MCP, detecte quais ferramentas exigem aprovação e ajuste 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 detecção ocorre na inicialização. A verificação de aprovação é executada uma vez quando o agente é inicializado. Não há sobrecarga por chamada.
- Degradação suave. Se nenhuma ferramenta tiver
require_approval: "always", o prompt do sistema ficará inalterado e o agente se comportará como antes. -
require_approvalé imposta pelo agente. O proxy MCP da caixa de ferramentas executatools/callindependente dessa configuração. O runtime do agente é responsável por controlar a chamada.
Configurar require_approval em uma ferramenta
Defina require_approval quando você cria uma versão da caixa de ferramentas. Os exemplos da ferramenta MCP na Etapa 1 mostram ambos os valores "always" e "never". Você também pode defini-lo por meio 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",
},
];
Use a aba Python, .NET, JavaScript, API REST ou azd para configurar require_approval na definição da caixa de ferramentas. O fluxo de trabalho do Foundry Toolkit neste artigo se concentra em criar e consumir a caixa de ferramentas em 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
Etapa 5: Gerenciar versões da caixa de ferramentas
Nota
Você pode gerenciar versões da caixa de ferramentas (listar, obter, promover, excluir) por meio do SDK Python, .NET SDK, SDK do JavaScript e API REST. A CLI do azd só dá suporte à criação de versões da caixa de ferramentas durante a implantação.
As versões da caixa de ferramentas são instantâneos imutáveis da configuração de ferramentas de uma caixa de ferramentas. Cada chamada para o endpoint de criação produz um novo ToolboxVersionObject. Pai ToolboxObject tem um campo default_version que controla qual versão o ponto de extremidade MCP serve. A criação de uma nova versão não a promove automaticamente – você decide quando atualizar default_version. Esse processo permite que você configure alterações, teste uma nova versão de forma independente e promova-a para produção em sua própria agenda.
| Objeto | Campos de chave | Descrição |
|---|---|---|
ToolboxObject |
id
name, default_version |
O contêiner 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 em um ponto no tempo. |
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 a criará automaticamente. Quando você cria a primeira versão de uma nova caixa de ferramentas, a versão padrão é v1 até que você atualize 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 a guia 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 se concentra na criação de ferramentas e na estruturação de um agente hospedado que as utiliza.
Essa operação não é suportada pelo azd. Para criar uma versão da caixa de ferramentas, use a guia Python, .NET, REST API ou JavaScript.
A resposta é um 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 a guia Python, .NET, JavaScript ou API REST para listar versões da caixa de ferramentas.
Essa operação não é suportada pelo azd. Para listar versões da caixa de ferramentas, use a guia Python, .NET, REST API ou JavaScript.
Obter 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 a guia Python, .NET, JavaScript ou API REST para obter uma versão específica da caixa de ferramentas.
Essa operação não é suportada pelo azd. Para obter uma versão específica da caixa de ferramentas, use a guia Python, .NET, REST API ou JavaScript.
Promover uma versão para o padrão
O endpoint MCP sempre atende o default_version. Para alternar qual versão está 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}`);
Use a aba Python, .NET, JavaScript ou API REST para promover uma versão de ferramentas como padrão.
Essa operação não é suportada pelo azd. Para promover uma versão para o padrão, use a guia Python, .NET, REST API ou a guia JavaScript.
Excluir 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 a aba Python, .NET, JavaScript ou REST API para excluir uma versão da caixa de ferramentas.
Essa operação não é suportada pelo azd. Para excluir uma versão da caixa de ferramentas, use a guia Python, .NET, REST API ou JavaScript.
Configurar ferramentas
Escolha o tipo de ferramenta e o padrão de autenticação que correspondem ao seu cenário. Selecione a aba para seu SDK preferido ou método de implantação.
Vários tipos de ferramentas
Uma única caixa de ferramentas pode agrupar diferentes tipos de ferramentas. O exemplo a seguir combina Pesquisa na Web, Pesquisa de IA do Azure e um servidor MCP em uma 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 o campo name. Para incluir várias instâncias do mesmo tipo, defina uma única name em cada instância. Confira o próximo exemplo.
Restrições de várias ferramentas
Você pode incluir no máximo uma instância de cada tipo de ferramenta interna em uma caixa de ferramentas sem um campo name. Se você incluir duas instâncias do mesmo tipo sem um name, a API retornará:
400 invalid_payload: Multiple tools without identifiers found...
Duas instâncias do mesmo tipo de ferramenta
Use o name campo para incluir várias instâncias do mesmo tipo de ferramenta em uma caixa de ferramentas. Cada instância nomeada é tratada como uma ferramenta separada e deve ter um nome exclusivo.
{
"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 seções a seguir mostram a configuração de cada tipo de ferramenta em detalhes.
Protocolo de Contexto de Modelo (MCP)
Autenticação baseada em chave:
{
"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"
}
]
}
Autenticação baseada em identidade ou OAuth:
Para o OAuth (conector gerenciado, registro de aplicativo personalizado), identidade do agente ou autenticação do token Entra do usuário, primeiro crie a conexão apropriada em seu projeto do Foundry e, em seguida, referencie-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 conexão authType determina o fluxo de autenticação. Os tipos de autenticação de conexão com suporte para MCP incluem CustomKeys, OAuth2 (gerenciado ou personalizado) AgenticIdentitye UserEntraToken. Consulte a guia azd para obter exemplos de configuração de conexã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 autenticaçã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 chave:
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 gerenciado:
Use esse padrão para servidores MCP que dão suporte ao fluxo OAuth gerenciado do Foundry. O valor connectorName deve corresponder a um conector gerenciado 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 – registro de aplicativo personalizado:
Use esse padrão ao trazer seu próprio registro de aplicativo 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 esse padrão para servidores MCP que dão suporte à autenticação Microsoft Entra ID. A identidade do agente do Foundry é verificada em relação ao recurso de destino.
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
Você deve atribuir à identidade do agente a função RBAC necessária no recurso de destino antes que o servidor MCP aceite solicitações.
Token de Entrada do Usuário (OBO 1P):
Use esse padrão para servidores MCP que exigem a identidade do usuário por meio do fluxo OBO (On-Behalf-Of). Foundry encaminha o token Entra do usuário para o 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 audience campo é necessário para UserEntraToken conexões. Sem ele, tools/list retorna zero ferramentas.
Importante
Na primeira vez que um usuário chama uma caixa de ferramentas com um MCP baseado em OAuth em um projeto, o ponto de extremidade MCP retorna um CONSENT_REQUIRED erro (código -32006) com uma URL de consentimento:
{
"error": {
"code": -32006,
"message": "User consent is required. Please visit: https://..."
}
}
Esse erro é esperado. Abra a URL de consentimento em um navegador, conclua o fluxo de autorização OAuth e tente novamente a chamada do agente. Chamadas subsequentes são bem-sucedidas sem necessidade de novo aviso.
Pesquisa na Web
Importante
- A Pesquisa na Web usa a contextualização com a Pesquisa do Bing e a contextualização com a Pesquisa Personalizada do Bing, que são Serviços de Consumo de Primeira Parte regidos por esses termos de uso do Grounding com Bing e pela Política de Privacidade da Microsoft.
- O Data Protection Addendum da Microsoft não se aplica aos dados enviados para Grounding com a Pesquisa do Bing e Grounding com a Pesquisa Personalizada do Bing. Quando você usa o Grounding com a Pesquisa do Bing e o Grounding com a Pesquisa Personalizada do Bing, as transferências de dados ocorrem fora das normas de conformidade e dos limites geográficos.
- O uso do recurso de Grounding com o Bing Search e o Grounding com o Bing Custom Search incorre em custos. Consulte os preços para obter detalhes.
- Consulte a seção management para obter informações sobre como Azure administradores podem gerenciar o acesso ao uso da pesquisa na Web.
Use esse padrão para adicionar pesquisa na Web. Nenhuma conexão de projeto é necessária para a pesquisa na web com o Grounding com o Bing. Para usar um aterramento com uma instância personalizada da Pesquisa do Bing, adicione um web_search.custom_search_configuration objeto apontando para o aterramento com a conexão de Pesquisa Personalizada do Bing.
{
"description": "Built-in web search",
"tools": [
{
"type": "web_search",
"name": "<OPTIONAL_TOOL_NAME>",
"description": "<Optional description for the model>"
}
]
}
Integração da Pesquisa Personalizada do 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
Usando 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 Pesquisa na Web retorna resultados sobre o MCP, a resposta é um resource item de conteúdo que contém a resposta sintetizada com links de origem do Markdown embutidos. As citações de URL estão 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
}
}
Pesquisa de IA do Azure
{
"description": "Azure AI Search over my data",
"tools": [
{
"type": "azure_ai_search",
"name": "<OPTIONAL_TOOL_NAME>",
"description": "<Optional description for the model>",
"azure_ai_search": {
"indexes": [
{
"index_name": "<INDEX_NAME>",
"project_connection_id": "<CONNECTION_NAME>"
}
]
}
}
]
}
from azure.ai.projects.models import AzureAISearchTool
tools = [
AzureAISearchTool(
index_name="<INDEX_NAME>",
project_connection_id="<CONNECTION_NAME>",
)
]
ProjectsAgentTool tool = new AzureAISearchTool(
new AzureAISearchToolOptions(
indexes: [
new AzureAISearchIndexResource(
indexName: "<INDEX_NAME>",
projectConnectionId: "<CONNECTION_NAME>"
)
]
)
);
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
toolboxName: "my-toolbox",
tools: [tool],
description: "Azure AI Search over my data"
);
const tools = [
{
type: "azure_ai_search",
name: "<OPTIONAL_TOOL_NAME>",
description: "<Optional description for the model>",
azure_ai_search: {
indexes: [
{
index_name: "<INDEX_NAME>",
project_connection_id: "<CONNECTION_NAME>",
},
],
},
},
];
parameters:
ai_search_key:
secret: true
description: Azure AI Search admin key
resources:
- kind: connection
name: aisearch-conn
category: CognitiveSearch
authType: ApiKey
target: https://your-search-service.search.windows.net/
credentials:
key: "{{ ai_search_key }}"
- kind: toolbox
name: search-tools
description: Azure AI Search toolbox
tools:
- type: azure_ai_search
index_name: your-index-name
project_connection_id: aisearch-conn
Configurar parâmetros de ferramenta
| parâmetro da ferramenta Pesquisa de IA do Azure | Necessário | Notas |
|---|---|---|
project_connection_id |
Sim | A ID do recurso da conexão do projeto com Pesquisa de IA do Azure . |
index_name |
Sim | O nome do índice em seu recurso de Pesquisa de IA do Azure . |
top_k |
Não | O padrão é 5. |
query_type |
Não | O padrão é vector_semantic_hybrid. Valores com suporte: 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 partes em result.structuredContent.documents[]. Cada documento inclui title, urle idscore campos que você pode usar para gerar detalhes de citação em seu aplicativo.
Interpretador de Código
Use esse padrão para permitir que o agente escreva e execute Python código. O padrão não requer uma conexão de projeto ou uma configuração extra.
Para carregar um arquivo para o Interpretador de Código a ser usado, chame POST {project_endpoint}/openai/v1/files com purpose=assistants. A ID do arquivo retornado é o valor fornecido como <FILE_ID> na configuração da ferramenta. Consulte o Interpretador de Código para obter exemplos de upload completos.
Importante
Quando o Interpretador de Código é usado por meio de uma caixa de ferramentas em um agente hospedado, não há suporte para o isolamento do usuário. Todos os usuários no mesmo projeto compartilham o mesmo contexto de contêiner.
{
"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
Baixar arquivos de saída do Interpretador de Código
Quando o Interpretador de Código produz arquivos de saída (por exemplo, um CSV ou gráfico gerado), use as etapas a seguir para listá-los e baixá-los.
Etapa 1: Listar arquivos usando a API de Contêiner
Extraia o container_id de content[]._meta.container_id na resposta tools/call. Em seguida, chame a API de Arquivos do Contêiner para listar todos os arquivos do contêiner.
GET {project_endpoint}/containers/{container_id}/files?api-version=v1
Authorization: Bearer {token}
A resposta retorna uma lista de arquivos com seus nomes e IDs.
Etapa 2: Baixar o arquivo usando a API de Arquivo
Use o nome do arquivo retornado da Etapa 1 para baixar o arquivo por meio do endpoint de download da File API.
Pesquisa de Arquivo
Use esse padrão para permitir que o agente pesquise arquivos carregados armazenados em um repositório de vetores. Forneça referências a repositórios de vetores já existentes em seu projeto do Foundry.
Para criar um repositório de arquivos e vetores, use a {project_endpoint}/openai/v1 API:
- Carregue seu arquivo:
POST {project_endpoint}/openai/v1/filescompurpose=assistants. - Crie um repositório de vetores:
POST {project_endpoint}/openai/v1/vector_storescom a ID de arquivo retornada.
A ID do repositório de vetor resultante é o valor que você fornece como <VECTOR_STORE_ID>. Consulte a Pesquisa de Arquivos para obter exemplos completos em cada idioma.
Importante
Quando a Pesquisa de Arquivos é usada por meio de uma caixa de ferramentas em um agente hospedado, não há suporte para o isolamento do usuário. Todos os usuários no mesmo projeto compartilham acesso ao mesmo repositório de vetores.
{
"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 a ID do repositório de vetores antes de implantar:
azd env set FILE_SEARCH_VECTOR_STORE_ID "vs_xxxxxxxxxxxx"
Nota
Quando a Pesquisa de Arquivos retorna resultados por MCP, os metadados de pedaço são inseridos no conteúdo de 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 _meta bloco dentro de cada item de recurso contém o title, o file_id, o document_chunk_id, e relevância score para o trecho correspondente. Use esses campos de metadados em seu aplicativo para gerar detalhes de citação ou vincular profundamente ao arquivo de origem.
Openapi
Use esse padrão para expor qualquer API REST descrita por uma especificação OpenAPI. Escolha o que corresponde ao auth.type modelo de segurança da API.
Importante
Quando a autenticação de identidade gerenciada é usada, você deve atribuir a função RBAC apropriada à identidade gerenciada do projeto do Foundry no serviço de destino. Por exemplo, atribua Leitor ou superior no recurso de Azure de destino. Sem essa atribuição, o agente recebe uma 401 Unauthorized resposta ao chamar a API. Para obter as etapas completas de instalação, consulte Autenticar usando a identidade gerenciada.
Autenticaçã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 conexão do projeto:
Use esse padrão quando a API exigir uma chave ou token armazenado em uma 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 gerenciada:
Use esse padrão quando a API de destino for autenticada por meio de Microsoft Entra ID. A identidade gerenciada do projeto foundry chama a API em nome do agente. Verifique se a identidade gerenciada tem a função RBAC necessária no serviço de destino antes de usar esse 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 chave:
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 precisar de autenticação, uma conexão de 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
Solucionar problemas
| Sintoma | Causa provável | Corrigir |
|---|---|---|
tools/list retorna zero ferramentas para ferramentas MCP ou A2A |
Credenciais de conexão inválidas ou ausentes para o servidor MCP remoto ou agente A2A. A caixa de ferramentas não consegue recuperar manifestos de ferramenta do ponto de extremidade remoto sem autenticação válida. | Verifique se o project_connection_id existe em seu projeto do Foundry e se as credenciais estão corretas. Tente se conectar diretamente ao servidor MCP para testar a configuração de autenticação. Se estiver usando a identidade gerenciada (PMI, identidade do agente ou MI), verifique as atribuições de função RBAC corretas para o chamador no recurso de destino. |
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 falhará se a especificação estiver malformada. | Valide o conteúdo de especificação do OpenAPI. Verifique se ele está em conformidade com o OpenAPI 3.0 ou 3.1 e inclui valores e esquemas de parâmetro válidospathsoperationId. Se estiver usando autenticação de identidade gerenciada, verifique também as atribuições de função 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 de ferramenta diferenciam entre maiúsculas e minúsculas e devem seguir a especificação MCP para nomes de ferramentas (sem espaço em branco ou caracteres especiais). |
Remova allowed_tools temporariamente e chame tools/list para obter a lista de ferramentas completa. Use os nomes exatos da resposta para definir valores para allowed_tools. |
tools/list retorna zero ferramentas (outros tipos de ferramentas) |
Kit de ferramentas não totalmente configurado ou tipo de ferramenta sem suporte na região. Para ferramentas internas (Pesquisa na Web, Pesquisa de IA, Interpretador de Código, Pesquisa de Arquivos), os manifestos da ferramenta são construídos no lado do servidor e não exigem autenticação – se retornarem vazios, a versão da caixa de ferramentas poderá ainda não ser provisionada. | Aguarde 10 segundos e tente novamente. |
400 Multiple tools without identifiers |
Dois tipos de ferramentas sem nome em uma caixa de ferramentas | Manter no máximo um tipo sem nome; adicione server_label a todas as ferramentas do MCP. |
CONSENT_REQUIRED (código -32006) |
A conexão OAuth requer o consentimento do usuário | Abra a URL de consentimento em um navegador e conclua o fluxo OAuth e tente novamente. |
401 em chamadas MCP |
Token expirado ou escopo incorreto | Use o escopo https://ai.azure.com/.default e atualize o token. |
| Nomes de ferramentas que não correspondem | Os nomes de ferramentas DO MCP são prefixados com server_label |
Usar {server_label}.{tool_name} formato (por exemplo, myserver.get_info). |
500 em send_ping() |
O servidor MCP da caixa de ferramentas não implementa o método MCP ping . |
Não ligue send_ping(). Se sua estrutura o chamar automaticamente (por exemplo, o Agent Framework da Microsoft MCPStreamableHTTPTool._ensure_connected()), desative a verificação de ping ou substitua o método por uma operação nula. |
500 em prompts/list |
O servidor MCP do Foundry não implementa prompts/list. |
Passe load_prompts=False (ou equivalente) para o construtor do cliente MCP. |
500 com não transmissão tools/call |
Não há suporte para o modo não streaming (stream=False) para endpoints MCP da toolbox. |
Sempre use stream=True ao chamar ferramentas MCP da caixa de ferramentas. |
500 em tools/list |
Erro de servidor transitório | Tente novamente após alguns segundos. |
| Variáveis de ambiente substituídas em runtime | A plataforma reserva todas as variáveis de ambiente prefixadas FOUNDRY_ e pode substituir silenciosamente valores definidos pelo usuário. |
Renomeie variáveis de ambiente personalizadas para evitar o FOUNDRY_ prefixo (por exemplo, use TOOLBOX_MCP_ENDPOINT em vez de FOUNDRY_TOOLBOX_ENDPOINT). |
Suporte à rede virtual
Quando o projeto Foundry usa isolamento de rede (link privado), nem todos os tipos de ferramentas são suportados. A tabela a seguir mostra o status de suporte para cada tipo de ferramenta e como o tráfego flui em um ambiente isolado de rede.
| Tipo de ferramenta | Suporte à VNet | Fluxo de tráfego |
|---|---|---|
| PCM | ✅ Suportado | Por meio da sub-rede da VNet |
| Pesquisa de IA do Azure | ✅ Suportado | Por meio do ponto de extremidade privado |
| Interpretador de Código | ✅ Suportado | rede de backbone Microsoft |
| Pesquisa na Web | ✅ Suportado | Ponto de extremidade público |
| Openapi | ✅ Suportado | Depende da configuração de rede da API de destino |
| Pesquisa de Arquivo | ❌ Sem suporte | Ainda não disponível |
| Agente para Agente (A2A) | ✅ Suportado | Por meio do ponto de extremidade privado |
Para obter instruções completas de instalação de isolamento de rede, incluindo injeção de VNet para o cliente do agente, configuração de DNS e requisitos de ponto de extremidade privado, consulte Configurar isolamento de rede para Microsoft Foundry.
Compatibilidade de região e modelo
A disponibilidade da caixa de ferramentas depende de dois fatores 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 dão suporte ao serviço do agente. Por exemplo, uma região que suporta o endpoint da caixa de ferramentas pode não suportar todos os tipos de ferramentas incorporados.
Antes de implantar uma caixa de ferramentas, verifique se sua região de destino dá suporte aos tipos de ferramentas que você planeja usar. Para obter as tabelas de compatibilidade completas, consulte o suporte à Ferramenta por região e modelo.
Conteúdo relacionado
- Conectar agentes a servidores do Model Context Protocol
- Adicionar autenticação de servidor MCP
- Ferramenta de pesquisa na Web
- Pesquisa de IA do Azure ferramenta
- Implantar um agente hospedado
- Adicionar uma conexão ao seu projeto
- Configure o isolamento de rede para o Microsoft Foundry