Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Importante
Los elementos marcados (versión preliminar) de este artículo se encuentran actualmente en versión preliminar pública. Esta versión preliminar se proporciona sin un contrato de nivel de servicio y no se recomienda para cargas de trabajo de producción. Es posible que algunas características no se admitan o que tengan funcionalidades restringidas. Para obtener más información, vea Supplemental Terms of Use for Microsoft Azure Previews.
Un solo agente puede depender de varias herramientas: API, servidores, conectores y flujos del Protocolo de contexto de modelo (MCP), cada uno con su propio modelo de autenticación y equipo propietario. A medida que se escala en una organización, los equipos vuelven a implementar las mismas herramientas de forma independiente, las credenciales se duplican, la gobernanza se vuelve incoherente y hay poca visibilidad sobre qué herramientas existen o quién las usa. Los desarrolladores se detienen, no porque los modelos no son capaces, sino porque la integración de herramientas se convierte en el cuello de botella.
Las empresas ya tienen la infraestructura: puertas de enlace, almacenes de credenciales, directivas y observabilidad. Lo que falta es una experiencia de desarrollador que empaqueta esta infraestructura en algo reutilizable, reconocible y regido de forma predeterminada.
El cuadro de herramientas proporciona esa experiencia. Defina un conjunto mantenido de herramientas una vez, administrelas centralmente en Foundry y expóselas a través de un único punto de conexión compatible con MCP que cualquier agente pueda consumir. La plataforma controla la inserción de credenciales, la actualización de tokens y la aplicación de directivas empresariales en tiempo de ejecución.
El cuadro de herramientas cubre el ciclo de vida completo de las herramientas a través de cuatro pilares: La compilación y el consumo están disponibles hoy en día:
| Pilar | Estado | Lo que habilita |
|---|---|---|
| Compilación | Disponible hoy | Seleccione herramientas, configure la autenticación de forma centralizada y publique un cuadro de herramientas reutilizable que cualquier equipo pueda consumir. |
| Consumo | Disponible hoy | Conecte cualquier agente a un único punto de conexión compatible con MCP para detectar e invocar dinámicamente todas las herramientas del cuadro de herramientas. |
Crea cuadros de herramientas en Foundry, pero la superficie de consumo está abierta. Cualquier entorno de ejecución de agente o cliente compatible con MCP puede usar un cuadro de herramientas, incluidos los agentes creados con cualquier marco, los IDE habilitados para MCP y el código personalizado.
Dado que un cuadro de herramientas es un recurso administrado, puede agregar, quitar o volver a configurar herramientas sin cambiar el código del agente. El agente siempre se conecta a un único punto de conexión. El control de versiones del cuadro de herramientas proporciona un control explícito sobre cuándo surten efecto los cambios: cree y pruebe una nueva versión y, a continuación, la promueva al valor predeterminado cuando esté listo. Cada agente que apunte al cuadro de herramientas recoge automáticamente la versión promocionada, sin cambios de código ni reimplementación.
En este artículo, aprenderá a:
- Cree un cuadro de herramientas con una o varias herramientas.
- Obtenga el punto de conexión mcP del cuadro de herramientas.
- Compruebe que las herramientas se cargan correctamente.
- Integre un cuadro de herramientas en el agente hospedado.
- Administrar las versiones del cuadro de herramientas y promover una versión de forma predeterminada.
Para ver la sintaxis de configuración de herramientas y las opciones de autenticación para cada tipo de herramienta, consulte Configuración de herramientas.
Compatibilidad con características
| Característica | SDK de Python | REST API | SDK de .NET | JavaScript SDK | azd (deploy) | Foundry Toolkit |
|---|---|---|---|---|---|---|
| Actualización, lista, obtención y eliminación del cuadro de herramientas | ✔️ | ✔️ | ✔️ | ✔️ | N/A | ✔️ |
| Creación de la versión del cuadro de herramientas | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Lista de versiones del cuadro de herramientas, obtención y eliminación | ✔️ | ✔️ | ✔️ | ✔️ | N/A | No. La interfaz de usuario solo muestra la versión más reciente. |
| Herramienta MCP | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Herramienta de búsqueda web | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| herramienta Búsqueda de Azure AI | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Herramienta de intérprete de código | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Herramienta de búsqueda de archivos | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Herramienta OpenAPI | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | No |
| Herramienta Agente a agente (A2A) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | No |
Requisitos previos
- Un proyecto Microsoft Foundry activo.
-
RBAC: Conceda el rol Azure usuario de IA en el proyecto Foundry a cada identidad que se aplique a su escenario:
- Desarrollador (siempre necesario): la identidad que crea, actualiza y administra las versiones del cuadro de herramientas.
- Identidad del agente (necesaria si se usa un agente hospedado): la identidad administrada del agente que llama a las herramientas en tiempo de ejecución.
- Usuario final (solo necesario para flujos de OAuth): cualquier usuario cuya identidad se proxie a través de conexiones OAuth o UserEntraToken (por ejemplo, flujos de OBO o MCP basados en OAuth).
- El proyecto foundry debe estar en una de las regiones admitidas. Los tipos de herramientas individuales de un cuadro de herramientas están más limitados por región y modelo: no todos los tipos de herramientas están disponibles en cada región o con cada modelo. Consulte Compatibilidad de regiones y modelos.
- Visual Studio Code (VS Code).
- Instale Microsoft Foundry Toolkit para Visual Studio Code (anteriormente AI Toolkit for VS Code) desde Visual Studio Code Marketplace. La compatibilidad con el cuadro de herramientas de Foundry Toolkit está actualmente en versión preliminar.
-
Python SDK:
pip install azure-ai-projects azure-identity -
.NET SDK:
dotnet add package Azure.AI.Projects --prereleaseydotnet add package Azure.Identity -
SDK de JavaScript:
npm install @azure/ai-projects @azure/identity -
azd (deploy): Install the Azure Developer CLI y la extensión del agente:
azd extension install azure.ai.agents
Importante
- Un cuadro de herramientas admite como máximo one herramienta sin un campo /
namepor tipo de herramienta (Búsqueda web, Búsqueda de Azure AI, Intérprete de código, Búsqueda de archivos). Para incluir más de una instancia del mismo tipo de herramienta, establezca un valor úniconameen cada instancia para diferenciarlos. La inclusión de dos instancias del mismo tipo sin unnamedevuelve uninvalid_payloaderror. Para obtener más información, consulte Varios tipos de herramientas. - Agregue un
descriptionelemento a cada herramienta del cuadro de herramientas para ayudar al modelo a seleccionar la herramienta adecuada para cada solicitud. - Revise cuidadosamente la documentación de cada herramienta para obtener más información sobre la configuración, las limitaciones y las advertencias individuales de las herramientas.
Paso 1: Crear una versión del cuadro de herramientas
Cree una versión del cuadro de herramientas en función de las herramientas que necesite.
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 el ámbito https://ai.azure.com/.default del token al obtener el 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 Foundry Toolkit en Visual Studio Code para crear y publicar un cuadro de herramientas desde la vista Tools.
- Seleccione Foundry Toolkit en la barra de actividades.
- En Mis recursos, expanda El nombre> del proyectoHerramientas.
- Seleccione el icono + Agregar cuadro de herramientas .
- En la pestaña Crear un cuadro de herramientas personalizado , escriba el nombre y la descripción del cuadro de herramientas, agregue las herramientas que desee y, a continuación, seleccione Publicar.
Al publicar un cuadro de herramientas, se crea su primera versión. Esa versión se convierte automáticamente en la versión predeterminada.
azdMediante , declara los recursos del cuadro de herramientas en un agent.yaml archivo en lugar de llamar al SDK. Defina las herramientas en la resources sección e implemente mediante azd ai agent init. Para obtener agent.yaml ejemplos de cada tipo de herramienta, consulte Configuración de herramientas. Para obtener el flujo de trabajo de implementación completo, consulte Implementación con azd.
Importante
La -m marca (o --manifest) es necesaria para azd ai agent init.
Indica al comando dónde encontrar la definición del agente y los archivos de origen.
-m puede apuntar a:
-
Un archivo específico
agent.yaml: init copia todos los archivos del mismo directorio que el manifiesto. -
Una carpeta que contiene
agent.yaml— init copia todos los archivos de esa carpeta.
Todos los archivos del directorio de manifiesto (main.py, Dockerfile, requirements.txt, setup.py, etc.) se copian en el proyecto con scaffolding en 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
Paso 2: Obtener el punto de conexión mcP del cuadro de herramientas
Existen dos patrones de punto de conexión en función del rol:
| Rol | Punto de conexión | Cuándo usar |
|---|---|---|
| Programador del cuadro de herramientas | {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1 |
Pruebe o valide una versión específica antes de promoverla al valor predeterminado. |
| Consumidor del cuadro de herramientas | {project_endpoint}/toolboxes/{toolbox_name}/mcp?api-version=v1 |
Conecte agentes al cuadro de herramientas. Siempre sirve a .default_version La primera versión que cree se establece automáticamente como valor predeterminado. |
Importante
Todas las solicitudes al punto de conexión mcP del cuadro de herramientas deben incluir el encabezado Foundry-Features: Toolboxes=V1Preview. Se produce un error en las llamadas que omiten este encabezado. Inclúyelo en todos los clientes HTTP, los transportes MCP y los contenedores del SDK que llaman al punto de conexión del cuadro de herramientas.
Nota
La primera versión de un nuevo cuadro de herramientas se promueve automáticamente a default_version (v1). Si necesita cambiar el valor predeterminado más adelante, consulte Promover una versión a predeterminada.
En Foundry Toolkit para Visual Studio Code, copie el punto de conexión del consumidor del cuadro de herramientas de la vista Toolboxes.
- Seleccione Foundry Toolkit en la barra de actividades.
- En Mis recursos, expanda El nombre> del proyectoHerramientas.
- En la pestaña Cuadros de herramientas , busque el cuadro de herramientas.
- En la columna Dirección URL del punto de conexión, copie el punto de conexión.
El valor de dirección URL del punto de conexión es el punto de conexión del consumidor del cuadro de herramientas. Para construir un punto de conexión específico de la versión, use el patrón de desarrollador que se muestra en la tabla anterior.
Paso 3: Comprobación de la disponibilidad de herramientas
Antes de ejecutar el agente completo, confirme que el cuadro de herramientas carga las herramientas esperadas mediante un SDK de cliente MCP en el punto de conexión. Use el punto de conexión específico de la versión para validar una versión antes de promoverla al valor predeterminado.
Instale el SDK de cliente MCP:
pip install mcp
Conexión al cuadro de herramientas y herramientas de lista
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 la pestaña API REST para comprobar la disponibilidad de las herramientas desde .NET o use el SDK de cliente mcP de Python.
Use el punto de conexión específico de la versión (/versions/{version}/mcp) para validar una versión antes de promocionarla.
1. Inicialice la sesión de 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 la notificación 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. Enumerar las herramientas disponibles:
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. Llame a una herramienta:
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 el SDK de cliente MCP:
npm install @modelcontextprotocol/sdk
Conexión al cuadro de herramientas y herramientas de lista
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 el punto de conexión del paso 2 junto con un ejemplo de agente hospedado con scaffolding para validar la carga del cuadro de herramientas en VS Code.
- En Foundry Toolkit, en Mis recursos>, el nombre> del proyectoHerramientas, busque el cuadro de herramientas que desea probar.
- Seleccione Scaffolding code template (Plantilla de código scaffolding).
- Elija una carpeta del proyecto cuando se le solicite.
- Siga las dependencias generadas
README.mdpara instalar dependencias, configurar variables de entorno y ejecutar el ejemplo localmente. - Use Agent Inspector o ejecute
python main.pypara confirmar que las herramientas del cuadro de herramientas se cargan y responden.
Para la validación específica de la versión antes de promover una nueva versión del cuadro de herramientas, use la pestaña api rest o Python en este paso.
Nota
Use la pestaña API REST para comprobar la disponibilidad de las herramientas o use el SDK de cliente mcP de Python.
Comprobar: inicializar: HTTP 200. Si omite el paso de inicialización, se producirá un error en las llamadas posteriores.
Check — tools/list:
-
len(tools) > 0: vacío significa que la versión del cuadro de herramientas no se ha aprovisionado correctamente. - Cada herramienta tiene
name,descriptionyinputSchema. Para conocer las convenciones de nomenclatura de herramientas, consulte la especificación MCP. -
inputSchematiene unpropertiescampo (algunos servidores MCP omiten este campo, que interrumpe OpenAI). - En el caso de las herramientas de MCP, los nombres tienen el prefijo ,
server_labelpor ejemplo,myserver.some_tool. Para todos los demás tipos de herramientas, el nombre es el valor delnamecampo o el nombre de la herramienta predeterminado. - Las herramientas de MCP incluyen un
_meta.tool_configurationbloque que contiene la configuración en tiempo de ejecución, comorequire_approval. Consulte Control de los requisitos de aprobación de herramientas. - Anote los nombres de parámetro exactos del paso de llamada (por ejemplo
query, frentequeriesa ).
Check - tools/call:
- No hay ningún campo de nivel
errorsuperior. Si está presente, inspeccioneerror.code. Para ver los códigos de error de MCP estándar, consulte la especificación MCP:-
-32006→ consentimiento de OAuth necesario (extraiga la dirección URL deerror.message). - Otros códigos → error del lado servidor.
-
-
result.content[]contiene entradas con"type": "text": se trata de la salida de la herramienta. - En Búsqueda de IA, compruebe
result.structuredContent.documents[]si hay metadatos de fragmentos (title,url,id,score). - En Búsqueda de archivos, compruebe
result.content[].resource._metasi hay metadatos de fragmento (title,file_id,document_chunk_id,score). - En Búsqueda web, compruebe si
result.content[].resource._meta.annotations[]hay citas de dirección URL (type,url,title,start_index,end_index). - Inspección en
"ServerError"el contenido de texto: la herramienta se ejecutó pero se ha producido un error interno.
Ejemplos de argumentos específicos tools/call de la herramienta:
| Tipo de herramienta | Argumentos |
|---|---|
| Búsqueda de IA | {"query": "search text"} |
| Búsqueda de archivos | {"queries": ["search text"]} |
| Intérprete de código | {"code": "print(2 ** 100)"} |
| Búsqueda web | {"search_query": "weather in seattle"} |
| A2A | {"message": {"parts": [{"type": "text", "text": "Hello"}]}} |
| MCP | {"query": "what is agent service"} |
Paso 4: Integrar el cuadro de herramientas en el agente
LangGraph
.env archivo:
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 (patrón de clave):
from langchain_azure_ai.tools import AzureAIProjectToolbox
toolbox = AzureAIProjectToolbox(toolbox_name=TOOLBOX_NAME)
tools = await toolbox.get_tools()
Consulte el ejemplo completo para obtener la implementación completa.
Importante
La clase langchain_azure_ai.tools.AzureAIProjectToolbox requiere langchain-azure-ai[tools]>1.2.3.
marco del agente de Microsoft
Use MCPStreamableHTTPTool desde el SDK de Agent Framework para conectarse directamente al punto de conexión mcP del cuadro de herramientas.
.env archivo:
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 (patrón de clave):
# 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 el ejemplo completo para obtener la implementación completa.
SDK de Copilot
Use el SDK de GitHub Copilot para crear un agente con tecnología del cuadro de herramientas que puentee la invocación de herramientas de Copilot al punto de conexión mcP del cuadro de herramientas de Foundry.
Nota
El SDK de Copilot rechaza los nombres de herramientas que contienen puntos. El puente reemplaza . automáticamente por _ en los nombres de herramientas. Por ejemplo, myserver.get_info se convierte en myserver_get_info.
.env archivo:
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 (patrón clave : puente 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 el ejemplo completo para obtener la implementación completa.
marco del agente de Microsoft
Use ResponsesServer desde el SDK de Agent Framework con un personalizado ToolboxMcpClient para detectar e invocar herramientas del cuadro de herramientas a través del punto de conexión de MCP.
Variables de entorno:
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 (patrón de clave):
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 ajusta las llamadas directas de JSON-RPC al punto de conexión de MCP.
ToolboxHandler conecta las llamadas de la herramienta LLM al cliente MCP mediante un bucle estándar de llamada a herramientas. Para obtener la implementación completa de ambas clases, consulte el ejemplo completo.
Nota
Los ejemplos de integración de este paso solo están disponibles para Python y .NET.
Nota
Los ejemplos de integración de este paso solo están disponibles para Python y .NET.
Use Foundry Toolkit para aplicar scaffolding a un ejemplo de agente hospedado que ya está conectado al cuadro de herramientas.
- Seleccione Foundry Toolkit en la barra de actividades.
- En Mis recursos, expanda El nombre> del proyectoHerramientas.
- En la pestaña Cuadros de herramientas , busque el cuadro de herramientas que desea consumir y, a continuación, seleccione Plantilla de código scaffolding.
- En la paleta de comandos, elija una carpeta del proyecto cuando se le solicite.
- Abra el elemento generado
README.mdy siga los pasos de configuración, ejecución local e implementación de scaffolding.
El proyecto generado incluye el punto de entrada del agente hospedado, los archivos de implementación y un README.md con los pasos exactos de configuración, ejecución e implementación. El agente con scaffolding controla el Foundry-Features: Toolboxes=V1Preview encabezado por usted.
Si desea integrar un cuadro de herramientas en un proyecto de agente hospedado existente en lugar de generar un nuevo ejemplo, use el punto de conexión copiado del paso 2 con los patrones de Python o .NET de esta sección.
Implementación con azd
Use la CLI de Azure Developer (
Importante
La -m marca (o --manifest) es necesaria para azd ai agent init. Indica al comando dónde encontrar la definición del agente y los archivos de origen.
-m puede apuntar a un archivo específico agent.yaml o a una carpeta que contenga uno. Todos los archivos del directorio de manifiesto (main.py, Dockerfile, requirements.txt, etc.) se copian textualmente en el proyecto con scaffolding en src/<agent-name>/.
Estructura de carpetas:
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 (ejemplo de MCP de Búsqueda web y 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
Al implementar con recursos del cuadro de herramientas en agent.yaml, la plataforma inserta FOUNDRY_AGENT_TOOLBOX_ENDPOINT (dirección URL base) y TOOLBOX_{toolbox_name}_MCP_ENDPOINT (punto de conexión completo por cuadro de herramientas) como variables de entorno. Para el cuadro de herramientas denominado agent-tools, la variable por cuadro de herramientas se convierte en TOOLBOX_AGENT_TOOLS_MCP_ENDPOINT.
main.py Lee la variable por cuadro de herramientas o construye la dirección URL desde FOUNDRY_AGENT_TOOLBOX_ENDPOINT y TOOLBOX_NAME en tiempo de ejecución.
main.py sigue el mismo patrón LangGraph mostrado anteriormente.
azdMediante , FOUNDRY_AGENT_TOOLBOX_ENDPOINT y TOOLBOX_{toolbox_name}_MCP_ENDPOINT se insertan automáticamente: no se necesita ninguna configuración de punto de conexión adicional en el 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
Control de los requisitos de aprobación de herramientas
El cuadro de herramientas devuelve un _meta.tool_configuration objeto en cada entrada de herramienta devuelta por tools/list. Cuando una herramienta se ha require_approval establecido "always"en , el tiempo de ejecución del agente debe presentar la acción pendiente al usuario y esperar confirmación antes de invocar la herramienta. El punto de conexión de MCP no se bloquea tools/call ; el cumplimiento es responsabilidad del tiempo de ejecución del agente.
Lectura require_approval desde tools/list
Cada entrada de herramienta de una tools/list respuesta incluye un _meta bloque devuelto por el cuadro de herramientas :
{
"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 |
Comportamiento |
|---|---|
"always" |
El agente debe pedir confirmación al usuario antes de cada invocación. |
"never" |
El agente puede invocar libremente la herramienta. |
Implementación de la aplicación de aprobación (LangGraph)
Consulte tools/list al inicio para crear una asignación de aprobación y, a continuación, inserte una restricción en el símbolo del sistema para cualquier herramienta que requiera aprobación:
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")
}
Después de cargar herramientas desde el cliente MCP, detecte qué herramientas requieren aprobación y ajuste el símbolo del 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
- La detección se produce al iniciarse. La comprobación de aprobación se ejecuta una vez cuando se inicializa el agente. No hay ninguna sobrecarga por llamada.
- Reserva con gracia. Si no hay
require_approval: "always"herramientas, el símbolo del sistema no se modifica y el agente se comporta como antes. -
require_approvales aplicado por el agente. El proxy MCP del cuadro de herramientas setools/callejecuta independientemente de esta configuración. El tiempo de ejecución del agente es responsable de la aplicación de la llamada.
Configurar require_approval en una herramienta
Establezca require_approval al crear una versión del cuadro de herramientas. Los ejemplos de herramientas de MCP del paso 1 muestran los valores y "always""never" . También puede establecerlo a través del 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 la pestaña Python, .NET, JavaScript, API REST o azd para configurar require_approval en la definición del cuadro de herramientas. El flujo de trabajo de Foundry Toolkit de este artículo se centra en crear y consumir el cuadro de herramientas en 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
Paso 5: Administrar versiones del cuadro de herramientas
Nota
Puede administrar las versiones del cuadro de herramientas (enumerar, obtener, promover, eliminar) a través del SDK de Python, el SDK de .NET, el SDK de JavaScript y la API REST. La CLI de azd solo admite la creación de versiones del cuadro de herramientas durante la implementación.
Las versiones del cuadro de herramientas son instantáneas inmutables de la configuración de herramientas de un cuadro de herramientas. Cada llamada al punto de conexión de creación genera un nuevo ToolboxVersionObject. El elemento primario ToolboxObject tiene un default_version campo que controla qué versión sirve el punto de conexión de MCP. La creación de una nueva versión no la promueve automáticamente: decide cuándo actualizar default_version. Este proceso le permite almacenar provisionalmente los cambios, probar una nueva versión de forma independiente y promoverla a producción según su propia programación.
| Objeto | Campos clave | Descripción |
|---|---|---|
ToolboxObject |
id, , name, default_version |
Contenedor del cuadro de herramientas.
default_version apunta a la versión activa. |
ToolboxVersionObject |
id, name, version, description, created_at, , tools[]policies |
Instantánea inmutable de la lista de herramientas del cuadro de herramientas en un momento dado. |
Creación de una nueva versión
Cada llamada de creación genera una nueva versión. Si el cuadro de herramientas aún no existe, el proceso lo crea automáticamente. Al crear la primera versión de un cuadro de herramientas, la versión predeterminada es v1 hasta que se actualiza manualmente a otra versión.
# 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 la pestaña Python, .NET, JavaScript o API REST para crear una nueva versión del cuadro de herramientas. El flujo de trabajo de Foundry Toolkit de este artículo se centra en crear un cuadro de herramientas y aplicar scaffolding a un agente hospedado que lo consume.
Esta operación no se admite con azd. Para crear una versión del cuadro de herramientas, use la Python, .NET, REST API o JavaScript pestaña.
La respuesta es un ToolboxVersionObject objeto que contiene el nuevo version identificador.
Enumerar versiones
# 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 la pestaña Python, .NET, JavaScript o API REST para enumerar las versiones del cuadro de herramientas.
Esta operación no se admite con azd. Para enumerar las versiones del cuadro de herramientas, use la Python, .NET, REST API o JavaScript pestaña.
Obtención de una versión 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 la pestaña Python, .NET, JavaScript o API REST para obtener una versión específica del cuadro de herramientas.
Esta operación no se admite con azd. Para obtener una versión específica del cuadro de herramientas, use la Python, .NET, REST API o JavaScript pestaña.
Promoción de una versión al valor predeterminado
El punto de conexión de MCP siempre sirve a .default_version Para cambiar la versión que está activa, actualice el cuadro de herramientas:
# 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 no puede estar vacío. Reemplácela por una nueva versión.
const toolbox = await project.beta.toolboxes.update(
"my-toolbox",
"<version_id>",
);
console.log(`Active version: ${toolbox.defaultVersion}`);
Use la pestaña Python, .NET, JavaScript o API REST para promover una versión del cuadro de herramientas de forma predeterminada.
Esta operación no se admite con azd. Para promover una versión de forma predeterminada, use la Python, .NET, REST API o JavaScript.
Eliminar una versión
# 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 la pestaña Python, .NET, JavaScript o API REST para eliminar una versión del cuadro de herramientas.
Esta operación no se admite con azd. Para eliminar una versión del cuadro de herramientas, use la Python, .NET, REST API o JavaScript.
Configuración de herramientas
Elija el tipo de herramienta y el patrón de autenticación que coincidan con su escenario. Seleccione la pestaña para el SDK o el método de implementación preferidos.
Varios tipos de herramientas
Un único cuadro de herramientas puede agrupar diferentes tipos de herramientas. En el ejemplo siguiente se combina Web Search, Búsqueda de Azure AI y un servidor MCP en un cuadro de herramientas:
{
"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 herramienta (web_search, azure_ai_search, code_interpreter, file_search) puede aparecer como máximo una vez sin un name campo. Para incluir varias instancias del mismo tipo, establezca un valor único name en cada instancia; vea el ejemplo siguiente.
Restricciones de varias herramientas
Puede incluir como máximo una instancia de cada tipo de herramienta integrado sin un name campo en un cuadro de herramientas. Si incluye dos instancias del mismo tipo sin name, la API devuelve:
400 invalid_payload: Multiple tools without identifiers found...
Dos instancias del mismo tipo de herramienta
Use el name campo para incluir varias instancias del mismo tipo de herramienta en un cuadro de herramientas. Cada instancia con nombre se trata como una herramienta independiente y debe tener un nombre ú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>"
}
]
}
}
]
}
En las secciones siguientes se muestra detalladamente la configuración de cada tipo de herramienta.
Protocolo de contexto de modelo (MCP)
Autenticación basada en claves:
{
"description": "my-mcp-toolbox",
"tools": [
{
"type": "mcp",
"server_label": "myserver",
"server_url": "https://your-mcp-server.example.com",
"project_connection_id": "my-mcp-connection"
}
]
}
Sin autenticación (servidor MCP público):
{
"description": "Public MCP server",
"tools": [
{
"type": "mcp",
"server_label": "myserver",
"server_url": "https://your-mcp-server.example.com"
}
]
}
Autenticación basada en identidad o OAuth:
En el caso de OAuth (conector administrado, registro de aplicaciones personalizado), identidad del agente o autenticación del token entra de usuario, cree primero la conexión adecuada en el proyecto Foundry y, a continuación, haga referencia a ella con project_connection_id:
{
"description": "MCP server with OAuth/identity auth",
"tools": [
{
"type": "mcp",
"server_label": "myserver",
"server_url": "https://your-mcp-server.example.com",
"project_connection_id": "<OAUTH_OR_IDENTITY_CONNECTION_NAME>"
}
]
}
La conexión authType determina el flujo de autenticación. Los tipos de autenticación de conexión admitidos para MCP incluyen CustomKeys, OAuth2 (administrado o personalizado), AgenticIdentityy UserEntraToken. Consulte la pestaña azd para ver ejemplos de configuración de conexión para cada tipo de autenticación.
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",
},
];
Sin autenticación:
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
Autenticación basada en claves:
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 administrado:
Use este patrón para los servidores MCP que admiten el flujo de OAuth administrado de Foundry. El connectorName valor debe coincidir con un conector administrado disponible en el catálogo de herramientas de 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 aplicaciones personalizado:
Use este patrón cuando traiga su propio registro de aplicaciones de OAuth para el 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
Agent identity (Entra ID):
Use este patrón para los servidores MCP que admiten la autenticación Microsoft Entra ID. La identidad del agente foundry se autentica en el 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
Debe asignar a la identidad del agente el rol RBAC necesario en el recurso de destino antes de que el servidor MCP acepte solicitudes.
Token de Entra de usuario (OBO 1P):
Use este patrón para los servidores MCP que requieren la identidad del usuario a través del flujo on-Behalf-Of (OBO). Foundry proxies el token Entra del usuario en el 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
El audience campo es necesario para UserEntraToken las conexiones. Sin ella, tools/list devuelve cero herramientas.
Importante
La primera vez que un usuario llama a un cuadro de herramientas con un MCP basado en OAuth en un proyecto, el punto de conexión de MCP devuelve un CONSENT_REQUIRED error (código -32006) con una dirección URL de consentimiento:
{
"error": {
"code": -32006,
"message": "User consent is required. Please visit: https://..."
}
}
Se espera este error. Abra la dirección URL de consentimiento en un explorador, complete el flujo de autorización de OAuth y vuelva a intentar la llamada al agente. Las llamadas posteriores se realizan correctamente sin volver a preguntar.
Búsqueda web
Importante
- Web Search usa grounding con Bing Search y grounding con Bing Custom Search, que son First Party Consumption Services regidos por estos Grounding con términos de uso de Bing y la declaración de privacidad Microsoft.
- El Microsoft Data Protection Addendum no se aplica a los datos enviados a Grounding con Bing Search y Grounding con Bing Custom Search. Al usar Grounding con Bing Search y Grounding con Bing Custom Search, las transferencias de datos se producen fuera del cumplimiento y los límites geográficos.
- El uso de Grounding con Bing Search y Grounding con Bing Custom Search conlleva costos. Consulte precios para obtener más información.
- Consulte la sección management para obtener información sobre cómo los administradores de Azure pueden administrar el acceso para usar la búsqueda web.
Use este patrón para agregar la búsqueda web. No se requiere ninguna conexión de proyecto para la búsqueda web con Grounding con Bing. Para usar una instancia de Grounding con bing Search personalizada, agregue un web_search.custom_search_configuration objeto que apunte a la conexión grounding con Bing Custom Search.
{
"description": "Built-in web search",
"tools": [
{
"type": "web_search",
"name": "<OPTIONAL_TOOL_NAME>",
"description": "<Optional description for the model>"
}
]
}
Con una conexión de grounding con Bing Custom Search:
{
"description": "Custom Bing Search instance",
"tools": [
{
"type": "web_search",
"name": "<OPTIONAL_TOOL_NAME>",
"description": "<Optional description for the model>",
"web_search": {
"custom_search_configuration": {
"project_connection_id": "<BING_CONNECTION_NAME>",
"instance_name": "<BING_INSTANCE_NAME>"
}
}
}
]
}
from azure.ai.projects.models import WebSearchTool
tools = [
WebSearchTool()
]
ProjectsAgentTool tool = ProjectsAgentTool.AsProjectTool(
ResponseTool.CreateWebSearchTool()
);
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
toolboxName: "my-toolbox",
tools: [tool],
description: "Built-in web search"
);
const tools = [
{
type: "web_search",
name: "<OPTIONAL_TOOL_NAME>",
description: "<Optional description for the model>",
},
];
resources:
- kind: toolbox
name: websearch-tools
description: Web search toolbox
tools:
- type: web_search
Con grounding con Bing Custom Search:
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
Cuando Web Search devuelve resultados a través de MCP, la respuesta es un resource elemento de contenido que contiene la respuesta sintetizada con vínculos de origen de Markdown insertados. Las citas de dirección URL se encuentran en content[].resource._meta.annotations[]. Por ejemplo:
{
"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
}
}
Búsqueda de Azure AI
{
"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
Configuración de parámetros de herramienta
| parámetro de la herramienta Búsqueda de Azure AI | Obligatorio | Notas |
|---|---|---|
project_connection_id |
Sí | Identificador de recurso de la conexión del proyecto a Búsqueda de Azure AI. |
index_name |
Sí | Nombre del índice en el recurso de Búsqueda de Azure AI. |
top_k |
No | El valor predeterminado es 5. |
query_type |
No | El valor predeterminado es vector_semantic_hybrid. Valores admitidos: simple, vector, semantic, vector_simple_hybrid, vector_semantic_hybrid. |
filter |
No | Se aplica a todas las consultas que realiza el agente en el índice. |
Los resultados de la búsqueda incluyen metadatos de fragmento en result.structuredContent.documents[]. Cada documento incluye titlecampos , url, idy score que puede usar para generar detalles de cita en la aplicación.
Intérprete de código
Use este patrón para permitir que el agente escriba y ejecute Python código. El patrón no requiere una conexión de proyecto ni una configuración adicional.
Para cargar un archivo para que el intérprete de código lo use, llame a POST {project_endpoint}/openai/v1/files con purpose=assistants. El identificador de archivo devuelto es el valor que se proporciona como <FILE_ID> en la configuración de la herramienta. Consulte Intérprete de código para ver ejemplos completos de carga.
Importante
Cuando se usa el intérprete de código a través de un cuadro de herramientas de un agente hospedado, no se admite el aislamiento de usuario. Todos los usuarios del mismo proyecto comparten el mismo contexto de contenedor.
{
"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
Descarga de archivos de salida desde el intérprete de código
Cuando el intérprete de código genera archivos de salida (por ejemplo, un archivo CSV o gráfico generado), siga estos pasos para enumerarlos y descargarlos.
Paso 1: Enumeración de archivos mediante la API de contenedor
Extraiga el de container_idcontent[]._meta.container_id en la tools/call respuesta y, a continuación, llame a container Files API para enumerar todos los archivos del contenedor:
GET {project_endpoint}/containers/{container_id}/files?api-version=v1
Authorization: Bearer {token}
La respuesta devuelve una lista de archivos con sus nombres e identificadores.
Paso 2: Descargar el archivo mediante la API de archivos
Use el nombre de archivo devuelto en el paso 1 para descargar el archivo a través del punto de conexión de descarga de La API de archivos.
Búsqueda de archivos
Use este patrón para permitir que el agente busque en los archivos cargados almacenados en un almacén de vectores. Proporcione vector_store_ids almacenes de vectores de referencia ya creados en el proyecto foundry.
Para crear un almacén de archivos y vectores, use la {project_endpoint}/openai/v1 API:
- Cargue el archivo:
POST {project_endpoint}/openai/v1/filesconpurpose=assistants. - Cree un almacén de vectores:
POST {project_endpoint}/openai/v1/vector_storescon el identificador de archivo devuelto.
El identificador de almacén de vectores resultante es el valor que se proporciona como <VECTOR_STORE_ID>. Consulte Búsqueda de archivos para obtener ejemplos completos en cada idioma.
Importante
Cuando la búsqueda de archivos se usa a través de un cuadro de herramientas de un agente hospedado, no se admite el aislamiento de usuario. Todos los usuarios del mismo proyecto comparten acceso al mismo almacén de vectores.
{
"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}
Establezca el identificador del almacén de vectores antes de implementar:
azd env set FILE_SEARCH_VECTOR_STORE_ID "vs_xxxxxxxxxxxx"
Nota
Cuando la búsqueda de archivos devuelve resultados a través de MCP, los metadatos del fragmento se incrustan en el contenido de la respuesta de la herramienta como 【index†filename†file_id】 marcadores. Por ejemplo:
{
"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..."
}
}
]
}
}
El _meta bloque dentro de cada elemento de recurso contiene la titlerelevancia score , file_id, document_chunk_idy para el fragmento coincidente. Use estos campos de metadatos en la aplicación para generar detalles de cita o vínculo profundo al archivo de origen.
OpenAPI
Use este patrón para exponer cualquier API REST descrita por una especificación de OpenAPI. Elija el que coincida con el auth.type modelo de seguridad de la API.
Importante
Cuando se usa la autenticación de identidad administrada, debe asignar el rol RBAC adecuado a la identidad administrada del proyecto Foundry en el servicio de destino. Por ejemplo, asigne Lector o superior en el recurso de Azure de destino. Sin esta asignación, el agente recibe una 401 Unauthorized respuesta al llamar a la API. Para ver los pasos de configuración completos, consulte Autenticación mediante la identidad administrada.
Autenticación anónima:
{
"description": "REST API via OpenAPI spec",
"tools": [
{
"type": "openapi",
"openapi": {
"name": "my-api",
"spec": { "<paste OpenAPI spec object here>" },
"auth": {
"type": "anonymous"
}
}
}
]
}
Project auth:
Use este patrón cuando la API requiera una clave o un token almacenados en una conexión de proyecto 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>"
}
}
}
}
]
}
Autenticación de identidad administrada:
Use este patrón cuando la API de destino se autentique a través de Microsoft Entra ID. La identidad administrada del proyecto Foundry llama a la API en nombre del agente. Asegúrese de que la identidad administrada tiene el rol RBAC necesario en el servicio de destino antes de usar este patrón.
{
"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",
},
},
},
];
Autenticación basada en claves:
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 a agente (A2A)
Use este patrón para llamar a otro agente como una herramienta. Proporcione la dirección URL base del agente remoto y, si requiere autenticación, una conexión de proyecto.
{
"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
Solución de problemas
| Síntoma | Causa probable | Corrección |
|---|---|---|
tools/list devuelve cero herramientas para las herramientas MCP o A2A. |
Credenciales de conexión no válidas o que faltan para el servidor MCP remoto o el agente A2A. El cuadro de herramientas no puede recuperar manifiestos de herramienta desde el punto de conexión remoto sin autenticación válida. | Compruebe que existe en el project_connection_id proyecto foundry y que las credenciales son correctas. Intente conectarse al servidor MCP directamente para probar la configuración de autenticación. Si usa la identidad administrada (PMI, identidad del agente o MI), compruebe las asignaciones de roles de RBAC correctas para el autor de la llamada en el recurso de destino. |
tools/list devuelve cero herramientas para las herramientas de OpenAPI. |
Especificación openAPI no válida. El cuadro de herramientas construye el manifiesto de herramienta a partir de la especificación, lo que produce un error si la especificación tiene un formato incorrecto. | Valide el contenido de la especificación de OpenAPI. Compruebe que se ajusta a OpenAPI 3.0 o 3.1 e incluye esquemas de parámetros , operationId valores y válidospaths. Si usa la autenticación de identidad administrada, compruebe también las asignaciones de roles de RBAC en el servicio de destino. |
tools/list devuelve menos herramientas de las esperadas. |
El allowed_tools filtro contiene nombres de herramientas incorrectos o mal escritos. Los nombres de herramientas distinguen mayúsculas de minúsculas y deben seguir la especificación mcP para los nombres de herramientas (sin espacios en blanco ni caracteres especiales). |
Quite allowed_tools temporalmente y llame tools/list a para obtener la lista completa de herramientas. Use los nombres exactos de la respuesta para establecer valores para allowed_tools. |
tools/list devuelve cero herramientas (otros tipos de herramientas) |
Cuadro de herramientas no totalmente aprovisionado o tipo de herramienta no admitido en la región. En el caso de las herramientas integradas (Búsqueda web, búsqueda de IA, intérprete de código, búsqueda de archivos), los manifiestos de herramientas se construyen en el lado servidor y no requieren autenticación, si devuelven vacíos, es posible que la versión del cuadro de herramientas aún no se aprovisione. | Espere 10 segundos y vuelva a intentarlo. |
400 Multiple tools without identifiers |
Dos tipos de herramientas sin nombre en un cuadro de herramientas | Mantenga como máximo un tipo sin nombre; agregue server_label a todas las herramientas de MCP. |
CONSENT_REQUIRED (código -32006) |
La conexión de OAuth requiere el consentimiento del usuario | Abra la dirección URL de consentimiento en un explorador y complete el flujo de OAuth y vuelva a intentarlo. |
401 en llamadas MCP |
Token expirado o ámbito incorrecto | Use el ámbito https://ai.azure.com/.default y actualice el token. |
| Nombres de herramientas que no coinciden | Los nombres de herramientas de MCP tienen el prefijo server_label |
Use {server_label}.{tool_name} el formato (por ejemplo, myserver.get_info). |
500 activado send_ping() |
El servidor MCP del cuadro de herramientas no implementa el método MCP ping . |
No llame a send_ping(). Si el marco lo llama automáticamente (por ejemplo, Microsoft MCPStreamableHTTPTool._ensure_connected() del marco del agente), deshabilite la comprobación de ping o invalide el método con un no-op. |
500 activado prompts/list |
El servidor DE FOUNDRY MCP no implementa prompts/list. |
Pase load_prompts=False (o equivalente) al constructor de cliente MCP. |
500 con no streaming tools/call |
No se admite el modo de transmisión por secuencias (stream=False) para los puntos de conexión mcP del cuadro de herramientas. |
stream=True Use siempre al llamar a las herramientas mcP del cuadro de herramientas. |
500 activado tools/list |
Error transitorio del servidor | Vuelva a intentarlo después de unos segundos. |
| Variables de entorno sobrescritas en tiempo de ejecución | La plataforma reserva todas las variables de entorno con FOUNDRY_ el prefijo y podrían sobrescribir de forma silenciosa los valores definidos por el usuario. |
Cambie el nombre de las variables de entorno personalizadas para evitar el FOUNDRY_ prefijo (por ejemplo, use TOOLBOX_MCP_ENDPOINT en lugar de FOUNDRY_TOOLBOX_ENDPOINT). |
Compatibilidad con redes virtuales
Cuando el proyecto foundry usa el aislamiento de red (private link), no se admiten todos los tipos de herramientas del cuadro de herramientas. En la tabla siguiente se muestra el estado de compatibilidad para cada tipo de herramienta y cómo fluye el tráfico en un entorno aislado de red.
| Tipo de herramienta | Compatibilidad con redes virtuales | Flujo de tráfico |
|---|---|---|
| MCP | ✅ Compatible | A través de la subred de la red virtual |
| Búsqueda de Azure AI | ✅ Compatible | A través del punto de conexión privado |
| Intérprete de código | ✅ Compatible | red troncal de Microsoft |
| Búsqueda web | ✅ Compatible | Punto de conexión público |
| OpenAPI | ✅ Compatible | Depende de la configuración de red de API de destino. |
| Búsqueda de archivos | ❌ No se admite | Todavía no está disponible |
| Agente a agente (A2A) | ✅ Compatible | A través del punto de conexión privado |
Para obtener instrucciones completas de configuración de aislamiento de red, incluida la inyección de red virtual para el cliente del agente, la configuración de DNS y los requisitos de punto de conexión privado, consulte Configurar el aislamiento de red para Microsoft Foundry.
Compatibilidad de regiones y modelos
La disponibilidad del cuadro de herramientas depende de dos factores más allá de la región del proyecto:
- Región: algunos tipos de herramientas no están disponibles en todas las regiones que admiten el servicio del agente. Por ejemplo, una región que admita el punto de conexión del cuadro de herramientas podría no admitir todos los tipos de herramientas integrados.
Antes de implementar un cuadro de herramientas, compruebe que la región de destino admite los tipos de herramientas que planea usar. Para obtener las tablas de compatibilidad completa, consulte Compatibilidad de herramientas por región y modelo.
Contenido relacionado
- Conexión de agentes a servidores de Protocolo de contexto de modelo
- Adición de la autenticación del servidor MCP
- Herramienta de búsqueda web
- herramienta Búsqueda de Azure AI
- Implementación de un agente hospedado
- Adición de una conexión al proyecto
- Configurar el aislamiento de red para Microsoft Foundry