Connecter des agents aux serveurs Model Context Protocol

Connectez vos agents Foundry aux serveurs MCP (Model Context Protocol) à l’aide de l’outil MCP. Cette connexion étend les fonctionnalités de l’agent avec des outils externes et des sources de données. En vous connectant à des points de terminaison de serveur MCP distants, le modèle Foundry de votre agent peut accéder aux outils hébergés par les développeurs et les organisations que les clients compatibles MCP, comme le service De l’agent Foundry, peuvent utiliser.

MCP est une norme ouverte qui définit la façon dont les applications fournissent des outils et des données contextuelles aux modèles de langage volumineux (LLMs). Il permet une intégration cohérente et évolutive d’outils externes dans des flux de travail de modèle.

Conseil

Envisagez d’ajouter cet outil à l’aide d’une boîte à outils. À l’aide d’une boîte à outils, vous pouvez réutiliser l’outil entre les agents et les runtimes, ainsi que centraliser la gestion des informations d’identification, le contrôle de version et l’application des stratégies via un point de terminaison MCP géré. Consultez le guide de démarrage rapide de la boîte à outils.

Dans cet article, vous allez apprendre à :

  • Ajoutez un serveur MCP distant en tant qu’outil.
  • Authentifiez-vous auprès d’un serveur MCP à l’aide d’une connexion de projet.
  • Passez en revue et approuvez les demandes des outils MCP.
  • Résolvez les problèmes courants d’intégration MCP.

Si vous utilisez un agent de codage comme GitHub Copilot, la compétence Microsoft Foundry peut aider à configurer les connexions d’outils MCP, l’authentification, le comportement d’approbation et les étapes de résolution des problèmes.

Conditions préalables

