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

Importante

Los elementos marcados (versión preliminar) en este artículo se encuentran actualmente en versión preliminar pública. Esta versión preliminar se ofrece sin acuerdo de nivel de servicio y no se recomienda para las cargas de trabajo de producción. Es posible que algunas características no sean compatibles o que tengan sus funcionalidades limitadas. Para más información, consulte Términos de uso complementarios para las versiones preliminares de Microsoft Azure.

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.

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 cuentan con la infraestructura: puertas de enlace, bóvedas de credenciales, políticas 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.

Cuadro de herramientas cubre el ciclo de vida completo de las herramientas a través de cuatro pilares: Compilar y Consumir están disponibles hoy.

Fundamento Situación Lo que permite
Construir 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.

Diagrama en el que se muestran los cuadros de herramientas de la arquitectura de Foundry: Compilación y consumo de pilares consumidos por LangGraph, Microsoft Agent Framework, GitHub Copilot, Claude Code y Microsoft Copilot Studio, regidos de forma predeterminada.

Cree conjuntos 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 como predeterminada.
  • Aplicar un límite de protección (directiva RAI) a una versión de la caja de herramientas.

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.

Soporte de funcionalidades

Feature SDK de Python REST API SDK de .NET SDK de JavaScript azd 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.
Herramienta MCP ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Herramienta de búsqueda web ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Herramienta de 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
herramienta Fabric IQ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Límite de protección (directiva RAI) ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Referencias de aptitudes ✔️ ✔️ ✔️ ✔️ ✔️ No
Herramienta de búsqueda de herramientas ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Herramienta Work IQ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Herramienta de automatización del explorador ✔️ ✔️ ✔️ ✔️ ✔️ No

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 hospedado): la identidad administrada del agente que llama a las 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)).
  • 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 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

  • SDK de .NET: dotnet add package Azure.AI.Projects --prerelease y dotnet add package Azure.Identity

  • SDK de JavaScript: npm install @azure/ai-projects @azure/identity

  • Azure CLI para desarrolladores: Instalar la CLI para desarrolladores de Azure (azd, 1.25 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

  • 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úyalo en todos los clientes HTTP, los transportes de MCP y los contenedores del SDK que llamen al punto de conexión del cuadro de herramientas.
  • Un cuadro de herramientas admite como máximo una herramienta sin un name campo por tipo de herramienta (Web Search, 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.

Tip

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:

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.

Tip

Cuando incluya la herramienta Fabric IQ con un modelo semántico de Power BI, limite el ámbito de la herramienta con allowed_tools para que el agente razone sobre el esquema y ejecute consultas directamente en lugar de generar DAX previamente. La lista recomendada es GetInstructions, DiscoverArtifacts, GetReportMetadata, GetSemanticModelSchema, ExecuteQueryy ValueSearch , omita GenerateQuery. Para la configuración integral de Fabric IQ, incluidos OAuth y el punto de conexión del modelo semántico de Power BI, consulte Usar la herramienta Fabric IQ.

import os
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import MCPTool, ToolboxSearchPreviewTool, 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, MCP, tool search, Work IQ, and Fabric IQ tools.
# Work IQ and Fabric IQ are dict-shaped here because they require a project_connection_id
# pointing at the corresponding connection. See work-iq.md and fabric-iq.md for setup details.
toolbox_version = project.beta.toolboxes.create_version(
    name="my-toolbox",
    description="Toolbox with web search, MCP, tool search, Work IQ, and Fabric IQ",
    tools=[
        WebSearchTool(),
        MCPTool(
            server_label="myserver",
            server_url="https://your-mcp-server.example.com",
            require_approval="never",
            project_connection_id="my-key-auth-connection",
        ),
        ToolboxSearchPreviewTool(),
        {
            "type": "work_iq_preview",
            "name": "workiq",
            "project_connection_id": os.environ["WORK_IQ_PROJECT_CONNECTION_ID"],
        },
        {
            "type": "fabric_iq_preview",
            "server_label": "fabriciq",
            "project_connection_id": os.environ["FABRIC_IQ_PROJECT_CONNECTION_ID"],
            "require_approval": "never",
            # For Power BI semantic models, restrict the tool surface so the agent reasons
            # over the schema and runs queries directly instead of pre-generating DAX.
            # "allowed_tools": [
            #     "GetInstructions",
            #     "DiscoverArtifacts",
            #     "GetReportMetadata",
            #     "GetSemanticModelSchema",
            #     "ExecuteQuery",
            #     "ValueSearch",
            # ],
        },
    ],
)
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>";
var workIqConnectionId = Environment.GetEnvironmentVariable("WORK_IQ_PROJECT_CONNECTION_ID");
var fabricIqConnectionId = Environment.GetEnvironmentVariable("FABRIC_IQ_PROJECT_CONNECTION_ID");
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
    )
));

