Outil d’interpréteur de code personnalisé pour les agents (préversion)

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 interpréteur de code personnalisé vous donne un contrôle total sur l’environnement d’exécution pour le code Python généré par l’agent. Vous pouvez configurer des packages Python personnalisés, des ressources de calcul et un environnement Azure Container Apps. Le conteneur d’interpréteur de code expose un serveur MCP (Model Context Protocol).

Utilisez un interpréteur de code personnalisé lorsque l'outil interpréteur de code intégré Code pour les agents ne répond pas à vos besoins, par exemple lorsque vous avez besoin de packages Python spécifiques, d'images conteneur personnalisées ou de ressources de calcul dédiées.

Pour plus d’informations sur MCP et sur la façon dont les agents se connectent aux outils MCP, consultez Se connecter aux serveurs Model Context Protocol (préversion).

Tip

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.

Conditions préalables

  • Azure CLI version 2.60.0 ou ultérieure.

  • Python 3.12 ou version ultérieure pour l’exemple de projet géré.

  • (Facultatif) uv pour accélérer la gestion des packages Python.

  • Un abonnement Azure et un groupe de ressources avec les attributions de rôles suivantes :

    • Utilisateur de Foundry dans le projet Foundry pour configurer et exécuter l’agent après le provisionnement.

      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.

    • Propriétaire Foundry sur le groupe de ressources cible uniquement pendant que l’exemple de déploiement crée les ressources Foundry et la connexion au projet.

    • Contributeur ManagedEnvironment de Container Apps uniquement pour le groupe de ressources cible lorsque l’exemple de déploiement crée l’environnement Container Apps.

    Activez les rôles d’approvisionnement juste à temps via Microsoft Entra Privileged Identity Management (PIM) et désactivez-les après le déploiement. Les développeurs d’agents quotidiens et les utilisateurs d’exécution n’ont pas besoin de ces rôles d’approvisionnement.

  • Kit de développement logiciel (SDK) Microsoft Foundry. Consultez le guide de démarrage rapide pour l’installation.

  • Région prise en charge à la fois par Foundry Agent Service et par les sessions dynamiques d’Azure Container Apps. Consultez les régions des sessions dynamiques d’Azure Container Apps.

Support d'utilisation

Cet article utilise les Azure CLI et un exemple de projet exécutable.

Le tableau suivant présente la prise en charge du KIT de développement logiciel (SDK) et de la configuration.

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
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ - ✔️

Pour connaître la dernière prise en charge du kit de développement logiciel (SDK) et de l’API pour les outils d’agents, consultez Pratiques d’utilisation des outils dans le Microsoft Foundry Agent Service.

Prise en charge du Kit de développement logiciel

L’interpréteur de code personnalisé utilise le type d’outil MCP. Tous les SDK qui prennent en charge les outils MCP peuvent créer un agent d’interpréteur de code personnalisé. Le sdk .NET est actuellement en préversion. Pour connaître les étapes d’approvisionnement d’infrastructure (Azure CLI, Bicep), consultez Créer un agent avec un interpréteur de code personnalisé.

Avant de commencer

Cette procédure provisionne l’infrastructure Azure, y compris les ressources Azure Container Apps. Passez en revue les exigences de coût et de gouvernance Azure de votre organisation avant le déploiement.

Créer un agent avec un interpréteur de code personnalisé

Les étapes suivantes montrent comment approvisionner l’infrastructure et créer un agent qui utilise un serveur MCP d’interpréteur de code personnalisé. La configuration de l’infrastructure s’applique à toutes les langues. Les exemples de code spécifiques à la langue suivent.

Inscrire la fonctionnalité d’aperçu

Inscrivez la fonctionnalité de serveur MCP pour Azure Container Apps sessions dynamiques :

az feature register --namespace Microsoft.App --name SessionPoolsSupportMCP
az provider register -n Microsoft.App

Obtenir l’exemple de code