Avant de commencer, assurez-vous d’avoir :

  • Un abonnement Azure avec un projet Microsoft Foundry actif.

  • Le rôle Foundry User sur le projet Foundry pour créer et tester des agents. Si vous créez une connexion de projet pour l’authentification MCP, vous devez également disposer du rôle Foundry Project Manager sur ce projet.

    Important

    Les rôles Foundry RBAC ont été récemment renommés. Foundry User, Foundry Owner, Propriétaire du compteFoundry et Foundry Project Manager ont été précédemment nommés Azure utilisateur IA, Azure propriétaire d’IA, propriétaire Azure compte IA et Azure gestionnaire Project IA. Il se peut que vous voyiez encore les anciens noms à certains endroits pendant le déploiement de ce changement de nom. Les ID de rôle et les autorisations de base ne sont pas modifiés par ce changement de nom.

  • Package sdk le plus récent pour votre langue. Le sdk .NET est actuellement en préversion. Pour plus d’informations sur l’installation, consultez le guide de démarrage rapide.

  • Azure informations d’identification configurées pour l’authentification (telles que DefaultAzureCredential).

  • Accès à un point de terminaison de serveur MCP distant (tel que le serveur MCP de GitHub sur https://api.githubcopilot.com/mcp).

Choisir une tâche

Tâche Path
Connecter un agent et confirmer le premier appel d’outil réussi Suivez la connexion, approuvez, vérifiez et nettoyez l’itinéraire.
Ajouter des informations d’identification ou un accès basé sur l’identité Secondaire :Configurer l’authentification.
Se connecter à un point de terminaison MCP privé Secondaire :passez en revue les exigences relatives au point de terminaison public et privé.
Exécuter une longue opération en mode arrière-plan Secondaire :Configurer des opérations de longue durée.
Comprendre le comportement du streaming et du délai d’expiration Secondaire :passez en revue les limitations connues.
Configurer des options de serveur ou héberger un serveur local Secondaire :configurez la connexion MCP ou hébergez un serveur MCP local.

Pour plus d’informations conceptuelles sur le fonctionnement de l’intégration MCP, voir Fonctionnement.

Support d'utilisation

Le tableau suivant présente la prise en charge du SDK et de la configuration des connexions MCP.

Prise en charge de Microsoft Foundry SDK Python Kit de développement logiciel (SDK) C# Kit de développement logiciel (SDK) JavaScript Kit de développement logiciel (SDK) Java REST API Configuration de l’agent de base Configuration de l’agent standard
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

Points de terminaison de serveur MCP publics et privés

Le service Agent prend en charge les points de terminaison de serveur MCP publics et privés :

  • Points de terminaison publics : Connectez-vous à n’importe quel serveur MCP distant accessible publiquement. Cette option fonctionne avec les configurations d’agent De base et Standard.
  • Points de terminaison privés : Connectez-vous aux serveurs MCP qui ne sont pas exposés à l’Internet public. McP privé nécessite une configuration réseau privée et un sous-réseau MCP dédié au sein de votre réseau virtuel.

Pour les serveurs MCP privés, déployez votre serveur MCP sur Azure Container Apps avec entrée interne uniquement sur un sous-réseau MCP dédié délégué à Microsoft.App/environments. Pour commencer, utilisez le modèle 19-private-network-agents-tools-setup , qui provisionne l’infrastructure réseau requise, y compris le sous-réseau MCP ou 11-private-network-basic-project si vous ne souhaitez pas apporter vos propres ressources.

Pour plus d’informations sur la prise en charge des outils dans les environnements isolés du réseau, consultez Outils d’agent avec isolation réseau.

Utiliser les boîtes à outils Foundry comme points de terminaison MCP

Les boîtes à outils Foundry vous permettent de regrouper plusieurs outils( tels que la recherche web, l’interpréteur de code, la recherche de fichiers, les Recherche Azure AI, les serveurs MCP, les outils OpenAPI et les connexions agent à agent) dans un point de terminaison compatible MCP unique. Au lieu de configurer chaque outil séparément sur chaque agent, créez une boîte à outils dans Foundry et pointez votre agent vers le point de terminaison de la boîte à outils à l’aide de la configuration d’outil standard mcp (server_url et server_label).

Étant donné que le point de terminaison de la boîte à outils est compatible AVEC MCP, tout runtime pouvant consommer un serveur MCP peut également consommer une boîte à outils. Cette compatibilité inclut le service Foundry Agent, Microsoft Agent Framework, LangGraph, GitHub Copilot SDK et d’autres clients compatibles MCP. Vous pouvez ajouter, supprimer ou reconfigurer des outils dans la boîte à outils sans modifier votre code d’agent.

Pour connaître les étapes de configuration, consultez Créer et utiliser une boîte à outils Foundry.

Le point de terminaison MCP de la boîte à outils prend en charge les opérations de longue durée via des tâches MCP, fonctionnalité actuellement en préversion. Pour utiliser des outils de longue durée, assurez-vous que votre harnais d’agent prend en charge les tâches MCP.

Authentification et configuration de Toolbox MCP

Créez une connexion de projet pour votre serveur MCP avec le type d’authentification qui correspond à votre scénario, puis référencez-le à partir d’une boîte à outils MINIMALE YAML.

Étape 1. Créer la connexion

Exportez votre point de terminaison de projet et définissez-le comme projet actif pour les azd ai commandes :

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

Choisissez la variante d’authentification dont vous avez besoin :

# No auth — public MCP server
azd ai connection create my-mcp-conn \
  --kind remote-tool \
  --target https://learn.microsoft.com/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=******"

# 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 Indicateurs supplémentaires
none
custom-keys --custom-key "Header=Value" (répétable)
oauth2 --authorization-url, , --token-url--client-id, , --client-secret--scopes
user-entra-token --audience <entra-audience>
project-managed-identity --audience <entra-audience> (facultatif)
agentic-identity --audience <entra-audience>

Pour l’authentification basée sur l’identité (user-entra-token, , project-managed-identityagentic-identity), affectez le principal correspondant au rôle RBAC requis sur la ressource cible avant d’appeler la boîte à outils.

Étape 2. Définir la boîte à outils

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

Étape 3. Créer la boîte à outils

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

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.

Authentification

Chemin d’accès secondaire : Configurez l’authentification après la première réussite de l’itinéraire lorsque votre serveur MCP nécessite des informations d’identification ou un accès basé sur l’identité.

De nombreux serveurs MCP nécessitent une authentification.

Dans le service d'agent Foundry, utilisez une connexion de projet pour stocker les détails de l’authentification, tels que les clés API ou les jetons d'accès, au lieu de coder en dur les informations d’identification dans votre application.

Pour en savoir plus sur les options d’authentification prises en charge, notamment les identités basées sur des clés, les identités Microsoft Entra et le passage d’identité OAuth, consultez authentification du serveurMCP.

Note

Définissez project_connection_id sur l’ID de votre connexion de projet.

Conseil

Lorsque vous ajoutez le serveur MCP Azure DevOps via le catalogue Ajouter des outils, vous vous authentifiez auprès de Azure DevOps lors de l’étape de connexion de l’organisation et stockez l’authentification en tant que connexion de projet. Utilisez un privilège minimum et passez en revue les périmètres lors de la connexion de l'organisation.

Lorsque vous utilisez un point de terminaison MCP de boîte à outils Foundry, la boîte à outils gère de manière centralisée l’authentification. L'outil gère l'injection des informations d'identification, le rafraîchissement des jetons et l'application des politiques durant l'exécution pour tous les outils de l'ensemble. Les agents s'authentifient auprès du point de terminaison de boîte à outils lui-même en utilisant des informations d'identification Microsoft Entra, telles que DefaultAzureCredential, et les informations d'identification d'outil individuelles n'ont pas besoin d'être transmises par chaque agent. Pour la configuration de l’authentification de la boîte à outils, consultez les prérequis de la boîte à outils.

Considérations relatives à l’utilisation de serveurs et non-services Microsoft

Vous êtes soumis aux conditions entre vous et le fournisseur de services lorsque vous utilisez des services non-Microsoft connectés. Lorsque vous vous connectez à un service non Microsoft, vous transmettez certaines de vos données, telles que le contenu d’invite, au service non Microsoft, ou votre application peut recevoir des données du service non-Microsoft. Vous êtes responsable de votre utilisation de données et non services Microsoft, ainsi que des frais associés à cette utilisation.

Les tiers, pas Microsoft, créent les serveurs MCP distants que vous décidez d’utiliser avec l’outil MCP décrit dans cet article. Microsoft ne teste pas ou ne vérifie pas ces serveurs. Microsoft n’a aucune responsabilité vis-à-vis de vous ou d’autres en ce qui concerne votre utilisation de serveurs MCP distants.

Examinez et suivez attentivement les serveurs MCP que vous ajoutez au service De l’agent Foundry. Reposez sur les serveurs hébergés par des fournisseurs de services approuvés eux-mêmes plutôt que sur des proxys.

L’outil MCP vous permet de transmettre des en-têtes personnalisés, tels que des clés d’authentification ou des schémas, dont un serveur MCP distant peut avoir besoin. Passez en revue toutes les données que vous partagez avec des serveurs MCP distants et consignez les données à des fins d’audit. Tenez compte des pratiques non Microsoft pour la rétention et l’emplacement des données.

Note

Les boîtes à outils Foundry sont différentes des serveurs MCP tiers. Les boîtes à outils sont des ressources régies par l’organisation que vous créez et gérez dans votre projet Microsoft Foundry. Toutefois, vous êtes toujours responsable de la sélection des outils, de la gestion des données et de la conformité lors de l’organisation du contenu de la boîte à outils.

Meilleures pratiques

Pour obtenir des conseils généraux sur l’utilisation des outils, consultez les Meilleures pratiques pour utiliser les outils dans le service Microsoft Foundry Agent.

Lorsque vous utilisez des serveurs MCP, procédez comme suit :

  • Utilisez une liste d'autorisation d’outils à l’aide de allowed_tools.
  • Traitez les descriptions des outils, les annotations et les résultats des serveurs MCP distants comme une entrée non approuvée. Ils peuvent contenir des instructions indirectes d’injection d’invite.
  • Exiger une approbation pour les opérations à haut risque, en particulier les outils qui écrivent des données ou modifient des ressources.
  • Passez en revue le nom et les arguments de l’outil demandés avant d’approuver.
  • Passez en revue allowed_tools, les paramètres d’approbation et les autorisations de connexion lorsque l’exploitant du serveur, les outils exposés ou le comportement changent.
  • Journaliser les approbations et les appels d’outils pour l’audit et la résolution des problèmes.

Conseil

Lorsque vous ajoutez le serveur MCP Azure DevOps via le catalogue Add Tools, la configuration de sélection d’outils est mappée au comportement allowed_tools décrit dans cet article. La sélection d’un sous-ensemble d’outils dans l’interface utilisateur du catalogue équivaut à spécifier une allowed_tools liste dans le code.

Itinéraire de première réussite : connecter, approuver, vérifier et nettoyer

Utilisez l’exemple prompt-agent pour la langue que vous avez sélectionnée. Lorsque l’exemple comporte des onglets de type « agent », sélectionnez Prompt Agents. Cette route conserve la première exécution axée sur une tâche : connecter un serveur MCP, appeler un outil et inspecter le résultat.

  1. Connexion : Configurez l’outil MCP avec require_approval défini sur always, puis associez-le à l’agent.
  2. Approuver : Exécutez l’exemple, examinez le serveur, l’outil et les arguments demandés, puis approuvez uniquement l’appel attendu.
  3. Vérifiez : Vérifiez que la réponse finale contient des informations retournées par l’outil MCP, comme indiqué dans la sortie attendue.
  4. Nettoyage : Exécutez l’opération de nettoyage de l’exemple. Les exemples prompt-agent suppriment la version de l’agent, et l’exemple TypeScript supprime également sa conversation.

Créer un agent dans Python avec l’outil MCP

Utilisez l’exemple de code suivant pour créer un agent et appeler la fonction. Le sdk .NET est actuellement en préversion. Pour plus d’informations, consultez le guide de démarrage rapide .

L’exemple suivant montre comment ajouter le serveur MCP GitHub à une boîte à outils et attacher la boîte à outils à un agent. Sélectionnez Prompt Agents pour utiliser le SDK Azure AI Projects afin de créer un agent de prompt côté serveur, ou Hosted Agents pour utiliser le framework Agent FoundryChatClient afin de créer un agent éphémère dans le processus.

Agents déclencheurs

import json
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import PromptAgentDefinition, MCPTool
from openai.types.responses.response_input_param import McpApprovalResponse, ResponseInputParam

# Format: "https://resource_name.ai.azure.com/api/projects/project_name"
PROJECT_ENDPOINT = "your_project_endpoint"
MCP_CONNECTION_NAME = "my-mcp-connection"

# Create clients to call Foundry API
project = AIProjectClient(
    endpoint=PROJECT_ENDPOINT,
    credential=DefaultAzureCredential(),
)
openai = project.get_openai_client()

# [START tool_declaration]
tool = MCPTool(
    server_label="api-specs",
    server_url="https://api.githubcopilot.com/mcp",
    require_approval="always",
    project_connection_id=MCP_CONNECTION_NAME,
)
# [END tool_declaration]

# Create a prompt agent with MCP tool capabilities
agent = project.agents.create_version(
    agent_name="MyAgent7",
    definition=PromptAgentDefinition(
        model="gpt-5-mini",
        instructions="Use MCP tools as needed",
        tools=[tool],
    ),
)
print(f"Agent created (id: {agent.id}, name: {agent.name}, version: {agent.version})")

# Create a conversation to maintain context across multiple interactions
conversation = openai.conversations.create()
print(f"Created conversation (id: {conversation.id})")

# Send initial request that will trigger the MCP tool
response = openai.responses.create(
    conversation=conversation.id,
    input="What is my username in my GitHub profile?",
    extra_body={"agent_reference": {"name": agent.name, "type": "agent_reference"}},
)

# Process any MCP approval requests that were generated
input_list: ResponseInputParam = []
for item in response.output:
    if item.type == "mcp_approval_request" and item.id:
        print("MCP approval requested")
        print(f"  Server: {item.server_label}")
        print(f"  Tool: {getattr(item, 'name', '<unknown>')}")
        print(
            f"  Arguments: {json.dumps(getattr(item, 'arguments', None), indent=2, default=str)}"
        )

        # Approve only after you review the tool call.
        # In production, implement your own approval UX and policy.
        should_approve = (
            input("Approve this MCP tool call? (y/N): ").strip().lower() == "y"
        )
        input_list.append(
            McpApprovalResponse(
                type="mcp_approval_response",
                approve=should_approve,
                approval_request_id=item.id,
            )
        )

# Send the approval response back to continue the agent's work
response = openai.responses.create(
    input=input_list,
    previous_response_id=response.id,
    extra_body={"agent_reference": {"name": agent.name, "type": "agent_reference"}},
)

print(f"Response: {response.output_text}")

# Clean up resources by deleting the agent version
project.agents.delete_version(agent_name=agent.name, agent_version=agent.version)
print("Agent deleted")

Sortie attendue

L’exemple suivant montre la sortie attendue lorsque vous exécutez l’exemple :

Agent created (id: <agent-id>, name: MyAgent7, version: 1)
Created conversation (id: <conversation-id>)
Response: Your GitHub username is "example-username".
Agent deleted

Agents hébergés

Cet exemple utilise FoundryChatClient Microsoft Agent Framework, crée une boîte à outils contenant le serveur MCP GitHub, puis attache le point de terminaison de boîte à outils à votre agent hébergé avec FoundryToolbox. Installez les packages avec pip install agent-framework-foundry, définissez les variables d’environnement FOUNDRY_PROJECT_ENDPOINTFOUNDRY_MODEL et connectez-vous avec az login.

import asyncio

from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient, FoundryToolbox
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import MCPToolboxTool
from azure.identity import AzureCliCredential

PROJECT_ENDPOINT = "https://<account>.services.ai.azure.com/api/projects/<project>"
MCP_CONNECTION_NAME = "my-mcp-connection"


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

    # 1. Add the GitHub MCP server to a toolbox.
    project = AIProjectClient(endpoint=PROJECT_ENDPOINT, credential=credential)
    server_tool = MCPToolboxTool(
        server_label="api-specs",
        server_url="https://api.githubcopilot.com/mcp",
        require_approval="always",
        project_connection_id=MCP_CONNECTION_NAME,
    )
    toolbox = project.toolboxes.create_version(
        name="mcp-server-toolbox",
        description="Toolbox with the GitHub MCP server",
        tools=[server_tool],
    )

    # 2. The toolbox exposes an MCP-compatible endpoint.
    TOOLBOX_MCP_URL = (
        f"{PROJECT_ENDPOINT}/toolboxes/{toolbox.name}"
        f"/versions/{toolbox.version}/mcp?api-version=v1"
    )

    # 3. Attach the toolbox to the hosted agent as an MCP tool.
,
        timeout=120.0,
    )

    toolbox_tool = FoundryToolbox(credential, url=TOOLBOX_MCP_URL)

