Aller au contenu

Serveur MCP TypeScript

Générez un serveur Model Context Protocol (MCP) en TypeScript pour fournir du contexte aux Grands Modèles de Langage (LLM), 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 LLM 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 en TypeScript de deux manières :

  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 - ts#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 Inherit The preferred IaC provider. By default this is inherited from your initial selection.

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

    • Répertoireyour-project/
      • Répertoiresrc/
        • Répertoiremcp-server/ (ou nom personnalisé si spécifié)
          • index.ts Exporte votre serveur
          • server.ts Définition principale du serveur
          • stdio.ts Point d’entrée pour le transport STDIO, utile pour des serveurs MCP locaux simples
          • http.ts Point d’entrée pour le transport HTTP streamable, utile pour héberger votre serveur MCP
          • Répertoiretools/
            • add.ts Exemple d’outil
          • Répertoireresources/
            • sample-guidance.ts Exemple de ressource
          • Dockerfile Point d’entrée pour héberger votre serveur MCP (exclu si computeType est défini sur None)
      • package.json Mis à jour avec l’entrée bin et les dépendances MCP
      • project.json Mis à jour avec la cible 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. Vous pouvez ajouter de nouveaux outils dans le fichier server.ts :

    server.tool("toolName", "description de l'outil",
    { param1: z.string(), param2: z.number() }, // Schéma d'entrée utilisant Zod
    async ({ param1, param2 }) => {
    // Implémentation de l'outil
    return {
    content: [{ type: "text", text: "Résultat" }]
    };
    }
    );

    Les ressources fournissent du contexte à l’assistant IA. Vous pouvez ajouter des ressources statiques depuis des fichiers ou des ressources dynamiques :

    const exampleContext = 'contexte exemple à retourner';
    server.resource('resource-name', 'example://resource', async (uri) => ({
    contents: [{ uri: uri.href, text: exampleContext }],
    }));
    // Ressource dynamique
    server.resource('dynamic-resource', 'dynamic://resource', async (uri) => {
    const data = await fetchSomeData();
    return {
    contents: [{ uri: uri.href, text: 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": "npx",
    "args": ["tsx", "/path/to/your-mcp-server/stdio.ts"]
    }
    }
    }

    Pendant le développement de votre serveur MCP, vous pouvez activer le flag --watch pour que l’assistant IA détecte toujours les dernières versions des outils/ressources :

    {
    "mcpServers": {
    "your-mcp-server": {
    "command": "npx",
    "args": ["tsx", "--watch", "/path/to/your-mcp-server/stdio.ts"]
    }
    }
    }

    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 démarre 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émarrera l’inspecteur sur http://localhost:6274. Commencez en cliquant sur le bouton “Connect”.

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

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

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

    Cette commande utilise tsx --watch pour redémarrer automatiquement le serveur lors des modifications de fichiers.

    Si vous souhaitez 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 tsx --watch pour redémarrer automatiquement le serveur lors des modifications de fichiers.

    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é d’après 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');
    }
    }

    Docker est requis pour construire et déployer votre serveur MCP. Assurez-vous qu’il est installé et lancé pour éviter des erreurs comme :

    ERROR: Cannot connect to the Docker daemon at unix://path/to/docker.sock.

    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 autoriser l’invocation de votre MCP sur Bedrock AgentCore Runtime avec la méthode grantInvoke. Par exemple, pour permettre à un agent généré avec le générateur py#strands-agent d’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 MCP. Cet exemple configure un user pool et un 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],
    },
    },
    });
    }
    }

    Le générateur configure automatiquement une cible bundle qui utilise Rolldown pour créer un package de déploiement :

    Terminal window
    pnpm nx run <project-name>:bundle

    La configuration de Rolldown se trouve dans rolldown.config.ts, avec une entrée par bundle à générer. Rolldown gère la création de plusieurs bundles en parallèle si définis.

    La cible de bundle utilise http.ts comme point d’entrée pour le serveur MCP HTTP Streamable à héberger sur Bedrock AgentCore Runtime.

    Le générateur configure une cible <your-server-name>-docker qui exécute le serveur MCP HTTP Streamable bundle sur le port 8000 conformément au contrat de protocole MCP.

    Une cible docker est aussi générée pour construire toutes les images Docker si vous avez plusieurs serveurs MCP définis.

    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é.