Clonez le code sample dans le référentiel GitHub et accédez au dossier samples/python/prompt-agents/code-interpreter-custom de votre terminal.

Provisionner l’infrastructure

L’exemple d’assistant direct géré stocke le point de terminaison MCP du pool de sessions dans la connexion du projet. Les définitions de la boîte à outils exigent également que le point de terminaison soit indiqué sous la forme server_url. Ajoutez cette sortie au fichier cloné infra.bicep :

output MCP_SERVER_URL string = sessionPool.properties.mcpServerSettings.mcpServerEndpoint

N’utilisez poolManagementEndpointpas . Cette valeur est le point de terminaison de gestion des sessions dynamiques, et non le point de terminaison du serveur MCP.

Pour approvisionner l’infrastructure, exécutez la commande suivante à l’aide du Azure CLI (az) :

az deployment group create \
    --name custom-code-interpreter \
    --subscription <your_subscription> \
    --resource-group <your_resource_group> \
    --template-file ./infra.bicep

Note

Le déploiement peut prendre jusqu’à une heure, en fonction du nombre d’instances de secours que vous demandez. L’allocation de pool de sessions dynamiques est l’étape la plus longue.

Configurer et exécuter l’agent

Copiez le .env.sample fichier du référentiel vers .env. Mappez les sorties de déploiement Bicep aux variables d’environnement correspondantes :

sortie Bicep Variable d'environnement Utilisé pour
AZURE_AI_PROJECT_ENDPOINT AZURE_AI_PROJECT_ENDPOINT Point de terminaison du projet Foundry.
AZURE_AI_CONNECTION_ID AZURE_AI_CONNECTION_ID Connexion de projet ayant pour cible le serveur MCP de l’interpréteur de code personnalisé.
MCP_SERVER_URL MCP_SERVER_URL Point de terminaison MCP du pool de sessions requis par les définitions de la boîte à outils.
AZURE_AI_MODEL_DEPLOYMENT_NAME AZURE_AI_MODEL_DEPLOYMENT_NAME Déploiement du modèle d’agent.

Les exemples inline utilisent PROJECT_ENDPOINT pour AZURE_AI_PROJECT_ENDPOINT et MCP_CONNECTION_ID pour AZURE_AI_CONNECTION_ID. L’exemple d’assistant direct géré résout la cible MCP par le biais de la connexion du projet et utilise https://localhost comme URL d’espace réservé obligatoire. Pour une boîte à outils, définissez MCP_SERVER_URL sur la sortie mcpServerEndpoint, car MCPToolboxTool nécessite server_url ou connector_id même lorsque vous fournissez également une connexion au projet.

Installez les dépendances Python et exécutez l’exemple géré avec l’une des paires de commandes suivantes :

uv sync
uv run ./main.py

Ou créez un environnement virtuel et installez les conditions requises pour l’enregistrement :

python -m venv .venv
./.venv/bin/pip install -r requirements.txt
./.venv/bin/python ./main.py

Exemple de code

L’exemple de Python suivant montre comment créer un agent avec un outil MCP de l’interpréteur de code personnalisé :

from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import MCPTool, MCPToolboxTool, PromptAgentDefinition

# Format: "https://resource_name.ai.azure.com/api/projects/project_name"
PROJECT_ENDPOINT = "your_project_endpoint"
MCP_SERVER_URL = "https://your-mcp-server-url"
# Optional: set to your project connection ID if your MCP server requires authentication
MCP_CONNECTION_ID = "your-mcp-connection-id"

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

# Add the custom code interpreter MCP server to a toolbox. Using a toolbox is the
# recommended way to give agents tools: you curate tools once and reuse the toolbox
# across agents. See /azure/foundry/agents/concepts/toolbox-overview
toolbox = project.toolboxes.create_version(
    name="custom-code-interpreter-toolbox",
    description="Toolbox with the custom code interpreter MCP server",
    tools=[
        MCPToolboxTool(
            server_label="custom-code-interpreter",
            server_url=MCP_SERVER_URL,
            project_connection_id=MCP_CONNECTION_ID,
        )
    ],
)

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