agent = Agent(
        client=FoundryChatClient(credential=credential),
        instructions="You are a helpful assistant that uses your MCP tool "
        "to help with Microsoft documentation questions.",
        tools=[toolbox_tool],
    )

    result = await agent.run("What is Microsoft Agent Framework?")
    print(f"Agent: {result.text}")

if __name__ == "__main__":
    asyncio.run(main())

Sortie attendue

L’agent interroge le serveur MCP de Microsoft Learn via l’endpoint de la boîte à outils et renvoie un texte fondé sur la documentation :

Agent: Microsoft Agent Framework is an open-source framework for building, orchestrating, and deploying AI agents ...

Pour connaître les modèles d’agent hébergé de la boîte à outils complète, consultez Utiliser une boîte à outils avec un agent hébergé.


Créer un agent avec l’outil MCP

L’exemple suivant montre comment ajouter un serveur MCP distant à une boîte à outils et attacher la boîte à outils à un agent. Sélectionnez Prompt Agents pour utiliser le SDK Azure AI Projects afin de créer un agent de prompt côté serveur, ou Agents hébergés pour utiliser le framework Microsoft Agent afin de créer un agent éphémère dans le processus.

Agents déclencheurs

L’exemple utilise des méthodes synchrones pour créer un agent. Pour connaître les méthodes asynchrones, consultez le code sample dans le Kit de développement logiciel (SDK) Azure pour .NET référentiel sur GitHub.

using System;
using Azure.AI.Projects;
using Azure.AI.Extensions.OpenAI;
using Azure.Identity;

// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
var projectEndpoint = "your_project_endpoint";

// Create project client to call Foundry API
AIProjectClient projectClient = new(
    endpoint: new Uri(projectEndpoint),
    tokenProvider: new DefaultAzureCredential());

// Create Agent with the `MCPTool`. Note that in this scenario 
// GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval is used,
// which means that any calls to the MCP server must be approved.
DeclarativeAgentDefinition agentDefinition = new(model: "gpt-5-mini")
{
    Instructions = "You are a helpful agent that can use MCP tools to assist users. Use the available MCP tools to answer questions and perform tasks.",
    Tools = { ResponseTool.CreateMcpTool(
        serverLabel: "api-specs",
        serverUri: new Uri("https://gitmcp.io/Azure/azure-rest-api-specs"),
        toolCallApprovalPolicy: new McpToolCallApprovalPolicy(GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval
    )) }
};
AgentVersion agentVersion = projectClient.AgentAdministrationClient.CreateAgentVersion(
    agentName: "myAgent",
    options: new(agentDefinition));

// If the tool approval is required, the response item is
// of `McpToolCallApprovalRequestItem` type and contains all
// the information about tool call. This example checks that
// the server label is "api-specs" and approves the tool call.
// All other calls are denied because they should not occur for
// the current configuration.
ProjectResponsesClient responseClient = projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agentVersion.Name);

CreateResponseOptions nextResponseOptions = new([ResponseItem.CreateUserMessageItem("Please summarize the Azure REST API specifications README")]);
ResponseResult latestResponse = null;

while (nextResponseOptions is not null)
{
    latestResponse = responseClient.CreateResponse(nextResponseOptions);
    nextResponseOptions = null;

    foreach (ResponseItem responseItem in latestResponse.OutputItems)
    {
        if (responseItem is McpToolCallApprovalRequestItem mcpToolCall)
        {
            nextResponseOptions = new CreateResponseOptions()
            {
                PreviousResponseId = latestResponse.Id,
            };
            if (string.Equals(mcpToolCall.ServerLabel, "api-specs"))
            {
                Console.WriteLine($"Approval requested for {mcpToolCall.ServerLabel} (tool: {mcpToolCall.ToolName})");
                Console.Write("Approve this MCP tool call? (y/N): ");
                bool approved = string.Equals(Console.ReadLine(), "y", StringComparison.OrdinalIgnoreCase);
                nextResponseOptions.InputItems.Add(ResponseItem.CreateMcpApprovalResponseItem(approvalRequestId: mcpToolCall.Id, approved: approved));
            }
            else
            {
                Console.WriteLine($"Rejecting unknown call {mcpToolCall.ServerLabel}...");
                nextResponseOptions.InputItems.Add(ResponseItem.CreateMcpApprovalResponseItem(approvalRequestId: mcpToolCall.Id, approved: false));
            }
        }
    }
}

// Output the final response from the agent.
Console.WriteLine(latestResponse.GetOutputText());

// Clean up resources by deleting the agent version.
projectClient.AgentAdministrationClient.DeleteAgentVersion(agentName: agentVersion.Name, agentVersion: agentVersion.Version);

Sortie attendue

L’exemple suivant montre la sortie attendue lorsque vous exécutez l’exemple :

Approval requested for api-specs...
Response: The Azure REST API specifications repository contains the OpenAPI specifications for Azure services. It is
organized by service and includes guidelines for contributing new specifications. The repository is intended for use by developers building tools and services that interact with Azure APIs.

Agents hébergés

Cet exemple crée la boîte à outils du serveur MCP avec le SDK Azure AI Projects, puis utilise l’intégration Microsoft Agent Framework AddFoundryToolboxes pour exposer les outils de boîte à outils à votre agent hébergé. Définissez les variables d’environnement AZURE_AI_PROJECT_ENDPOINT, AZURE_OPENAI_ENDPOINT et AZURE_AI_MODEL_DEPLOYMENT_NAME, puis connectez-vous avec az login.

using Azure.AI.AgentServer.Responses;
using Azure.AI.AgentServer.Responses.Models;
using Azure.AI.OpenAI;
using Azure.AI.Projects;
using Azure.AI.Extensions.OpenAI;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Foundry.Hosting;
using Microsoft.Extensions.DependencyInjection;
using OpenAI.Chat;

string projectEndpoint = Environment.GetEnvironmentVariable("AZURE_AI_PROJECT_ENDPOINT")
    ?? "https://<account>.services.ai.azure.com/api/projects/<project>";
string openAiEndpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")
    ?? throw new InvalidOperationException("AZURE_OPENAI_ENDPOINT is not set.");
string deploymentName = Environment.GetEnvironmentVariable("AZURE_AI_MODEL_DEPLOYMENT_NAME") ?? "gpt-5-mini";

DefaultAzureCredential credential = new();

// 1. Create the MCP server tool and add it to a toolbox.
AIProjectClient projectClient = new(endpoint: new Uri(projectEndpoint), tokenProvider: credential);
McpTool mcpTool = ResponseTool.CreateMcpTool(
    serverLabel: "api-specs",
    serverUri: new Uri("https://gitmcp.io/Azure/azure-rest-api-specs"),
    toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
        GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval));

ToolboxVersion toolboxVersion = projectClient.AgentAdministrationClient
    .GetAgentToolboxes().CreateToolboxVersion(
        toolboxName: "mcp-server-toolbox",
        tools: [ProjectsAgentTool.AsProjectTool(mcpTool)],
        description: "Toolbox with the GitHub MCP server");

// Create the hosted agent and register the toolbox integration.
AIAgent agent = projectClient.AsAIAgent(
    model: deploymentName,
    instructions: "You are a helpful assistant with access to the toolbox tools.",
    name: "hosted-toolbox-agent");

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddFoundryResponses(agent);
builder.Services.AddFoundryToolboxes(credential, toolboxVersion.Name);

var app = builder.Build();
app.MapFoundryResponses();
app.Run();

Sortie attendue

Lorsqu’il est appelé, l’agent hébergé interroge le serveur Microsoft Learn MCP via le point de terminaison de boîte à outils pour obtenir des extraits de documentation et des réponses :

User: How does one create an Azure storage account using the az CLI?

Agent: To create an Azure storage account using the az CLI, run: `az storage account create --name <name> --resource-group <rg> --location <region> --sku Standard_LRS` ...

Pour obtenir une intégration .NET Agent Framework gérée, consultez Utiliser une boîte à outils avec un agent hébergé.


Créer un agent à l’aide de l’outil MCP avec l’authentification de connexion de projet

Dans cet exemple, vous allez apprendre à vous authentifier auprès du serveur MCP GitHub à l’intérieur d’une boîte à outils, puis à attacher le point de terminaison MCP de la boîte à outils à un agent. L’exemple utilise des méthodes synchrones pour créer la boîte à outils et l’agent. Pour connaître les méthodes asynchrones, consultez le code sample dans le Kit de développement logiciel (SDK) Azure pour .NET référentiel sur GitHub.

Configurer la connexion de projet

