Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Important
Les éléments indiqués comme (aperçu) dans cet article sont en aperçu public. Cette préversion est fournie sans contrat de niveau de service. Nous vous déconseillons donc de l’utiliser dans des charges de travail de production. Certaines fonctionnalités peuvent ne pas être prises en charge ou avoir des fonctionnalités contraintes. Pour plus d’informations, consultez Conditions d'utilisation supplémentaires pour les versions préliminaires de Microsoft Azure.
Un seul agent peut dépendre de plusieurs outils : API, serveurs MCP (Model Context Protocol), connecteurs et flux, chacun avec son propre modèle d’authentification et son équipe propriétaire. Lorsque vous effectuez une mise à l’échelle au sein d’une organisation, les équipes ré-implémentent les mêmes outils indépendamment, les informations d’identification sont dupliquées, la gouvernance devient incohérente et il n’y a pas de visibilité sur les outils qui existent ou qui les utilisent. Les développeurs se bloquent, non pas parce que les modèles ne sont pas capables, mais parce que l’intégration des outils devient le goulot d’étranglement.
Les entreprises disposent déjà de l’infrastructure : passerelles, coffres d’informations d’identification, stratégies et observabilité. Ce qui manque, c’est une expérience de développement qui empaquette cette infrastructure en quelque chose de réutilisable, détectable et régi par défaut.
La boîte à outils fournit cette expérience. Définissez un ensemble organisé d’outils une fois, gérez-les de manière centralisée dans Foundry et exposez-les via un point de terminaison compatible MCP unique que n’importe quel agent peut consommer. La plateforme gère l’injection d’informations d’identification, l’actualisation des jetons et l’application de la stratégie d’entreprise au moment de l’exécution.
Les outils couvrent le cycle de vie complet à travers quatre piliers : Créer et consommer sont disponibles dès aujourd’hui.
| Pilier | Statut | Ce qu’il permet |
|---|---|---|
| Construire | Disponible aujourd’hui | Sélectionnez des outils, configurez l’authentification de manière centralisée et publiez une boîte à outils réutilisable que n’importe quelle équipe peut consommer. |
| Consommer | Disponible aujourd’hui | Connectez n’importe quel agent à un point de terminaison compatible MCP unique pour découvrir et appeler dynamiquement tous les outils de la boîte à outils. |
Vous créez des boîtes à outils dans Foundry, mais la surface de consommation reste ouverte. Tout environnement d'exécution ou client compatible MCP peut utiliser une boîte à outils, y compris les agents créés avec n’importe quel cadre, les IDE compatibles MCP et le code personnalisé.
Étant donné qu’une boîte à outils est une ressource managée, vous pouvez ajouter, supprimer ou reconfigurer des outils sans modifier le code dans votre agent. Votre agent se connecte toujours à un seul point de terminaison. Le contrôle de version de la boîte à outils vous permet de contrôler explicitement quand les modifications prennent effet : créez et testez une nouvelle version, puis faites-la passer par défaut lorsque vous êtes prêt. Chaque agent qui pointe vers la boîte à outils récupère automatiquement la version promue, sans aucune modification de code et aucun redéploiement.
Dans cet article, vous allez apprendre à :
- Créez une boîte à outils avec un ou plusieurs outils.
- Récupérez le point de terminaison MCP de la boîte à outils.
- Vérifiez que les outils se chargent correctement.
- Intégrez une boîte à outils à votre agent hébergé.
- Gérer les versions de boîte à outils et promouvoir une version par défaut.
Pour connaître la syntaxe de configuration des outils et les options d’authentification pour chaque type d’outil, consultez Configurer des outils.
Prise en charge des fonctionnalités
| Fonction | SDK Python | REST API | Kit de développement logiciel (SDK) .NET | Kit de développement logiciel (SDK) JavaScript | azd (déployer) | Boîte à outils Foundry |
|---|---|---|---|---|---|---|
| Mise à jour de la boîte à outils, liste, récupération et suppression. | ✔️ | ✔️ | ✔️ | ✔️ | N/A | ✔️ |
| Création de la version de la boîte à outils | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Liste des versions de la boîte à outils, obtenir et supprimer | ✔️ | ✔️ | ✔️ | ✔️ | N/A | Non. L’interface utilisateur affiche uniquement la dernière version. |
| Outil MCP | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Outil De recherche web | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Outil de recherche Azure AI | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Outil Interpréteur de code | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Outil De recherche de fichiers | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Outil OpenAPI | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | Non |
| Outil Agent-to-Agent (A2A) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | Non |
Conditions préalables
- Un projet Microsoft Foundry actif.
-
RBAC : accordez le rôle utilisateur d'Azure AI sur le projet Foundry à chaque identité qui s’applique à votre scénario :
- Développeur (toujours requis) : identité qui crée, met à jour et gère les versions de boîte à outils.
- Identité de l’agent (obligatoire si vous utilisez un agent hébergé) : identité managée de l’agent qui appelle des outils au moment de l’exécution.
- Utilisateur final (requis uniquement pour les flux OAuth) : tout utilisateur dont l’identité est proxiée via des connexions OAuth ou UserEntraToken (par exemple, des flux MCP ou OBO basés sur OAuth).
- Votre projet Foundry doit se trouver dans l’une des régions prises en charge. Les types d’outils individuels au sein d’une boîte à outils sont plus limités par région et par modèle . Tous les types d’outils ne sont pas disponibles dans chaque région ou avec chaque modèle. Consultez la compatibilité des régions et des modèles.
- Visual Studio Code (VS Code).
- Installez le Microsoft Foundry Toolkit pour Visual Studio Code (anciennement AI Toolkit pour VS Code) à partir de la Place de marché Visual Studio Code. La prise en charge de la boîte à outils dans Foundry Toolkit est actuellement en version préliminaire.
- sdk Python :
pip install azure-ai-projects azure-identity -
.NET SDK :
dotnet add package Azure.AI.Projects --prereleaseetdotnet add package Azure.Identity -
Kit de développement logiciel (SDK) JavaScript :
npm install @azure/ai-projects @azure/identity -
azd (deploy) : Installer l’interface CLI Azure développeur et l’extension de l’agent :
azd extension install azure.ai.agents
Important
- Une boîte à outils prend en charge au maximum 'outil sans champ
namepar type d’outil (Recherche web, Recherche Azure AI, Interpréteur de code, Recherche de fichiers). Pour inclure plusieurs instances du même type d’outil, définissez une instance uniquenamesur chaque instance pour les différencier. Inclure deux instances du même type sansnamerenvoie une erreurinvalid_payload. Pour plus d’informations, consultez Plusieurs types d’outils. - Ajoutez un
descriptionà chaque outil de votre boîte à outils pour que le modèle puisse sélectionner l’outil approprié pour chaque requête. - Examinez attentivement la documentation de chaque outil pour en savoir plus sur la configuration, les limitations et les avertissements individuels des outils.
Étape 1 : Créer une version de boîte à outils
Créez une version de boîte à outils en fonction des outils dont vous avez besoin.
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import MCPTool, WebSearchTool
# Create Foundry project client
endpoint = "https://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>"
project = AIProjectClient(
endpoint=endpoint,
credential=DefaultAzureCredential(),
)
# Create toolbox version with web search and MCP tools
toolbox_version = project.beta.toolboxes.create_toolbox_version(
toolbox_name="my-toolbox",
description="Toolbox with web search and an MCP server",
tools=[
WebSearchTool(),
MCPTool(
server_label="myserver",
server_url="https://your-mcp-server.example.com",
require_approval="never",
project_connection_id="my-key-auth-connection",
),
],
)
print(f"Created toolbox: {toolbox_version.name}, version: {toolbox_version.version}")
using Azure.Identity;
using Azure.AI.Projects;
// Create Foundry project client
var projectEndpoint = "https://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>";
AIProjectClient projectClient = new(new Uri(projectEndpoint), new DefaultAzureCredential());
AgentToolboxes toolboxClient = projectClient.AgentAdministrationClient.GetAgentToolboxes();
ProjectsAgentTool webTool = ProjectsAgentTool.AsProjectTool(
ResponseTool.CreateWebSearchTool());
ProjectsAgentTool mcpTool = ProjectsAgentTool.AsProjectTool(ResponseTool.CreateMcpTool(
serverLabel: "myserver",
serverUri: new Uri("https://your-mcp-server.example.com"),
toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
GlobalMcpToolCallApprovalPolicy.NeverRequireApproval
)
));
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
toolboxName: "my-toolbox",
tools: [webTool, mcpTool],
description: "Toolbox with web search and an MCP server"
);
Console.WriteLine($"Created toolbox: {toolboxVersion.Name}, version: {toolboxVersion.Version}");
POST {project_endpoint}/toolboxes/my-toolbox/versions?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
{
"description": "Toolbox with web search and an MCP server",
"tools": [
{
"type": "web_search",
"description": "Search the web for current information"
},
{
"type": "mcp",
"server_label": "myserver",
"server_url": "https://your-mcp-server.example.com",
"require_approval": "never",
"project_connection_id": "my-key-auth-connection"
}
]
}
Note
Utilisez la portée https://ai.azure.com/.default du jeton pour obtenir le jeton porteur.
import { DefaultAzureCredential } from "@azure/identity";
import { AIProjectClient } from "@azure/ai-projects";
// Create Foundry project client
const projectEndpoint = "https://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>";
const project = new AIProjectClient(projectEndpoint, new DefaultAzureCredential());
const toolboxVersion = await project.beta.toolboxes.createVersion(
"my-toolbox",
[
{
type: "web_search",
description: "Search the web for current information",
},
{
type: "mcp",
server_label: "myserver",
server_url: "https://your-mcp-server.example.com",
require_approval: "never",
project_connection_id: "my-key-auth-connection",
},
],
{
description: "Toolbox with web search and an MCP server",
},
);
console.log(`Created toolbox: ${toolboxVersion.name}, version: ${toolboxVersion.version}`);
Utilisez Foundry Toolkit dans Visual Studio Code pour créer et publier une boîte à outils à partir de la vue Tools.
- Sélectionnez Foundry Toolkit dans la barre d’activité.
- Sous Mes ressources, développez Votre nom de projet>Outils.
- Sélectionnez l’icône + Ajouter une boîte à outils .
- Sous l’onglet Générer une boîte à outils personnalisée , entrez le nom et la description de la boîte à outils, ajoutez les outils souhaités, puis sélectionnez Publier.
La publication d’une nouvelle boîte à outils crée sa première version. Cette version devient automatiquement la version par défaut.
En utilisant azd, vous déclarez des ressources de boîte à outils dans un agent.yaml fichier au lieu d’appeler le Kit de développement logiciel (SDK). Définissez vos outils dans la section resources et déployez à l’aide de azd ai agent init. Pour obtenir agent.yaml des exemples pour chaque type d’outil, consultez Configurer des outils. Pour le flux de travail de déploiement complet, consultez Déployer avec azd.
Important
L’indicateur -m (ou --manifest) est requis pour azd ai agent init.
Il indique à la commande où rechercher la définition de votre agent et les fichiers sources.
-m peut pointer vers l’une ou l’autre des options suivantes :
-
Un fichier spécifique
agent.yaml: init copie tous les fichiers du même répertoire que le manifeste -
Dossier contenant
agent.yaml— init copie tous les fichiers de ce dossier
Tous les fichiers du répertoire manifeste (main.py, Dockerfile, requirements.txt, setup.py, et ainsi de suite) sont copiés dans le projet généré sous src/<agent-name>/.
# 1. Create a manifest directory with your agent.yaml + source files
mkdir my-agent/manifest
# Copy agent.yaml, main.py, Dockerfile, requirements.txt into my-agent/manifest/
# 2. Initialize the azd project (note: -m is REQUIRED)
cd my-agent
$PROJECT_ID = "/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.CognitiveServices/accounts/<account>/projects/<project>"
azd ai agent init -m https://github.com/microsoft/hosted-agents-vnext-private-preview/main/samples/python/toolbox/azd/agent.yaml --project-id $PROJECT_ID -e my-env
# Or equivalently: azd ai agent init -m manifest/ --project-id $PROJECT_ID -e my-env
# ↑ If your agent.yaml declares {{ param }} secrets (e.g., github_pat), you will be prompted to enter
# them interactively HERE — before init completes. This is the only safe time to supply credentials.
# NOTE: Do NOT use --no-prompt here — it skips the prompt and leaves {{ param }} credentials empty (see Troubleshooting: Credentials Empty with --no-prompt)
# 3. CRITICAL post-init fixes (see "Post-Init Checklist" below)
azd env set enableHostedAgentVNext "true" -e my-env
azd env set AZURE_AI_MODEL_DEPLOYMENT_NAME "gpt-4o" -e my-env # must match the deployment name in azure.yaml
# 4. Provision infrastructure (creates connections via Bicep)
azd provision -e my-env
# 5. Deploy agent (creates toolboxes, container image, agent version)
azd deploy -e my-env
# 6. Invoke the agent (MUST run from the scaffolded project directory)
azd ai agent invoke --new-session "tell me about the latest news in Microsoft Foundry" --timeout 120
Agent.yaml :
kind: hosted
name: toolbox-azd-test
description: LangGraph agent wired for toolbox MCP.
metadata:
tags:
- AI Agent Hosting
- LangGraph
# template: contains the ContainerAgent definition (kind: hosted).
# These fields are used to generate src/<agent>/agent.yaml during init.
template:
kind: hosted
protocols:
- protocol: responses
version: 1.0.0
environment_variables:
# FOUNDRY_PROJECT_ENDPOINT and FOUNDRY_AGENT_TOOLBOX_* are injected
# automatically by the platform at runtime — do NOT declare them here.
- name: AZURE_OPENAI_ENDPOINT
value: ${AZURE_OPENAI_ENDPOINT}
- name: AZURE_AI_MODEL_DEPLOYMENT_NAME
value: ${AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o}
- name: TOOLBOX_NAME
value: ${TOOLBOX_NAME=agent-tools}
# parameters: secret values prompted at init time (or set via azd env).
# azd uppercases the param name to find the env var: github_pat → GITHUB_PAT.
parameters:
github_pat:
secret: true
description: GitHub Personal Access Token (classic ghp_... or fine-grained github_pat_...)
# resources: connections and toolboxes scaffolded into azure.yaml by azd ai agent init.
resources:
- kind: connection
name: github-mcp-conn
target: https://api.githubcopilot.com/mcp
category: remoteTool
credentials:
type: CustomKeys
keys:
Authorization: "Bearer {{ github_pat }}"
- kind: toolbox
name: agent-tools
tools:
- type: web_search
- type: mcp
server_label: github
server_url: https://api.githubcopilot.com/mcp
project_connection_id: github-mcp-conn
Étape 2 : Obtenir le point de terminaison MCP de la boîte à outils
Deux modèles de point de terminaison existent selon votre rôle :
| Rôle | Point de terminaison | Quand utiliser |
|---|---|---|
| Développeur de boîte à outils | {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1 |
Testez ou validez une version spécifique avant de la promouvoir par défaut. |
| Utilisateur de boîte à outils | {project_endpoint}/toolboxes/{toolbox_name}/mcp?api-version=v1 |
Connectez les agents à la boîte à outils. Sert toujours le default_version. La première version que vous créez est automatiquement définie comme valeur par défaut. |
Important
Chaque demande au point de terminaison MCP de la boîte à outils doit inclure l’en-tête Foundry-Features: Toolboxes=V1Preview. Les appels qui omettent cet en-tête échouent. Incluez-le dans tous les clients HTTP, les transports MCP et les wrappers SDK qui appellent l'endpoint de la boîte à outils.
Note
La première version d’une nouvelle boîte à outils est automatiquement promue vers default_version (v1). Si vous devez modifier la valeur par défaut ultérieurement, consultez Promouvoir une version par défaut.
Dans Foundry Toolkit pour Visual Studio Code, copiez le point de terminaison consommateur de la boîte à outils depuis la vue Boîtes à outils.
- Sélectionnez Foundry Toolkit dans la barre d’activité.
- Sous Mes ressources, développez Votre nom de projet>Outils.
- Sous l’onglet Boîtes à outils , recherchez votre boîte à outils.
- Dans la colonne Endpoint URL, copiez l'endpoint.
La valeur de l'URL de point de terminaison est celle du point de terminaison consommateur de la boîte à outils. Pour construire un point de terminaison spécifique à la version, utilisez le modèle de développeur indiqué dans le tableau précédent.
Étape 3 : Vérifier la disponibilité des outils
Avant d’exécuter l’agent complet, vérifiez que la boîte à outils charge les outils attendus à l’aide d’un SDK client MCP sur le point de terminaison. Utilisez le point de terminaison spécifique de version pour valider une version avant de la promouvoir en tant que version par défaut.
Installez le Kit de développement logiciel (SDK) client MCP :
pip install mcp
Se connecter à la boîte à outils et aux outils de liste
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())
Note
Utilisez l’onglet API REST pour vérifier la disponibilité de l’outil à partir de .NET, ou utilisez le sdk client MCP Python.
Utilisez le point de terminaison spécifique à la version (/versions/{version}/mcp) pour valider une version avant de la promouvoir.
1. Initialisez la session 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. Envoyez la notification initialisée :
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. Répertorier les outils 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. Appelez un outil :
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":{}}}
Installez le Kit de développement logiciel (SDK) client MCP :
npm install @modelcontextprotocol/sdk
Se connecter à la boîte à outils et aux outils de liste
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();
Utilisez le point de terminaison de l’étape 2 avec un exemple d’agent hébergé sur échafaudage pour valider le chargement de la boîte à outils dans VS Code.
- Dans Foundry Toolkit, sous My Resources>Your project name>Tools, localisez la boîte à outils que vous souhaitez tester.
- Sélectionnez le modèle de code scaffold.
- Choisissez un dossier de projet lorsque vous y êtes invité.
- Suivez la génération
README.mdpour installer les dépendances, configurer des variables d’environnement et exécuter l’exemple localement. - Utilisez Agent Inspector ou exécutez
python main.pypour confirmer le chargement et la réponse des outils de boîte à outils.
Pour une validation spécifique à la version avant de promouvoir une nouvelle version de boîte à outils, utilisez l’onglet Python ou API REST dans cette étape.
Note
Utilisez l’onglet API REST pour vérifier la disponibilité de l’outil ou utilisez le sdk client MCP Python.
Vérifier : initialiser : HTTP 200. Si vous ignorez l’étape d’initialisation, les appels suivants échouent.
Vérifier : tools/list
-
len(tools) > 0: vide signifie que la version de la boîte à outils n’a pas été configurée correctement. - Chaque outil a
name,descriptionetinputSchema. Pour connaître les conventions d’affectation de noms des outils, consultez la spécification MCP. -
inputSchemaa unpropertieschamp (certains serveurs MCP omettent ce champ, ce qui interrompt OpenAI). - Pour les outils MCP, les noms sont précédés des préfixes suivants
server_label:myserver.some_toolpar exemple. Pour tous les autres types d’outils, le nom est la valeur dunamechamp ou le nom de l’outil par défaut. - Les outils MCP incluent un
_meta.tool_configurationbloc contenant des paramètres d’exécution tels querequire_approval. Consultez Gérer les exigences d’approbation de l’outil. - Notez les noms de paramètres exacts pour l’étape d’appel (par exemple
query, vsqueries).
Vérifier - tools/call:
- Aucun champ de niveau
errorsupérieur. S’il est présent, inspectezerror.code. Pour connaître les codes d’erreur MCP standard, consultez la spécification MCP :-
-32006→ consentement OAuth requis (extraire l’URL deerror.message). - D’autres codes → défaillance côté serveur.
-
-
result.content[]contient des entrées avec"type": "text": il s’agit de la sortie de l’outil. - Pour la recherche IA, vérifiez les métadonnées de segments de
result.structuredContent.documents[](title,url,id,score). - Pour la recherche de fichiers, vérifiez les
result.content[].resource._metamétadonnées de bloc (title,file_id,document_chunk_id,score). - Pour la recherche web, vérifiez
result.content[].resource._meta.annotations[]pour les citations d'URL (type,url,title,start_index,end_index). - Regardez le
"ServerError"contenu du texte : l’outil s’est exécuté mais a rencontré une erreur interne.
Exemples d’arguments spécifiques tools/call à l’outil :
| Type d’outil | Arguments |
|---|---|
| Recherche PAR IA | {"query": "search text"} |
| Recherche de fichiers | {"queries": ["search text"]} |
| Interpréteur de code | {"code": "print(2 ** 100)"} |
| Recherche web | {"search_query": "weather in seattle"} |
| A2A | {"message": {"parts": [{"type": "text", "text": "Hello"}]}} |
| MCP | {"query": "what is agent service"} |
Étape 4 : Intégrer la boîte à outils dans votre agent
LangGraph
.env fichier :
FOUNDRY_PROJECT_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>
FOUNDRY_AGENT_TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1
TOOLBOX_NAME=agent-tools
FOUNDRY_AGENT_TOOLBOX_FEATURES=Toolboxes=V1Preview
AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o
main.py (modèle clé) :
from langchain_azure_ai.tools import AzureAIProjectToolbox
toolbox = AzureAIProjectToolbox(toolbox_name=TOOLBOX_NAME)
tools = await toolbox.get_tools()
Consultez l’exemple complet de l’implémentation complète.
Important
La classe langchain_azure_ai.tools.AzureAIProjectToolbox nécessite langchain-azure-ai[tools]>1.2.3.
Infrastructure de l’agent Microsoft
Utilisez MCPStreamableHTTPTool depuis le SDK Agent Framework pour vous connecter directement au point de terminaison MCP de la boîte à outils.
.env fichier :
FOUNDRY_PROJECT_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>
FOUNDRY_AGENT_TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1
FOUNDRY_AGENT_TOOLBOX_FEATURES=Toolboxes=V1Preview
AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o
main.py (modèle clé) :
# Auth: wrap token provider in an httpx.Auth subclass
credential = DefaultAzureCredential()
token_provider = get_bearer_token_provider(credential, "https://ai.azure.com/.default")
http_client = httpx.AsyncClient(
auth=_ToolboxAuth(token_provider),
headers={"Foundry-Features": "Toolboxes=V1Preview"},
timeout=120.0,
)
# Toolbox MCP endpoint (platform-injected at runtime via FOUNDRY_AGENT_TOOLBOX_ENDPOINT)
TOOLBOX_ENDPOINT = "https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1"
# Connect MCPStreamableHTTPTool to the toolbox endpoint
mcp_tool = MCPStreamableHTTPTool(
name="toolbox",
url=TOOLBOX_ENDPOINT,
http_client=http_client,
load_prompts=False,
)
agent = chat_client.as_agent(
name="my-toolbox-agent",
instructions="You are a helpful assistant with access to Foundry toolbox tools.",
tools=[mcp_tool],
)
ResponsesAgentServerHost().run()
Consultez l’exemple complet de l’implémentation complète.
Copilot SDK
Utilisez le sdk GitHub Copilot pour créer un agent alimenté par la boîte à outils qui relie l'appel d'outils de Copilot au point de terminaison MCP de la boîte à outils Foundry.
Note
Le sdk Copilot rejette les noms d’outils contenant des points. Le pont remplace automatiquement . par _ dans les noms d’outils. Par exemple, myserver.get_info devient myserver_get_info.
.env fichier :
GITHUB_TOKEN=<your-github-token>
FOUNDRY_AGENT_TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1
agent.py (modèle clé — Pont 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"],
)
Consultez l’exemple complet de l’implémentation complète.
Infrastructure de l’agent Microsoft
Utilisez ResponsesServer depuis le SDK Agent Framework avec un outil personnalisé ToolboxMcpClient pour découvrir et invoquer des outils de boîte à outils via le point de terminaison MCP.
Variables d’environnement :
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 (modèle clé) :
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 encapsule les appels directs JSON-RPC au point de terminaison MCP.
ToolboxHandler les appels d’outil LLM par câbles renvoyent au client MCP en utilisant une boucle d’appel d’outils standard. Pour obtenir l’implémentation complète des deux classes, consultez l’exemple complet.
Note
Les exemples d’intégration pour cette étape sont disponibles uniquement pour Python et .NET.
Note
Les exemples d’intégration pour cette étape sont disponibles uniquement pour Python et .NET.
Utilisez Foundry Toolkit pour mettre en place un exemple d’agent hébergé déjà intégré à votre boîte à outils.
- Sélectionnez Foundry Toolkit dans la barre d’activité.
- Sous Mes ressources, développez Votre nom de projet>Outils.
- Sous l’onglet Boîtes à outils , recherchez la boîte à outils que vous souhaitez utiliser, puis sélectionnez Modèle de code de structure Scaffold.
- Dans la palette de commandes, choisissez un dossier de projet lorsque vous y êtes invité.
- Ouvrez le fichier généré
README.mdet suivez les étapes d’installation, d’exécution locale et de déploiement pour l’échafaudage.
Le projet généré inclut le point d’entrée de l’agent hébergé, les fichiers de déploiement et une README.md avec les étapes exactes de configuration, d’exécution et de déploiement. L’agent échafaudé s’occupe de l’en-tête Foundry-Features: Toolboxes=V1Preview pour vous.
Si vous souhaitez intégrer une boîte à outils dans un projet d’agent hébergé existant au lieu de générer un nouvel exemple, utilisez le point de terminaison copié à partir de l’étape 2 avec les modèles Python ou .NET de cette section.
Déployer avec azd
Utilisez l’interface CLI développeur Azure (azd) pour déclarer des ressources de boîte à outils directement dans un fichier agent.yaml et déployer votre agent avec une seule commande. À l’aide de cette approche, vous n’avez pas besoin de créer la boîte à outils séparément via le Kit de développement logiciel (SDK) ou REST.
azd configure ensemble la boîte à outils, les connexions et le déploiement du modèle.
Important
L’indicateur -m (ou --manifest) est requis pour azd ai agent init. Il indique à la commande où rechercher la définition de votre agent et les fichiers sources.
-m peut pointer vers un fichier spécifique agent.yaml ou un dossier contenant un fichier. Tous les fichiers du répertoire manifeste (main.py, Dockerfile, requirements.txt et ainsi de suite) sont copiés textuellement dans le projet généré sous src/<agent-name>/.
Structure de dossiers :
my-agent/
├── agent.yaml # Agent, toolbox, and connection declarations
├── main.py # LangGraph agent
├── requirements.txt # All dependencies (Azure SDK + PyPI packages)
├── Dockerfile # Container build
agent.yaml (exemple recherche web + GitHub MCP) :
name: my-toolbox-agent
description: LangGraph agent with Azure AI Foundry toolbox MCP.
metadata:
tags:
- AI Agent Hosting
- LangGraph
template:
name: my-toolbox-agent
kind: hosted
protocols:
- protocol: responses
version: 1.0.0
environment_variables:
# FOUNDRY_PROJECT_ENDPOINT and FOUNDRY_AGENT_TOOLBOX_* are injected
# automatically by the platform at runtime — do NOT declare them here.
- name: AZURE_AI_MODEL_DEPLOYMENT_NAME
value: ${AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o}
- name: TOOLBOX_NAME
value: ${TOOLBOX_NAME=agent-tools}
parameters:
github_pat:
secret: true
description: GitHub Personal Access Token for MCP connection
resources:
- kind: connection
name: github-mcp-conn
target: https://api.githubcopilot.com/mcp
category: RemoteTool
authType: CustomKeys
credentials:
keys:
Authorization: "Bearer {{ github_pat }}"
- kind: toolbox
name: agent-tools
description: Web search and GitHub MCP tools
tools:
- type: web_search
- type: mcp
server_label: github
server_url: https://api.githubcopilot.com/mcp
project_connection_id: github-mcp-conn
Note
Lorsque vous déployez avec les ressources de la boîte à outils spécifiées par agent.yaml, la plateforme injecte FOUNDRY_AGENT_TOOLBOX_ENDPOINT (URL de base) et TOOLBOX_{toolbox_name}_MCP_ENDPOINT (point de terminaison complet par boîte à outils) comme variables d’environnement. Pour la boîte à outils nommée agent-tools, la variable par boîte à outils devient TOOLBOX_AGENT_TOOLS_MCP_ENDPOINT. Votre main.py lit la variable par boîte à outils ou construit l'URL à partir de FOUNDRY_AGENT_TOOLBOX_ENDPOINT et TOOLBOX_NAME à l'exécution.
main.py suit le même modèle LangGraph illustré précédemment. En utilisant azd, FOUNDRY_AGENT_TOOLBOX_ENDPOINT et TOOLBOX_{toolbox_name}_MCP_ENDPOINT sont injectés automatiquement - aucune configuration de point de terminaison supplémentaire n’est nécessaire dans le code.
Déployer :
# 1. Place agent.yaml and source files in a manifest directory
mkdir my-agent/manifest
# Copy agent.yaml, main.py, Dockerfile, requirements.txt into my-agent/manifest/
# 2. Initialize the azd project (-m is required)
cd my-agent
PROJECT_ID="/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.CognitiveServices/accounts/<account>/projects/<project>"
azd ai agent init -m manifest/ --project-id $PROJECT_ID -e my-env
# If agent.yaml declares {{ param }} secrets (for example, github_pat), you are prompted
# to enter them interactively here. Do NOT use --no-prompt — it leaves credentials empty.
# 3. Set required environment variables
azd env set enableHostedAgentVNext "true" -e my-env
azd env set AZURE_AI_MODEL_DEPLOYMENT_NAME "gpt-4o" -e my-env
# 4. Provision infrastructure (creates connections via Bicep)
azd provision -e my-env
# 5. Deploy agent (creates toolboxes, container image, agent version)
azd deploy -e my-env
# 6. Invoke the agent
azd ai agent invoke --new-session "Hello, what tools do you have?" --timeout 120
Gérer les exigences d’approbation des outils
La boîte à outils renvoie un objet _meta.tool_configuration pour chaque entrée d'outil renvoyée par tools/list. Lorsqu’un outil est défini sur require_approval set to "always", le runtime de l’agent doit présenter l’action en attente à l’utilisateur et attendre la confirmation avant d’exécuter l’outil. Le point de terminaison MCP ne bloque nottools/call — l’application des règles relève entièrement de la responsabilité de l’environnement d’exécution de l’agent.
Lire require_approval à partir de tools/list
Chaque entrée d’outil dans une tools/list réponse contient un bloc _meta fourni par la boîte à outils :
{
"name": "myserver.my_tool",
"description": "...",
"inputSchema": { "type": "object" },
"_meta": {
"tool_configuration": {
"type": "mcp",
"server_label": "myserver",
"server_url": "https://your-mcp-server.example.com",
"require_approval": "always"
}
}
}
require_approval Valeur |
Comportement |
|---|---|
"always" |
L’agent doit demander à l’utilisateur une confirmation avant chaque appel. |
"never" |
L’agent peut appeler l’outil librement. |
Implémenter le processus de validation par approbation (LangGraph)
Interrogez tools/list au démarrage pour générer une carte d’approbation, puis intégrez une contrainte dans l’invite du système pour tout outil nécessitant une approbation :
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")
}
Après avoir chargé des outils à partir du client MCP, détectez les outils qui nécessitent une approbation et ajustez l’invite système :
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"]
Note
- La détection se produit au démarrage. La vérification d’approbation s’exécute une fois lorsque l’agent initialise. Il n’y a pas de surcharge par appel.
- Repli élégant. Si aucun outil n’a
require_approval: "always", l’invite système n’est pas modifiée et l’agent se comporte comme avant. -
require_approvalest appliquée par un agent. Le proxy MCP de boîte à outils s’exécutetools/callindépendamment de ce paramètre. Le runtime de votre agent est responsable de bloquer l’appel.
Configurer require_approval sur un outil
Définissez require_approval lors de la création d'une version de boîte à outils. Les exemples d'outils MCP à l'étape 1 montrent à la fois les valeurs de "always" et de "never". Vous pouvez également le définir via le Kit de développement logiciel (SDK) :
from azure.ai.projects.models import MCPTool
# Set require_approval on an MCP tool
toolbox_version = project.beta.toolboxes.create_toolbox_version(
toolbox_name="my-toolbox",
tools=[
MCPTool(
server_label="myserver",
server_url="https://your-mcp-server.example.com",
require_approval="always", # "always" | "never"
project_connection_id="my-connection",
)
],
)
{
"tools": [
{
"type": "mcp",
"server_label": "myserver",
"server_url": "https://your-mcp-server.example.com",
"require_approval": "always",
"project_connection_id": "my-connection"
}
]
}
ProjectsAgentTool mcpTool = ProjectsAgentTool.AsProjectTool(ResponseTool.CreateMcpTool(
serverLabel: "myserver",
serverUri: new Uri("https://your-mcp-server.example.com"),
toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval
)
));
const tools = [
{
type: "mcp",
server_label: "myserver",
server_url: "https://your-mcp-server.example.com",
require_approval: "always",
project_connection_id: "my-connection",
},
];
Utilisez l’onglet Python, .NET, JavaScript, API REST ou azd pour configurer require_approval dans votre définition de boîte à outils. Le flux de travail Foundry Toolkit de cet article se concentre sur la création et la consommation de la boîte à outils dans 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
Étape 5 : Gérer les versions de boîte à outils
Note
Vous pouvez gérer les versions de boîte à outils (lister, obtenir, promouvoir, supprimer) via le sdk Python, .NET SDK, le Kit de développement logiciel (SDK) JavaScript et l’API REST. L’interface CLI azd prend uniquement en charge la création de versions de boîte à outils pendant le déploiement.
Les versions des boîtes à outils sont des instantanés immuables de leur configuration d'outils. Chaque appel à l'endpoint de création produit un nouveau ToolboxVersionObject. Le parent ToolboxObject a un default_version champ qui contrôle la version utilisée par le point de terminaison MCP. La création d’une nouvelle version ne la promeut pas automatiquement . Vous décidez quand mettre à jour default_version. Ce processus vous permet d’effectuer des modifications, de tester une nouvelle version indépendamment et de la promouvoir en production selon votre propre planification.
| Objet | Champs clés | Description |
|---|---|---|
ToolboxObject |
id, name, default_version |
Conteneur de boîte à outils.
default_version pointe vers la version active. |
ToolboxVersionObject |
id, name, version, description, created_at, tools[], policies |
Capture instantanée immuable de la liste des outils de la boîte à outils à un moment donné. |
Créer une nouvelle version
Chaque appel de création produit une nouvelle version. Si la boîte à outils n’existe pas encore, le processus le crée automatiquement. Lorsque vous créez la première version d’une nouvelle boîte à outils, la version par défaut est v1 jusqu’à ce que vous mettez manuellement à jour vers une autre version.
# Create a new toolbox version
toolbox_version = project.beta.toolboxes.create_toolbox_version(
toolbox_name="my-toolbox",
description="Updated tools v2",
tools=[...],
)
print(f"Created version: {toolbox_version.version}")
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
toolboxName: "my-toolbox",
tools: [tool],
description: "Updated tools v2"
);
Console.WriteLine($"Created version: {toolboxVersion.Version}");
POST {project_endpoint}/toolboxes/my-toolbox/versions?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
{
"description": "Updated tools v2",
"tools": [...]
}
const toolboxVersion = await project.beta.toolboxes.createVersion(
"my-toolbox",
[/* tools array */],
{ description: "Updated tools v2" },
);
console.log(`Created version: ${toolboxVersion.version}`);
Utilisez l’onglet Python, .NET, JavaScript ou API REST pour créer une nouvelle version de boîte à outils. Le flux de travail du Foundry Toolkit présenté dans cet article se concentre sur la création d'une boîte à outils et la mise en place d'un agent hébergé qui l'utilise.
Cette opération n’est pas prise en charge avec azd. Pour créer une version de boîte à outils, utilisez l’onglet Python, .NET, API REST ou JavaScript.
La réponse est un ToolboxVersionObject contenant le nouvel identificateur version.
Répertorier les versions
# List all toolbox versions
versions = list(project.beta.toolboxes.list_toolbox_versions(toolbox_name="my-toolbox"))
for v in versions:
print(f"{v.version} — created {v.created_at}")
List<ToolboxVersion> versions = await toolboxClient
.GetToolboxVersionsAsync("my-toolbox")
.ToListAsync();
Console.WriteLine($"Found {versions.Count} toolbox version(s).");
foreach (ToolboxVersion v in versions)
{
Console.WriteLine($" - {v.Name} ({v.Version})");
}
GET {project_endpoint}/toolboxes/my-toolbox/versions?api-version=v1
Authorization: Bearer {token}
const versions = project.beta.toolboxes.listVersions("my-toolbox");
for await (const v of versions) {
console.log(`${v.version} — created ${v.createdAt}`);
}
Utilisez l’onglet Python, .NET, JavaScript ou API REST pour répertorier les versions de boîte à outils.
Cette opération n’est pas prise en charge avec azd. Pour répertorier les versions de boîte à outils, utilisez l’API Python, .NET, REST API ou JavaScript onglet.
Obtenir une version spécifique
# Get a specific toolbox version
version_obj = project.beta.toolboxes.get_toolbox_version(
toolbox_name="my-toolbox",
version="<version_id>",
)
ToolboxVersion versionObj = await toolboxClient.GetToolboxVersionAsync(
"my-toolbox",
"<version_id>"
);
Console.WriteLine($"Retrieved toolbox: {versionObj.Name} ({versionObj.Id})");
GET {project_endpoint}/toolboxes/my-toolbox/versions/{version}?api-version=v1
Authorization: Bearer {token}
const versionObj = await project.beta.toolboxes.getVersion(
"my-toolbox",
"<version_id>",
);
console.log(`Retrieved version: ${versionObj.version}`);
Utilisez l’onglet Python, .NET, JavaScript ou API REST pour obtenir une version spécifique de la boîte à outils.
Cette opération n’est pas prise en charge avec azd. Pour obtenir une version de boîte à outils spécifique, utilisez l’onglet Python, .NET, REST API ou JavaScript.
Promouvoir une version par défaut
Le point de terminaison MCP sert toujours le default_version. Pour changer la version active, mettez à jour la boîte à outils :
# Promote a version to default
toolbox = project.beta.toolboxes.update(
toolbox_name="my-toolbox",
default_version="<version_id>",
)
print(f"Active version: {toolbox.default_version}")
ToolboxRecord record = await toolboxClient.UpdateToolboxAsync(
"my-toolbox",
"<version_id>"
);
Console.WriteLine($"Active version: {record.DefaultVersion}");
PATCH {project_endpoint}/toolboxes/my-toolbox?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
{
"default_version": "<version_id>"
}
default_version ne peut pas être vide. Remplacez-le par une nouvelle version.
const toolbox = await project.beta.toolboxes.update(
"my-toolbox",
"<version_id>",
);
console.log(`Active version: ${toolbox.defaultVersion}`);
Utilisez l’onglet Python, .NET, JavaScript ou API REST pour promouvoir une version de boîte à outils par défaut.
Cette opération n’est pas prise en charge avec azd. Pour promouvoir une version par défaut, utilisez l’onglet Python, .NET, REST API ou JavaScript.
Supprimer une version
# Delete a toolbox version
project.beta.toolboxes.delete_toolbox_version(
toolbox_name="my-toolbox",
version="<version_id>",
)
await toolboxClient.DeleteToolboxVersionAsync(
"my-toolbox",
"<version_id>"
);
DELETE {project_endpoint}/toolboxes/my-toolbox/versions/{version}?api-version=v1
Authorization: Bearer {token}
await project.beta.toolboxes.deleteVersion(
"my-toolbox",
"<version_id>",
);
Utilisez l’onglet Python, .NET, JavaScript ou API REST pour supprimer une version de boîte à outils.
Cette opération n’est pas prise en charge avec azd. Pour supprimer une version de boîte à outils, utilisez l'onglet Python, .NET, REST API ou JavaScript.
Configurer des outils
Choisissez le type d’outil et le modèle d’authentification qui correspondent à votre scénario. Sélectionnez l’onglet de votre kit DE développement logiciel (SDK) ou de votre méthode de déploiement préférée.
Types d’outils multiples
Une boîte à outils unique peut regrouper différents types d’outils. L’exemple suivant combine recherche web, Recherche Azure AI et un serveur MCP dans une boîte à outils :
{
"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"
}
]
}
Note
Chaque type d’outil (web_search, azure_ai_search, code_interpreter, file_search) peut apparaître au maximum une fois sans name champ. Pour inclure plusieurs instances du même type, définissez une instance unique name sur chaque instance . Consultez l’exemple suivant.
Restrictions multi-outils
Vous pouvez inclure au maximum une instance de chaque type d’outil intégré dans une boîte à outils, à condition qu'il n'ait pas de champ name. Si vous incluez deux instances du même type sans un name, l’API retourne :
400 invalid_payload: Multiple tools without identifiers found...
Deux instances du même type d’outil
Utilisez le name champ pour inclure plusieurs instances du même type d’outil dans une boîte à outils. Chaque instance nommée est traitée comme un outil distinct et doit avoir un nom unique.
{
"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>"
}
]
}
}
]
}
Les sections suivantes montrent en détail la configuration de chaque type d’outil.
Model Context Protocol (MCP)
Authentification basée sur des clés :
{
"description": "my-mcp-toolbox",
"tools": [
{
"type": "mcp",
"server_label": "myserver",
"server_url": "https://your-mcp-server.example.com",
"project_connection_id": "my-mcp-connection"
}
]
}
Aucune authentification (serveur MCP public) :
{
"description": "Public MCP server",
"tools": [
{
"type": "mcp",
"server_label": "myserver",
"server_url": "https://your-mcp-server.example.com"
}
]
}
Authentification OAuth ou basée sur une identité :
Pour OAuth (connecteur managé, inscription d’application personnalisée), identité de l’agent ou authentification de jeton Entra de l’utilisateur, commencez par créer la connexion appropriée dans votre projet Foundry, puis référencez-la avec 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 connexion authType détermine le flux d’authentification. Les types d’authentification de connexion pris en charge pour MCP incluent CustomKeys, OAuth2 (géré ou personnalisé) AgenticIdentityet UserEntraToken. Consultez l’onglet azd pour obtenir des exemples de configuration de connexion pour chaque type d’authentification.
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",
},
];
Aucune authentification :
resources:
- kind: toolbox
name: mcp-tools
description: Public MCP server tools
tools:
- type: mcp
server_label: myserver
server_url: https://your-mcp-server.example.com
Authentification basée sur des clés :
parameters:
mcp_api_key:
secret: true
description: API key for the MCP server
resources:
- kind: connection
name: mcp-conn
target: https://your-mcp-server.example.com
category: RemoteTool
authType: CustomKeys
credentials:
keys:
Authorization: "Bearer {{ mcp_api_key }}"
- kind: toolbox
name: mcp-tools
description: MCP server tools with key auth
tools:
- type: mcp
server_label: myserver
server_url: https://your-mcp-server.example.com
project_connection_id: mcp-conn
OAuth - Connecteur managé :
Utilisez ce modèle pour les serveurs MCP qui prennent en charge le flux OAuth managé de Foundry. La connectorName valeur doit correspondre à un connecteur managé disponible dans le catalogue des outils Foundry.
resources:
- kind: connection
name: github-oauth-conn
category: RemoteTool
authType: OAuth2
target: https://api.githubcopilot.com/mcp
connectorName: foundrygithubmcp
- kind: toolbox
name: oauth-tools
description: GitHub OAuth MCP toolbox
tools:
- type: mcp
server_label: github
project_connection_id: github-oauth-conn
OAuth - Inscription d’application personnalisée :
Utilisez ce modèle lorsque vous apportez votre propre inscription d’application OAuth pour le serveur MCP.
parameters:
oauth_client_id:
secret: true
description: OAuth client ID
oauth_client_secret:
secret: true
description: OAuth client secret
resources:
- kind: connection
name: mcp-oauth-custom-conn
category: RemoteTool
authType: OAuth2
target: https://your-mcp-server.example.com
authorizationUrl: https://auth.example.com/authorize
tokenUrl: https://auth.example.com/token
refreshUrl: https://auth.example.com/token
scopes: []
credentials:
clientID: "{{ oauth_client_id }}"
clientSecret: "{{ oauth_client_secret }}"
- kind: toolbox
name: oauth-custom-tools
description: MCP toolbox with custom OAuth
tools:
- type: mcp
server_label: myserver
project_connection_id: mcp-oauth-custom-conn
Identité de l'agent (Entra ID) :
Utilisez ce modèle pour les serveurs MCP qui prennent en charge l’authentification Microsoft Entra ID. L’identité de l’agent Foundry s’authentifie auprès de la ressource cible.
resources:
- kind: connection
name: language-mcp
category: RemoteTool
authType: AgenticIdentity
audience: <entra-audience>
target: https://<resource>.cognitiveservices.azure.com/language/mcp?api-version=2025-11-15-preview
- kind: toolbox
name: agent-identity-tools
description: MCP toolbox with agent identity auth
tools:
- type: mcp
server_label: language
project_connection_id: language-mcp
Note
Vous devez affecter l’identité de votre agent au rôle RBAC requis sur la ressource cible avant que le serveur MCP n’accepte les demandes.
Jeton Entra utilisateur (1P OBO) :
Utilisez ce modèle pour les serveurs MCP qui nécessitent une identité utilisateur via le flux OBO (On-Behalf-Of). Foundry utilise le jeton Entra de l'utilisateur en tant que proxy vers le serveur MCP.
resources:
- kind: connection
name: workiq-mail-conn
category: RemoteTool
authType: UserEntraToken
audience: <entra-app-id>
target: https://agent365.svc.cloud.microsoft/agents/servers/mcp_MailTools
- kind: toolbox
name: workiq-tools
description: MCP toolbox with user Entra token auth
tools:
- type: mcp
server_label: workiq
project_connection_id: workiq-mail-conn
Note
Le audience champ est requis pour les connexions UserEntraToken. Sans cela, tools/list retourne aucun outil.
Important
La première fois qu’un utilisateur appelle une boîte à outils avec un MCP OAuth dans un projet, le point de terminaison MCP retourne une CONSENT_REQUIRED erreur (code -32006) avec une URL de consentement :
{
"error": {
"code": -32006,
"message": "User consent is required. Please visit: https://..."
}
}
Cette erreur est attendue. Ouvrez l’URL de consentement dans un navigateur, terminez le flux d’autorisation OAuth, puis réessayez l’appel de l’agent. Les appels suivants réussissent sans réinititation.
Recherche web
Important
- La recherche web (version préliminaire) utilise Grounding avec Recherche Bing et Grounding avec Recherche personnalisée Bing, qui sont des services de consommation internes régis par ces conditions d’utilisation Grounding avec Bing et la Déclaration de confidentialité Microsoft.
- L'Addendum de Protection des Données de Microsoft ne s'applique pas aux données envoyées à Grounding avec Bing Search et Grounding avec Bing Custom Search. Lorsque vous utilisez Grounding avec Recherche Bing et Grounding avec Recherche personnalisée Bing, les transferts de données se produisent en dehors de la conformité et des limites géographiques.
- L’utilisation de Grounding avec Recherche Bing et Grounding avec Recherche personnalisée Bing entraîne des coûts. Pour plus d’informations, consultez la tarification .
- Consultez la section management pour plus d’informations sur la façon dont les administrateurs Azure peuvent gérer l’accès à l’utilisation de la recherche web.
Utilisez ce modèle pour ajouter la recherche web. Aucune connexion de projet n’est requise pour la recherche web avec Grounding avec Bing. Pour utiliser un ancrage avec une instance de Recherche personnalisée Bing, ajoutez un objet web_search.custom_search_configuration pointant vers votre connexion d'ancrage avec Recherche Bing personnalisée.
{
"description": "Built-in web search",
"tools": [
{
"type": "web_search",
"name": "<OPTIONAL_TOOL_NAME>",
"description": "<Optional description for the model>"
}
]
}
Avec une connexion de recherche personnalisée Bing à la mise à la terre :
{
"description": "Custom Bing Search instance",
"tools": [
{
"type": "web_search",
"name": "<OPTIONAL_TOOL_NAME>",
"description": "<Optional description for the model>",
"web_search": {
"custom_search_configuration": {
"project_connection_id": "<BING_CONNECTION_NAME>",
"instance_name": "<BING_INSTANCE_NAME>"
}
}
}
]
}
from azure.ai.projects.models import WebSearchTool
tools = [
WebSearchTool()
]
ProjectsAgentTool tool = ProjectsAgentTool.AsProjectTool(
ResponseTool.CreateWebSearchTool()
);
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
toolboxName: "my-toolbox",
tools: [tool],
description: "Built-in web search"
);
const tools = [
{
type: "web_search",
name: "<OPTIONAL_TOOL_NAME>",
description: "<Optional description for the model>",
},
];
resources:
- kind: toolbox
name: websearch-tools
description: Web search toolbox
tools:
- type: web_search
Avec ancrage avec la Recherche personnalisée Bing
parameters:
bing_api_key:
secret: true
description: Bing API key
resources:
- kind: connection
name: bing-custom-conn
category: GroundingWithCustomSearch
authType: ApiKey
target: ""
credentials:
key: "{{ bing_api_key }}"
metadata:
ResourceId: /subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.Bing/accounts/<bing-account>
type: bing_custom_search
- kind: toolbox
name: bing-custom-tools
description: Bing Custom Search toolbox
tools:
- type: bing_custom_search
custom_search_configuration:
instance_name: your-bing-custom-instance
project_connection_id: bing-custom-conn
Note
Lorsque la recherche web retourne des résultats sur MCP, la réponse est un resource élément de contenu contenant la réponse synthétisée avec des liens sources Markdown inline. Les citations d’URL sont dans content[].resource._meta.annotations[]. Par exemple :
{
"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
}
}
Recherche Azure AI
{
"description": "Azure AI Search over my data",
"tools": [
{
"type": "azure_ai_search",
"name": "<OPTIONAL_TOOL_NAME>",
"description": "<Optional description for the model>",
"azure_ai_search": {
"indexes": [
{
"index_name": "<INDEX_NAME>",
"project_connection_id": "<CONNECTION_NAME>"
}
]
}
}
]
}
from azure.ai.projects.models import AzureAISearchTool
tools = [
AzureAISearchTool(
index_name="<INDEX_NAME>",
project_connection_id="<CONNECTION_NAME>",
)
]
ProjectsAgentTool tool = new AzureAISearchTool(
new AzureAISearchToolOptions(
indexes: [
new AzureAISearchIndexResource(
indexName: "<INDEX_NAME>",
projectConnectionId: "<CONNECTION_NAME>"
)
]
)
);
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
toolboxName: "my-toolbox",
tools: [tool],
description: "Azure AI Search over my data"
);
const tools = [
{
type: "azure_ai_search",
name: "<OPTIONAL_TOOL_NAME>",
description: "<Optional description for the model>",
azure_ai_search: {
indexes: [
{
index_name: "<INDEX_NAME>",
project_connection_id: "<CONNECTION_NAME>",
},
],
},
},
];
parameters:
ai_search_key:
secret: true
description: Azure AI Search admin key
resources:
- kind: connection
name: aisearch-conn
category: CognitiveSearch
authType: ApiKey
target: https://your-search-service.search.windows.net/
credentials:
key: "{{ ai_search_key }}"
- kind: toolbox
name: search-tools
description: Azure AI Search toolbox
tools:
- type: azure_ai_search
index_name: your-index-name
project_connection_id: aisearch-conn
Configurer les paramètres de l’outil
| paramètre de l’outil Recherche Azure AI | Obligatoire | Notes |
|---|---|---|
project_connection_id |
Oui | ID de ressource de la connexion de projet à Recherche Azure AI. |
index_name |
Oui | Nom de l’index dans votre ressource Recherche Azure AI. |
top_k |
Non | La valeur par défaut est 5. |
query_type |
Non | La valeur par défaut est vector_semantic_hybrid. Valeurs prises en charge : simple, , vectorsemantic, vector_simple_hybrid, vector_semantic_hybrid. |
filter |
Non | S’applique à toutes les requêtes effectuées par l’agent à l’index. |
Les résultats de la recherche incluent des métadonnées de bloc dans result.structuredContent.documents[]. Chaque document inclut title, urlet idscore les champs que vous pouvez utiliser pour générer des détails de citation dans votre application.
Interpréteur de code
Utilisez ce modèle pour permettre à l’agent d’écrire et d’exécuter Python code. Le modèle ne nécessite pas de connexion de projet ni de configuration supplémentaire.
Pour charger un fichier pour l’interpréteur de code à utiliser, appelez POST {project_endpoint}/openai/v1/files avec purpose=assistants. L’ID de fichier retourné est la valeur que vous fournissez comme <FILE_ID> dans la configuration de l’outil. Consultez l’interpréteur de code pour obtenir des exemples de chargement complets.
Important
Lorsque l’interpréteur de code est utilisé via une boîte à outils dans un agent hébergé, l’isolation utilisateur n’est pas prise en charge. Tous les utilisateurs du même projet partagent le même contexte de conteneur.
{
"description": "Code interpreter for data analysis",
"tools": [
{
"type": "code_interpreter",
"name": "<OPTIONAL_TOOL_NAME>",
"description": "<Optional description for the model>",
"container": {
"type": "auto",
"file_ids": ["<FILE_ID>"]
}
}
]
}
from azure.ai.projects.models import CodeInterpreterTool
tools = [
CodeInterpreterTool()
]
ProjectsAgentTool tool = ProjectsAgentTool.AsProjectTool(
ResponseTool.CreateCodeInterpreterTool(
new CodeInterpreterToolContainer()
)
);
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
toolboxName: "my-toolbox",
tools: [tool],
description: "Code interpreter for data analysis"
);
const tools = [
{
type: "code_interpreter",
name: "<OPTIONAL_TOOL_NAME>",
description: "<Optional description for the model>",
container: {
type: "auto",
file_ids: ["<FILE_ID>"],
},
},
];
resources:
- kind: toolbox
name: codeinterp-tools
description: Code interpreter toolbox
tools:
- type: code_interpreter
Télécharger des fichiers de sortie à partir de l’interpréteur de code
Lorsque l’interpréteur de code produit des fichiers de sortie (par exemple, un csv ou un graphique généré), procédez comme suit pour répertorier et télécharger ces fichiers.
Étape 1 : Répertorier les fichiers à l’aide de l’API conteneur
Extrayez container_id de content[]._meta.container_id dans la réponse tools/call, puis appelez l’API Container Files pour répertorier tous les fichiers du conteneur :
GET {project_endpoint}/containers/{container_id}/files?api-version=v1
Authorization: Bearer {token}
La réponse retourne une liste de fichiers avec leurs noms et ID.
Étape 2 : Télécharger le fichier à l’aide de l’API Fichier
Utilisez le nom de fichier retourné à l’étape 1 pour télécharger le fichier via le point de terminaison de téléchargement de l’API fichier.
Recherche de fichiers
Utilisez ce modèle pour permettre à l’agent de rechercher sur les fichiers chargés stockés dans un magasin vectoriel. Fournissez vector_store_ids des magasins vectoriels de référencement déjà créés dans votre projet Foundry.
Pour créer un fichier et un magasin de vecteurs, utilisez l’API {project_endpoint}/openai/v1 :
- Chargez votre fichier :
POST {project_endpoint}/openai/v1/filesavecpurpose=assistants. - Créez un magasin de vecteurs :
POST {project_endpoint}/openai/v1/vector_storesavec l’ID de fichier retourné.
L’ID de magasin de vecteurs résultant est la valeur que vous fournissez en tant que <VECTOR_STORE_ID>. Consultez Recherche de fichiers pour obtenir des exemples complets dans chaque langue.
Important
Lorsque la recherche de fichiers est utilisée via une boîte à outils dans un agent hébergé, l’isolation utilisateur n’est pas prise en charge. Tous les utilisateurs du même projet partagent l’accès au même magasin vectoriel.
{
"description": "Search over uploaded documents",
"tools": [
{
"type": "file_search",
"name": "<OPTIONAL_TOOL_NAME>",
"description": "<Optional description for the model>",
"file_search": {
"vector_store_ids": ["<VECTOR_STORE_ID>"]
}
}
]
}
from azure.ai.projects.models import FileSearchTool
tools = [
FileSearchTool(
vector_store_ids=["<VECTOR_STORE_ID>"]
)
]
ProjectsAgentTool tool = ProjectsAgentTool.AsProjectTool(
ResponseTool.CreateFileSearchTool(
vectorStoreIds: ["<VECTOR_STORE_ID>"]
)
);
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
toolboxName: "my-toolbox",
tools: [tool],
description: "Search over uploaded documents"
);
const tools = [
{
type: "file_search",
name: "<OPTIONAL_TOOL_NAME>",
description: "<Optional description for the model>",
file_search: {
vector_store_ids: ["<VECTOR_STORE_ID>"],
},
},
];
resources:
- kind: toolbox
name: filesearch-tools
description: File search toolbox
tools:
- type: file_search
vector_store_ids:
- ${FILE_SEARCH_VECTOR_STORE_ID}
Définissez l’ID du magasin vectoriel avant le déploiement :
azd env set FILE_SEARCH_VECTOR_STORE_ID "vs_xxxxxxxxxxxx"
Note
Lorsque la Recherche de fichiers retourne des résultats sur MCP, les métadonnées de chunk sont incorporées dans le contenu de réponse de l’outil sous forme de marqueurs 【index†filename†file_id】. Par exemple :
{
"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..."
}
}
]
}
}
Le _meta bloc à l’intérieur de chaque objet de ressource contient les title, file_id, document_chunk_id, et la pertinence score pour le bloc correspondant. Utilisez ces champs de métadonnées dans votre application pour générer des détails de citation ou un lien profond vers le fichier source.
OpenAPI
Utilisez ce modèle pour exposer n’importe quelle API REST décrite par une spécification OpenAPI. Choisissez le auth.type modèle de sécurité de votre API.
Important
Lorsque l’authentification d’identité managée est utilisée, vous devez affecter le rôle RBAC approprié à l’identité managée de votre projet Foundry sur le service cible. Par exemple, affectez le rôle Reader ou un rôle supérieur à la ressource Azure cible. Sans cette affectation, l’agent reçoit une 401 Unauthorized réponse lors de l’appel de l’API. Pour connaître les étapes d’installation complètes, consultez Authentifier à l’aide de l’identité managée.
Authentification anonyme :
{
"description": "REST API via OpenAPI spec",
"tools": [
{
"type": "openapi",
"openapi": {
"name": "my-api",
"spec": { "<paste OpenAPI spec object here>" },
"auth": {
"type": "anonymous"
}
}
}
]
}
Authentification de connexion de projet :
Utilisez ce modèle lorsque l’API nécessite une clé ou un jeton stocké dans une connexion de projet 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>"
}
}
}
}
]
}
Authentification d’identité managée :
Utilisez ce modèle lorsque l’API cible s’authentifie via Microsoft Entra ID. L’identité managée du projet Foundry appelle l’API pour le compte de l’agent. Vérifiez que l’identité managée a le rôle RBAC requis sur le service cible avant d’utiliser ce modèle.
{
"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",
},
},
},
];
Authentification basée sur des clés :
parameters:
api_key:
secret: true
description: API key for the target service
resources:
- kind: connection
name: api-conn
category: CustomKeys
authType: CustomKeys
target: https://api.example.com
credentials:
keys:
key: "{{ api_key }}"
- kind: toolbox
name: openapi-tools
description: OpenAPI key-auth toolbox
tools:
- type: openapi
openapi:
name: my-api
spec:
openapi: "3.0.1"
info:
title: "My API"
version: "1.0"
servers:
- url: https://api.example.com/v1
paths:
/search:
get:
operationId: search
parameters:
- name: query
in: query
required: true
schema:
type: string
responses:
"200":
description: OK
auth:
type: connection_auth
connection_id: api-conn
Agent à agent (A2A)
Utilisez ce modèle pour appeler un autre agent en tant qu’outil. Fournissez l’URL de base de l’agent distant et, si elle nécessite une authentification, une connexion de projet.
{
"description": "Delegate tasks to a specialist agent",
"tools": [
{
"type": "a2a_preview",
"name": "<AGENT_NAME>",
"description": "<What this agent does>",
"base_url": "<AGENT_BASE_URL>",
"project_connection_id": "<CONNECTION_NAME>"
}
]
}
from azure.ai.projects.models import A2APreviewTool
tools = [
A2APreviewTool(
name="<AGENT_NAME>",
description="<What this agent does>",
base_url="<AGENT_BASE_URL>",
project_connection_id="<CONNECTION_NAME>",
)
]
ProjectsAgentTool tool = new A2APreviewTool()
{
ProjectConnectionId = "<CONNECTION_NAME>",
};
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
toolboxName: "my-toolbox",
tools: [tool],
description: "Delegate tasks to a specialist agent"
);
const tools = [
{
type: "a2a_preview",
name: "<AGENT_NAME>",
description: "<What this agent does>",
base_url: "<AGENT_BASE_URL>",
project_connection_id: "<CONNECTION_NAME>",
},
];
resources:
- kind: connection
name: a2a-conn
category: RemoteA2A
authType: None
target: https://your-remote-agent.azurecontainerapps.io
- kind: toolbox
name: a2a-tools
description: Agent-to-Agent toolbox
tools:
- type: a2a_preview
project_connection_id: a2a-conn
Dépanner
| Symptôme | Cause probable | Correction |
|---|---|---|
tools/list ne renvoie aucun outil pour MCP ou A2A. |
Informations d’identification de connexion non valides ou manquantes pour le serveur MCP distant ou l’agent A2A. La boîte à outils ne peut pas récupérer les manifestes de l’outil à partir du point de terminaison distant sans authentification valide. | Vérifiez que les project_connection_id existent dans votre projet Foundry et que les identifiants sont corrects. Essayez de vous connecter directement au serveur MCP pour tester la configuration de l’authentification. Si vous utilisez une identité managée (PMI, identité de l’agent ou MI), vérifiez les attributions de rôle RBAC appropriées pour l’appelant sur la ressource cible. |
tools/list ne retourne aucun outil pour OpenAPI |
Spécification OpenAPI non valide. La boîte à outils construit le manifeste de l’outil à partir de la spécification, ce qui échoue si la spécification est incorrecte. | Validez votre contenu de spécification OpenAPI. Vérifiez qu’elle est conforme à OpenAPI 3.0 ou 3.1 et inclut des schémas valides paths, operationId de valeurs et de paramètres. Si vous utilisez l’authentification d’identité managée, vérifiez également les attributions de rôles RBAC sur le service cible. |
tools/list retourne moins d’outils que prévu |
Le allowed_tools filtre contient des noms d’outils incorrects ou mal orthographiés. Les noms d’outils sont sensibles à la casse et doivent suivre la spécification MCP pour les noms d’outils (pas d’espaces blancs ni de caractères spéciaux). |
Supprimez allowed_tools temporairement et appelez tools/list pour obtenir la liste complète des outils. Utilisez les noms exacts de la réponse pour définir des valeurs pour allowed_tools. |
tools/list Ne rend aucun outil (autres types d’outils) |
Boîte à outils non entièrement approvisionnée ou type d’outil non pris en charge dans la région. Pour les outils intégrés (Recherche web, RECHERCHE IA, Interpréteur de code, Recherche de fichiers), les manifestes d’outils sont construits côté serveur et ne nécessitent pas d’authentification , s’ils retournent vides, la version de la boîte à outils peut ne pas encore être provisionnée. | Patientez 10 secondes et réessayez. |
400 Multiple tools without identifiers |
Deux types d’outils sans nom dans une boîte à outils | Conservez au maximum un type sans nom ; ajoutez server_label à tous les outils MCP. |
CONSENT_REQUIRED (code -32006) |
La connexion OAuth nécessite le consentement de l’utilisateur | Ouvrez l’URL de consentement dans un navigateur et terminez le flux OAuth, puis réessayez. |
401 sur les appels MCP |
Jeton expiré ou périmètre incorrect | Utilisez l'étendue https://ai.azure.com/.default et actualisez le jeton. |
| Noms d’outils non correspondants | Les noms d’outils MCP sont préfixés par server_label |
Utilisez le format {server_label}.{tool_name} (par exemple, myserver.get_info). |
500 sur send_ping() |
Le serveur MCP de boîte à outils n’implémente pas la méthode MCP ping . |
N’appelez pas send_ping(). Si votre infrastructure l'appelle automatiquement (par exemple, Microsoft'infrastructure agent MCPStreamableHTTPTool._ensure_connected()), désactivez la vérification ping ou remplacez la méthode par un no-op. |
500 sur prompts/list |
Le serveur Foundry MCP n’implémente prompts/listpas . |
Passez load_prompts=False (ou l'équivalent) à votre constructeur de client MCP. |
500 sans streaming tools/call |
Le mode non streaming (stream=False) n’est pas pris en charge pour les points de terminaison MCP de boîte à outils. |
Toujours utiliser stream=True lors de l’appel des outils MCP de boîte à outils. |
500 sur tools/list |
Erreur de serveur temporaire | Réessayez après quelques secondes. |
| Variables d’environnement remplacées au moment de l’exécution | La plateforme réserve toutes les variables d’environnement préfixées FOUNDRY_ et peut remplacer silencieusement les valeurs définies par l’utilisateur. |
Renommez les variables d’environnement personnalisées pour éviter le FOUNDRY_ préfixe (par exemple, utilisez TOOLBOX_MCP_ENDPOINT plutôt que FOUNDRY_TOOLBOX_ENDPOINT). |
Prise en charge du réseau virtuel
Lorsque votre projet Foundry utilise l’isolation réseau (liaison privée), tous les types d’outils de boîte à outils ne sont pas pris en charge. Le tableau suivant indique l’état de prise en charge de chaque type d’outil et la façon dont le trafic circule dans un environnement isolé du réseau.
| Type d’outil | Prise en charge du réseau virtuel | Flux de trafic |
|---|---|---|
| MCP | ✅ Soutenu | Via votre sous-réseau de réseau virtuel |
| Recherche Azure AI | ✅ Soutenu | Via un point de terminaison privé |
| Interpréteur de code | ✅ Soutenu | Microsoft réseau principal |
| Recherche web | ✅ Soutenu | Point de terminaison public |
| OpenAPI | ✅ Soutenu | Dépend de la configuration réseau de l’API cible |
| Recherche de fichiers | ❌ Non pris en charge | Non encore disponible |
| Agent à agent (A2A) | ✅ Soutenu | Via un point de terminaison privé |
Pour obtenir des instructions de configuration complètes de l’isolation réseau, notamment l’injection de réseau virtuel pour le client agent, la configuration DNS et les exigences de point de terminaison privé, consultez Configurer l’isolation réseau pour Microsoft Foundry.
Compatibilité des régions et des modèles
La disponibilité de la boîte à outils dépend de deux facteurs au-delà de la région du projet :
- Région : certains types d’outils ne sont pas disponibles dans chaque région qui prend en charge le service d’agent. Par exemple, une région qui prend en charge le point de terminaison de boîte à outils peut ne pas prendre en charge tous les types d’outils intégrés.
Avant de déployer une boîte à outils, vérifiez que votre région cible prend en charge les types d’outils que vous envisagez d’utiliser. Pour obtenir les tables de compatibilité complètes, consultez la prise en charge des outils par région et par modèle.