Caixa de ferramentas do Microsoft Foundry

Uma caixa de ferramentas do Microsoft Foundry é um pacote do lado do servidor nomeado e com versão de configurações de ferramentas hospedadas, como interpretador de código, pesquisa de arquivos, geração de imagem, MCP e pesquisa na Web. As caixas de ferramentas permitem gerenciar a configuração da ferramenta uma vez na Foundry e reutilizá-la entre agentes.

O Agent Framework aborda o consumo da Caixa de Ferramentas. Crie e atualize as versões da Caixa de Ferramentas por meio do portal do Foundry ou do azure-ai-projects SDK.

Importante

FoundryToolbox é fornecido pelo pacote beta agent-framework-foundry-hosting e pode ser alterado antes da versão estável.

Para um serviço gerenciado FoundryAgent, anexe a Caixa de Ferramentas à definição do agente na Foundry. As diretrizes de consumo da caixa de ferramentas .NET do lado do cliente não estão documentadas no momento.

Instalar os pacotes

pip install agent-framework-foundry-hosting agent-framework-foundry --pre

FoundryToolbox é importado agent_framework.foundry e fornecido por agent-framework-foundry-hosting.

Configurar a caixa de ferramentas

Defina um ponto de extremidade de MCP da Caixa de Ferramentas explícita:

TOOLBOX_ENDPOINT="https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<name>/mcp?api-version=v1"

Ou deixe construir FoundryToolbox o ponto de extremidade:

FOUNDRY_PROJECT_ENDPOINT="https://<account>.services.ai.azure.com/api/projects/<project>"
TOOLBOX_NAME="<toolbox-name>"

Os exemplos de agente hospedado também são usados AZURE_AI_MODEL_DEPLOYMENT_NAME para FoundryChatClient.

Usar FoundryToolbox com um agente hospedado

FoundryToolboxresolve seu ponto de extremidade, autentica cada solicitação MCP com a credencial de Azure fornecida, encaminha a ID de chamada por solicitação da Foundry e participa do ciclo de vida de conexão do agente.

import asyncio
import os

from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient, FoundryToolbox, ResponsesHostServer
from azure.identity import DefaultAzureCredential
from dotenv import load_dotenv

# Load environment variables from .env file
load_dotenv()


async def main():
    credential = DefaultAzureCredential()

    # FoundryToolbox resolves the toolbox endpoint from the environment
    # (TOOLBOX_ENDPOINT, or FOUNDRY_PROJECT_ENDPOINT + TOOLBOX_NAME), authenticates
    # every request with the credential, and transparently forwards the platform
    # per-request call-id to the toolbox. The hosting server enters the agent, which
    # connects the toolbox on first use and closes it at shutdown.
    toolbox = FoundryToolbox(credential)

    # Create the chat client
    client = FoundryChatClient(
        project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
        model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
        credential=credential,
    )

    agent = Agent(
        client=client,
        instructions="You are a friendly assistant. Keep your answers brief.",
        tools=toolbox,
        # History will be managed by the hosting infrastructure, thus there
        # is no need to store history by the service. Learn more at:
        # https://developers.openai.com/api/reference/resources/responses/methods/create
        default_options={"store": False},
    )

    server = ResponsesHostServer(agent)
    await server.run_async()

Expor as habilidades da Caixa de Ferramentas

Uma caixa de ferramentas pode expor as habilidades do agente sobre o MCP. Defina load_tools=False quando apenas as habilidades devem ser visíveis para o modelo e, em seguida, adicione a Caixa de Ferramentas como uma ferramenta para que sua sessão MCP se conecte e use as_skills_provider() como um provedor de contexto.

import asyncio
import os

from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient, FoundryToolbox, ResponsesHostServer
from azure.identity import DefaultAzureCredential
from dotenv import load_dotenv

# Load environment variables from .env file
load_dotenv()


async def main() -> None:
    credential = DefaultAzureCredential()

    # FoundryToolbox resolves the toolbox endpoint from the environment
    # (TOOLBOX_ENDPOINT, or FOUNDRY_PROJECT_ENDPOINT + TOOLBOX_NAME), authenticates
    # every request with the credential, and forwards the platform per-request
    # call-id. ``load_tools=False`` keeps the toolbox's tools hidden so only its
    # Agent Skills (SEP-2640) are surfaced; passing it via ``tools=`` connects the
    # MCP session that ``as_skills_provider()`` reads from.
    toolbox = FoundryToolbox(credential, load_tools=False)

    # as_skills_provider() discovers skills from skill://index.json on the toolbox
    # MCP session and exposes them as an agent context provider; SKILL.md bodies are
    # fetched on demand via resources/read. disable_load_skill_approval=True registers
    # the load_skill tool with approval_mode="never_require" so this unattended agent
    # can load skills without an approval round-trip -- the Responses host runs the
    # agent without an AgentSession, which the default approval flow requires.
    skills_provider = toolbox.as_skills_provider(disable_load_skill_approval=True)

    client = FoundryChatClient(
        project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
        model=os.environ["AZURE_AI_MODEL_DEPLOYMENT_NAME"],
        credential=credential,
    )

    agent = Agent(
        client=client,
        name=os.environ.get("AGENT_NAME", "hosted-toolbox-mcp-skills"),
        instructions="You are a helpful assistant.",
        tools=toolbox,
        context_providers=[skills_provider],
        # History will be managed by the hosting infrastructure, thus there
        # is no need to store history by the service. Learn more at:
        # https://developers.openai.com/api/reference/resources/responses/methods/create
        default_options={"store": False},
    )

    server = ResponsesHostServer(agent)
    await server.run_async()