ToolboxSearchPreviewTool searchTool = new() { Name = "ToolBoxSearch" };
WorkIQPreviewTool workIqTool = new(workIqConnectionId) { Name = "workiq" };
FabricIQPreviewTool fabricIqTool = new(fabricIqConnectionId)
{
    ServerLabel = "fabriciq",
    RequireApproval = BinaryData.FromObjectAsJson("never"),
};

ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "my-toolbox",
    tools: [webTool, mcpTool, searchTool, workIqTool, fabricIqTool],
    description: "Toolbox with web search, MCP, tool search, Work IQ, and Fabric IQ"
);
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, tool search, Work IQ, and Fabric IQ",
  "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_preview"
    },
    {
      "type": "work_iq_preview",
      "name": "workiq",
      "project_connection_id": "{workiq-connection-id}"
    },
    {
      "type": "fabric_iq_preview",
      "server_label": "fabriciq",
      "project_connection_id": "{fabric-iq-connection-id}",
      "require_approval": "never"
    }
  ]
}

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 workIqProjectConnectionId = process.env["WORK_IQ_PROJECT_CONNECTION_ID"];
const fabricIqProjectConnectionId = process.env["FABRIC_IQ_PROJECT_CONNECTION_ID"];

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",
    },
    { type: "toolbox_search_preview" },
    {
      type: "work_iq_preview",
      name: "workiq",
      project_connection_id: workIqProjectConnectionId,
    },
    {
      type: "fabric_iq_preview",
      server_label: "fabriciq",
      project_connection_id: fabricIqProjectConnectionId,
      require_approval: "never",
    },
  ],
  {
    description: "Toolbox with web search, MCP, tool search, Work IQ, and Fabric IQ",
  },
);
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.

  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 y agregue las herramientas que desee.
  5. Para habilitar el enrutamiento de herramientas basado en intenciones, seleccione Búsqueda de herramientas.
  6. Para agregar Herramientas de Work IQ o Fabric IQ, seleccione + Agregar herramienta y elija el tipo de herramienta correspondiente. Proporcione la conexión de proyecto necesaria cuando se le solicite. Para obtener más información sobre la configuración de un extremo a otro, consulte Use la herramienta Work IQ y Use la herramienta Fabric IQ.
  7. 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.

Captura de pantalla de la extensión Microsoft Foundry Toolkit para Visual Studio Code que muestra la vista Crear una caja de herramientas personalizada, con campos para el nombre, la descripción y las herramientas de la caja de herramientas, además de la acción Publicar.

Con la agrupación de extensiones unificadas microsoft.foundry (consulte Requisitos previos), cree un cuadro de herramientas en dos pasos:

  1. Use azd ai connection create para registrar cada conexión de proyecto a la que hace referencia el cuadro de herramientas (una llamada por registro de credencial).
  2. 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:

  1. Establecer el proyecto activo una vez en cada shell:

    azd ai project set $PROJECT_ENDPOINT
    
  2. Cree 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 list y azd ai connection show <name> para inspeccionar las conexiones y azd ai connection delete <name> --force para quitarlas.

  3. 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_preview
      # Work IQ requires project_connection_id plus a unique name.
      - type: work_iq_preview
        name: workiq
        project_connection_id: <work-iq-connection-name>
      # Fabric IQ requires project_connection_id plus server_label.
      - type: fabric_iq_preview
        server_label: fabriciq
        project_connection_id: <fabric-iq-connection-name>
        require_approval: never
        # For Power BI semantic models, restrict the tool surface with allowed_tools
        # so the agent reasons over the schema and runs queries directly instead of
        # pre-generating DAX. See fabric-iq.md for the full guidance.
        # allowed_tools:
        #   - GetInstructions
        #   - DiscoverArtifacts
        #   - GetReportMetadata
        #   - GetSemanticModelSchema
        #   - ExecuteQuery
        #   - ValueSearch
      # 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: bing_custom_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 project
    

    Al menos uno de connections, skillso tools debe 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 con azd ai skill create. Para obtener información detallada sobre la configuración integral de la búsqueda de herramientas, Work IQ y Fabric IQ, consulte Usar la búsqueda de herramientas, Usar la herramienta Work IQ y Usar la herramienta Fabric IQ.

  4. Cree el cuadro de herramientas a partir de ese archivo:

    azd ai toolbox create <toolbox-name> --from-file ./my-toolbox.yaml
    

    La 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>y azd ai toolbox delete <name> --force para 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

Paso 2: 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.

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.

  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 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.