# 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 custom-code-interpreter-toolbox-conn \
#      --kind remote-tool \
#      --target "<TOOLBOX_MCP_URL>" \
#      --auth-type user-entra-token \
#      --audience https://ai.azure.com
TOOLBOX_CONNECTION_NAME = "custom-code-interpreter-toolbox-conn"

# Create an agent that uses the toolbox as an MCP tool
agent = project.agents.create_version(
    agent_name="CustomCodeInterpreterAgent",
    definition=PromptAgentDefinition(
        model="gpt-5-mini",
        instructions="You are a helpful assistant that can run Python code to analyze data and solve problems.",
        tools=[
            MCPTool(
                server_label="toolbox",
                server_url=TOOLBOX_MCP_URL,
                require_approval="never",
                project_connection_id=TOOLBOX_CONNECTION_NAME,
            )
        ],
    ),
    description="Agent with custom code interpreter for data analysis.",
)
print(f"Agent created (id: {agent.id}, name: {agent.name}, version: {agent.version})")

# Test the agent with a simple calculation
response = openai.responses.create(
    input="Calculate the factorial of 10 using Python.",
    extra_body={"agent_reference": {"name": agent.name, "type": "agent_reference"}},
)
print(f"Response: {response.output_text}")

# Clean up
project.agents.delete_version(agent_name=agent.name, agent_version=agent.version)
project.toolboxes.delete_toolbox_version(
  toolbox_name=toolbox.name,
  version=toolbox.version,
)
print("Agent deleted")

Sortie attendue

Lorsque vous exécutez l’exemple, vous voyez une sortie similaire à :

Agent created (id: agent-xxxxxxxxxxxx, name: CustomCodeInterpreterAgent, version: 1)
Response: The factorial of 10 is 3,628,800. I calculated this using Python's math.factorial() function.
Agent deleted

Utiliser un agent hébergé

Cet exemple utilise le FoundryChatClient Microsoft Agent Framework et se connecte au point de terminaison MCP de la boîte à outils à l’aide de FoundryToolbox.

import asyncio

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

PROJECT_ENDPOINT = "https://<account>.services.ai.azure.com/api/projects/<project>"
MCP_SERVER_URL = "https://your-mcp-server-url"
# Optional: set to your project connection ID if your MCP server requires authentication
MCP_CONNECTION_ID = "your-mcp-connection-id"


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

    # 1. Create the custom code interpreter MCP tool and add it to a toolbox. Using a toolbox is the
    #    recommended way to give agents tools: curate tools once and reuse the
    #    toolbox across agents. See /azure/foundry/agents/concepts/toolbox-overview
    project = AIProjectClient(endpoint=PROJECT_ENDPOINT, credential=credential)
    toolbox = project.toolboxes.create_version(
        name="custom-code-interpreter-toolbox",
        description="Toolbox with the custom code interpreter MCP server",
        tools=[
            MCPToolboxTool(
                server_label="custom-code-interpreter",
                server_url=MCP_SERVER_URL,
                project_connection_id=MCP_CONNECTION_ID,
            )
        ],
    )

    # 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 can run Python code to analyze data and solve problems.",
        tools=[toolbox_tool],
    )

    result = await agent.run("Calculate the factorial of 10 using Python.")
    print(result.text)


    project.toolboxes.delete_toolbox_version(
      toolbox_name=toolbox.name,
      version=toolbox.version,
    )


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

Exemple de code

L’exemple C# suivant montre comment créer un agent avec un outil MCP de l’interpréteur de code personnalisé. Pour plus d’informations sur l’utilisation des outils MCP dans .NET, consultez l’exemple d’outil MCP 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";
var mcpServerUrl = "https://your-mcp-server-url";
// Optional: set to your project connection ID if your MCP server requires authentication
var mcpConnectionId = "your-mcp-connection-id";

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