Avant d’exécuter l’exemple :

  1. Connectez-vous à votre profil de GitHub.
  2. Sélectionnez l’image de profil en haut à droite.
  3. Sélectionnez Paramètres.
  4. Dans le volet gauche, sélectionnez Paramètres du développeur et Jetons > d’accès personnels (classique).
  5. En haut, sélectionnez Générer un nouveau jeton, entrez votre mot de passe et créez un jeton capable de lire les dépôts publics.
    • Important: Enregistrez le jeton ou laissez la page ouverte une fois la page fermée, le jeton ne peut pas être affiché à nouveau.
  6. Dans le portail Azure, ouvrez Microsoft Foundry.
  7. Sélectionnez Gérer dans le volet de navigation supérieur droit, sélectionnez Project détails, puis sélectionnez l’onglet Ressources connectées.
  8. Créez une nouvelle connexion de type clés personnalisées.
  9. Nommez-le et ajoutez une paire clé-valeur.
  10. Définissez le nom de clé sur Authorization et la valeur doit avoir une forme de Bearer your_github_token.

Exemple de code pour créer l’agent

using System;
using Azure.AI.Projects;
using Azure.AI.Extensions.OpenAI;
using Azure.Identity;

// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
var projectEndpoint = "your_project_endpoint";
var mcpConnectionName = "my-mcp-connection";

// Create project client to call Foundry API
AIProjectClient projectClient = new(
    endpoint: new Uri(projectEndpoint),
    tokenProvider: new DefaultAzureCredential());

// 1. Add the GitHub MCP server to a toolbox. Using a toolbox is the recommended
//    way to give agents tools. See /azure/foundry/agents/concepts/toolbox-overview
AgentToolboxes toolboxClient = projectClient.AgentAdministrationClient.GetAgentToolboxes();

McpTool mcpTool = ResponseTool.CreateMcpTool(
    serverLabel: "api-specs",
    serverUri: new Uri("https://api.githubcopilot.com/mcp"),
    toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
        GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval));
mcpTool.ProjectConnectionId = mcpConnectionName;

ToolboxVersion toolboxVersion = toolboxClient.CreateToolboxVersion(
    toolboxName: "mcp-server-toolbox",
    tools: [ProjectsAgentTool.AsProjectTool(mcpTool)],
    description: "Toolbox with the GitHub MCP server");

// 2. The toolbox exposes an MCP-compatible endpoint.
var toolboxMcpUrl = new Uri(
    $"{projectEndpoint}/toolboxes/{toolboxVersion.Name}" +
    $"/versions/{toolboxVersion.Version}/mcp?api-version=v1");

// 3. Create a remote-tool project connection that points at the toolbox endpoint.
//    Use a user Entra token so the caller's identity is passed through
//    (audience https://ai.azure.com). Create the connection once, for example
//    with the Azure Developer CLI:
//
//    azd ai connection create mcp-server-toolbox-conn \
//      --kind remote-tool \
//      --target "<toolboxMcpUrl>" \
//      --auth-type user-entra-token \
//      --audience https://ai.azure.com
var toolboxConnectionName = "mcp-server-toolbox-conn";

// 4. Attach the toolbox to a prompt agent as an MCP tool. Note that in this scenario
//    GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval is used, which means that
//    any calls to the toolbox MCP endpoint must be approved.
McpTool toolboxTool = ResponseTool.CreateMcpTool(
    serverLabel: "toolbox",
    serverUri: toolboxMcpUrl,
    toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
        GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval));
toolboxTool.ProjectConnectionId = toolboxConnectionName;

DeclarativeAgentDefinition agentDefinition = new(model: "gpt-5-mini")
{
    Instructions = "You are a helpful agent that can use MCP tools to assist users. Use the available MCP tools to answer questions and perform tasks.",
    Tools = { toolboxTool }
};
AgentVersion agentVersion = projectClient.AgentAdministrationClient.CreateAgentVersion(
    agentName: "myAgent",
    options: new(agentDefinition));

// If the tool approval is required, the response item is
// of McpToolCallApprovalRequestItem type and contains all
// the information about tool call. This example checks that
// the server label is "toolbox" and approves the tool call.
// All other calls are denied because they shouldn't happen given
// the current configuration.
ProjectResponsesClient responseClient = projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agentVersion.Name);

CreateResponseOptions nextResponseOptions = new([ResponseItem.CreateUserMessageItem("What is my username in my GitHub profile?")]);
ResponseResult latestResponse = null;

while (nextResponseOptions is not null)
{
    latestResponse = responseClient.CreateResponse(nextResponseOptions);
    nextResponseOptions = null;

    foreach (ResponseItem responseItem in latestResponse.OutputItems)
    {
        if (responseItem is McpToolCallApprovalRequestItem mcpToolCall)
        {
            nextResponseOptions = new()
            {
                PreviousResponseId = latestResponse.Id,
            };
            if (string.Equals(mcpToolCall.ServerLabel, "toolbox"))
            {
                Console.WriteLine($"Approval requested for {mcpToolCall.ServerLabel} (tool: {mcpToolCall.ToolName})");
                Console.Write("Approve this MCP tool call? (y/N): ");
                bool approved = string.Equals(Console.ReadLine(), "y", StringComparison.OrdinalIgnoreCase);
                nextResponseOptions.InputItems.Add(ResponseItem.CreateMcpApprovalResponseItem(approvalRequestId: mcpToolCall.Id, approved: approved));
            }
            else
            {
                Console.WriteLine($"Rejecting unknown call {mcpToolCall.ServerLabel}...");
                nextResponseOptions.InputItems.Add(ResponseItem.CreateMcpApprovalResponseItem(approvalRequestId: mcpToolCall.Id, approved: false));
            }
        }
    }
}

// Output the final response from the agent.
Console.WriteLine(latestResponse.GetOutputText());

// Clean up resources by deleting the agent version.
projectClient.AgentAdministrationClient.DeleteAgentVersion(agentName: agentVersion.Name, agentVersion: agentVersion.Version);

Sortie attendue

L’exemple suivant montre la sortie attendue lorsque vous exécutez l’exemple :

Approval requested for toolbox...
Response: Your GitHub username is "example-username".

Créer un agent dans TypeScript avec l’outil MCP

L’exemple TypeScript suivant montre comment ajouter un serveur MCP à une boîte à outils, attacher la boîte à outils à un agent, envoyer des demandes qui déclenchent des flux de travail d’approbation MCP, gérer les demandes d’approbation et nettoyer les ressources. Pour obtenir une version JavaScript, consultez l'exemple de code sur le référentiel GitHub du SDK Azure pour JavaScript.

import { DefaultAzureCredential } from "@azure/identity";
import { AIProjectClient } from "@azure/ai-projects";
import OpenAI from "openai";
import * as readline from "readline";

// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
const PROJECT_ENDPOINT = "your_project_endpoint";

export async function main(): Promise<void> {
  // Create clients to call Foundry API
  const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
  const openai = project.getOpenAIClient();

  console.log("Creating agent with MCP tool...");

  // 1. Add the Azure REST API specifications MCP server to a toolbox. Using a toolbox is
  //    the recommended way to give agents tools. See /azure/foundry/agents/concepts/toolbox-overview
  const toolbox = await project.toolboxes.createVersion(
    "mcp-server-toolbox",
    [
      {
        type: "mcp",
        server_label: "api-specs",
        server_url: "https://gitmcp.io/Azure/azure-rest-api-specs",
        require_approval: "always",
      },
    ],
    { description: "Toolbox with the Azure REST API specifications MCP server" },
  );

  // 2. The toolbox exposes an MCP-compatible endpoint.
  const toolboxMcpUrl =
    `${PROJECT_ENDPOINT}/toolboxes/${toolbox.name}` +
    `/versions/${toolbox.version}/mcp?api-version=v1`;

  // 3. Create a remote-tool project connection that points at the toolbox endpoint.
  //    Use a user Entra token so the caller's identity is passed through
  //    (audience https://ai.azure.com). Create the connection once, for example
  //    with the Azure Developer CLI:
  //
  //    azd ai connection create mcp-server-toolbox-conn \
  //      --kind remote-tool \
  //      --target "<toolboxMcpUrl>" \
  //      --auth-type user-entra-token \
  //      --audience https://ai.azure.com
  const toolboxConnectionName = "mcp-server-toolbox-conn";

  // 4. Attach the toolbox to a prompt agent as an MCP tool.
  // The toolbox tool requires approval for each operation to ensure user control over external requests.
  const agent = await project.agents.createVersion("agent-mcp", {
    kind: "prompt",
    model: "gpt-5-mini",
    instructions:
      "You are a helpful agent that can use MCP tools to assist users. Use the available MCP tools to answer questions and perform tasks.",
    tools: [
      {
        type: "mcp",
        server_label: "toolbox",
        server_url: toolboxMcpUrl,
        require_approval: "always",
        project_connection_id: toolboxConnectionName,
      },
    ],
  });
  console.log(`Agent created (id: ${agent.id}, name: ${agent.name}, version: ${agent.version})`);

  // Create a conversation thread to maintain context across multiple interactions
  console.log("\nCreating conversation...");
  const conversation = await openai.conversations.create();
  console.log(`Created conversation (id: ${conversation.id})`);

  // Send initial request that will trigger the MCP tool to access Azure REST API specs
  // This will generate an approval request since requireApproval="always"
  console.log("\nSending request that will trigger MCP approval...");
  const response = await openai.responses.create(
    {
      conversation: conversation.id,
      input: "Please summarize the Azure REST API specifications Readme",
    },
    {
      body: { agent_reference: { name: agent.name, type: "agent_reference" } },
    },
  );

  // Process any MCP approval requests that were generated
  // When requireApproval="always", the agent will request permission before accessing external resources
  const inputList: OpenAI.Responses.ResponseInputItem.McpApprovalResponse[] = [];

  const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
  const ask = (q: string) => new Promise<string>((resolve) => rl.question(q, resolve));
  for (const item of response.output) {
    if (item.type === "mcp_approval_request") {
      if (item.server_label === "toolbox" && item.id) {
        console.log(`\nReceived MCP approval request (id: ${item.id})`);
        console.log(`  Server: ${item.server_label}`);
        console.log(`  Tool: ${item.name}`);

        // Approve only after you review the tool call.
        // In production, implement your own approval UX and policy.
        const answer = (await ask("Approve this MCP tool call? (y/N): ")).trim().toLowerCase();
        const approve = answer === "y";
        inputList.push({
          type: "mcp_approval_response",
          approval_request_id: item.id,
          approve,
        });
      }
    }
  }

  rl.close();

  console.log(`\nProcessing ${inputList.length} approval request(s)`);
  console.log("Final input:");
  console.log(JSON.stringify(inputList, null, 2));

  // Send the approval response back to continue the agent's work
  // This allows the MCP tool to access the GitHub repository and complete the original request
  console.log("\nSending approval response...");
  const finalResponse = await openai.responses.create(
    {
      input: inputList,
      previous_response_id: response.id,
    },
    {
      body: { agent_reference: { name: agent.name, type: "agent_reference" } },
    },
  );

  console.log(`\nResponse: ${finalResponse.output_text}`);

  // Clean up resources by deleting the agent version and conversation
  // This prevents accumulation of unused resources in your project
  console.log("\nCleaning up resources...");
  await openai.conversations.delete(conversation.id);
  console.log("Conversation deleted");

  await project.agents.deleteVersion(agent.name, agent.version);
  console.log("Agent deleted");

  console.log("\nMCP sample completed!");
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
});