A aprovação permanece habilitada por padrão para operações de habilidade. Desabilite as aprovações individuais apenas para cenários confiáveis e autônomos.

Usar uma caixa de ferramentas com FoundryAgent

Anexe a caixa de ferramentas à definição do Prompt ou do Agente Hospedado no Foundry. FoundryAgent usa essa configuração de ferramenta armazenada; passar um lado do cliente da Caixa de Ferramentas não o adiciona ao agente gerenciado.

Conectar-se por meio de MCP bruto

Use MCPStreamableHTTPTool diretamente quando o aplicativo não usar o FoundryToolbox wrapper de hospedagem. Forneça o ponto de extremidade da Caixa de Ferramentas e um token de portador Entra ID por meio header_provider.

import asyncio
import os
from collections.abc import Callable
from typing import Any, cast

from agent_framework import Agent, MCPStreamableHTTPTool
from agent_framework.foundry import FoundryChatClient
from azure.core.credentials import TokenCredential
from azure.identity import AzureCliCredential, DefaultAzureCredential, get_bearer_token_provider
from dotenv import load_dotenv
def make_toolbox_header_provider(credential: TokenCredential) -> Callable[[dict[str, Any]], dict[str, str]]:
    """Build a header_provider that injects a fresh Azure AI bearer token on every MCP request."""
    get_token = get_bearer_token_provider(credential, "https://ai.azure.com/.default")

    def provide(_kwargs: dict[str, Any]) -> dict[str, str]:
        return {
            "Authorization": f"Bearer {get_token()}",
        }

    return provide


async def main() -> None:
    credential = DefaultAzureCredential()

    toolbox_tool = MCPStreamableHTTPTool(
        name="foundry_toolbox",
        description="Tools exposed by the configured Foundry toolbox",
        url=os.environ["FOUNDRY_TOOLBOX_ENDPOINT"],
        header_provider=make_toolbox_header_provider(credential),
        load_prompts=False,
    )

    async with Agent(
        client=FoundryChatClient(
            project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
            model=os.environ["FOUNDRY_MODEL"],
            credential=credential,
        ),
        instructions="You are a helpful assistant. Use the available toolbox tools to answer the user.",
        tools=toolbox_tool,
    ) as agent:
        query = "What tools do you have access to?"
        print(f"User: {query}")
        result = await agent.run(query)
        print(f"Assistant: {result}")

O exemplo de nível inferior usa FOUNDRY_TOOLBOX_ENDPOINT. O exemplo de habilidades da Caixa de Ferramentas usaFOUNDRY_TOOLBOX_MCP_SERVER_URL; esses nomes pertencem a esses exemplos e são separados das FoundryToolbox configurações e TOOLBOX_NAME da TOOLBOX_ENDPOINT classe.

Limitations

  • As ferramentas MCP dentro de uma Caixa de Ferramentas usam a autenticação do lado do servidor por meio de uma Foundry project_connection_id; o cliente do Agent Framework não mantém o token de portador DO MCP upstream.
  • Consumir uma Caixa de Ferramentas como um servidor MCP requer autenticação de Entra ID do lado do cliente para o ponto de extremidade da Caixa de Ferramentas.
  • Respostas de fluxo de consentimento, como CONSENT_REQUIRED são tratadas enquanto o agente é executado, não enquanto a conexão da Caixa de Ferramentas é criada.

Samples

Sample Description
foundry_toolbox/main.py FoundryToolbox com um agente de Respostas hospedado
foundry_toolbox_mcp_skills/main.py Habilidades de agente com suporte de caixa de ferramentas
foundry_chat_client_with_toolbox.py Consumo de MCP da caixa de ferramentas com MCPStreamableHTTPTool
foundry_chat_client_with_toolbox_skills.py Configuração de competências com suporte do Toolbox
invoke_foundry_toolbox_mcp Consumo de MCP do lado do fluxo de trabalho

No momento, o Go não expõe um auxiliar da Caixa de Ferramentas do Foundry. Configure caixas de ferramentas por meio do Foundry e use declarações de ferramentas locais ou hospedadas com suporte para agentes go.