// Add the custom code interpreter MCP server to a toolbox. Using a toolbox is the
// recommended way to give agents tools. See /azure/foundry/agents/concepts/toolbox-overview
// Code runs in a sandboxed Azure Container Apps session.
McpTool customCodeInterpreter = ResponseTool.CreateMcpTool(
    serverLabel: "custom-code-interpreter",
    serverUri: new Uri(mcpServerUrl));
customCodeInterpreter.ProjectConnectionId = mcpConnectionId;

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

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

// 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 custom-code-interpreter-toolbox-conn \
//      --kind remote-tool \
//      --target "<toolboxMcpUrl>" \
//      --auth-type user-entra-token \
//      --audience https://ai.azure.com
var toolboxConnectionName = "custom-code-interpreter-toolbox-conn";

McpTool toolboxTool = ResponseTool.CreateMcpTool(
    serverLabel: "toolbox",
    serverUri: toolboxMcpUrl,
    toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
        GlobalMcpToolCallApprovalPolicy.NeverRequireApproval));
toolboxTool.ProjectConnectionId = toolboxConnectionName;

DeclarativeAgentDefinition agentDefinition = new(model: "gpt-5-mini")
{
    Instructions = "You are a helpful assistant that can run Python code to analyze data and solve problems.",
    Tools = { toolboxTool }
};

AgentVersion agent = projectClient.AgentAdministrationClient.CreateAgentVersion(
    agentName: "CustomCodeInterpreterAgent",
    options: new(agentDefinition));

Console.WriteLine($"Agent created: {agent.Name} (version {agent.Version})");

// Create a response using the agent
ProjectResponsesClient responseClient = projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agent.Name);

ResponseResult response = responseClient.CreateResponse(
    new([ResponseItem.CreateUserMessageItem("Calculate the factorial of 10 using Python.")]));

Console.WriteLine(response.GetOutputText());

// Clean up
projectClient.AgentAdministrationClient.DeleteAgentVersion(
    agentName: agent.Name,
    agentVersion: agent.Version);
Console.WriteLine("Agent deleted");

Supprimez la version de la boîte à outils après que l’agent ne le référence plus. Consultez Supprimer une version de boîte à outils pour l’appel .NET vérifié.

Sortie attendue

Agent created: CustomCodeInterpreterAgent (version 1)
The factorial of 10 is 3,628,800.
Agent deleted

Utiliser un agent hébergé

Cet exemple utilise l’intégration Microsoft Agent Framework AddFoundryToolboxes pour connecter l’agent hébergé à la boîte à outils.

using System;
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;

const string AgentInstructions = "You are a helpful assistant that can run Python code to analyze data and solve problems.";
const string AgentName = "CustomCodeInterpreterAgent";

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";
string mcpServerUrl = "https://your-mcp-server-url";
string mcpConnectionId = "your-mcp-connection-id";

DefaultAzureCredential credential = new();

// 1. Create the custom code interpreter MCP tool and add it to a toolbox. Using a toolbox is the
//    recommended way to give agents tools. See /azure/foundry/agents/concepts/toolbox-overview
AIProjectClient projectClient = new(
    endpoint: new Uri(projectEndpoint),
    tokenProvider: credential);
McpTool customCodeInterpreter = ResponseTool.CreateMcpTool(
    serverLabel: "custom-code-interpreter",
    serverUri: new Uri(mcpServerUrl));