Sortie attendue

L’exemple suivant montre la sortie attendue lorsque vous exécutez l’exemple :

Creating agent with MCP tool...
Agent created (id: <agent-id>, name: agent-mcp, version: 1)

Creating conversation...
Created conversation (id: <conversation-id>)

Sending request that will trigger MCP approval...

Received MCP approval request (id: <approval-request-id>)
  Server: api-specs
  Tool: get-readme

Processing 1 approval request(s)
Final input:
[
  {
    "type": "mcp_approval_response",
    "approval_request_id": "<approval-request-id>",
    "approve": true
  }
]

Sending approval response...

Response: The Azure REST API specifications repository contains the OpenAPI specifications for Azure services. It is organized by service and includes guidelines for contributing new specifications. The repository is intended for use by developers building tools and services that interact with Azure APIs.

Cleaning up resources...
Conversation deleted
Agent deleted

MCP sample completed!

Créer un agent à l’aide de l’outil MCP avec l’authentification de connexion de projet

L’exemple TypeScript suivant montre comment ajouter un serveur MCP authentifié à une boîte à outils, attacher le point de terminaison MCP de boîte à outils à un agent, envoyer des demandes qui déclenchent des flux de travail d’approbation MCP, gérer les demandes d’approbation et nettoyer les ressources. Pour obtenir une version JavaScript, consultez l'exemple de code sur le référentiel GitHub du SDK Azure pour JavaScript.

import { DefaultAzureCredential } from "@azure/identity";
import { AIProjectClient } from "@azure/ai-projects";
import OpenAI from "openai";
import * as readline from "readline";

// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
const PROJECT_ENDPOINT = "your_project_endpoint";
const MCP_CONNECTION_NAME = "my-mcp-connection";

export async function main(): Promise<void> {
  // Create clients to call Foundry API
  const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
  const openai = project.getOpenAIClient();

  console.log("Creating agent with MCP tool using project connection...");

  // 1. Add the GitHub MCP server to a toolbox with project connection authentication.
  // The project connection should have Authorization header configured with "Bearer <GitHub PAT token>"
  // Token can be created at https://github.com/settings/personal-access-tokens/new
  const toolbox = await project.toolboxes.createVersion(
    "mcp-server-toolbox",
    [
      {
        type: "mcp",
        server_label: "api-specs",
        server_url: "https://api.githubcopilot.com/mcp",
        require_approval: "always",
        project_connection_id: MCP_CONNECTION_NAME,
      },
    ],
    { description: "Toolbox with the GitHub MCP server" },
  );

  // 2. The toolbox exposes an MCP-compatible endpoint.
  const toolboxMcpUrl =
    `${PROJECT_ENDPOINT}/toolboxes/${toolbox.name}` +
    `/versions/${toolbox.version}/mcp?api-version=v1`;

  // 3. Create a remote-tool project connection that points at the toolbox endpoint.
  //    Use a user Entra token so the caller's identity is passed through
  //    (audience https://ai.azure.com). Create the connection once, for example
  //    with the Azure Developer CLI:
  //
  //    azd ai connection create mcp-server-toolbox-conn \
  //      --kind remote-tool \
  //      --target "<toolboxMcpUrl>" \
  //      --auth-type user-entra-token \
  //      --audience https://ai.azure.com
  const toolboxConnectionName = "mcp-server-toolbox-conn";

  // 4. Attach the toolbox to a prompt agent as an MCP tool.
  const agent = await project.agents.createVersion("agent-mcp-connection-auth", {
    kind: "prompt",
    model: "gpt-5-mini",
    instructions: "Use MCP tools as needed",
    tools: [
      {
        type: "mcp",
        server_label: "toolbox",
        server_url: toolboxMcpUrl,
        require_approval: "always",
        project_connection_id: toolboxConnectionName,
      },
    ],
  });
  console.log(`Agent created (id: ${agent.id}, name: ${agent.name}, version: ${agent.version})`);

  // Create a conversation thread to maintain context across multiple interactions
  console.log("\nCreating conversation...");
  const conversation = await openai.conversations.create();
  console.log(`Created conversation (id: ${conversation.id})`);

  // Send initial request that will trigger the MCP tool
  console.log("\nSending request that will trigger MCP approval...");
  const response = await openai.responses.create(
    {
      conversation: conversation.id,
      input: "What is my username in my GitHub profile?",
    },
    {
      body: { agent_reference: { name: agent.name, type: "agent_reference" } },
    },
  );

  // Process any MCP approval requests that were generated
  const inputList: OpenAI.Responses.ResponseInputItem.McpApprovalResponse[] = [];

  const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
  const ask = (q: string) => new Promise<string>((resolve) => rl.question(q, resolve));
  for (const item of response.output) {
    if (item.type === "mcp_approval_request") {
      if (item.server_label === "toolbox" && item.id) {
        console.log(`\nReceived MCP approval request (id: ${item.id})`);
        console.log(`  Server: ${item.server_label}`);
        console.log(`  Tool: ${item.name}`);

        // Approve only after you review the tool call.
        // In production, implement your own approval UX and policy.
        const answer = (await ask("Approve this MCP tool call? (y/N): ")).trim().toLowerCase();
        const approve = answer === "y";
        inputList.push({
          type: "mcp_approval_response",
          approval_request_id: item.id,
          approve,
        });
      }
    }
  }

  rl.close();

  console.log(`\nProcessing ${inputList.length} approval request(s)`);
  console.log("Final input:");
  console.log(JSON.stringify(inputList, null, 2));

  // Send the approval response back to continue the agent's work
  // This allows the MCP tool to access the GitHub repository and complete the original request
  console.log("\nSending approval response...");
  const finalResponse = await openai.responses.create(
    {
      input: inputList,
      previous_response_id: response.id,
    },
    {
      body: { agent_reference: { name: agent.name, type: "agent_reference" } },
    },
  );

  console.log(`\nResponse: ${finalResponse.output_text}`);

  // Clean up resources by deleting the agent version and conversation
  // This prevents accumulation of unused resources in your project
  console.log("\nCleaning up resources...");
  await openai.conversations.delete(conversation.id);
  console.log("Conversation deleted");

  await project.agents.deleteVersion(agent.name, agent.version);
  console.log("Agent deleted");

  console.log("\nMCP with project connection sample completed!");
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
});

Sortie attendue

L’exemple suivant montre la sortie attendue lorsque vous exécutez l’exemple :

Creating agent with MCP tool using project connection...
Agent created (id: <agent-id>, name: agent-mcp-connection-auth, version: 1)
Creating conversation...
Created conversation (id: <conversation-id>)
Sending request that will trigger MCP approval...
Received MCP approval request (id: <approval-request-id>)
  Server: toolbox
  Tool: get-github-username
Processing 1 approval request(s)
Final input:
[
  {
    "type": "mcp_approval_response",
    "approval_request_id": "<approval-request-id>",
    "approve": true
  }
]
Sending approval response...
Response: Your GitHub username is "example-username".
Cleaning up resources...
Conversation deleted
Agent deleted
MCP with project connection sample completed!

