Selección del cuadro de herramientas basado en intenciones en Foundry (versión preliminar)

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.

Diagrama en el que se muestran varios agentes que conectan sus propias herramientas con diferentes modelos de autenticación y credenciales duplicadas.

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.

Diagram que muestra cuadros de herramientas en la arquitectura foundry: Crear y consumir pilares consumidos por LangGraph, Microsoft Agent Framework, GitHub Copilot, Claude Code y Microsoft Copilot Studio, regidos por default.

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 --prerelease y dotnet 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 /name por 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 único name en cada instancia para diferenciarlos. La inclusión de dos instancias del mismo tipo sin un name devuelve un invalid_payload error. Para obtener más información, consulte Varios tipos de herramientas.
  • Agregue un description elemento 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.

  1. Seleccione Foundry Toolkit en la barra de actividades.
  2. En Mis recursos, expanda El nombre> del proyectoHerramientas.
  3. Seleccione el icono + Agregar cuadro de herramientas .
  4. 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.

Screenshot of Foundry Toolkit en Visual Studio Code mostrando la vista Crear un cuadro de herramientas personalizado con campos para el nombre, la descripción y las herramientas del cuadro de herramientas, además de la acción Publicar.

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.

  1. Seleccione Foundry Toolkit en la barra de actividades.
  2. En Mis recursos, expanda El nombre> del proyectoHerramientas.
  3. En la pestaña Cuadros de herramientas , busque el cuadro de herramientas.
  4. 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.

Screenshot of Foundry Toolkit en Visual Studio Code que muestra la vista Cuadros de herramientas con la dirección URL del punto de conexión del cuadro de herramientas y la acción de plantilla de código Scaffold.

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.

  1. En Foundry Toolkit, en Mis recursos>, el nombre> del proyectoHerramientas, busque el cuadro de herramientas que desea probar.
  2. Seleccione Scaffolding code template (Plantilla de código scaffolding).
  3. Elija una carpeta del proyecto cuando se le solicite.
  4. Siga las dependencias generadas README.md para instalar dependencias, configurar variables de entorno y ejecutar el ejemplo localmente.
  5. Use Agent Inspector o ejecute python main.py para 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, descriptiony inputSchema. Para conocer las convenciones de nomenclatura de herramientas, consulte la especificación MCP.
  • inputSchema tiene un properties campo (algunos servidores MCP omiten este campo, que interrumpe OpenAI).
  • En el caso de las herramientas de MCP, los nombres tienen el prefijo , server_label por ejemplo, myserver.some_tool. Para todos los demás tipos de herramientas, el nombre es el valor del name campo o el nombre de la herramienta predeterminado.
  • Las herramientas de MCP incluyen un _meta.tool_configuration bloque que contiene la configuración en tiempo de ejecución, como require_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 , frente queriesa ).

Check - tools/call:

  • No hay ningún campo de nivel error superior. Si está presente, inspeccione error.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 de error.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._meta si 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.

  1. Seleccione Foundry Toolkit en la barra de actividades.
  2. En Mis recursos, expanda El nombre> del proyectoHerramientas.
  3. 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.
  4. En la paleta de comandos, elija una carpeta del proyecto cuando se le solicite.
  5. Abra el elemento generado README.md y 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 () para declarar los recursos del cuadro de herramientas directamente en un archivo /> de azd aprovisiona juntos el cuadro de herramientas, las conexiones y la implementación del modelo.

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_approval es aplicado por el agente. El proxy MCP del cuadro de herramientas se tools/call ejecuta 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.

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
  }
}
{
  "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 Identificador de recurso de la conexión del proyecto a Búsqueda de Azure AI.
index_name 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.

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:

  1. Cargue el archivo: POST {project_endpoint}/openai/v1/files con purpose=assistants.
  2. Cree un almacén de vectores: POST {project_endpoint}/openai/v1/vector_stores con 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.