customCodeInterpreter.ProjectConnectionId = mcpConnectionId;
ToolboxVersion toolboxVersion = projectClient.AgentAdministrationClient
    .GetAgentToolboxes().CreateToolboxVersion(
        toolboxName: "custom-code-interpreter-toolbox",
        tools: [ProjectsAgentTool.AsProjectTool(customCodeInterpreter)],
        description: "Toolbox with the custom code interpreter 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();

Exemple de code

L’exemple TypeScript suivant montre comment créer un agent avec un outil MCP de l’interpréteur de code personnalisé. Pour obtenir une version javaScript, consultez l’exemple d’outil MCP dans le Kit de développement logiciel (SDK) Azure du référentiel JavaScript sur GitHub.

import { DefaultAzureCredential } from "@azure/identity";
import { AIProjectClient } from "@azure/ai-projects";

// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
const PROJECT_ENDPOINT = "your_project_endpoint";
const MCP_SERVER_URL = "https://your-mcp-server-url";

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

  // Add the custom code interpreter MCP server to a toolbox. Using a toolbox is
  // the recommended way to give agents tools. Code runs in a sandboxed Azure
  // Container Apps session, so the tool uses require_approval: "never".
  // See /azure/foundry/agents/concepts/toolbox-overview
  const toolbox = await project.toolboxes.createVersion(
    "custom-code-interpreter-toolbox",
    [
      {
        type: "mcp",
        server_label: "custom-code-interpreter",
        server_url: MCP_SERVER_URL,
        require_approval: "never",
      },
    ],
    { description: "Toolbox with the custom code interpreter MCP server" },
  );

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

  // 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 custom-code-interpreter-toolbox-conn \
  //      --kind remote-tool \
  //      --target "<toolboxMcpUrl>" \
  //      --auth-type user-entra-token \
  //      --audience https://ai.azure.com
  const toolboxConnectionName = "custom-code-interpreter-toolbox-conn";

  // Create an agent that uses the toolbox as an MCP tool
  const agent = await project.agents.createVersion("CustomCodeInterpreterAgent", {
    kind: "prompt",
    model: "gpt-5-mini",
    instructions:
      "You are a helpful assistant that can run Python code to analyze data and solve problems.",
    tools: [
      {
        type: "mcp",
        server_label: "toolbox",
        server_url: toolboxMcpUrl,
        require_approval: "never",
        project_connection_id: toolboxConnectionName,
      },
    ],
  });
  console.log(`Agent created (name: ${agent.name}, version: ${agent.version})`);

  // Send a request to the agent
  const response = await openai.responses.create(
    {
      input: "Calculate the factorial of 10 using Python.",
    },
    {
      body: { agent_reference: { name: agent.name, type: "agent_reference" } },
    },
  );
  console.log(`Response: ${response.output_text}`);

  // Clean up
  await project.agents.deleteVersion(agent.name, agent.version);
  await project.toolboxes.deleteVersion(toolbox.name, toolbox.version);
  console.log("Agent deleted");
}

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

Sortie attendue

Agent created (name: CustomCodeInterpreterAgent, version: 1)
Response: The factorial of 10 is 3,628,800. I calculated this using Python's math.factorial() function.
Agent deleted

Tip

Recommandé : Pour la plupart des agents, ajoutez des outils via une boîte à outils et joignez la boîte à outils à votre agent en tant qu’outil MCP. Le SDK Java n’expose pas encore d’API permettant de créer une boîte à outils. Créez donc la boîte à outils à l’aide de l’exemple Python, de l’API REST, de l’exemple C# ou de l’exemple TypeScript, ou du portail Foundry, puis faites ensuite référence à son point de terminaison MCP depuis votre agent Java comme McpTool. L’exemple suivant connecte le point de terminaison MCP de la boîte à outils, qui contient l’interpréteur de code personnalisé, à l’agent.

Ajoutez la dépendance à votre pom.xml:

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