Utiliser les outils MCP dans un agent Java

Conseil

La plupart des agents utilisent une boîte à outils pour ajouter l’outil de recherche de fichiers et attacher la boîte à outils à votre agent en tant qu’outil MCP. *Si vous utilisez le Kit de développement logiciel (SDK) Java, une API permettant de créer des boîtes à outils n’est pas encore disponible. Créez une boîte à outils à l'aide de l'Python, de l'API REST, de C#, de TypeScript ou du portail Foundry, puis référencez son point de terminaison MCP à partir de votre agent Java en tant que McpTool.

Ajoutez la dépendance à votre pom.xml:

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-ai-agents</artifactId>
    <version>2.2.0</version>
</dependency>

Créer un agent avec l’outil MCP

import com.azure.ai.agents.AgentsClient;
import com.azure.ai.agents.AgentsClientBuilder;
import com.azure.ai.agents.ResponsesClient;
import com.azure.ai.agents.models.AgentReference;
import com.azure.ai.agents.models.AgentVersionDetails;
import com.azure.ai.agents.models.AzureCreateResponseOptions;
import com.azure.ai.agents.models.McpTool;
import com.azure.ai.agents.models.PromptAgentDefinition;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.openai.models.responses.Response;
import com.openai.models.responses.ResponseCreateParams;

import java.util.Collections;

public class McpToolExample {
    public static void main(String[] args) {
        // Format: "https://resource_name.ai.azure.com/api/projects/project_name"
        String projectEndpoint = "your_project_endpoint";
        // Create the toolbox out-of-band by using Python, REST, the Foundry portal, C#, or TypeScript.
        String toolboxMcpUrl = projectEndpoint + "/toolboxes/mcp-server-toolbox/versions/1/mcp?api-version=v1";
        String toolboxConnectionName = "mcp-server-toolbox-conn";

        AgentsClientBuilder builder = new AgentsClientBuilder()
            .credential(new DefaultAzureCredentialBuilder().build())
            .endpoint(projectEndpoint);

        AgentsClient agentsClient = builder.buildAgentsClient();
        ResponsesClient responsesClient = builder.buildResponsesClient();

        // Attach the toolbox MCP endpoint with server label, URL, connection, and approval mode.
        McpTool mcpTool = new McpTool("toolbox")
            .setServerUrl(toolboxMcpUrl)
            .setProjectConnectionId(toolboxConnectionName)
            .setRequireApproval("always");

        // Create agent with MCP tool
        PromptAgentDefinition agentDefinition = new PromptAgentDefinition("gpt-5-mini")
            .setInstructions("You are a helpful assistant that can use MCP tools.")
            .setTools(Collections.singletonList(mcpTool));

        AgentVersionDetails agent = agentsClient.createAgentVersion("mcp-agent", agentDefinition);
        System.out.printf("Agent created: %s (version %s)%n", agent.getName(), agent.getVersion());

        // Create a response
        AgentReference agentReference = new AgentReference(agent.getName())
            .setVersion(agent.getVersion());

        Response response = responsesClient.createAzureResponse(
            new AzureCreateResponseOptions().setAgentReference(agentReference),
            ResponseCreateParams.builder()
                .input("Summarize the Azure REST API specifications"));

        System.out.println("Response: " + response.output());

        // Clean up
        agentsClient.deleteAgentVersion(agent.getName(), agent.getVersion());
    }
}

Sortie attendue

Agent created: mcp-agent (version 1)
Response: [ResponseOutputItem containing MCP tool results ...]

Utiliser l’outil MCP avec l’API REST

Les exemples suivants montrent comment créer un agent avec l’outil MCP et l’appeler à l’aide de l’API Réponses. Si la réponse inclut un élément de sortie avec type défini sur mcp_approval_request, envoyez une demande de suivi qui inclut un élément mcp_approval_response.

Conditions préalables

Définissez ces variables d’environnement :

  • FOUNDRY_PROJECT_ENDPOINT: URL du point de terminaison de votre projet.
  • FOUNDRY_MODEL_DEPLOYMENT_NAME: Nom du déploiement de votre modèle.
  • AGENT_TOKEN : jeton du porteur pour Foundry.
  • MCP_PROJECT_CONNECTION_NAME (facultatif) : nom de connexion de votre projet MCP.

Obtenez un jeton d’accès :

export AGENT_TOKEN=$(az account get-access-token --scope "https://ai.azure.com/.default" --query accessToken -o tsv)

Si le serveur MCP dans la boîte à outils ne nécessite pas d’authentification, omettez project_connection_id de la définition de l’outil de la boîte à outils. L’outil MCP de l’agent utilise toujours project_connection_id pour la connexion d’outil distant au point de terminaison de la boîte à outils.

Note

Pour l’API REST, utilisez le nom de connexion du projet remote-tool que vous créez pour le point de terminaison de la boîte à outils en tant que project_connection_id sur l’outil MCP de l’agent.

Conseil

Pour plus d’informations sur le schéma de l’outil MCP et les éléments d’approbation, consultez la référence de l’API REST Microsoft Foundry.

1. Créer une boîte à outils avec le serveur MCP

La méthode recommandée pour ajouter un serveur MCP consiste à utiliser une boîte à outils, puis à attacher la boîte à outils à votre agent en tant qu’outil MCP. Voir Qu’est-ce qu’une boîte à outils ?

curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/toolboxes/mcp-server-toolbox/versions?api-version=v1" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AGENT_TOKEN" \
  -d '{
    "description": "Toolbox with the Azure REST API specifications MCP server",
    "tools": [
      {
        "type": "mcp",
        "server_label": "api-specs",
        "server_url": "https://gitmcp.io/Azure/azure-rest-api-specs",
        "require_approval": "never"
      }
    ]
  }'

La boîte à outils expose un point de terminaison compatible MCP à l’emplacement $FOUNDRY_PROJECT_ENDPOINT/toolboxes/mcp-server-toolbox/versions/<version>/mcp?api-version=v1<version> est la version retournée par l’appel précédent.

2. Créer une connexion d’outil distant à la boîte à outils

Créez une connexion de projet d’outil distant qui pointe vers le point de terminaison de la boîte à outils. Utilisez un jeton utilisateur Entra pour que l’identité de l’appelant soit transmise (audience https://ai.azure.com) :

azd ai connection create mcp-server-toolbox-conn \
  --kind remote-tool \
  --target "$FOUNDRY_PROJECT_ENDPOINT/toolboxes/mcp-server-toolbox/versions/<version>/mcp?api-version=v1" \
  --auth-type user-entra-token \
  --audience https://ai.azure.com

3. Créer un agent MCP

curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/agents?api-version=v1" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AGENT_TOKEN" \
  -d '{
    "name": "<AGENT_NAME>-mcp",
    "description": "MCP agent",
    "definition": {
      "kind": "prompt",
      "model": "'$FOUNDRY_MODEL_DEPLOYMENT_NAME'",
      "instructions": "You are a helpful agent that can use MCP tools to assist users. Use the available MCP tools to answer questions and perform tasks.",
      "tools": [
        {
          "type": "mcp",
          "server_label": "toolbox",
          "server_url": "'$FOUNDRY_PROJECT_ENDPOINT'/toolboxes/mcp-server-toolbox/versions/<version>/mcp?api-version=v1",
          "require_approval": "always",
          "project_connection_id": "mcp-server-toolbox-conn"
        }
      ]
    }
  }'

Pour utiliser un serveur MCP authentifié à l’intérieur de la boîte à outils, ajoutez "project_connection_id": "'$MCP_PROJECT_CONNECTION_NAME'" à la définition de l’outil de boîte à outils. Remplacez server_url par le point de terminaison du serveur authentifié (par exemple, https://api.githubcopilot.com/mcp).

4. Créer une réponse

curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AGENT_TOKEN" \
  -d '{
    "agent": {"type": "agent_reference", "name": "<AGENT_NAME>-mcp"},
    "input": "Please summarize the Azure REST API specifications Readme"
  }'

Si la réponse inclut un élément de sortie défini type sur mcp_approval_request, copiez l’élément id de demande d’approbation en tant que APPROVAL_REQUEST_ID. Copiez également la réponse id de niveau supérieur en tant que PREVIOUS_RESPONSE_ID.

5. Envoyer une réponse d’approbation

Si l’outil MCP nécessite une approbation, envoyez une demande de suivi :

curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AGENT_TOKEN" \
  -d '{
    "previous_response_id": "'$PREVIOUS_RESPONSE_ID'",
    "input": [
      {
        "type": "mcp_approval_response",
        "approval_request_id": "'$APPROVAL_REQUEST_ID'",
        "approve": true
      }
    ]
  }'

6. Nettoyer les ressources

Supprimez l’agent :

curl -X DELETE "$FOUNDRY_PROJECT_ENDPOINT/agents/<AGENT_NAME>-mcp?api-version=v1" \
  -H "Authorization: Bearer $AGENT_TOKEN"

Fonctionnement

