Aller au contenu

Serveur MCP TypeScript

Générez un serveur Model Context Protocol (MCP) en TypeScript pour fournir du contexte aux modèles de langage de grande taille (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 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 CDK The preferred IaC provider

    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é 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 <your-mcp-server>-bundle est ajoutée à votre projet. Elle :

    • Package votre serveur MCP en un seul fichier JavaScript avec esbuild, utilisant http.ts comme point d’entrée pour un serveur MCP HTTP Streamable
    • Construit une image Docker depuis le Dockerfile qui exécute ce serveur packagé sur le port 8000, conformément au contrat de protocole 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é.