Exemple de code

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 CustomCodeInterpreterExample {
    public static void main(String[] args) {
        // Format: "https://resource_name.ai.azure.com/api/projects/project_name"
        String projectEndpoint = "your_project_endpoint";
        String toolboxMcpUrl = projectEndpoint + "/toolboxes/custom-code-interpreter-toolbox/versions/1/mcp?api-version=v1";
        // Set to the remote-tool project connection that points at the toolbox MCP endpoint.
        String toolboxConnectionId = "custom-code-interpreter-toolbox-conn";

        // Create clients to call Foundry API
        AgentsClientBuilder builder = new AgentsClientBuilder()
            .credential(new DefaultAzureCredentialBuilder().build())
            .endpoint(projectEndpoint);

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

        // Attach the toolbox MCP endpoint as an MCP tool.
        // Uses require_approval: "never" because code runs in a sandboxed Container Apps session.
        McpTool toolboxTool = new McpTool("toolbox")
            .setServerUrl(toolboxMcpUrl)
            .setProjectConnectionId(toolboxConnectionId)
            .setRequireApproval("never");

        PromptAgentDefinition agentDefinition = new PromptAgentDefinition("gpt-5-mini")
            .setInstructions("You are a helpful assistant that can run Python code to analyze data and solve problems.")
            .setTools(Collections.singletonList(toolboxTool));

        AgentVersionDetails agent = agentsClient.createAgentVersion(
            "CustomCodeInterpreterAgent", 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("Calculate the factorial of 10 using Python."));

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

        // Clean up
        agentsClient.deleteAgentVersion(agent.getName(), agent.getVersion());
        System.out.println("Agent deleted");
    }
}

Sortie attendue

Agent created: CustomCodeInterpreterAgent (version 1)
Response: The factorial of 10 is 3,628,800.
Agent deleted

Conditions préalables

Définissez ces variables d’environnement :

  • FOUNDRY_PROJECT_ENDPOINT: URL du point de terminaison de votre projet.
  • AGENT_TOKEN : jeton du porteur pour Foundry.

Obtenez un jeton d’accès :

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

Exemple de code

Créer une boîte à outils avec l’interpréteur de code personnalisé

Ajoutez l’interpréteur de code personnalisé en créant une boîte à outils. Ensuite, attachez la boîte à outils à votre agent en tant qu’outil MCP. Pour plus d’informations, consultez Qu’est-ce qu’une boîte à outils ?

curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/toolboxes/custom-code-interpreter-toolbox/versions?api-version=v1" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AGENT_TOKEN" \
  -d '{
    "description": "Toolbox with the custom code interpreter MCP server",
    "tools": [
      {
        "type": "mcp",
        "server_label": "custom-code-interpreter",
        "server_url": "<MCP_SERVER_URL>",
        "project_connection_id": "<MCP_PROJECT_CONNECTION_ID>",
        "require_approval": "never"
      }
    ]
  }'

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

Créer une connexion à l’outil distant pour 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 Entra utilisateur pour que l’identité de l’appelant soit transmise (audience https://ai.azure.com) :

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

Créer un agent qui utilise la boîte à outils

curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/agents?api-version=v1" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AGENT_TOKEN" \
  -d '{
    "name": "CustomCodeInterpreterAgent",
    "definition": {
      "kind": "prompt",
      "model": "<MODEL_DEPLOYMENT>",
      "instructions": "You are a helpful assistant that can run Python code to analyze data and solve problems.",
      "tools": [
        {
          "type": "mcp",
          "server_label": "toolbox",
          "server_url": "'$FOUNDRY_PROJECT_ENDPOINT'/toolboxes/custom-code-interpreter-toolbox/versions/<version>/mcp?api-version=v1",
          "require_approval": "never",
          "project_connection_id": "custom-code-interpreter-toolbox-conn"
        }
      ]
    }
  }'

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_reference": {"type": "agent_reference", "name": "CustomCodeInterpreterAgent"},
    "input": "Calculate the factorial of 10 using Python."
  }'

Nettoyer

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

curl -X DELETE \
  "$FOUNDRY_PROJECT_ENDPOINT/toolboxes/custom-code-interpreter-toolbox/versions/<version>?api-version=v1" \
  -H "Authorization: Bearer $AGENT_TOKEN"

Sortie attendue

{
  "id": "resp_xxxxxxxxxxxx",
  "output": [
    {
      "type": "message",
      "role": "assistant",
      "content": [
        {
          "type": "output_text",
          "text": "The factorial of 10 is 3,628,800."
        }
      ]
    }
  ]
}

Vérifier votre configuration

