Serveur MCP Python
Générer un serveur Python Model Context Protocol (MCP) pour fournir du contexte aux grands modèles de langage (LLM), et éventuellement le déployer sur Amazon Bedrock AgentCore.
Qu’est-ce que MCP ?
Section intitulée « Qu’est-ce que MCP ? »Le Model Context Protocol (MCP) est un standard ouvert qui permet aux assistants IA d’interagir avec des outils et des ressources externes. Il fournit un moyen cohérent pour les LLM de :
- Exécuter des outils (fonctions) qui effectuent des actions ou récupèrent des informations
- Accéder à des ressources qui fournissent du contexte ou des données
Utilisation
Section intitulée « Utilisation »Générer un serveur MCP
Section intitulée « Générer un serveur MCP »Vous pouvez générer un serveur MCP Python de deux manières :
- Installez le Nx Console VSCode Plugin si ce n'est pas déjà fait
- Ouvrez la console Nx dans VSCode
- Cliquez sur
Generate (UI)dans la section "Common Nx Commands" - Recherchez
@aws/nx-plugin - py#mcp-server - Remplissez les paramètres requis
- Cliquez sur
Generate
pnpm nx g @aws/nx-plugin:py#mcp-serveryarn nx g @aws/nx-plugin:py#mcp-servernpx nx g @aws/nx-plugin:py#mcp-serverbunx nx g @aws/nx-plugin:py#mcp-serverVous pouvez également effectuer une simulation pour voir quels fichiers seraient modifiés
pnpm nx g @aws/nx-plugin:py#mcp-server --dry-runyarn nx g @aws/nx-plugin:py#mcp-server --dry-runnpx nx g @aws/nx-plugin:py#mcp-server --dry-runbunx nx g @aws/nx-plugin:py#mcp-server --dry-run| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
| project Requis | string | - | Le projet auquel ajouter un serveur MCP |
| name | string | - | Le nom de votre serveur MCP (par défaut : mcp-server) |
| auth | iam | cognito | iam | La 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 | terraform | inherit | Le fournisseur IaC préféré. Par défaut, celui-ci est hérité de votre sélection initiale. |
| infra | agentcore | none | agentcore | Le type d'infrastructure pour héberger votre serveur MCP. Sélectionnez none pour aucun hébergement. |
| preferInstallDependencies | boolean | true | Indique s'il faut privilégier l'installation des dépendances après l'exécution du générateur. Définir à 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. |
Sortie du générateur
Section intitulée « Sortie du générateur »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 des 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 héberger votre serveur MCP
- Dockerfile Point d’entrée pour héberger votre serveur MCP (exclu lorsque
infraest défini surNone)
- pyproject.toml Mis à jour avec les dépendances MCP
- project.json Mis à jour avec les cibles de service du serveur MCP
Infrastructure
Section intitulée « Infrastructure »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
Répertoirepackages/common/terraform
Répertoiresrc
Répertoireapp/ Modules Terraform pour l’infrastructure spécifique à un projet/générateur
- …
Répertoirecore/ Modules génériques réutilisés par ceux dans
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épertoirepackages/common/terraform/src
Répertoireapp
Répertoiremcp-servers
Répertoire<project-name>
- <project-name>.tf Module pour déployer votre serveur MCP
Répertoirecore
Répertoireagent-core
- runtime.tf Module générique pour le déploiement sur Bedrock AgentCore Runtime
Si vous avez sélectionné none pour infra, aucun construct CDK ou 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.
Architecture
Section intitulée « Architecture »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.
Avec infra: None, aucune infrastructure AWS n’est générée. Le serveur MCP est configuré uniquement pour les transports STDIO et HTTP locaux, et est consommé par des assistants IA s’exécutant sur la même machine.
Travailler avec votre serveur MCP
Section intitulée « Travailler avec votre serveur MCP »Ajouter des outils
Section intitulée « Ajouter des outils »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 fournit une approche simple 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="Your tool description")def your_tool_name(param1: str, param2: int) -> str: """Tool implementation with type hints""" # Your tool logic here return f"Result: {param1} with {param2}"La bibliothèque FastMCP gère automatiquement :
- La validation de type basée sur les annotations de type de votre fonction
- La génération de schéma JSON pour le protocole MCP
- La gestion des erreurs et le formatage des réponses
Ajouter des ressources
Section intitulée « Ajouter des ressources »Les ressources fournissent du contexte à l’assistant IA. Vous pouvez ajouter des ressources en utilisant le décorateur @mcp.resource :
@mcp.resource("example://static-resource", description="Static resource example")def static_resource() -> str: """Return static content""" return "This is static content that provides context to the AI"
@mcp.resource("dynamic://resource/{item_id}", description="Dynamic resource example")def dynamic_resource(item_id: str) -> str: """Return dynamic content based on parameters""" # Fetch data based on item_id data = fetch_data_for_item(item_id) return f"Dynamic content for {item_id}: {data}"Configuration avec les assistants IA
Section intitulée « Configuration avec les assistants IA »Fichiers de configuration
Section intitulée « Fichiers de configuration »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" } } }}Configuration spécifique à l’assistant
Section intitulée « Configuration spécifique à l’assistant »Consultez la documentation suivante pour configurer MCP avec des assistants IA spécifiques :
Exécuter votre serveur MCP
Section intitulée « Exécuter votre serveur MCP »Développement local
Section intitulée « Développement local »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 :
pnpm nx dev your-projectyarn nx dev your-projectnpx nx dev your-projectbunx nx dev your-projectSi 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 :
pnpm nx your-server-name-dev your-projectyarn nx your-server-name-dev your-projectnpx nx your-server-name-dev your-projectbunx nx your-server-name-dev your-projectInspecteur
Section intitulée « Inspecteur »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, y compris toutes les dépendances connectées telles qu’une base de données locale) et lance l’inspecteur MCP préconfiguré pour s’y connecter via le transport HTTP streamable.
pnpm nx your-server-name-inspect your-projectyarn nx your-server-name-inspect your-projectnpx nx your-server-name-inspect your-projectbunx nx your-server-name-inspect your-projectCela démarrera l’inspecteur à l’adresse http://localhost:6274. Commencez en cliquant sur le bouton “Connect”.
Le moyen le plus simple de tester et d’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.
pnpm nx your-server-name-serve-stdio your-projectyarn nx your-server-name-serve-stdio your-projectnpx nx your-server-name-serve-stdio your-projectbunx nx your-server-name-serve-stdio your-projectCette commande utilise uv run pour exécuter votre serveur MCP avec le transport STDIO.
HTTP streamable
Section intitulée « HTTP streamable »Si vous souhaitez exécuter votre serveur MCP localement en utilisant le transport HTTP streamable, vous pouvez utiliser la cible <your-server-name>-serve.
pnpm nx your-server-name-serve your-projectyarn nx your-server-name-serve your-projectnpx nx your-server-name-serve your-projectbunx nx your-server-name-serve your-projectCette commande utilise uv run uvicorn --reload pour exécuter votre serveur MCP avec le transport HTTP (généralement sur le port 8000), et redémarre automatiquement lorsque les fichiers changent.
Déployer votre serveur MCP sur Bedrock AgentCore Runtime
Section intitulée « Déployer votre serveur MCP sur Bedrock AgentCore Runtime »Infrastructure en tant que code
Section intitulée « Infrastructure en tant que code »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'); }}Un module Terraform est généré pour vous, nommé d’après le name choisi lors de l’exécution du générateur, ou <ProjectName>-mcp-server par défaut.
Transmettez les sorties du module partagé runtime_config_appconfig au module du serveur MCP :
module "my_project_mcp_server" { source = "../../common/terraform/src/app/mcp-servers/my-project-mcp-server"
appconfig_application_id = module.runtime_config_appconfig.application_id appconfig_application_arn = module.runtime_config_appconfig.application_arn}Authentification
Section intitulée « Authentification »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); }}# Serveur MCPmodule "my_project_mcp_server" { # Chemin relatif vers le module généré dans le projet common/terraform source = "../../common/terraform/src/app/mcp-servers/my-project-mcp-server"
appconfig_application_id = module.runtime_config_appconfig.application_id appconfig_application_arn = module.runtime_config_appconfig.application_arn}Pour autoriser l’invocation de votre serveur MCP, ajoutez une politique IAM faisant référence à la sortie module.my_project_mcp_server.agent_core_runtime_arn :
{ Effect = "Allow" Action = [ "bedrock-agentcore:InvokeAgentRuntime" ] Resource = [ module.my_project_mcp_server.agent_core_runtime_arn, "${module.my_project_mcp_server.agent_core_runtime_arn}/*" ]}Authentification Cognito
Section intitulée « Authentification Cognito »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 module généré accepte les variables user_pool_id et user_pool_client_ids pour l’authentification Cognito :
module "user_identity" { source = "../../common/terraform/src/core/user-identity"}
module "my_project_mcp_server" { source = "../../common/terraform/src/app/mcp-servers/my-project-mcp-server"
appconfig_application_id = module.runtime_config_appconfig.application_id appconfig_application_arn = module.runtime_config_appconfig.application_arn
user_pool_id = module.user_identity.user_pool_id user_pool_client_ids = [module.user_identity.user_pool_client_id]}Cibles Bundle et Docker
Section intitulée « Cibles Bundle et Docker »Afin de construire votre serveur MCP pour Bedrock AgentCore Runtime, une cible bundle est ajoutée à votre projet, qui :
- Exporte vos dépendances Python vers un fichier
requirements.txten utilisantuv export - Installe les dépendances pour la plateforme cible (
aarch64-manylinux_2_28) en utilisantuv pip install
Une cible docker spécifique à votre serveur MCP est également ajoutée, qui copie le Dockerfile et les artefacts empaquetés dans un répertoire de contexte docker. Cela co-localise le Dockerfile avec la sortie construite, permettant à CDK de construire l’image Docker directement en utilisant AgentRuntimeArtifact.fromAsset.
Analyse d’image
Section intitulée « Analyse d’image »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.
Suppression des résultats Trivy
Section intitulée « Suppression des résultats Trivy »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 :
# node-tar arbitrary file write - not exploitable in our usageCVE-2024-XXXXXPour plus de détails sur le filtrage des résultats, consultez la documentation de filtrage Trivy.
Observabilité
Section intitulée « Observabilité »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é.
Connexions
Section intitulée « Connexions »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 :