Aller au contenu

Serveur MCP TypeScript

Filter this guidePick generator option values to hide sections that don't apply.

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ètreTypePar défautDescription
    project Requisstring-Le projet auquel ajouter un serveur MCP
    name string-Le nom de votre serveur MCP (par défaut : mcp-server)
    auth iam | cognitoiamLa méthode utilisée pour s'authentifier auprès de votre serveur MCP. Applicable uniquement lorsque infra est défini (ignoré lorsque infra est none).
    iac inherit | cdk | terraforminheritLe fournisseur IaC préféré. Par défaut, cette valeur est héritée de votre sélection initiale.
    infra agentcore | noneagentcoreLe type d'infrastructure pour héberger votre serveur MCP. Sélectionnez none pour aucun hébergement.
    preferInstallDependencies booleantrueIndique s'il faut privilégier l'installation des dépendances après l'exécution du générateur. Définir sur false pour différer l'installation lors de l'exécution de plusieurs générateurs en lot (une installation s'exécute quand même si nécessaire pour que les générateurs suivants puissent calculer le graphe de projet Nx) ; installer une seule fois à la fin.

    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/
            • divide.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 infra est défini sur None)
      • project.json Mis à jour avec la cible de service du serveur MCP
    infra = agentcore

    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
    infra = none

    Si vous avez sélectionné None pour infra, aucun construct CDK ni module Terraform n’est généré — le serveur MCP est configuré uniquement pour une utilisation locale STDIO / HTTP. L’option auth est ignorée dans ce mode car il n’y a pas de point de terminaison hébergé à authentifier.

    Lorsqu’il est déployé sur Bedrock AgentCore Runtime, le serveur MCP est construit dans une image de conteneur, poussé vers Amazon ECR et exécuté dans AgentCore Runtime. Les assistants IA invoquent le point de terminaison du plan de données AgentCore Runtime, qui transmet les appels tools/* et resources/* à votre serveur via le transport HTTP streamable.

    AI AssistantECRMCP Server(AgentCore Runtime)CloudWatch(Logs, Metrics) StreamableHTTP Containerimage

    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.registerTool("toolName", {
    description: "description de l'outil",
    inputSchema: { 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.registerResource('resource-name', 'example://resource', {}, async (uri) => ({
    contents: [{ uri: uri.href, text: exampleContext }],
    }));
    // Ressource dynamique
    server.registerResource('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 :

    Pour exécuter votre serveur MCP (et tout ce qui y est connecté, comme une base de données locale) localement, utilisez la cible dev du projet :

    Terminal window
    pnpm nx dev your-project

    Si vous avez ajouté plusieurs composants à votre projet (serveurs MCP, agents, etc.), cela les démarre tous. Pour exécuter uniquement ce serveur MCP, ciblez sa cible <your-server-name>-dev :

    Terminal window
    pnpm nx your-server-name-dev your-project

    Le générateur configure une cible nommée <your-server-name>-inspect, qui démarre votre serveur MCP localement (via la cible <your-server-name>-dev, incluant toutes les dépendances connectées telles qu’une base de données locale) et lance l’MCP Inspector préconfiguré pour s’y connecter via le transport HTTP Streamable.

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

    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 your-server-name-serve-stdio your-project

    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.

    Terminal window
    pnpm nx your-server-name-serve your-project

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

    infra = agentcore

    Si vous avez sélectionné agentcore pour infra, 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 serveur MCP, 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');
    }
    }

    Le générateur fournit une option auth pour configurer l’authentification de votre serveur MCP. Vous pouvez choisir entre l’authentification IAM (par défaut) ou Cognito lors de la génération de votre serveur MCP.

    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 serveur MCP sur Bedrock AgentCore Runtime avec la méthode grantInvokeAccess. Par exemple, pour permettre à un agent généré avec le générateur py#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.grantInvokeAccess(agent);
    }
    }

    Lorsque vous sélectionnez l’authentification Cognito, le générateur configure le serveur MCP pour utiliser Cognito pour l’authentification.

    Le construct généré accepte une prop identity qui configure l’authentification Cognito :

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

    Le construct UserIdentity peut être généré en utilisant le générateur ts#website#auth, ou vous pouvez créer votre propre UserPool et UserPoolClient CDK.

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

    Terminal window
    pnpm nx bundle <project-name>

    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 copie le Dockerfile depuis le répertoire source de votre serveur MCP vers le répertoire de sortie du bundle. Cela co-localise le Dockerfile avec les artefacts bundlés, permettant à CDK de construire l’image Docker directement en utilisant AgentRuntimeArtifact.fromAsset.

    Une cible docker est aussi générée pour préparer le contexte Docker de tous les serveurs MCP si vous en avez plusieurs définis.

    L’image Docker construite pour ce projet est analysée pour détecter les vulnérabilités dans le cadre de la construction en utilisant Trivy, exécuté à partir de l’image Trivy hébergée sur ECR.

    Une cible trivy est ajoutée à votre projet qui analyse l’image construite et fait échouer la construction si une vulnérabilité de gravité HIGH ou CRITICAL est trouvée. Le Dockerfile généré utilise une image de base sans vulnérabilité corrigeable connue de ces gravités au moment de la génération, et met à niveau les outils intégrés (tels que npm) pour le maintenir ainsi.

    L’analyse utilise le même moteur de conteneur que votre construction d’image (docker ou finch), donc aucun outillage supplémentaire n’est requis. Étant donné que l’analyse n’est réexécutée que lorsque l’image change, une image inchangée n’est pas réanalysée.

    Il peut y avoir des cas où vous souhaitez supprimer une vulnérabilité spécifique, par exemple lorsqu’aucun correctif n’est encore disponible et que vous avez évalué le risque comme acceptable.

    Ajoutez l’ID de vulnérabilité (un par ligne) au fichier .trivyignore à la racine de votre projet :

    .trivyignore
    # node-tar arbitrary file write - not exploitable in our usage
    CVE-2024-XXXXX

    Pour plus de détails sur le filtrage des résultats, consultez la documentation de filtrage Trivy.

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

    Utilisez le générateur connection pour intégrer ce projet avec d’autres dans votre espace de travail. Les connexions suivantes impliquent ce projet :

    Strands AgentsTypeScriptModel Context Protocol
    TypeScript Agent vers MCPConnecter un TypeScript Agent à un serveur MCP
    Strands AgentsPythonModel Context Protocol
    Python Agent vers MCPConnecter un Python Agent à un serveur MCP
    Model Context ProtocolAmazon Aurora
    Serveur MCP vers Base de données relationnelleConnecter un serveur MCP TypeScript à une base de données relationnelle Aurora
    Model Context ProtocolAmazon DynamoDB
    Serveur MCP vers TypeScript DynamoDBConnecter un serveur MCP TypeScript à une table DynamoDB
    Amazon Bedrock AgentCore GatewayModel Context Protocol
    AgentCore Gateway vers Serveur MCPAgréger un serveur MCP derrière une AgentCore Gateway