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.
Advertencia
Cuando se conecta a herramientas ajenas a Foundry, podría incurrir en costes y es posible que los datos se envíen fuera del perímetro de cumplimiento de Foundry y se procesen de acuerdo con los términos aplicables y las políticas de tratamiento de datos. Consulte la documentación de la herramienta para obtener información sobre cómo administrar el acceso a la herramienta.
En este artículo se muestra cómo crear un cuadro de herramientas, agregar y configurar herramientas, comprobar que se cargan, integrar el cuadro de herramientas en un agente hospedado y administrar las versiones del cuadro de herramientas. Para obtener una introducción conceptual a los cuadros de herramientas, consulte ¿Qué es El cuadro de herramientas en Foundry?. 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.
Prerequisites
Un proyecto activo de Microsoft Foundry.
RBAC: asigne el rol de Usuario de Foundry en el proyecto de Foundry a cada identidad que corresponda a su caso:
- 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 de indicaciones) — la identidad administrada del agente que invoca herramientas en tiempo de ejecución.
- Usuario final (solo obligatorio para flujos de OAuth) — cualquier usuario cuya identidad se canaliza a través de conexiones OAuth o UserEntraToken (por ejemplo, MCP basado en OAuth o flujos de token Entra de usuario (transferencia directa de la identidad de usuario administrada)).
Para obtener instrucciones paso a paso para asignar el rol de usuario de Foundry a una identidad del agente, consulte Asignación de permisos a la identidad del agente.
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.
Instale la extensión Microsoft Foundry Toolkit para Visual Studio Code desde el Marketplace de Visual Studio Code.
SDK de Python:
pip install azure-ai-projects azure-identity.NET SDK: instale el conjunto de paquetes de vista previa coherente y Azure Identity:
dotnet add package Azure.AI.Projects --version 2.1.0-beta.4 dotnet add package Azure.AI.Projects.Agents --version 2.1.0-beta.4 dotnet add package Azure.AI.Extensions.OpenAI --version 2.1.0-beta.4 dotnet add package Azure.IdentitySDK de JavaScript:
npm install @azure/ai-projects @azure/identityAzure CLI para desarrolladores: instale la CLI para desarrolladores de Azure (
azd1.27.1 o posterior) y el conjunto unificado de extensiones de la CLI de Foundry:# Install the unified bundle (provides azd ai agent, connection, inspector, # project, routine, skill, and toolbox). azd ext install microsoft.foundry
Importante
- Un cuadro de herramientas admite como máximo una herramienta sin campo
name(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.
Si utiliza GitHub Copilot para Azure para generar la estructura de un agente hospedado que consume el conjunto de herramientas, las siguientes referencias de capacidades describen el mismo contrato del punto de conexión (variable de entorno, encabezados, protocolo MCP, patrones de citación y solución de problemas) que el agente debe implementar:
- Referencia del cuadro de herramientas para obtener instrucciones sobre el formato de punto de conexión, el protocolo MCP, el control de consentimiento de OAuth, los patrones de cita y la solución de problemas.
- Utilice la caja de herramientas en un agente hospedado para encontrar orientación sobre la resolución de puntos de conexión, el contrato de variables de entorno, la forma de la carga útil, los patrones de integración de código y el rastreo.
Ruta de acceso rápida
- Crear:cree una versión del cuadro de herramientas con una o varias herramientas. Mantenga cada fragmento de código centrado en una tarea y en 30 líneas; use los ejemplos mantenidos vinculados para aplicaciones completas.
- Publique o seleccione una versión: La primera versión se convierte automáticamente en el valor predeterminado. Para versiones posteriores, pruebe y promueva una versión cuando esté listo para convertirlo en el valor predeterminado.
- Conectar y consumir: Copia el punto de conexión de consumidor de la caja de herramientas y, a continuación, intégralo en tu agente.
- Compruebe: Use el punto de conexión específico de la versión para enumerar las herramientas disponibles y, a continuación, ejecute una solicitud de agente que llame a una herramienta esperada.
Soporte de funcionalidades
Los SDK y las herramientas admiten operaciones de administración de cuadros de herramientas, como se muestra en la tabla siguiente.
| Funcionamiento | SDK de Python | REST API | SDK de .NET | SDK de JavaScript | CLI para desarrolladores de Azure | Kit de Herramientas de Fundición |
|---|---|---|---|---|---|---|
| Actualizar, enumerar, obtener y eliminar cuadro de herramientas. | ✔️ | ✔️ | ✔️ | ✔️ | N/A | ✔️ |
| Creación de la versión del cuadro de herramientas | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Lista de versiones del cuadro de herramientas, obtener y eliminar | ✔️ | ✔️ | ✔️ | ✔️ | N/A | N.º La interfaz de usuario solo muestra la versión más reciente. |
| Límite de protección (directiva RAI) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
También puede administrar cuadros de herramientas de forma conversacional con Foundry MCP Server. Consulte Administración de cuadros de herramientas con foundry MCP Server.
Puede agregar las siguientes herramientas a un cuadro de herramientas. En esta tabla se muestra la compatibilidad con el SDK y las herramientas para cada herramienta y si la herramienta también se puede asociar directamente a un agente (fuera de un cuadro de herramientas). Para saber cómo fluye el tráfico de cada herramienta cuando el proyecto usa el aislamiento de red, consulte Aislamiento de red para un cuadro de herramientas.
| Herramienta | En una caja de herramientas | Integración de herramientas directas | SDK de Python | REST API | SDK de .NET | SDK de JavaScript | CLI para desarrolladores de Azure | Kit de Herramientas de Fundición |
|---|---|---|---|---|---|---|---|---|
| Protocolo de contexto de modelo (MCP) | ✅ Sí | ✅ Sí | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Búsqueda web | ✅ Sí | ✅ Sí | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Búsqueda de Azure AI | ✅ Sí | ✅ Sí | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Intérprete de código | ✅ Sí | ✅ Sí | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Búsqueda de archivos | ✅ Sí | ✅ Sí | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| OpenAPI | ✅ Sí | ✅ Sí | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | No |
| De agente a agente (A2A) | ✅ Sí | ✅ Sí | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | No |
| Automatización del explorador | ✅ Sí | ✅ Sí | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | No |
| Fabric IQ | ✅ Sí | ✅ Sí | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| IQ de trabajo | ✅ Sí | ✅ Sí | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Búsqueda de herramientas | ✅ Sí | ❌ No | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Habilidades | ✅ Sí | ❌ No | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | No |
La disponibilidad de las herramientas también depende de la región y el modelo del proyecto. Antes de implementar un cuadro de herramientas, compruebe que la región de destino admite los tipos de herramientas que planea usar. Consulte Compatibilidad de herramientas por región y modelo.
Creación de 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 MCPToolboxTool, ToolSearchToolboxTool, WebSearchToolboxTool
# 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.toolboxes.create_version(
name="my-toolbox",
description="Toolbox with web search and an MCP server",
tools=[
WebSearchToolboxTool(),
MCPToolboxTool(
server_label="myserver",
server_url="https://your-mcp-server.example.com",
require_approval="never",
project_connection_id="my-key-auth-connection",
),
ToolSearchToolboxTool(),
],
)
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();
WebSearchToolboxTool webTool = new();
MCPToolboxTool mcpTool = new(serverLabel: "myserver")
{
ServerUri = new Uri("https://your-mcp-server.example.com"),
ToolCallApprovalPolicy = new McpToolCallApprovalPolicy(
GlobalMcpToolCallApprovalPolicy.NeverRequireApproval),
};
ToolSearchToolboxTool searchTool = new() { Name = "ToolBoxSearch" };
ToolboxVersion toolboxVersion = await toolboxClient.CreateVersionAsync(
name: "my-toolbox",
tools: [webTool, mcpTool, searchTool],
description: "Toolbox with web search, MCP, and tool search"
);
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, MCP, and tool search",
"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"
},
{
"type": "toolbox_search"
}
]
}
Nota:
Use el ámbito del token https://ai.azure.com/.default 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.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",
},
{ type: "toolbox_search" },
],
{
description: "Toolbox with web search, MCP, and tool search",
},
);
console.log(`Created toolbox: ${toolboxVersion.name}, version: ${toolboxVersion.version}`);
Use la extensión Microsoft Foundry Toolkit para 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 y agregue las herramientas que desee.
- Para habilitar el enrutamiento de herramientas basado en intenciones, seleccione Búsqueda de herramientas.
- Seleccione Publicar.
Al publicar un nuevo cuadro de herramientas, se genera automáticamente su primera versión. Esa versión se convierte automáticamente en la versión predeterminada.
Con la agrupación de extensiones unificadas microsoft.foundry (consulte Requisitos previos), cree un cuadro de herramientas en dos pasos:
- Use
azd ai connection createpara registrar cada conexión de proyecto a la que hace referencia el cuadro de herramientas (una llamada por registro de credencial). - Use
azd ai toolbox create --from-file <toolbox.yaml>para crear el cuadro de herramientas. YAML hace referencia a las conexiones por nombre y nunca inserta credenciales.
El patrón es el mismo para cada tipo de conexión y tipo de autenticación:
Establecer el proyecto activo una vez en cada shell:
azd ai project set $PROJECT_ENDPOINTCree una conexión con
azd ai connection create. Las marcas difieren por tipo de autenticación, pero la forma del comando siempre es:azd ai connection create <name> \ --kind <remote-tool|remote-a2a|cognitive-search|GroundingWithCustomSearch> \ --target <endpoint-url> \ --auth-type <none|custom-keys|api-key|oauth2|user-entra-token|project-managed-identity|agentic-identity> \ [--custom-key "Header=Value" | --key <key> | --client-id ... --client-secret ... --authorization-url ... --token-url ... | --audience <aad-resource-uri>]Use
azd ai connection listyazd ai connection show <name>para inspeccionar las conexiones yazd ai connection delete <name> --forcepara quitarlas.Cree un archivo YAML del cuadro de herramientas que haga referencia a una o varias conexiones existentes por nombre. YaML nunca inserta credenciales:
# my-toolbox.yaml description: <human-readable description> connections: - name: <project-connection-name> # must already exist in the project # Optional: add connectionless built-in tools and policies. tools: - type: web_search name: web - type: code_interpreter container: { type: auto } name: code # Tool search is connectionless. - type: toolbox_search # For Azure AI Search, set the index in the tool entry: # - type: azure_ai_search # name: search # azure_ai_search: # indexes: # - project_connection_id: <azure-ai-search-connection-name> # index_name: <search-index-name> # For Bing Custom Search, set the instance in the tool entry: # - type: web_search # name: bing # custom_search_configuration: # project_connection_id: <bing-connection-name> # instance_name: <bing-instance-name> # Optional: attach existing project skills as MCP resources. skills: - name: <skill-name> # uses the skill's default version - name: <other-skill> version: "2" # pin to a specific skill version (string) policies: rai_config: rai_policy_name: <policy-name> # must already exist on the projectAl menos uno de
connections,skillsotoolsdebe no estar vacío. Las referencias de habilidades deben apuntar a habilidades que ya existan en el mismo proyecto de Foundry; consulte Usar habilidades en Foundry para crearlas conazd ai skill create. Para obtener detalles sobre la configuración integral de la búsqueda de herramientas, consulte Usar la búsqueda de herramientas.Cree el cuadro de herramientas a partir de ese archivo:
azd ai toolbox create <toolbox-name> --from-file ./my-toolbox.yamlLa primera versión se convierte automáticamente en el valor predeterminado. Use
azd ai toolbox list,azd ai toolbox show <name>,azd ai toolbox version list <name>yazd ai toolbox delete <name> --forcepara administrar cuadros de herramientas.
Ejemplo: servidor MCP con autenticación basada en claves
# 1. Create the connection
azd ai connection create my-gh-conn \
--kind remote-tool \
--target https://api.githubcopilot.com/mcp/ \
--auth-type custom-keys \
--custom-key "Authorization=Bearer $GITHUB_PAT"
# 2. Create the toolbox
azd ai toolbox create my-toolbox \
--from-file ./my-toolbox.yaml \
--no-prompt
# my-toolbox.yaml
description: GitHub MCP toolbox
connections:
- name: my-gh-conn
Obtener el punto de conexión MCP de la caja de herramientas
Existen dos patrones de punto de conexión según tu rol:
| Función | Endpoint | Cuándo se deben 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. |
| Cliente del conjunto de herramientas | {project_endpoint}/toolboxes/{toolbox_name}/mcp?api-version=v1 |
Conecte agentes a la caja de herramientas. Siempre sirve al default_version. La primera versión que cree se establece automáticamente como valor predeterminado. |
Reemplaza los marcadores de posición por tus propios valores.
-
{project_endpoint}es el endpoint de tu proyecto de Foundry, con la formahttps://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>. Cópielo desde la página Información general del proyecto en el portal de Foundry o desde la columna Dirección URL del punto de conexión de la vista Cuadros de herramientas del kit de herramientas de Microsoft Foundry para Visual Studio Code. -
{toolbox_name}y{version}son el nombre y la versión del cuadro de herramientas que creó en Crear una versión del cuadro de herramientas.
Tip
Conecta a los agentes al punto de conexión toolbox consumer. Siempre ofrece el default_version, por lo que puedes promocionar nuevas versiones sin cambiar el código del agente ni volver a desplegarlo. Reserva el punto de conexión toolbox developer (específico de la versión) para probar una versión antes de promocionarla.
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 la extensión Microsoft Foundry Toolkit for Visual Studio Code, copie el punto de conexión del consumidor del cuadro de herramientas desde la vista Cuadros 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.
- En la columna Dirección URL del punto de conexión, copie el punto de conexión.
El valor de la 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.
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 convertirla en la opción predeterminada.
Instale el SDK de cliente MCP:
pip install mcp
Conéctate al cuadro de herramientas y enumera las herramientas
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}",
}
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
{"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
{"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
{"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
{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"<TOOL_NAME>","arguments":{}}}
Instale el SDK de cliente MCP:
npm install @modelcontextprotocol/sdk
Conéctate al cuadro de herramientas y enumera las herramientas
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}`,
},
},
},
);
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();
Utiliza el punto de conexión MCP de la caja de herramientas con un ejemplo de agente hospedado preconfigurado para validar la carga de la caja de herramientas en VS Code.
- En Foundry Toolkit, dentro de Mis recursos>El nombre de su proyecto>Herramientas, localice el cuadro de herramientas que desea probar.
- Seleccione Plantilla de código de andamiaje.
- Elija una carpeta del proyecto cuando se le solicite.
- Siga el script generado
README.mdpara instalar dependencias, configurar variables de entorno y ejecutar la muestra 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 de 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.
Comprobar — 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).Los nombres de las herramientas se organizan por espacios de nombres según el tipo de herramienta:
Tipo de herramienta Formato de nombre de herramienta Example MCP {server_label}.{tool_name}myserver.some_toolOpenAPI {openapi_name}.{operationId}weatherapi.getForecastA2A El nombre de la herramienta (nombre del nameagente) o el nombre de conexión sinamese omitemyagentTodos los demás tipos de herramientas Valor de namecampo o nombre de herramienta predeterminadoweb_searchLas herramientas de MCP incluyen un
_meta.tool_configurationbloque que contiene la configuración en tiempo de ejecución, comorequire_approval. Consulte Exigir la aprobación de herramientas.Anote los nombres de parámetro exactos del paso de llamada (por ejemplo
queryfrente aqueries).
Verificación - 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→ se requiere consentimiento de OAuth (obtenga la 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. - Para la búsqueda de IA, verifique
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
result.content[].resource._meta.annotations[]para citas de URL (type,url,title,start_index,end_index). - Para Fabric IQ, consulte
result.structuredContent.documents[]para ver los fragmentos de citas. Cada documento incluyetitleyurlcampos que apuntan al elemento de Fabric (ontología, agente de datos o modelo semántico Power BI) usado para basar la respuesta. - Esté atento a
"ServerError"en el contenido del texto: la herramienta se ejecutó pero se produjo un error interno.
Ejemplos de argumentos específicos tools/call de la herramienta:
| Tipo de herramienta | Argumentos |
|---|---|
| Búsqueda IA | {"query": "search text"} |
| Búsqueda de archivos |
{"queries": ["search text"]} — o {"queries": ["search text"], "vector_store_ids": ["<VECTOR_STORE_ID>"]} cuando el almacén de vectores se pasa dinámicamente |
| Intérprete de código | {"code": "print(2 ** 100)"} |
| Web Search | {"search_query": "weather in seattle"} |
| A2A | {"message": {"parts": [{"type": "text", "text": "Hello"}]}} |
| Fabric IQ (inteligencia de tejido) | Varía según la herramienta expuesta, normalmente {"query": "..."} para las herramientas de consulta. |
| Inteligencia laboral | {"message": {"parts": [{"type": "text", "text": "Hello"}]}} |
| MCP | {"query": "what is agent service"} |
Integra la caja de herramientas en tu agente
LangGraph
Requisitos de fragmentos de integración hospedados: Instale langchain-azure-ai[tools]>1.2.3. El fragmento utiliza AzureAIProjectToolbox; utiliza el ejemplo LangGraph mantenido para obtener el agente completo, el conjunto de paquetes y los archivos de implementación.
.env archivo:
FOUNDRY_PROJECT_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>
TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1
TOOLBOX_NAME=agent-tools
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()
Importante
La clase langchain_azure_ai.tools.AzureAIProjectToolbox requiere langchain-azure-ai[tools]>1.2.3.
Framework del Agente de Microsoft
Instala agent-framework-foundry además del paquete Azure Identity, que es un requisito previo. Para obtener la implementación completa, consulte el ejemplo de Marco de agente mantenido.
Usa FoundryToolbox del SDK de Agent Framework para conectarte al punto de conexión de la caja de herramientas. La clase controla la autenticación del cuadro de herramientas y reenvía el contexto de llamada del agente hospedado.
.env archivo:
FOUNDRY_PROJECT_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>
TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1
AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o
main.py (patrón de clave):
from agent_framework.foundry import FoundryToolbox
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
# Toolbox MCP endpoint (platform-injected at runtime via TOOLBOX_ENDPOINT)
TOOLBOX_ENDPOINT = "https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1"
toolbox = FoundryToolbox(
credential,
url=TOOLBOX_ENDPOINT,
)
agent = chat_client.as_agent(
name="my-toolbox-agent",
instructions="You are a helpful assistant with access to Foundry toolbox tools.",
tools=[toolbox],
)
ResponsesAgentServerHost().run()
SDK de Copilot
Requisitos de fragmentos de integración hospedados: Instale el SDK de GitHub Copilot para el entorno de ejecución. El esquema depende de las funciones auxiliares McpBridge y _get_toolbox_token, propias de la aplicación, que no están implementadas aquí. Sigue el punto de conexión de la caja de herramientas y el contrato de autenticación existentes, así como los patrones de integración de agentes hospedados. Todavía no hay disponible un ejemplo completo mantenido.
Usar el SDK de GitHub Copilot para crear un agente potenciado por el cuadro de herramientas que sirva de enlace entre la invocación de herramientas de Copilot y el 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>
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"],
)
Framework del Agente de Microsoft
Instale Microsoft.Agents.AI.Foundry.Hosting y Azure.Identity. Para ver un proyecto completo, consulte el ejemplo público de hosted-toolbox de Agent Framework.
Use AddFoundryToolboxes para registrar uno o varios cuadros de herramientas con el agente hospedado. La integración resuelve el punto de conexión MCP administrado, autentica las solicitudes e incluye el estado de la caja de herramientas en la prueba de disponibilidad.
Variables de entorno:
AZURE_AI_PROJECT_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>
AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o
TOOLBOX_NAME=<toolbox-name>
Program.cs (patrón de clave):
using Azure.AI.Projects;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Foundry.Hosting;
string projectEndpoint = Environment.GetEnvironmentVariable("AZURE_AI_PROJECT_ENDPOINT")
?? throw new InvalidOperationException("AZURE_AI_PROJECT_ENDPOINT is not set.");
string deploymentName = Environment.GetEnvironmentVariable(
"AZURE_AI_MODEL_DEPLOYMENT_NAME") ?? "gpt-4o";
string toolboxName = Environment.GetEnvironmentVariable("TOOLBOX_NAME")
?? throw new InvalidOperationException("TOOLBOX_NAME is not set.");
var credential = new DefaultAzureCredential();
AIAgent agent = new AIProjectClient(new Uri(projectEndpoint), credential)
.AsAIAgent(
model: deploymentName,
instructions: "You are a helpful assistant with access to toolbox tools.",
name: "hosted-toolbox-agent");
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddFoundryResponses(agent);
builder.Services.AddFoundryToolboxes(credential, toolboxName);
var app = builder.Build();
app.MapFoundryResponses();
app.Run();
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.
Usa la extensión Microsoft Foundry Toolkit para Visual Studio Code para crear un ejemplo de agente hospedado que ya está integrado con tu caja 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 del código de scaffolding.
- En la paleta de comandos, elija una carpeta del proyecto cuando se le solicite.
- Abra el archivo generado
README.mdy siga los pasos de configuración, ejecución local e implementación para el scaffolding.
El proyecto generado incluye el punto de entrada del agente hospedado, los archivos de implementación y un README.md elemento con los pasos exactos de configuración, ejecución e implementación.
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 MCP del cuadro de herramientas con los patrones de Python o .NET de esta sección.
Pasa el extremo de la caja de herramientas a tu agente
Después de crear el cuadro de herramientas, recupere su punto de conexión de MCP mediante azd ai toolbox show y pase ese punto de conexión al código del agente como una variable de entorno. El agente lee la variable en el inicio y la usa para conectarse al cuadro de herramientas.
Obtenga el extremo de la caja de herramientas:
azd ai toolbox show <toolbox-name> --output jsonEl
endpointcampo de la respuesta identifica la versión seleccionada. Úselo para probar esa versión antes de la promoción. Para un agente que deba seguirdefault_version, crea el punto de conexión de consumidor sin versionar que se muestra en Obtener el punto de conexión MCP de la caja de herramientas.Establezca el punto de conexión como una variable de entorno que el agente lee en el inicio:
# .env (or however your runtime loads environment variables) TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/mcp?api-version=v1En el código del agente, lea
TOOLBOX_ENDPOINTy conéctese a él con un cliente MCP. Utilice los patrones de integración de Python o .NET descritos anteriormente en esta sección como referencia para la configuración del cliente y el token de Entra (ámbito dehttps://ai.azure.com/.default).
Gestión de los requisitos de aprobación de herramientas
El cuadro de herramientas devuelve un objeto _meta.tool_configuration en cada entrada de herramienta devuelta por tools/list. Cuando una herramienta tiene definido require_approval en "always", el tiempo de ejecución del agente debe presentar la acción pendiente al usuario y esperar la confirmación antes de utilizar la herramienta. El punto de conexión de MCP no bloquea tools/call. La aplicación es responsabilidad exclusiva del entorno de ejecución del agente.
Una vez creado y probado el cuadro de herramientas, conéctelo a un agente. El patrón de integración depende del tipo de agente:
- Agente hospedado (su propio código que se ejecuta en Foundry Agent Service): consulte Usar un conjunto de herramientas con un agente hospedado para conocer los patrones de integración y los requisitos de aprobación en tiempo de ejecución para Agent Framework, LangGraph, Visual Studio Code y la CLI para desarrolladores de Azure.
Configurar require_approval en una herramienta
Establezca require_approval al crear una versión del cuadro de herramientas. Los ejemplos de herramientas MCP de Crear una versión del cuadro de herramientas muestran los valores "always" y "never". Para establecerlo a través del SDK:
from azure.ai.projects.models import MCPToolboxTool
# Set require_approval on an MCP tool
toolbox_version = project.toolboxes.create_version(
name="my-toolbox",
tools=[
MCPToolboxTool(
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"
}
]
}
MCPToolboxTool mcpTool = new(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 Azure CLI para desarrolladores para configurar require_approval en la definición del cuadro de herramientas. El flujo de trabajo de la extensión Microsoft Foundry Toolkit para Visual Studio Code descrito en este artículo se centra en crear y usar la caja 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
Gestionar versiones de la caja de herramientas
Nota:
Solo puede eliminar las versiones del cuadro de herramientas a través del SDK de Python, el SDK de .NET, el SDK de JavaScript y la API REST. La CLI para desarrolladores de Azure admite operaciones de lista, obtención y publicación (promoción de versión predeterminada).
Las versiones del cuadro de herramientas son instantáneas inmutables de la configuración de las herramientas de un cuadro de herramientas. Cada llamada al endpoint de creación genera un nuevo ToolboxVersionObject. El elemento primario ToolboxObject tiene un campo default_version 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.
Nota:
Para la CLI para desarrolladores de Azure, cada operación de mutación destinada a la versión predeterminada actual (azd ai toolbox connection add/remove y azd ai toolbox skill add/remove), crea una new versión del cuadro de herramientas que lleva adelante todas las conexiones y aptitudes asociadas previamente con el cambio solicitado aplicado. Ninguno de estos comandos cambia default_versionautomáticamente ; ejecute azd ai toolbox publish <toolbox-name> <version> cuando esté listo para activar la nueva versión. Para inspeccionar una versión pendiente (no predeterminada), use azd ai toolbox show <name> --version <n>.
| Objeto | Campos clave | Description |
|---|---|---|
ToolboxObject |
id, , name, default_version |
Contenedor de la caja 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.
policies.rai_config.rai_policy_name especifica la protección opcional aplicada a esta versión. |
Crear 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.toolboxes.create_version(
name="my-toolbox",
description="Updated tools v2",
tools=[...],
)
print(f"Created version: {toolbox_version.version}")
ToolboxVersion toolboxVersion = await toolboxClient.CreateVersionAsync(
name: "<toolbox-name>",
tools: [tool],
description: "Updated tools v2"
);
Console.WriteLine($"Created version: {toolboxVersion.Version}");
POST {project_endpoint}/toolboxes/<toolbox-name>/versions?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
{
"description": "Updated tools v2",
"tools": [...]
}
const toolboxVersion = await project.toolboxes.createVersion(
"<toolbox-name>",
[/* 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 la extensión Microsoft Foundry Toolkit para Visual Studio Code descrito en este artículo se centra en crear una caja de herramientas y generar la estructura base de un agente alojado que la consume.
Esta operación no se admite con la CLI para desarrolladores de Azure. Para crear una versión del cuadro de herramientas, use la pestaña Python, .NET, API REST o JavaScript .
La respuesta es una ToolboxVersionObject que contiene el nuevo version identificador.
Enumerar versiones
# List all toolbox versions
versions = list(project.toolboxes.list_toolbox_versions(name="<toolbox-name>"))
for v in versions:
print(f"{v.version} — created {v.created_at}")
List<ToolboxVersion> versions = await toolboxClient
.GetToolboxVersionsAsync("<toolbox-name>")
.ToListAsync();
Console.WriteLine($"Found {versions.Count} toolbox version(s).");
foreach (ToolboxVersion v in versions)
{
Console.WriteLine($" - {v.Name} ({v.Version})");
}
GET {project_endpoint}/toolboxes/<toolbox-name>/versions?api-version=v1
Authorization: Bearer {token}
const versions = project.toolboxes.listVersions("<toolbox-name>");
for await (const v of versions) {
console.log(`${v.version} — created ${v.created_at}`);
}
Use la pestaña Python, .NET, JavaScript o API REST para enumerar las versiones del cuadro de herramientas.
# The current default version is marked with *
azd ai toolbox version list <toolbox-name>
Obtención de una versión específica
# Get a specific toolbox version
version_obj = project.toolboxes.get_toolbox_version(
toolbox_name="<toolbox-name>",
version="<version_id>",
)
ToolboxVersion versionObj = await toolboxClient.GetToolboxVersionAsync(
"<toolbox-name>",
"<version_id>"
);
Console.WriteLine($"Retrieved toolbox: {versionObj.Name} ({versionObj.Id})");
GET {project_endpoint}/toolboxes/<toolbox-name>/versions/{version}?api-version=v1
Authorization: Bearer {token}
const versionObj = await project.toolboxes.getVersion(
"<toolbox-name>",
"<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.
azd ai toolbox version get <toolbox-name> <version_id>
Promoción de una versión al valor predeterminado
El punto de conexión de MCP siempre sirve el default_version. Para cambiar la versión que está activa, actualice el cuadro de herramientas:
# Promote a version to default
toolbox = project.toolboxes.update(
toolbox_name="<toolbox-name>",
default_version="<version_id>",
)
print(f"Active version: {toolbox.default_version}")
ToolboxRecord record = await toolboxClient.UpdateToolboxAsync(
"<toolbox-name>",
"<version_id>"
);
Console.WriteLine($"Active version: {record.DefaultVersion}");
PATCH {project_endpoint}/toolboxes/<toolbox-name>?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.toolboxes.update(
"<toolbox-name>",
"<version_id>",
);
console.log(`Active version: ${toolbox.default_version}`);
Seleccione la pestaña Python, .NET, JavaScript o API REST para establecer una versión del conjunto de herramientas como predeterminada.
Las versiones del cuadro de herramientas son inmutables. Use publish para convertir cualquier versión existente en el nuevo valor predeterminado:
# Roll back or forward to a specific version
azd ai toolbox publish <toolbox-name> <version_id> --no-prompt
publish es la única vía para cambiar default_version desde la CLI; los verbos mutadores (connection add/remove, skill add/remove) siempre crean una nueva versión sin promoverla.
Eliminar una versión
# Delete a toolbox version
project.toolboxes.delete_toolbox_version(
toolbox_name="<toolbox-name>",
version="<version_id>",
)
await toolboxClient.DeleteToolboxVersionAsync(
"<toolbox-name>",
"<version_id>"
);
DELETE {project_endpoint}/toolboxes/<toolbox-name>/versions/{version}?api-version=v1
Authorization: Bearer {token}
await project.toolboxes.deleteVersion(
"<toolbox-name>",
"<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 la CLI para desarrolladores de Azure. Para eliminar una versión del cuadro de herramientas, use la pestaña Python, .NET, API REST o JavaScript .
Administración de cuadros de herramientas con el servidor MCP de Foundry
Foundry MCP Server (versión preliminar) expone la administración de cuadros de herramientas como herramientas de MCP, por lo que puede recuperar, actualizar y eliminar cuadros de herramientas de un cliente MCP, como GitHub Copilot en Visual Studio Code. Para configurar el servidor, consulte Introducción al servidor MCP de Foundry (versión preliminar).
| Herramienta | Acceso | Description |
|---|---|---|
toolbox_get |
leer | Recupere un cuadro de herramientas y su versión predeterminada actual. |
toolbox_version_get |
leer | Enumerar las versiones del cuadro de herramientas o recuperar una versión específica. |
toolbox_version_create |
write | Cree una versión inmutable del cuadro de herramientas. Si el cuadro de herramientas no existe, esta herramienta también la crea. |
toolbox_update |
write | Cree o actualice un cuadro de herramientas, incluida su versión predeterminada. |
toolbox_delete |
write | Eliminar una caja de herramientas. |
toolbox_version_delete |
write | Elimine una versión específica del cuadro de herramientas. |
Se aplican las mismas reglas de control de versiones que con los SDK. La creación de una versión para un cuadro de herramientas existente no cambia la versión predeterminada. Para promocionar una versión, llama a toolbox_update con defaultVersion establecido en la nueva versión. Antes de eliminar la versión predeterminada actual, establezca otra versión como predeterminada.
Ejemplos de instrucciones:
- "Muéstrame el
customer-support-toolscuadro de herramientas." - "Obtener la versión 2 de
customer-support-tools." - "Cree una nueva versión de
customer-support-tools." - "Establezca la versión 2 de
customer-support-toolscomo valor predeterminado". - "Establezca la versión 1 de
customer-support-toolscomo valor predeterminado y, a continuación, elimine la versión 2". - Elimine la
old-support-toolscaja de herramientas.
Para obtener la referencia completa de la herramienta, consulte Herramientas disponibles y mensajes de ejemplo para foundry MCP Server.
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.
La pestaña azd de cada herramienta que aparece a continuación muestra el YAML declarativo del conjunto de herramientas. Para crear un cuadro de herramientas de forma imperativa sin un proyecto de agente, use el azd ai toolbox create --from-file flujo de trabajo y aplique los datos por herramienta que se muestran en las secciones siguientes. Para desplegar un conjunto de herramientas con un agente alojado, modélelo como un servicio azure.ai.toolbox en azure.yaml y conecte el agente a este con uses: o toolboxes:.
Varios tipos de herramientas
Un único cuadro de herramientas puede agrupar diferentes tipos de herramientas. En el ejemplo siguiente se combinan 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 integrada sin el campo name en una caja 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>"
}
]
}
}
]
}
Cada tipo de herramienta tiene su propia configuración del cuadro de herramientas: tipos de autenticación de conexión, fragmentos de código del SDK por lenguaje y cualquier comportamiento específico del cuadro de herramientas. Estos detalles se encuentran en el artículo de referencia de cada herramienta. Consulte la tabla compatibilidad de funciones para acceder al enlace de cada herramienta.
Para consultar el comportamiento específico de cada conjunto de herramientas, como el almacén vectorial dinámico de File Search (anulación de parámetros) o las cargas de archivos a nivel de recurso para Code Interpreter y File Search, consulte el artículo enlazado correspondiente a cada herramienta.
Configurar salvaguardas
Aplique una directiva de límites de protección con nombre a una versión del conjunto de herramientas para hacer cumplir el filtrado de contenido de IA responsable en las entradas y salidas de las herramientas. El mecanismo de protección funciona en la capa de herramientas, independientemente de cualquier filtro de contenido a nivel de modelo.
Haga referencia a una barrera de seguridad por su nombre de directiva, que se configura en el portal de Foundry en Barreras de seguridad. Establezca policies.rai_config.rai_policy_name en el nombre de la directiva al crear una versión del cuadro de herramientas.
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import WebSearchToolboxTool
endpoint = "https://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>"
project = AIProjectClient(endpoint=endpoint, credential=DefaultAzureCredential())
toolbox_version = project.toolboxes.create_version(
name="my-toolbox",
description="Toolbox with guardrail",
tools=[WebSearchToolboxTool()],
policies={
"rai_config": {
"rai_policy_name": "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account-name>/raiPolicies/<policy-name>"
}
},
)
print(f"Created version: {toolbox_version.version}")
POST {endpoint}/toolboxes/{toolbox_name}/versions?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
{
"description": "Toolbox with guardrail",
"tools": [{ "type": "web_search" }],
"policies": {
"rai_config": {
"rai_policy_name": "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account-name>/raiPolicies/<policy-name>"
}
}
}
#pragma warning disable AAIP001
using Azure.AI.Projects;
using Azure.AI.Projects.Agents;
using Azure.Identity;
var projectEndpoint = Environment.GetEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT");
DefaultAzureCredential credential = new();
AIProjectClient projectClient = new(endpoint: new Uri(projectEndpoint), tokenProvider: credential);
AgentToolboxes toolboxClient = projectClient.AgentAdministrationClient.GetAgentToolboxes();
var toolboxVersion = toolboxClient.CreateVersion(
name: "my-toolbox",
description: "Toolbox with guardrail",
tools: [new WebSearchToolboxTool()],
policies: new ToolboxPolicies
{
RaiConfig = new RaiConfig { RaiPolicyName = "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account-name>/raiPolicies/<policy-name>" }
});
Console.WriteLine($"Created version: {toolboxVersion.Version}");
const toolboxVersion = await project.toolboxes.createVersion(
"my-toolbox",
[{ type: "web_search" }],
{
description: "Toolbox with guardrail",
policies: {
rai_config: {
rai_policy_name: "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account-name>/raiPolicies/<policy-name>",
},
},
},
);
console.log(`Created version: ${toolboxVersion.version}`);
name: my-toolbox
description: Toolbox with guardrail
policies:
rai_config:
rai_policy_name: /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account-name>/raiPolicies/<policy-name>
tools:
- type: web_search
La configuración de guardrails aún no está disponible en la extensión para VS Code. Use la API REST, el SDK o la CLI de Azure Developer para configurar límites de protección.
Asociar habilidades a una caja de herramientas
Adjunte capacidades a una versión del cuadro de herramientas para que estén disponibles para los agentes a través del punto de conexión MCP del cuadro de herramientas. Cada referencia de aptitud especifica el nombre de la aptitud y una versión opcional. Omita version para usar el default_version de la capacidad; fije una cadena version para usar una instantánea inmutable.
Una versión del cuadro de herramientas puede contener herramientas, aptitudes o ambas. En los ejemplos siguientes se crea una versión del cuadro de herramientas que contiene una sola referencia de aptitud. Para agregar habilidades a una caja de herramientas que ya tiene herramientas, incluya el mismo tools que utilizó en Crear una versión de la caja de herramientas junto con la matriz skills.
Importante
Las habilidades asociadas a una caja de herramientas deben existir en el mismo proyecto de Foundry. No se admiten referencias entre proyectos.
Cuando un agente o cliente MCP se conecta al punto de conexión del cuadro de herramientas, las aptitudes se exponen como recursos de MCP. El marco de cliente o agente de MCP debe admitir el protocolo de recursos de MCP para detectar y cargar aptitudes automáticamente. Para comprobar que se puedan detectar capacidades, llame a resources/list en el punto de conexión MCP del cuadro de herramientas y confirme que los nombres de las capacidades aparezcan en la respuesta.
POST {endpoint}/toolboxes/{toolbox_name}/versions?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
Accept: application/json
Foundry-Features: Skills=V1Preview
{
"description": "Toolbox with a skill reference",
"tools": [],
"skills": [
{
"type": "skill_reference",
"name": "greeting"
}
]
}
Para anclar una versión específica:
{
"skills": [
{
"type": "skill_reference",
"name": "greeting",
"version": "v1"
}
]
}
from azure.ai.projects.models import ToolboxSkillReference
toolbox_version = project.toolboxes.create_version(
name="my-toolbox",
description="Toolbox with a skill reference",
tools=[],
skills=[
ToolboxSkillReference(name="greeting"), # use default version
# ToolboxSkillReference(name="greeting", version="1"), # pin to version 1
],
)
print(f"Created toolbox version: {toolbox_version.id}")
#pragma warning disable AAIP001
// Reuse the AgentToolboxes client (toolboxClient) from Step 1.
ToolboxSkillReference skillRef = new("greeting");
// To pin a version: new ToolboxSkillReference("greeting") { Version = "1" }
ToolboxVersion toolboxVersion = toolboxClient.CreateVersion(
name: "my-toolbox",
tools: [],
skills: [skillRef],
description: "Toolbox with a skill reference"
);
Console.WriteLine($"Created toolbox version: {toolboxVersion.Id}");
const toolboxVersion = await project.toolboxes.createVersion(
"my-toolbox",
[],
{
description: "Toolbox with a skill reference",
skills: [
{ type: "skill_reference", name: "greeting" },
// { type: "skill_reference", name: "greeting", version: "v1" }, // pin to v1
],
},
);
console.log(`Created toolbox version: ${toolboxVersion.id}`);
La CLI de Azure Developer admite referencias de aptitudes en dos lugares: declarativamente como un bloque de skills: de nivel superior en el azd ai toolbox create --from-file YAML y de forma imperativa con los verbos azd ai toolbox skill add/list/remove. Cada referencia acepta un name (obligatorio) y un version (cadena) opcional. Omita version para ajustarse a la habilidad default_version; fije una cadena de versión para fijar el conjunto de herramientas en una instantánea inmutable.
Declarar aptitudes al crear el cuadro de herramientas
# my-toolbox.yaml
description: Toolbox with skill references
connections:
- name: my-gh-conn
skills:
- name: greeting # follows the skill's default version
- name: review-checklist
version: "2" # pin to skill version 2
azd ai toolbox create my-toolbox --from-file ./my-toolbox.yaml --no-prompt
Agregar, enumerar y quitar aptitudes en un cuadro de herramientas existente
# Add a skill (follows default version)
azd ai toolbox skill add my-toolbox greeting
# Add a skill pinned to a specific version
azd ai toolbox skill add my-toolbox review-checklist@2
# Add multiple skills from a file (same shape as the create YAML's skills block)
azd ai toolbox skill add my-toolbox --from-file ./skills.yaml
# List skill references on the current default version
azd ai toolbox skill list my-toolbox --output table
# Remove a skill (--force skips the confirmation prompt; multiple names allowed)
azd ai toolbox skill remove my-toolbox greeting --force
skill list muestra solo la versión predeterminada. Las habilidades fijadas muestran su versión; las habilidades no fijadas muestran (default). Para inspeccionar las habilidades de una versión pendiente, ejecute azd ai toolbox show <toolbox> --version <n> --output json y consulte la matriz skills.
Importante
skill add y skill remove cada una crea una nueva versión del cuadro de herramientas que lleva adelante todas las conexiones y capacidades adjuntas previamente con el cambio solicitado aplicado.
No promueven la nueva versión a la predeterminada, por lo que los cambios no son visibles para los clientes de MCP hasta que ejecute azd ai toolbox publish <toolbox> <version>. Para cambiar la versión anclada de una aptitud que ya está asociada (por ejemplo, actualizar greeting de v1 a v2) ejecute tres comandos en orden: skill remove, la nueva versión y, a continuación publish , skill add <name>@<new-version> (skill add bloquea los duplicados cuando se comprueban con la versión predeterminada actual).
Los nombres de las capacidades deben coincidir con ^[a-z0-9]([a-z0-9\-]*[a-z0-9])?$ (letras minúsculas, dígitos y guiones; máximo 64 caracteres; sin guion al principio ni al final). Se rechaza un @ al final en <name>@<version> (una versión vacía).
Actualmente, las referencias de aptitud no se pueden configurar mediante la extensión de VS Code. Use la API REST o el SDK para configurar aptitudes.
Validación de la detección de aptitudes
Después de adjuntar habilidades a una versión de la caja de herramientas, compruebe que puede descubrirlas a través del endpoint MCP de la caja de herramientas con el SDK de Python para MCP:
import asyncio
from azure.identity import DefaultAzureCredential
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
async def list_skills():
credential = DefaultAzureCredential()
token = credential.get_token("https://ai.azure.com/.default").token
toolbox_url = "{endpoint}/toolboxes/my-toolbox/mcp?api-version=v1"
headers = {
"Authorization": f"Bearer {token}",
}
async with streamablehttp_client(toolbox_url, headers=headers) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
resources = await session.list_resources()
for resource in resources.resources:
print(f"Skill: {resource.uri} - {resource.name}")
asyncio.run(list_skills())
Las aptitudes aparecen como recursos MCP con URI con el formato skill://{name}.
Usar habilidades de un agente (Microsoft Agent Framework, .NET)
En .NET, use AgentSkillsProviderBuilder().UseMcpSkills(mcpClient) del SDK de Microsoft Agent Framework para descubrir funcionalidades basadas en MCP desde un punto de conexión de la caja de herramientas e inyectarlas como AIContextProviders en el agente. A continuación, el agente carga las instrucciones de cada aptitud en tiempo de ejecución cuando el modelo decide que es relevante. El siguiente Program.cs aloja el agente con la capa de alojamiento de Respuestas (AddFoundryResponses y MapFoundryResponses).
using System.Net.Http.Headers;
using Azure.AI.Projects;
using Azure.Core;
using Azure.Identity;
using DotNetEnv;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Foundry.Hosting;
using Microsoft.Extensions.AI;
using ModelContextProtocol.Client;
// Load .env file if present (for local development).
Env.TraversePath().Load();
string projectEndpoint = Environment.GetEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT")
?? throw new InvalidOperationException("FOUNDRY_PROJECT_ENDPOINT environment variable is not set.");
string deployment = Environment.GetEnvironmentVariable("AZURE_AI_MODEL_DEPLOYMENT_NAME")
?? throw new InvalidOperationException("AZURE_AI_MODEL_DEPLOYMENT_NAME environment variable is not set.");
string toolboxName = Environment.GetEnvironmentVariable("TOOLBOX_NAME")
?? throw new InvalidOperationException("TOOLBOX_NAME environment variable is not set.");
// Build the Foundry Toolbox MCP URL from the project endpoint and toolbox name.
string toolboxMcpServerUrl = $"{projectEndpoint.TrimEnd('/')}/toolboxes/{toolboxName}/mcp?api-version=v1";
TokenCredential credential = new DefaultAzureCredential();
// HttpClient that attaches a fresh Foundry bearer token to every request.
// CheckCertificateRevocationList = true satisfies CA5399.
using var httpClient = new HttpClient(
new BearerTokenHandler(credential, "https://ai.azure.com/.default")
{
CheckCertificateRevocationList = true,
});
Console.WriteLine($"Connecting to Foundry Toolbox '{toolboxName}' MCP server...");
// Connect to the Foundry Toolbox MCP endpoint.
await using var mcpClient = await McpClient.CreateAsync(
new HttpClientTransport(
new HttpClientTransportOptions
{
Endpoint = new Uri(toolboxMcpServerUrl),
Name = toolboxName,
TransportMode = HttpTransportMode.StreamableHttp,
},
httpClient));
// AgentSkillsProvider implements progressive disclosure over the MCP-discovered skills:
// names and descriptions are advertised in the system prompt, and the full skill body
// (and any supplementary resources) is loaded on demand when the model decides it is
// relevant.
var skillsProvider = new AgentSkillsProviderBuilder()
.UseMcpSkills(mcpClient)
.Build();
AIAgent agent = new AIProjectClient(new Uri(projectEndpoint), credential)
.AsAIAgent(new ChatClientAgentOptions
{
Name = "foundry-toolbox-mcp-skills",
Description = "Agent that discovers MCP-based skills from a Foundry Toolbox and exposes them via AgentSkillsProvider.",
ChatOptions = new ChatOptions
{
ModelId = deployment,
Instructions = "You are a helpful assistant.",
},
AIContextProviders = [skillsProvider],
});
var builder = AgentHost.CreateBuilder(args);
builder.Services.AddFoundryResponses(agent);
builder.RegisterProtocol("responses", endpoints => endpoints.MapFoundryResponses());
var app = builder.Build();
app.Run();
// HttpClientHandler that attaches a fresh Foundry bearer token to every outgoing request.
internal sealed class BearerTokenHandler(TokenCredential credential, string scope) : HttpClientHandler
{
private readonly TokenRequestContext _tokenContext = new([scope]);
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
AccessToken token = await credential.GetTokenAsync(this._tokenContext, cancellationToken).ConfigureAwait(false);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.Token);
return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
}
}
Para obtener el ejemplo completo, incluidos los archivos de proyecto y los pasos de implementación, consulte el ejemplo Aptitudes en el cuadro de herramientas.
Recordatorio
La reminder_preview herramienta permite a un agente hospedado programar su ejecución de nuevo en un futuro. Cuando el agente llama a esta herramienta, especifica un retraso en minutos. Después de ese retraso, Foundry vuelve a invocar al mismo agente en la misma conversación.
Troubleshoot
| Síntoma | Causa probable | Corregir |
|---|---|---|
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 el project_connection_id existe en su 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 valores válidos de paths, operationId y esquemas de parámetros. 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 un número menor de herramientas del esperado. |
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). |
Caja de herramientas no completamente provisionada 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 durante 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 |
Utilice el formato {server_label}.{tool_name} (por ejemplo, myserver.get_info). |
500 en send_ping() |
El servidor MCP del cuadro de herramientas no implementa el método MCP ping . |
Use la clase Microsoft Agent FrameworkFoundryToolbox, que controla la conexión del cuadro de herramientas. No llames send_ping() directamente. |
500 en prompts/list |
El servidor de Foundry MCP no implementa prompts/list. |
Pase load_prompts=False (o equivalente) al constructor de cliente MCP. |
500 sin transmisión tools/call |
No se admite el modo de transmisión por secuencias (stream=False) para los puntos de conexión de MCP del cuadro de herramientas. |
Use siempre stream=True al llamar a las herramientas de MCP del cuadro de herramientas. |
500 en 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). |
La herramienta reminder solo está disponible para agentes hospedados. No se puede utilizar la herramienta de recordatorio con agentes de respuesta inmediata.
Para obtener instrucciones de configuración completas, ejemplos de uso y limitaciones, consulte Herramienta recordatorio para agentes de programación automática.
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
- Conectar agentes a servidores del Protocolo de Contexto de Modelo
- Herramientas disponibles y mensajes de ejemplo para foundry MCP Server
- Adición de la autenticación del servidor MCP
- Herramienta de búsqueda web
- Herramienta de búsqueda de Azure AI
- Descripción general de los guardrails
- Gestionar competencias
- Implementación de un agente hospedado
- Adición de una conexión al proyecto
- Configuración del aislamiento de red para Microsoft Foundry