Aller au contenu

Serveur Python MCP

Générez un serveur Python Model Context Protocol (MCP) pour fournir du contexte aux Grands Modèles de Langage (LLMs), avec option de déploiement sur Amazon Bedrock AgentCore.

Le Model Context Protocol (MCP) est un standard ouvert permettant aux assistants IA d’interagir avec des outils et ressources externes. Il fournit une méthode cohérente pour que les LLMs puissent :

  • Exécuter des outils (fonctions) réalisant des actions ou récupérant des informations
  • Accéder à des ressources fournissant du contexte ou des données

Vous pouvez générer un serveur MCP Python de deux façons :

  1. Installez le Nx Console VSCode Plugin si ce n'est pas déjà fait
  2. Ouvrez la console Nx dans VSCode
  3. Cliquez sur Generate (UI) dans la section "Common Nx Commands"
  4. Recherchez @aws/nx-plugin - py#mcp-server
  5. Remplissez les paramètres requis
    • Cliquez sur Generate
    Paramètre Type Par défaut Description
    project Requis string - The project to add an MCP server to
    computeType string BedrockAgentCoreRuntime The type of compute to host your MCP server. Select None for no hosting.
    name string - The name of your MCP server (default: mcp-server)
    iacProvider string CDK The preferred IaC provider

    Le générateur ajoutera les fichiers suivants à votre projet Python existant :

    • Répertoireyour-project/
      • Répertoireyour_module/
        • Répertoiremcp_server/ (ou nom personnalisé si spécifié)
          • __init__.py Initialisation du package Python
          • server.py Définition principale du serveur avec outils et ressources d’exemple
          • stdio.py Point d’entrée pour le transport STDIO, utile pour les serveurs MCP locaux simples
          • http.py Point d’entrée pour le transport HTTP Streamable, utile pour l’hébergement du serveur MCP
          • Dockerfile Point d’entrée pour l’hébergement du serveur MCP (exclu si computeType est None)
      • pyproject.toml Mis à jour avec les dépendances MCP
      • project.json Mis à jour avec les cibles de service du serveur MCP

    Ce générateur fournit de l’infrastructure as code basée sur votre iacProvider choisi. Il créera un projet dans packages/common qui inclut les constructions CDK ou modules Terraform pertinents.

    Le projet commun d’infrastructure as code est structuré comme suit :

    • Répertoirepackages/common/constructs
      • Répertoiresrc
        • Répertoireapp/ Constructions pour l’infrastructure spécifique à un projet/générateur
        • Répertoirecore/ Constructions génériques réutilisées par celles dans app
        • index.ts Point d’entrée exportant les constructions depuis app
      • project.json Cibles de build et configuration du projet

    Pour le déploiement de votre serveur MCP, les fichiers suivants sont générés :

    • Répertoirepackages/common/constructs/src
      • Répertoireapp
        • Répertoiremcp-servers
          • Répertoire<project-name>
            • <project-name>.ts Construct CDK pour déployer votre serveur MCP
            • Dockerfile Fichier Docker transmis directement utilisé par le construct CDK
      • Répertoirecore
        • Répertoireagent-core
          • runtime.ts Construct CDK générique pour le déploiement sur Bedrock AgentCore Runtime

    Les outils sont des fonctions que l’assistant IA peut appeler pour effectuer des actions. Le serveur MCP Python utilise la bibliothèque MCP Python SDK (FastMCP) qui propose une approche basée sur des décorateurs pour définir des outils.

    Vous pouvez ajouter de nouveaux outils dans le fichier server.py :

    @mcp.tool(description="Description de votre outil")
    def your_tool_name(param1: str, param2: int) -> str:
    """Implémentation de l'outil avec annotations de type"""
    # Logique de l'outil ici
    return f"Résultat : {param1} avec {param2}"

    La bibliothèque FastMCP gère automatiquement :

    • La validation des types selon les annotations de votre fonction
    • La génération du schéma JSON pour le protocole MCP
    • La gestion des erreurs et le formatage des réponses

    Les ressources fournissent du contexte à l’assistant IA. Vous pouvez les ajouter avec le décorateur @mcp.resource :

    @mcp.resource("example://static-resource", description="Exemple de ressource statique")
    def static_resource() -> str:
    """Retourne un contenu statique"""
    return "Ce contenu statique fournit du contexte à l'IA"
    @mcp.resource("dynamic://resource/{item_id}", description="Exemple de ressource dynamique")
    def dynamic_resource(item_id: str) -> str:
    """Retourne un contenu dynamique basé sur des paramètres"""
    # Récupération des données selon item_id
    data = fetch_data_for_item(item_id)
    return f"Contenu dynamique pour {item_id} : {data}"

    La plupart des assistants IA compatibles avec MCP utilisent une approche de configuration similaire. Vous devrez créer ou mettre à jour un fichier de configuration avec les détails de votre serveur MCP :

    {
    "mcpServers": {
    "your-mcp-server": {
    "command": "uv",
    "args": [
    "run",
    "python",
    "-m",
    "my_module.mcp_server.stdio"
    ],
    "env": {
    "VIRTUAL_ENV": "/path/to/your/project/.venv"
    }
    }
    }
    }

    Consultez la documentation suivante pour configurer MCP avec des assistants IA spécifiques :

    Le générateur configure une cible nommée <your-server-name>-inspect qui lance l’MCP Inspector avec la configuration pour se connecter à votre serveur MCP via le transport STDIO.

    Terminal window
    pnpm nx run your-project:your-server-name-inspect

    Ceci démarre l’inspector sur http://localhost:6274. Cliquez sur le bouton “Connect” pour commencer.

    La méthode la plus simple pour tester et utiliser un serveur MCP est d’utiliser l’inspector ou de le configurer avec un assistant IA (comme ci-dessus).

    Vous pouvez cependant exécuter votre serveur avec le transport STDIO directement via la cible <your-server-name>-serve-stdio.

    Terminal window
    pnpm nx run your-project:your-server-name-serve-stdio

    Cette commande utilise uv run pour exécuter votre serveur MCP avec le transport STDIO.

    Pour exécuter votre serveur MCP localement avec le transport HTTP Streamable, utilisez la cible <your-server-name>-serve-http.

    Terminal window
    pnpm nx run your-project:your-server-name-serve-http

    Cette commande utilise uv run pour exécuter votre serveur MCP avec le transport HTTP, généralement sur le port 8000.

    Si vous avez sélectionné BedrockAgentCoreRuntime pour computeType, l’infrastructure CDK ou Terraform correspondante est générée. Vous pouvez l’utiliser pour déployer votre serveur MCP sur Amazon Bedrock AgentCore Runtime.

    Un construct CDK est généré pour votre projet, nommé selon le name choisi lors de l’exécution du générateur, ou <ProjectName>McpServer par défaut.

    Vous pouvez utiliser ce construct CDK dans une application CDK :

    import { MyProjectMcpServer } from ':my-scope/common-constructs';
    export class ExampleStack extends Stack {
    constructor(scope: Construct, id: string) {
    // Ajoutez le serveur MCP à votre stack
    new MyProjectMcpServer(this, 'MyProjectMcpServer');
    }
    }

    Par défaut, votre serveur MCP sera sécurisé via l’authentification IAM. Déployez-le simplement sans arguments :

    import { MyProjectMcpServer } from ':my-scope/common-constructs';
    export class ExampleStack extends Stack {
    constructor(scope: Construct, id: string) {
    new MyProjectMcpServer(this, 'MyProjectMcpServer');
    }
    }

    Vous pouvez accorder l’accès pour invoquer votre MCP sur Bedrock AgentCore Runtime en utilisant la méthode grantInvoke. Par exemple, vous pourriez autoriser un agent généré avec le générateur py#strands-agent à appeler votre serveur MCP :

    import { MyProjectAgent, MyProjectMcpServer } from ':my-scope/common-constructs';
    export class ExampleStack extends Stack {
    constructor(scope: Construct, id: string) {
    const agent = new MyProjectAgent(this, 'MyProjectAgent');
    const mcpServer = new MyProjectMcpServer(this, 'MyProjectMcpServer');
    mcpServer.agentCoreRuntime.grantInvoke(agent.agentCoreRuntime);
    }
    }

    L’exemple suivant montre comment configurer l’authentification Cognito pour votre agent.

    Pour configurer l’authentification JWT, passez la propriété authorizerConfiguration à votre construct de serveur MCP. Voici un exemple configurant un user pool et client Cognito :

    import { MyProjectMcpServer } from ':my-scope/common-constructs';
    export class ExampleStack extends Stack {
    constructor(scope: Construct, id: string) {
    const userPool = new UserPool(this, 'UserPool');
    const client = userPool.addClient('Client', {
    authFlows: {
    userPassword: true,
    },
    });
    new MyProjectMcpServer(this, 'MyProjectMcpServer', {
    authorizerConfiguration: {
    customJWTAuthorizer: {
    discoveryUrl: `https://cognito-idp.${Stack.of(userPool).region}.amazonaws.com/${userPool.userPoolId}/.well-known/openid-configuration`,
    allowedClients: [client.userPoolClientId],
    },
    },
    });
    }
    }

    Pour construire votre serveur MCP pour Bedrock AgentCore Runtime, une cible bundle est ajoutée à votre projet. Elle :

    • Exporte vos dépendances Python dans un fichier requirements.txt via uv export
    • Installe les dépendances pour la plateforme cible (aarch64-manylinux2014) via uv pip install

    Une cible docker spécifique à votre serveur MCP est aussi ajoutée. Elle :

    • Construit une image Docker depuis le Dockerfile exécutant votre serveur MCP sur le port 8000, conformément au contrat de service MCP

    Votre serveur MCP est automatiquement configuré avec de l’observabilité grâce à AWS Distro for Open Telemetry (ADOT), en configurant l’auto-instrumentation dans votre Dockerfile.

    Vous pouvez trouver les traces dans la console AWS CloudWatch en sélectionnant “GenAI Observability” dans le menu. Notez que pour que les traces soient peuplées, vous devrez activer Transaction Search.

    Pour plus de détails, consultez la documentation d’AgentCore sur l’observabilité.