Captura de pantalla de la extensión Microsoft Foundry Toolkit for Visual Studio Code que muestra la vista Cuadros de herramientas con la URL del punto de conexión del cuadro de herramientas y la acción de plantilla de código de scaffolding.

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

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}`,
        "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 del agente hospedado con scaffolding para validar la carga del cuadro de herramientas de VS Code.

  1. En Foundry Toolkit, dentro de Mis recursos>El nombre de su proyecto>Herramientas, localice el cuadro de herramientas que desea probar.
  2. Seleccione Plantilla de código de andamiaje.
  3. Elija una carpeta del proyecto cuando se le solicite.
  4. Siga el script generado README.md para instalar dependencias, configurar variables de entorno y ejecutar la muestra 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 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, 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 Gestión de los requisitos de aprobación de herramientas.
  • Anote los nombres de parámetro exactos del paso de llamada (por ejemplo query frente a queries).

Verificación - 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 → se requiere consentimiento de OAuth (obtenga la 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.
  • 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._meta si 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 incluye title y url campos 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"]}
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"}

Paso 4: Integrar la caja de herramientas en tu agente

LangGraph

Consulte el ejemplo completo para obtener la implementación completa.

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

Importante

La clase langchain_azure_ai.tools.AzureAIProjectToolbox requiere langchain-azure-ai[tools]>1.2.3.

Framework del Agente de Microsoft

Usa MCPStreamableHTTPTool desde el SDK de Agent Framework para conectarse directamente al punto de conexión MCP de la caja de herramientas.

.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
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 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

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

Use ResponsesServer desde el SDK de Agent Framework con un ToolboxMcpClient personalizado para explorar 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 encapsula las llamadas directas de JSON-RPC al punto de conexión de MCP. ToolboxHandler conecta las llamadas de la herramienta LLM al cliente de 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.

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.

  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 del código de scaffolding.
  4. En la paleta de comandos, elija una carpeta del proyecto cuando se le solicite.
  5. Abra el archivo generado README.md y 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 con los pasos exactos de configuración, ejecución e implementación. El agente de scaffolding controla el encabezado Foundry-Features: Toolboxes=V1Preview.

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.

Pasa el extremo de la caja de herramientas a tu agente

Después de crear el cuadro de herramientas en el paso 1, recupere su punto de conexión de MCP con 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.

  1. Obtenga el extremo de la caja de herramientas:

    azd ai toolbox show <toolbox-name> --output json
    

    El campo mcp_endpoint de la respuesta es el punto de conexión del consumidor que siempre se resuelve como la default_version de la caja de herramientas.

  2. 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=v1
    
  3. En el código del agente, lea TOOLBOX_ENDPOINT y 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, el encabezado Foundry-Features: Toolboxes=V1Preview y el token de Entra (alcance https://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: el cumplimiento es responsabilidad del tiempo de ejecución del agente.

Leer require_approval desde tools/list

Cada entrada de herramienta en una respuesta tools/list incluye un bloque _meta devuelto por la caja 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"
    }
  }
}
Valor de require_approval 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 las fases de aprobación (LangGraph)

Interrogue tools/list al iniciar para construir un mapa de aprobación, luego inserte una restricción en la solicitud 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 indicador 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 ocurre al inicio. La comprobación de aprobación se ejecuta una vez cuando se inicializa el agente. No hay ninguna sobrecarga por llamada.
  • Reserva correcta. 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 ejecuta tools/call independientemente de esta configuración. El tiempo de ejecución del agente es responsable de la fase de accesos 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 tanto los valores de "always" como de "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_version(
    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 azd, Python, .NET, JavaScript o REST API 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

Paso 5: Administrar versiones del cuadro de herramientas

Nota:

Puede eliminar las versiones del cuadro de herramientas mediante el SDK de Python, .NET SDK, el SDK de JavaScript y la API REST solo. La interfaz de línea de comandos de azd admite operaciones de listado, obtención y publicación (promoción de la 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.beta.toolboxes.create_version(
    name="<toolbox-name>",
    description="Updated tools v2",
    tools=[...],
)
print(f"Created version: {toolbox_version.version}")
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "<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.beta.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.beta.toolboxes.list_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.beta.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.beta.toolboxes.get_version(
    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.beta.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.beta.toolboxes.update(
    "<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.beta.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.beta.toolboxes.delete_version(
    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.beta.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 .

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 manifiesto declarativo agent.yaml consumido por azd ai agent init. Para crear un cuadro de herramientas de forma imperativa (sin un proyecto de agente), use el flujo de trabajo genérico de cuatro pasos azd ai toolbox create --from-file y aplique los datos por herramienta que se muestran en las secciones siguientes.

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

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), AgenticIdentityTokeny UserEntraToken. Consulte la pestaña azd para ver ejemplos de configuración de conexión según el 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",
  },
];

Cree una conexión de proyecto para el servidor MCP con el tipo de autenticación que coincida con el escenario y, a continuación, haga referencia a ella desde un archivo YAML de cuadro de herramientas mínimo.

Paso 1. Creación de la conexión

Nota:

Exporte el punto de conexión del proyecto y establézcalo como el proyecto activo para los azd ai comandos:

PROJECT_ENDPOINT="https://<account>.services.ai.azure.com/api/projects/<project>"
azd ai project set $PROJECT_ENDPOINT

Elija la variante de autenticación que necesita:

# No auth — public MCP server
azd ai connection create my-mcp-conn \
  --kind remote-tool \
  --target https://mms.heiai.top/api/mcp \
  --auth-type none

# Custom-keys header (for example, GitHub PAT)
azd ai connection create my-mcp-conn \
  --kind remote-tool \
  --target https://api.githubcopilot.com/mcp/ \
  --auth-type custom-keys \
  --custom-key "Authorization=Bearer $GITHUB_PAT"

# OAuth — bring your own app registration
azd ai connection create my-mcp-conn \
  --kind remote-tool \
  --target https://your-mcp-server.example.com \
  --auth-type oauth2 \
  --authorization-url https://auth.example.com/authorize \
  --token-url https://auth.example.com/token \
  --client-id <oauth-client-id> \
  --client-secret <oauth-client-secret> \
  --scopes "<scope1> <scope2>"

# User Entra token (managed user identity passthrough; for example, Microsoft Fabric)
azd ai connection create my-mcp-conn \
  --kind remote-tool \
  --target https://api.fabric.microsoft.com/v1/mcp/fabricaihub/integrations/m365 \
  --auth-type user-entra-token \
  --audience https://analysis.windows.net/powerbi/api

# Project managed identity — the project's system-assigned MI
azd ai connection create my-mcp-conn \
  --kind remote-tool \
  --target https://<resource>.cognitiveservices.azure.com/language/mcp \
  --auth-type project-managed-identity \
  --audience https://cognitiveservices.azure.com

# Agentic identity — the agent's per-project identity
azd ai connection create my-mcp-conn \
  --kind remote-tool \
  --target https://<resource>.cognitiveservices.azure.com/language/mcp \
  --auth-type agentic-identity \
  --audience https://cognitiveservices.azure.com
--auth-type Indicadores adicionales
none
custom-keys --custom-key "Header=Value" (repetible)
oauth2 --authorization-url, --token-url, --client-id, , --client-secret, --scopes
user-entra-token --audience <entra-audience>
project-managed-identity --audience <entra-audience> (opcional)
agentic-identity --audience <entra-audience>

Para la autenticación basada en identidades (user-entra-token, project-managed-identity, agentic-identity), asigne a la identidad correspondiente el rol RBAC necesario en el recurso de destino antes de llamar a la caja de herramientas.

Paso 2. Definición del cuadro de herramientas

# my-toolbox.yaml
description: MCP server tools
connections:
  - name: my-mcp-conn

Paso 3. Creación del cuadro de herramientas

azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

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://..."
  }
}

Este error es esperado. 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 solicitarlas.

Importante

  • Web Search usa Grounding con Bing Search y Grounding con Bing Custom Search, que son servicios de consumo de primera parte regidos por estos términos de uso de Grounding con Bing y la Declaración de privacidad de Microsoft.
  • El anexo de Protección de datos de Microsoft 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 costes. Consulte Precios para obtener detalles.
  • Consulte la sección de administración para obtener información sobre cómo los administradores de Azure pueden administrar el acceso al uso de 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 personalizado, agregue un objeto web_search.custom_search_configuration que apunte a su conexión de 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>",
  },
];

Predeterminado (basado en Bing Search, no requiere conexión):

# my-toolbox.yaml
description: Web search toolbox
tools:
  - type: web_search
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

Fundamento con Bing Custom Search:

# Step 1. Create the Bing Custom Search connection
azd ai connection create my-bing-custom \
  --kind GroundingWithCustomSearch \
  --target https://api.bing.microsoft.com/ \
  --auth-type api-key \
  --key "<bing-custom-search-key>"

--kind GroundingWithCustomSearch requiere la sintaxis exacta de PascalCase.

# Step 2. Define the toolbox (my-toolbox.yaml)
description: Bing Custom Search toolbox
connections:
  - name: my-bing-custom
    instance_name: your-bing-custom-instance
# Step 3. Create the toolbox
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

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>",
        },
      ],
    },
  },
];
# Step 1. Create the Azure AI Search connection
azd ai connection create my-search \
  --kind cognitive-search \
  --target "https://<your-search>.search.windows.net/" \
  --auth-type api-key \
  --key "<aisearch-admin-key>"

cognitive-search las conexiones también aceptan --auth-type project-managed-identity (sin clave). Al usar la identidad administrada por el proyecto, asigne a la identidad administrada asignada por el sistema del proyecto el rol Lector de datos de índice de búsqueda en el servicio de búsqueda.

# Step 2. Define the toolbox (my-toolbox.yaml)
description: Azure AI Search toolbox
connections:
  - name: my-search
    index: your-index-name
# Step 3. Create the toolbox
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

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 Tiene como valor predeterminado 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 bloques en result.structuredContent.documents[]. Cada documento incluye campos title, url, id y score que puede usar para generar detalles de referencia en su aplicación.

Intérprete de código

Use este patrón para permitir que el agente escriba y ejecute código de Python. El patrón no requiere una conexión de proyecto ni una configuración adicional.

Para cargar un archivo que el intérprete de código pueda utilizar a través de una caja de herramientas, cargue el archivo en el punto final Files de nivel de recurso (POST {account_endpoint}/openai/v1/files) con el encabezado x-aml-project-id. A diferencia del flujo del agente de indicaciones, los archivos cargados a través del punto de conexión Files con ámbito de proyecto (/api/projects/{name}/openai/v1/files) reciben un owner_id que el contenedor de herramientas no puede verificar, por lo que tools/call falla con un error de verificación de propiedad.

  1. Obtenga el GUID del proyecto de Azure Resource Manager. Utilice properties.amlWorkspace.internalId (formato UUID con guiones), noproperties.internalId (sin guiones — el contenedor de la caja de herramientas lo rechaza):

    ARM_TOKEN=$(az account get-access-token --query accessToken -o tsv)
    PROJECT_GUID=$(curl -s -H "Authorization: Bearer $ARM_TOKEN" \
      "https://management.azure.com/subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.CognitiveServices/accounts/{account}/projects/{project}?api-version=2025-06-01" \
      | jq -r '.properties.amlWorkspace.internalId')
    
  2. Cargue el archivo a nivel de cuenta (recurso) con el encabezado x-aml-project-id:

    TOKEN=$(az account get-access-token --resource https://ai.azure.com/.default --query accessToken -o tsv)
    curl -X POST "https://{account}.services.ai.azure.com/openai/v1/files" \
      -H "Authorization: Bearer $TOKEN" \
      -H "x-aml-project-id: $PROJECT_GUID" \
      -F "purpose=assistants" \
      -F "[email protected]"
    

El archivo id devuelto es el valor que se proporciona como <FILE_ID> en la configuración de la herramienta. Los archivos se montan en el espacio aislado en /mnt/data/{file-id}-{original-filename}. Consulte Intérprete de código para obtener ejemplos de carga adicionales y ejemplos específicos del lenguaje.

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

El intérprete de código no tiene conexión. Declárelo directamente debajo de tools:.

# my-toolbox.yaml
description: Code interpreter toolbox
tools:
  - type: code_interpreter
    container: { type: auto }
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

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 container_id de content[]._meta.container_id en la respuesta tools/call, y a continuación, llame a la API de Archivos del Contenedor 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

Utilice 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 referencias de almacenes de vectores vector_store_ids ya creados en su proyecto Foundry.

Para crear un archivo y un almacén de vectores para usar con una caja de herramientas, cargue el archivo en el punto de conexión de Files de en el nivel de recurso con el encabezado x-aml-project-id (el mismo requisito que para el intérprete de código — consulte la sección anterior para saber cómo obtener el GUID del proyecto de properties.amlWorkspace.internalId):

  1. Cargue el archivo: POST {account_endpoint}/openai/v1/files con purpose=assistants y el encabezado x-aml-project-id: {project-guid}.
  2. Cree un almacén de vectores: POST {account_endpoint}/openai/v1/vector_stores con el identificador de archivo devuelto y el mismo x-aml-project-id encabezado.

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

La búsqueda de archivos funciona sin conexión, pero requiere el ID de un almacén de vectores existente. Declárelo directamente debajo de tools:.

# my-toolbox.yaml
description: File search toolbox
tools:
  - type: file_search
    vector_store_ids:
      - vs_xxxxxxxxxxxx
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

Nota:

Cuando la búsqueda de archivos devuelve resultados a través de MCP, los metadatos de fragmento se incrustan en el contenido de la respuesta de la herramienta como marcadores 【index†filename†file_id【. 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 title, file_id, document_chunk_id y la relevancia score 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 utiliza la autenticación de identidad administrada, es necesario asignar el rol RBAC adecuado a la identidad administrada del proyecto Foundry en el servicio objetivo. Por ejemplo, asigne Lector o un rol superior para 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"
        }
      }
    }
  ]
}

Autenticación de conexión de proyecto:

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

Las herramientas de OpenAPI insertan la especificación directamente en tools:. La autenticación basada en conexión (connection_auth) hace referencia a una conexión de proyecto; las herramientas anónimas de OpenAPI no necesitan conexión.

Paso 1. (Opcional) Creación de la conexión de autenticación

Omita este paso para herramientas anónimas de OpenAPI.

# API-key auth (passed by the platform on every call)
azd ai connection create my-api-conn \
  --kind remote-tool \
  --target https://api.example.com \
  --auth-type custom-keys \
  --custom-key "Authorization=Bearer <token>"

Las herramientas de OpenAPI también aceptan --auth-type oauth2 conexiones. Consulte la sección MCP más arriba para ver la lista completa de indicadores azd ai connection create.

Paso 2. Definición del cuadro de herramientas

La especificación de OpenAPI está insertada en tools[].openapi.spec.

# my-toolbox.yaml
description: OpenAPI toolbox
tools:
  - type: openapi
    name: my-api
    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: my-api-conn

En el caso de las API anónimas, reemplace el auth: bloque por:

      auth:
        type: anonymous
        security_scheme:
          type: anonymous

Paso 3. Creación del cuadro de herramientas

azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

Agente a Agente (A2A)

Utiliza este patrón para llamar a otro agente a modo de 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>",
  },
];

Cree una conexión remote-a2a para el agente remoto y, a continuación, haga referencia a ella desde un archivo YAML mínimo de la caja de herramientas.

Paso 1. Creación de la conexión

Elija la variante de autenticación que necesita:

# No auth
azd ai connection create my-a2a-conn \
  --kind remote-a2a \
  --target https://your-remote-agent.azurecontainerapps.io \
  --auth-type none

# Custom-keys header
azd ai connection create my-a2a-conn \
  --kind remote-a2a \
  --target https://your-remote-agent.azurecontainerapps.io \
  --auth-type custom-keys \
  --custom-key "Authorization=Bearer <token>"

# OAuth — bring your own app registration
azd ai connection create my-a2a-conn \
  --kind remote-a2a \
  --target https://your-remote-agent.azurecontainerapps.io \
  --auth-type oauth2 \
  --authorization-url https://auth.example.com/authorize \
  --token-url https://auth.example.com/token \
  --client-id <oauth-client-id> \
  --client-secret <oauth-client-secret> \
  --scopes "<scope1> <scope2>"

# User Entra token (managed user identity passthrough)
azd ai connection create my-a2a-conn \
  --kind remote-a2a \
  --target https://your-remote-agent.azurecontainerapps.io \
  --auth-type user-entra-token \
  --audience "<entra-audience>"

# Project managed identity
azd ai connection create my-a2a-conn \
  --kind remote-a2a \
  --target https://your-remote-agent.azurecontainerapps.io \
  --auth-type project-managed-identity \
  --audience "<entra-audience>"

# Agentic identity
azd ai connection create my-a2a-conn \
  --kind remote-a2a \
  --target https://your-remote-agent.azurecontainerapps.io \
  --auth-type agentic-identity \
  --audience "<entra-audience>"
--auth-type Indicadores adicionales
none
custom-keys --custom-key "Header=Value" (repetible)
oauth2 --authorization-url, --token-url, --client-id, , --client-secret, --scopes
user-entra-token --audience <entra-audience>
project-managed-identity --audience <entra-audience> (opcional)
agentic-identity --audience <entra-audience>

Paso 2. Definición del cuadro de herramientas

# my-toolbox.yaml
description: Agent-to-Agent toolbox
connections:
  - name: my-a2a-conn

Paso 3. Creación del cuadro de herramientas

azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

Fabric IQ

Use este patrón para conceder al agente acceso a datos Microsoft Fabric ( ontologías, agentes de datos y modelos semánticos de Power BI) a través de Fabric IQ. Proporcione la conexión del proyecto, la dirección URL del servidor MCP y la etiqueta del servidor para el elemento de Fabric de destino.

{
  "description": "Fabric IQ for enterprise Fabric data access",
  "tools": [
    {
      "type": "fabric_iq_preview",
      "project_connection_id": "<CONNECTION_NAME>",
      "server_label": "<SERVER_LABEL>",
      "server_url": "<SERVER_URL>"
    }
  ]
}
tools = [
    {
        "type": "fabric_iq_preview",
        "project_connection_id": "<CONNECTION_NAME>",
        "server_label": "<SERVER_LABEL>",
        "server_url": "<SERVER_URL>",
    }
]

Fabric IQ se sirve como punto de conexión de MCP. Cree una conexión remote-tool al servidor de Fabric IQ con user-entra-token (recomendado; la identidad del autor de la llamada se reenvía a Fabric) y, a continuación, haga referencia a ella desde un archivo YAML de cuadro de herramientas mínimo.

# Step 1. Create the Fabric IQ connection
azd ai connection create my-fabric-conn \
  --kind remote-tool \
  --target https://api.fabric.microsoft.com/v1/mcp/fabricaihub/integrations/m365 \
  --auth-type user-entra-token \
  --audience https://analysis.windows.net/powerbi/api

remote-tool las conexiones también aceptan --auth-type oauth2. Para obtener el conjunto de marcas completo, consulte la sección MCP anterior.

# Step 2. Define the toolbox (my-toolbox.yaml)
description: Fabric IQ (semantic model)
tools:
  - type: fabric_iq_preview
    project_connection_id: my-fabric-conn
# Step 3. Create the toolbox
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

Para consultar los patrones por tipo de elemento de Fabric, consulte server_url.

Los fragmentos de anotación se devuelven en result.structuredContent.documents[]. Cada documento incluye los campos title y url, que puede utilizar para generar datos de cita en su aplicación.

Use este patrón para habilitar el enrutamiento de herramientas basado en intenciones. Cuando toolbox_search_preview se incluye en un cuadro de herramientas, la plataforma selecciona las herramientas más relevantes para cada solicitud en lugar de exponer todas las herramientas al modelo a la vez. No se requiere ninguna configuración adicional.

{
  "description": "Toolbox with intent-based tool routing",
  "tools": [
    {
      "type": "toolbox_search_preview"
    }
  ]
}
tools = [
    {"type": "toolbox_search_preview"}
]

Tool Search no requiere conexión. Declárelo directamente debajo de tools:.

# my-toolbox.yaml
description: Toolbox with intent-based tool routing
tools:
  - type: toolbox_search_preview
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

Nota:

toolbox_search_preview es una directiva de configuración que activa la búsqueda de herramientas. No aparece en las respuestas de tools/list y no cuenta para el límite de herramientas sin nombre por tipo.

Cuando la búsqueda de herramientas está habilitada, Foundry inserta dos meta-herramientas junto con las herramientas del cuadro de herramientas: tool_search y call_tool. La metaherramienta call_tool actúa como intermediario que permite a los frameworks de agentes invocar, mediante su nombre, cualquier herramienta descubierta a través de un único punto de entrada declarado. Esto evita errores de validación de esquema que se producen cuando un marco intenta llamar a una herramienta que no estaba presente en la inicial tools/list. Si el marco admite llamadas directas a herramientas sin validación previa del esquema, también puede llamar a una herramienta detectada directamente después de buscarla con tool_search.

En Foundry Toolkit for Visual Studio Code, seleccione Tool search en la Build a Custom Toolbox pestaña al crear o editar un cuadro de herramientas. Para obtener más información, consulte Habilitación de la búsqueda de herramientas en un cuadro de herramientas.

Work IQ

Use este patrón para conceder al agente acceso al contexto de trabajo del usuario Microsoft 365 ( correo electrónico, reuniones, archivos y chats) a través de Work IQ. Proporcione una conexión de proyecto al punto de conexión de Work IQ.

{
  "description": "Work IQ for Microsoft 365 data access",
  "tools": [
    {
      "type": "work_iq_preview",
      "project_connection_id": "<CONNECTION_NAME>"
    }
  ]
}
tools = [
    {
        "type": "work_iq_preview",
        "project_connection_id": "<CONNECTION_NAME>",
    }
]

Work IQ se ofrece como punto de conexión A2A. Cree una remote-a2a conexión con el servidor Work IQ con oauth2 y, a continuación, haga referencia a ella desde un cuadro de herramientas mínimo de YAML.

# Step 1. Create the Work IQ connection
azd ai connection create my-workiq-conn \
  --kind remote-a2a \
  --target https://agent365.svc.cloud.microsoft/agents/agents/workiq \
  --auth-type oauth2 \
  --authorization-url https://login.microsoftonline.com/common/oauth2/v2.0/authorize \
  --token-url https://login.microsoftonline.com/common/oauth2/v2.0/token \
  --client-id <oauth-client-id> \
  --client-secret <oauth-client-secret> \
  --scopes "<scope1> <scope2>"
# Step 2. Define the toolbox (my-toolbox.yaml)
description: Work IQ toolbox
tools:
  - type: work_iq_preview
    project_connection_id: my-workiq-conn
# Step 3. Create the toolbox
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

Automatización del explorador

{
  "description": "Perform actions using a real web browser",
  "tools": [
    {
      "type": "browser_automation_preview",
      "name": "<OPTIONAL_TOOL_NAME>",
      "description": "<Optional description for the model>",
      "browser_automation_preview": {
        "connection": {
          "project_connection_id": "<BROWSER_AUTOMATION_PROJECT_CONNECTION_ID>"
        }
      }
    }
  ]
}
from azure.ai.projects.models import (
    BrowserAutomationPreviewTool,
    BrowserAutomationToolParameters,
    BrowserAutomationToolConnectionParameters,
)

tools = [
    BrowserAutomationPreviewTool(
        browser_automation_preview=BrowserAutomationToolParameters(
            connection=BrowserAutomationToolConnectionParameters(
                project_connection_id="<BROWSER_AUTOMATION_PROJECT_CONNECTION_ID>",
            )
        )
    )
]
ProjectsAgentTool tool = new BrowserAutomationPreviewTool(
    new BrowserAutomationToolOptions(
        new BrowserAutomationToolConnectionParameters("<BROWSER_AUTOMATION_PROJECT_CONNECTION_ID>")
    )
);
const tools = [
  {
    type: "browser_automation_preview",
    name: "<OPTIONAL_TOOL_NAME>",
    description: "<Optional description for the model>",
    browser_automation_preview: {
      connection: {
          project_connection_id: "<BROWSER_AUTOMATION_PROJECT_CONNECTION_ID>"
      }
    }
  },
];
# Step 1. Create the Playwright Workspace connection
azd ai connection create my-browser-conn \
  --kind PlaywrightWorkspace \
  --target wss://your-browser-endpoint.api.playwright.microsoft.com/playwrightworkspaces/browsers \
  --auth-type api-key \
  --key "<playwright-workspaces-access-token>"

--kind PlaywrightWorkspace requiere la sintaxis exacta de PascalCase.

# Step 2. Define the toolbox (my-toolbox.yaml)
description: Browser Automation toolbox
tools:
  - type: browser_automation_preview
    project_connection_id: my-browser-conn
# Step 3. Create the toolbox
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

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 . No llame a send_ping(). Si el marco lo llama automáticamente (por ejemplo, Microsoft Agent Framework MCPStreamableHTTPTool._ensure_connected()), deshabilite la comprobación de ping o reemplace el método con una operación nula.
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).

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.

Una barrera de protección se identifica por el nombre de su directiva, que configuras en el portal de Foundry, en Barreras de protección. 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 WebSearchTool

endpoint = "https://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>"
project = AIProjectClient(endpoint=endpoint, credential=DefaultAzureCredential())

toolbox_version = project.beta.toolboxes.create_version(
    name="my-toolbox",
    description="Toolbox with guardrail",
    tools=[WebSearchTool()],
    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
Foundry-Features: Toolboxes=V1Preview

{
  "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.CreateToolboxVersion(
    toolboxName: "my-toolbox",
    description: "Toolbox with guardrail",
    tools: [new WebSearchTool()],
    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.beta.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 azd 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 contiene herramientas, incluya el mismo tools que usó en el Paso 1 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: Toolboxes=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.beta.toolboxes.create_version(
    name="my-toolbox",
    description="Toolbox with a skill reference",
    tools=[],
    skills=[
        ToolboxSkillReference(name="greeting"),              # use default version
        # ToolboxSkillReference(name="greeting", version="v1"),  # pin to v1
    ],
)
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 = "v1" }

ToolboxVersion toolboxVersion = toolboxClient.CreateToolboxVersion(
    name: "my-toolbox",
    tools: [],
    skills: [skillRef],
    description: "Toolbox with a skill reference"
);
Console.WriteLine($"Created toolbox version: {toolboxVersion.Id}");
const toolboxVersion = await project.beta.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 se pueden descubrir a través del punto de conexión MCP de la caja de herramientas mediante el SDK de Python de 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}",
        "Foundry-Features": "Toolboxes=V1Preview",
    }
    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.
// The Foundry-Features: Toolboxes=V1Preview opt-in header is required while the
// toolbox MCP surface is in preview.
await using var mcpClient = await McpClient.CreateAsync(
    new HttpClientTransport(
        new HttpClientTransportOptions
        {
            Endpoint = new Uri(toolboxMcpServerUrl),
            Name = toolboxName,
            TransportMode = HttpTransportMode.StreamableHttp,
            AdditionalHeaders = new Dictionary<string, string>
            {
                ["Foundry-Features"] = "Toolboxes=V1Preview",
            },
        },
        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.

Compatibilidad con redes virtuales

Cuando un proyecto de Foundry utiliza aislamiento de red (enlace privado), no se admiten todos los tipos de herramientas del conjunto 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 VNet Flujo de tráfico
MCP ✅ Soportado A través de la subred de la VNet
Búsqueda de Azure AI ✅ Soportado A través del punto de conexión privado
Intérprete de código ✅ Soportado Red troncal de Microsoft
Búsqueda web ✅ Soportado Punto de conexión público
OpenAPI ✅ Soportado Depende de la configuración de red de API de destino.
Búsqueda de archivos ❌ No se admite No disponible todavía
Agente a Agente (A2A) ✅ Soportado A través del punto de conexión privado
Fabric IQ ❌ No se admite No disponible todavía
Work IQ ❌ No se admite No disponible todavía
Automatización del explorador ❌ No se admite No disponible todavía

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 Configuración del 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.