Après avoir provisionné l’infrastructure et exécuté l’exemple :

  1. Vérifiez que le déploiement Azure s’est terminé avec succès.
  2. Confirmez que l’exemple se connecte en utilisant les valeurs de votre fichier .env.
  3. Dans Microsoft Foundry, vérifiez que votre agent appelle l’outil en utilisant le traçage. Pour plus d’informations, consultez Meilleures pratiques pour l’utilisation des outils dans le Service Agent Foundry de Microsoft.

Dépannage

Problème Cause probable Résolution
L'enregistrement des fonctionnalités est toujours en attente La commande az feature register retourne l’état Registering. Attendez que l’inscription soit terminée (peut prendre 15 à 30 minutes). Vérifiez l’état avec az feature show --namespace Microsoft.App --name SessionPoolsSupportMCP. Exécutez ensuite az provider register -n Microsoft.App à nouveau.
Le déploiement échoue avec une erreur d’autorisation Attributions de rôles requises manquantes. Dans le cadre du déploiement de l’infrastructure, activez Foundry Owner et Container Apps ManagedEnvironment Contributor pour le groupe de ressources cible via Microsoft Entra PIM. Désactivez-les après le déploiement. Pour les opérations d’agent, vérifiez que vous avez Foundry User sur le projet Foundry.
Échec du déploiement avec une erreur de région La région sélectionnée ne prend pas en charge Azure Container Apps sessions dynamiques. Essayez une autre région. Consultez Azure Container Apps régions pour les régions prises en charge.
L’agent n’appelle pas l’outil La connexion MCP n’est pas configurée correctement, ou les instructions de l’agent n’invitent pas l’outil à utiliser. Utilisez le suivi dans Microsoft Foundry pour confirmer l’appel de l’outil. Vérifiez que MCP_SERVER_URL correspond à votre point de terminaison Container Apps déployé. Consultez les meilleures pratiques.
Délai d’expiration de la connexion au serveur MCP Le pool de sessions Container Apps n’est pas en cours d’exécution ou n’a pas d’instances de secours. Vérifiez l’état du pool de sessions dans le portail Azure. Augmentez standbyInstanceCount dans votre modèle de Bicep si nécessaire.
Échec de l’exécution du code dans le conteneur Packages Python manquants dans le conteneur personnalisé. Mettez à jour votre image conteneur pour inclure les packages requis. Regénérer et redéployer le conteneur.
Erreur d’authentification lors de la connexion au serveur MCP Les informations d’identification de connexion du projet ne sont pas valides ou expirées. Régénérez les informations d’identification de connexion et mettez à jour le .env fichier. Vérifiez le MCP_PROJECT_CONNECTION_ID format.

Limitations

Les API ne prennent pas directement en charge l’entrée ou la sortie de fichier, ou l’utilisation de magasins de fichiers. Pour importer et exporter des données, vous devez utiliser des URL, telles que les URL de données pour les petits fichiers et les URL de signature d'accès partagé (SAS) du service Blob Azure pour les fichiers volumineux.

Sécurité

Traitez le code généré et ses dépendances comme non approuvés. Utilisez une image de base approuvée et une liste d’autorisation de paquets, exécutez le tout avec les ressources de calcul et les autorisations minimales nécessaires, et limitez l’accès réseau sortant aux destinations nécessaires. Ne montez pas les données sensibles ou les informations d’identification de production dans la session.

Si vous utilisez des URL SAS pour transmettre des données dans ou hors du runtime :

  • Utilisez des jetons SAP de courte durée.
  • Ne consignez pas les URL SAP ni stockez-les dans le contrôle de code source.
  • Limitez les autorisations au strict minimum requis (par exemple, en lecture seule ou en écriture seule).

Nettoyer

Pour arrêter la facturation des ressources approvisionnées, supprimez les ressources créées par l’exemple de déploiement. Si vous avez utilisé un groupe de ressources dédié pour cet article, supprimez le groupe de ressources.