Vous devez intégrer un serveur MCP distant (un point de terminaison de serveur MCP existant) au service Foundry Agent. Vous pouvez apporter plusieurs serveurs MCP distants en les ajoutant en tant qu’outils. Pour chaque outil, vous devez fournir une valeur unique server_label au sein du même agent et une server_url valeur qui pointe vers le serveur MCP distant. Veillez à examiner attentivement les serveurs MCP que vous ajoutez au service De l’agent Foundry.

En plus de connecter des serveurs MCP distants arbitraires par URL, vous pouvez ajouter des serveurs MCP directement à partir du catalogue Foundry Add Tools . Par exemple, Azure DevOps MCP Server est disponible en tant qu’entrée du catalogue. Azure DevOps héberge le point de terminaison MCP distant et l’expose via HTTP en streaming, vous n’avez donc pas à installer ni à héberger le serveur lorsque vous l’ajoutez depuis le catalogue Foundry. Les entrées de catalogue simplifient la configuration de la connexion et s’alignent sur les mêmes mécanismes d’approbation et d’audit documentés dans cet article.

Pour plus d’informations sur l’utilisation de MCP, consultez :

Configurer la connexion MCP

Chemin d’accès secondaire - opérations avancées : Utilisez cette référence après le premier itinéraire de réussite pour restreindre les outils, modifier le comportement d’approbation ou ajouter une connexion de projet.

Les étapes suivantes décrivent comment se connecter à un serveur MCP distant à partir du service De l’agent Foundry :

  1. Recherchez le serveur MCP distant auquel vous souhaitez vous connecter, par exemple le serveur GitHub MCP. Créez ou mettez à jour un agent Foundry avec un mcp outil à l’aide des informations suivantes :
    1. server_url: URL du serveur MCP, par exemple https://api.githubcopilot.com/mcp/.
    2. server_label: identificateur unique de ce serveur MCP à l’agent, tel que github.
    3. allowed_tools: liste facultative d’outils auxquels cet agent peut accéder et utiliser. Si vous ne fournissez pas cette valeur, la valeur par défaut inclut tous les outils du serveur MCP.
    4. require_approval: déterminez éventuellement si l’approbation est requise. La valeur par défaut est always. Les valeurs prises en charge sont les suivantes :
      • always: un développeur doit fournir une approbation pour chaque appel. Si vous ne fournissez pas de valeur, il s’agit de la valeur par défaut.
      • never: aucune approbation n’est requise.
      • {"never":[<tool_name_1>, <tool_name_2>]}: Vous fournissez une liste d’outils qui ne nécessitent pas d’approbation.
      • {"always":[<tool_name_1>, <tool_name_2>]}: Vous fournissez une liste d’outils qui nécessitent une approbation.
  2. project_connection_id: ID de connexion de projet qui stocke l’authentification et d’autres détails de connexion pour le serveur MCP.
  3. Si le modèle tente d’appeler un outil dans votre serveur MCP avec approbation requise, vous obtenez un type d’élément de sortie de réponse en tant que mcp_approval_request. Dans l’élément de sortie de la réponse, vous pouvez obtenir plus de détails sur l'outil du serveur MCP appelé et les arguments à transmettre. Passez en revue l’outil et les arguments afin que vous puissiez prendre une décision éclairée pour approbation.
  4. Envoyez votre approbation à l’agent en utilisant previous_response_id et en définissant approve sur true.

Se connecter à Azure DevOps serveur MCP

Azure DevOps MCP Server est disponible en tant qu’entrée de catalogue dans Foundry.

Important

Le serveur MCP distant Azure DevOps s’authentifie auprès de Microsoft Entra ID. Votre organisation Azure DevOps doit être soutenue par un locataire Microsoft Entra. Les organisations de compte Microsoft (MSA) indépendantes ne sont pas prises en charge.

Pour ajouter le serveur :

  1. Dans le portail Foundry, accédez à votre projet.
  2. Sélectionnez Add Tools>Catalog et recherchez « Azure DevOps ».
  3. Sélectionnez Azure DevOps serveur MCP, puis sélectionnez Créer.
  4. Entrez le nom de votre organisation Azure DevOps et sélectionnez Connect.
  5. Choisissez les outils Azure DevOps à exposer à votre agent. Vous pouvez sélectionner un sous-ensemble d’outils pour contrôler exactement ce que l’agent peut accéder.

Cette configuration basée sur le catalogue crée l’outil MCP à utiliser par les agents sans nécessiter de modifications de code. Vous pouvez valider la connectivité et le comportement des outils dans l’expérience de test de conversation Foundry avant d’intégrer l’outil dans le code de production.

Conseil

Contrôle de version de la boîte à outils : Les boîtes à outils foundry prennent en charge le contrôle de version. Vous pouvez donc itérer sur une nouvelle version sans affecter les agents de production. Utilisez le point de terminaison du consommateur ({project_endpoint}/toolboxes/{name}/mcp?api-version=v1) pour les agents de production : il sert toujours la version par défaut promue. Utilisez le point de terminaison spécifique à la version ({project_endpoint}/toolboxes/{name}/versions/{version}/mcp?api-version=v1) pour tester avant la mise en production. Conservez server_label unique pour chaque agent, même lorsque vous changez de version de Toolbox. Pour plus d’informations, consultez Promouvoir une version par défaut.

Opérations de longue durée (aperçu)

Chemin d’accès secondaire - mode d’arrière-plan : Utilisez ce mode uniquement lorsqu’une opération MCP ne peut pas se terminer dans le délai d’expiration synchrone standard.

Certains serveurs MCP exposent des outils qui prennent plus de temps que le délai d’expiration synchrone standard pour retourner un résultat. Pour prendre en charge ces opérations, exécutez l’agent en mode arrière-plan. Le mode en arrière-plan exécute la réponse de façon asynchrone, de sorte que l’appel de l’outil MCP peut continuer sans conserver une connexion ouverte, et vous interrogez l’état de la réponse jusqu’à ce qu’il se termine. Cette approche permet aux appels d’outils MCP de dépasser le délai d’expiration de 100 secondes sans diffusion en continu décrit dans les limitations connues.

Note

Les opérations MCP de longue durée sont en préversion. Les fonctionnalités en préversion sont fournies sans contrat de niveau de service et ne sont pas recommandées pour les charges de travail de production. Le comportement et les modèles pris en charge peuvent changer.

Configuration requise pour le serveur MCP

Le runtime de l’agent s’appuie sur le serveur MCP pour exécuter l’opération de manière asynchrone et signaler la progression. Le serveur doit :

  • Implémentez la fonctionnalité de tâches du protocole de contexte de modèle afin qu’un appel d’outil puisse retourner une référence de tâche au lieu de bloquer jusqu’à ce que le travail se termine.
  • Renvoyez un identifiant de tâche associé dans les métadonnées du résultat de l’outil (le champ io.modelcontextprotocol/related-task avec une valeur taskId) lorsqu’il démarre une opération de longue durée.
  • Fournissez un moyen permettant à l’environnement d’exécution d’interroger l’état de la tâche et de récupérer le résultat final une fois la tâche terminée.
  • Être accessible en tant que point de terminaison MCP distant, identique à tout autre outil MCP. Les serveurs MCP locaux doivent être auto-hébergés pour fournir un point de terminaison distant. Consultez Héberger un serveur MCP local.

Lorsque le runtime de l’agent appelle un outil qui démarre une opération de longue durée, le serveur retourne la référence de tâche et le runtime conserve la réponse en arrière-plan. L’environnement d’exécution lance la réponse, retourne immédiatement avec une réponse id et un status de queued, puis récupère le résultat lorsque la tâche se termine. Vous interrogez la réponse id jusqu’à ce qu’elle status devienne completed, puis lisez la sortie finale.

Le mode arrière-plan pour les opérations MCP longues fonctionne avec n’importe quel modèle prenant en charge le mode d’arrière-plan, tel que gpt-5.4 ou gpt-5.5.

Si votre agent utilise un modèle qui ne prend pas en charge le mode en arrière-plan, les appels de l’outil MCP s’exécutent de manière synchrone et sont soumis au délai d’expiration de 100 secondes.

Activer le mode arrière-plan dans le portail Microsoft Foundry

Vous pouvez activer le mode en arrière-plan d’un agent dans le terrain de jeu du portail Microsoft Foundry, sans écrire de code :

  1. Ouvrez votre agent, puis sélectionnez l’onglet Playground.

  2. Dans la liste Des modèles, sélectionnez un modèle qui prend en charge le mode d’arrière-plan, tel que gpt-5.4 ou gpt-5.5.

  3. Sélectionnez l’icône de paramètres en regard du modèle, puis activez le mode Arrière-plan.

  4. Sous Outils, ajoutez un outil dont le serveur MCP prend en charge les tâches MCP, telles qu’un agent de données Fabric ajouté via l’outil Fabric IQ. Pour plus d’informations, consultez Connecter des agents à Microsoft Fabric avec Fabric IQ.

  5. Envoyez un message. L’agent démarre une tâche en arrière-plan et affiche sa progression pendant que l’appel à l’outil de longue durée s’exécute. Une fois l’exécution terminée, la réponse s’affiche dans la conversation.

Exécuter le mode arrière-plan avec du code

Les exemples suivants invoquent un agent déjà configuré avec un outil MCP, définissent background sur true et effectuent des interrogations répétées jusqu’à ce que la réponse soit complète. Remplacez les valeurs par défaut par vos propres valeurs.

from time import sleep
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient

PROJECT_ENDPOINT = "your_project_endpoint"
AGENT_NAME = "your_mcp_agent_name"

project = AIProjectClient(
    endpoint=PROJECT_ENDPOINT,
    credential=DefaultAzureCredential(),
)
openai = project.get_openai_client()

# Start a background response. It returns immediately with status "queued".
response = openai.responses.create(
    extra_body={
        "agent_reference": {
            "name": AGENT_NAME,
            "type": "agent_reference",
        }
    },
    input="Run the long-running task and summarize the result.",
    background=True,
)

# Poll the response ID until the MCP tool call completes.
while response.status in ("queued", "in_progress"):
    sleep(5)
    response = openai.responses.retrieve(response.id)

print(response.output_text)
using Azure.Identity;
using Azure.AI.Projects;

var projectEndpoint = "your_project_endpoint";
var agentName = "your_mcp_agent_name";

AIProjectClient projectClient = new(
    endpoint: new Uri(projectEndpoint),
    tokenProvider: new DefaultAzureCredential());

ProjectResponsesClient responsesClient
    = projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agentName);

// Start a background response. It returns immediately with status "queued".
ResponseResult response = await responsesClient.CreateResponseAsync(
    new CreateResponseOptions
    {
        InputItems = { ResponseItem.CreateUserMessageItem(
            "Run the long-running task and summarize the result.") },
        Background = true,
    });

// Poll the response ID until the MCP tool call completes.
while (response.Status is "queued" or "in_progress")
{
    await Task.Delay(5000);
    response = await responsesClient.RetrieveResponseAsync(response.Id);
}
Console.WriteLine(response.GetOutputText());
import { DefaultAzureCredential } from "@azure/identity";
import { AIProjectClient } from "@azure/ai-projects";

const PROJECT_ENDPOINT = "your_project_endpoint";
const AGENT_NAME = "your_mcp_agent_name";

const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
const openai = project.getOpenAIClient();

// Start a background response. It returns immediately with status "queued".
let response = await openai.responses.create(
  {
    input: "Run the long-running task and summarize the result.",
    background: true,
  },
  { body: { agent_reference: { name: AGENT_NAME, type: "agent_reference" } } },
);

// Poll the response ID until the MCP tool call completes.
while (response.status === "queued" || response.status === "in_progress") {
  await new Promise((r) => setTimeout(r, 5000));
  response = await openai.responses.retrieve(response.id);
}
console.log(response.output_text);
import com.azure.ai.agents.*;
import com.azure.ai.agents.models.AgentReference;
import com.azure.ai.agents.models.AzureCreateResponseOptions;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.openai.models.responses.Response;
import com.openai.models.responses.ResponseCreateParams;

String projectEndpoint = "your_project_endpoint";
String agentName = "your_mcp_agent_name";

AgentsClientBuilder builder = new AgentsClientBuilder()
    .credential(new DefaultAzureCredentialBuilder().build())
    .endpoint(projectEndpoint);
ResponsesClient responsesClient = builder.buildResponsesClient();

AgentReference agentRef = new AgentReference(agentName);

// Start a background response. It returns immediately with status "queued".
Response response = responsesClient.createAzureResponse(
    new AzureCreateResponseOptions()
        .setAgentReference(agentRef)
        .setBackground(true),
    ResponseCreateParams.builder()
        .input("Run the long-running task and summarize the result."));

// Poll the response ID until the MCP tool call completes.
while (response.status().equals("queued") || response.status().equals("in_progress")) {
    Thread.sleep(5000);
    response = responsesClient.getAzureResponse(response.id());
}
System.out.println(response.output());

Créez une réponse en arrière-plan. La requête renvoie immédiatement une réponse id et un status de queued :

curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AGENT_TOKEN" \
  -d '{
    "agent": {"type": "agent_reference", "name": "<AGENT_NAME>-mcp"},
    "input": "Run the long-running task and summarize the result.",
    "background": true
  }'

Copiez la réponse id du résultat, puis interrogez-la jusqu’à ce que status soit completed.

curl "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses/$RESPONSE_ID" \
  -H "Authorization: Bearer $AGENT_TOKEN"

Lorsque status est completed, le tableau output contient le résultat de l’appel à l’outil MCP et le message final de l’assistant.

Limitations connues

Chemin d’accès secondaire - Comportement de diffusion en continu : Passez en revue ces limites après la première réussite si votre client diffuse des réponses ou que votre appel MCP approche du délai d’expiration synchrone.

  • Délai d’expiration des appels de l’outil MCP non-streaming : les appels de l’outil MCP non-streaming ont un délai d’expiration de 100 secondes. Si votre serveur MCP prend plus de 100 secondes pour répondre, l’appel échoue. Pour éviter les délais d’expiration, assurez-vous que votre serveur MCP répond dans cette limite. Si votre cas d’usage nécessite des temps de traitement plus longs, exécutez l’agent en mode arrière-plan avec un modèle pris en charge, optimisez la logique côté serveur ou arrêtez l’opération en étapes plus petites.
  • MCP privé nécessite le programme d’installation de l’agent standard : la connectivité du serveur MCP privé est disponible uniquement avec le programme d’installation de l’agent standard avec mise en réseau privée (VNet BYO). La configuration de l’agent de base ne prend pas en charge les points de terminaison MCP privés.
  • Hébergement MCPPrivate : Azure Container Apps sur un sous-réseau MCP dédié est la configuration testée pour les serveurs MCP privés. Les applications de fonction ou App Services en tant qu’hôte de serveur MCP privé peuvent fonctionner, mais ne sont pas validées en interne.

Questions et erreurs courantes

Les problèmes courants suivants peuvent se produire lorsque vous utilisez des outils MCP avec le service De l’agent Foundry :

  • « Schéma d’outil non valide » :

    Cette erreur se produit généralement si votre définition de serveur MCP inclut anyOf ou allOfsi un paramètre accepte plusieurs types de valeurs. Mettez à jour votre définition de serveur MCP et réessayez.

  • « Non autorisé » ou « Interdit » à partir du serveur MCP :

    Vérifiez que le serveur MCP prend en charge votre méthode d’authentification et vérifiez les informations d’identification stockées dans votre connexion de projet. Pour GitHub, utilisez des jetons de privilège minimum et faites-les pivoter régulièrement. Pour le serveur MCP pour Azure DevOps, vérifiez que l’organisation est associée à un locataire Microsoft Entra et que vous pouvez mener à bien le processus de connexion de l’organisation dans Foundry. Les organisations utilisant uniquement des comptes Microsoft ne sont pas prises en charge.

  • Le modèle n’appelle jamais votre outil MCP :

    Confirmez que les instructions de votre agent encouragent l’utilisation de l’outil, et vérifiez les valeurs server_label, server_url et allowed_tools. Si vous définissez allowed_tools, vérifiez que le nom de l’outil correspond à ce que le serveur MCP expose.

  • L'agent ne continue jamais après approbation.

    Vérifiez que vous envoyez une demande de suivi avec previous_response_id défini comme l’ID de réponse d’origine, et que vous utilisez l’ID d’élément de demande d’approbation comme approval_request_id.

Héberger un serveur MCP local

Le runtime du service agent accepte uniquement un point de terminaison de serveur MCP distant. Si vous souhaitez ajouter des outils à partir d’un serveur MCP local, vous devez l’héberger automatiquement sur Azure Container Apps ou Azure Functions pour obtenir un point de terminaison de serveur MCP distant.

Le point de terminaison distant peut être un point de terminaison public ou un point de terminaison privé au sein de votre réseau virtuel. Pour les serveurs MCP privés, déployez votre application conteneur avec des entrées internes uniquement (--internal-only true) sur un sous-réseau MCP dédié. Pour plus d’informations sur l’installation, consultez les points de terminaison de serveur MCP publics et privés .

Tenez compte des facteurs suivants lors de l’hébergement de serveurs MCP locaux dans le cloud :

Configuration du serveur MCP local Hébergement dans Azure Container Apps Hébergement dans Azure Functions
Transport Points de terminaison HTTP POST/GET requis. HTTP streamable requis.
Modifications du code Reconstruction du conteneur requise. Les fichiers de configuration spécifiques à Azure Functions sont requis dans le répertoire racine.
Authentification Implémentation d’authentification personnalisée requise. Basé sur une clé uniquement. OAuth a besoin de gestion des API.
Langue Tout langage qui s’exécute dans des conteneurs Linux (Python, Node.js, .NET, TypeScript, Go). Python, Node.js, Java, .NET uniquement.
Configuration requise pour les conteneurs Linux (linux/amd64) uniquement. Aucun conteneur privilégié. Les serveurs conteneurisés ne sont pas pris en charge.
Dépendances Toutes les dépendances doivent être dans l’image du conteneur. Les dépendances au niveau du système d’exploitation (par exemple, Playwright) ne sont pas prises en charge.
État Sans état uniquement. Sans état uniquement.
UVX/NPX Soutenu. Non pris en charge. npx commandes de démarrage non prises en charge.