Salta ai contenuti

Server MCP Python

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

Genera un server Python per il Model Context Protocol (MCP) per fornire contesto ai Large Language Model (LLM), con opzione di deploy su Amazon Bedrock AgentCore.

Il Model Context Protocol (MCP) è uno standard aperto che permette agli assistenti AI di interagire con strumenti e risorse esterne. Fornisce un modo consistente per i LLM di:

  • Eseguire strumenti (funzioni) che compiono azioni o recuperano informazioni
  • Accedere a risorse che forniscono contesto o dati

Puoi generare un server MCP Python in due modi:

  1. Installa il Nx Console VSCode Plugin se non l'hai già fatto
  2. Apri la console Nx in VSCode
  3. Clicca su Generate (UI) nella sezione "Common Nx Commands"
  4. Cerca @aws/nx-plugin - py#mcp-server
  5. Compila i parametri richiesti
    • Clicca su Generate
    ParametroTipoPredefinitoDescrizione
    project Obbligatoriostring-Il progetto a cui aggiungere un server MCP
    name string-Il nome del tuo server MCP (predefinito: mcp-server)
    auth iam | cognitoiamIl metodo utilizzato per autenticare con il tuo server MCP. Applicabile solo quando infra è impostato (ignorato quando infra è none).
    iac inherit | cdk | terraforminheritIl provider IaC preferito. Per impostazione predefinita viene ereditato dalla selezione iniziale.
    infra agentcore | noneagentcoreIl tipo di infrastruttura per ospitare il tuo server MCP. Seleziona none per nessun hosting.
    preferInstallDependencies booleantrueSe preferire l'installazione delle dipendenze dopo l'esecuzione del generatore. Impostare su false per rimandare l'installazione quando si eseguono più generatori in batch (l'installazione viene comunque eseguita se necessaria affinché i generatori successivi possano calcolare il grafo dei progetti Nx); installare una volta alla fine.

    Il generatore aggiungerà questi file al tuo progetto Python esistente:

    • Directoryyour-project/
      • Directoryyour_module/
        • Directorymcp_server/ (o nome personalizzato se specificato)
          • __init__.py Inizializzazione pacchetto Python
          • server.py Definizione principale del server con strumenti e risorse di esempio
          • stdio.py Punto d’ingresso per trasporto STDIO, utile per server MCP locali semplici
          • http.py Punto d’ingresso per trasporto HTTP Streamable, utile per hosting del server MCP
          • Dockerfile Punto d’ingresso per hosting del server MCP (escluso se infra è impostato a None)
      • pyproject.toml Aggiornato con dipendenze MCP
      • project.json Aggiornato con target di servizio del server MCP
    infra = agentcore

    Poiché questo generatore fornisce infrastruttura come codice basata sul tuo iacProvider selezionato, creerà un progetto in packages/common che include i relativi costrutti CDK o moduli Terraform.

    Il progetto comune di infrastruttura come codice è strutturato come segue:

    • Directorypackages/common/constructs
      • Directorysrc
        • Directoryapp/ Construct per l’infrastruttura specifica di un progetto/generatore
        • Directorycore/ Construct generici riutilizzati dai construct in app
        • index.ts Punto di ingresso che esporta i construct da app
      • project.json Target di build e configurazione del progetto

    Per il deployment del tuo MCP Server, vengono generati i seguenti file:

    • Directorypackages/common/constructs/src
      • Directoryapp
        • Directorymcp-servers
          • Directory<project-name>
            • <project-name>.ts Costrutto CDK per il deployment del tuo MCP Server
            • Dockerfile File Docker passthrough utilizzato dal costrutto CDK
    infra = none

    Se hai selezionato None per infra, non vengono generati costrutti CDK o moduli Terraform — il server MCP è configurato solo per uso locale STDIO / HTTP. L’opzione auth viene ignorata in questa modalità poiché non c’è un endpoint ospitato da autenticare.

    Quando viene distribuito su Bedrock AgentCore Runtime, il server MCP viene compilato in un’immagine container, caricato su Amazon ECR ed eseguito in AgentCore Runtime. Gli assistenti AI invocano l’endpoint del data plane di AgentCore Runtime, che inoltra le chiamate tools/* e resources/* al tuo server tramite il trasporto HTTP streamable.

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

    Gli strumenti sono funzioni che l’assistente AI può chiamare per eseguire azioni. Il server MCP Python utilizza la libreria MCP Python SDK (FastMCP), che fornisce un approccio basato su decoratori per definire gli strumenti.

    Puoi aggiungere nuovi strumenti nel file server.py:

    @mcp.tool(description="Descrizione del tuo strumento")
    def your_tool_name(param1: str, param2: int) -> str:
    """Implementazione dello strumento con type hints"""
    # Logica dello strumento qui
    return f"Risultato: {param1} con {param2}"

    La libreria FastMCP gestisce automaticamente:

    • Validazione dei tipi basata sui type hint della funzione
    • Generazione dello schema JSON per il protocollo MCP
    • Gestione errori e formattazione delle risposte

    Le risorse forniscono contesto all’assistente AI. Puoi aggiungere risorse usando il decoratore @mcp.resource:

    @mcp.resource("example://static-resource", description="Esempio risorsa statica")
    def static_resource() -> str:
    """Restituisce contenuto statico"""
    return "Questo è contenuto statico che fornisce contesto all'AI"
    @mcp.resource("dynamic://resource/{item_id}", description="Esempio risorsa dinamica")
    def dynamic_resource(item_id: str) -> str:
    """Restituisce contenuto dinamico basato su parametri"""
    # Recupera dati basati su item_id
    data = fetch_data_for_item(item_id)
    return f"Contenuto dinamico per {item_id}: {data}"

    La maggior parte degli assistenti AI che supportano MCP utilizza un approccio di configurazione simile. Dovrai creare o aggiornare un file di configurazione con i dettagli del tuo server MCP:

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

    Consulta la seguente documentazione per configurare MCP con assistenti AI specifici:

    Per eseguire il tuo server MCP (e tutto ciò che è connesso ad esso, come un database locale) localmente, usa il target dev del progetto:

    Terminal window
    pnpm nx dev your-project

    Se hai aggiunto più componenti al tuo progetto (server MCP, agenti, ecc.), questo li avvia tutti. Per eseguire solo questo server MCP, usa il suo target <your-server-name>-dev:

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

    Il generatore configura un target chiamato <your-server-name>-inspect che avvia il tuo server MCP localmente (tramite il target <your-server-name>-dev, includendo eventuali dipendenze connesse come un database locale) e lancia l’MCP Inspector preconfigurato per connettersi ad esso tramite trasporto HTTP Streamable.

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

    Questo avvierà l’inspector su http://localhost:6274. Inizia cliccando sul pulsante “Connect”.

    Il modo più semplice per testare e usare un server MCP è utilizzare l’inspector o configurarlo con un assistente AI (come sopra).

    Puoi comunque eseguire il server con il trasporto STDIO direttamente usando il target <your-server-name>-serve-stdio.

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

    Questo comando usa uv run per eseguire il server MCP con trasporto STDIO.

    Se vuoi eseguire il server MCP localmente usando il trasporto HTTP Streamable, puoi usare il target <your-server-name>-serve.

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

    Questo comando usa uv run uvicorn --reload per eseguire il server MCP con trasporto HTTP (tipicamente sulla porta 8000), e riavvia automaticamente quando i file cambiano.

    infra = agentcore

    Deploy del Server MCP su Bedrock AgentCore Runtime

    Sezione intitolata “Deploy del Server MCP su Bedrock AgentCore Runtime”

    Se hai selezionato agentcore per infra, verrà generata l’infrastruttura CDK o Terraform rilevante che puoi utilizzare per distribuire il tuo server MCP su Amazon Bedrock AgentCore Runtime.

    Viene generato un costrutto CDK per il tuo server MCP, denominato in base al name scelto durante l’esecuzione del generatore, o <ProjectName>McpServer per impostazione predefinita.

    Puoi utilizzare questo costrutto CDK in un’applicazione CDK:

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

    Il generatore fornisce un’opzione auth per configurare l’autenticazione per il tuo server MCP. Puoi scegliere tra l’autenticazione IAM (predefinita) o Cognito durante la generazione del tuo server MCP.

    Per impostazione predefinita, il tuo server MCP sarà protetto utilizzando l’autenticazione IAM. Basta distribuirlo senza alcun argomento:

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

    Puoi concedere l’accesso per invocare il tuo server MCP su Bedrock AgentCore Runtime utilizzando il metodo grantInvokeAccess. Ad esempio, potresti voler consentire a un agent generato con il generatore py#agent di chiamare il tuo server 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);
    }
    }

    Quando selezioni l’autenticazione Cognito, il generatore configura il server MCP per utilizzare Cognito per l’autenticazione.

    Il costrutto generato accetta una prop identity che configura l’autenticazione 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,
    });
    }
    }

    Il costrutto UserIdentity può essere generato utilizzando il generatore ts#website#auth, oppure puoi creare il tuo UserPool e UserPoolClient CDK.

    Per costruire il tuo server MCP per Bedrock AgentCore Runtime, viene aggiunto un target bundle che:

    • Esporta le dipendenze Python in un file requirements.txt usando uv export
    • Installa le dipendenze per la piattaforma target (aarch64-manylinux_2_28) usando uv pip install

    Viene anche aggiunto un target docker specifico per il tuo server MCP che copia il Dockerfile e gli artefatti bundlizzati in una directory di contesto docker. Questo co-loca il Dockerfile con l’output costruito, permettendo a CDK di costruire l’immagine Docker direttamente usando AgentRuntimeArtifact.fromAsset.

    L’immagine Docker creata per questo progetto viene scansionata alla ricerca di vulnerabilità come parte del processo di build utilizzando Trivy, eseguito dall’immagine Trivy ospitata su ECR.

    Un target trivy viene aggiunto al progetto che scansiona l’immagine creata e fa fallire la build se viene trovata qualsiasi vulnerabilità di gravità HIGH o CRITICAL. Il Dockerfile generato utilizza un’immagine base senza vulnerabilità risolvibili note di queste gravità al momento della generazione e aggiorna gli strumenti inclusi (come npm) per mantenerla tale.

    La scansione utilizza lo stesso motore di container della build dell’immagine (docker o finch), quindi non sono necessari strumenti aggiuntivi. Poiché la scansione viene rieseguita solo quando l’immagine cambia, un’immagine non modificata non viene scansionata nuovamente.

    Potrebbero esserci casi in cui si desidera sopprimere una vulnerabilità specifica, ad esempio quando non è ancora disponibile una correzione e si è valutato il rischio come accettabile.

    Aggiungi l’ID della vulnerabilità (uno per riga) al file .trivyignore nella radice del progetto (cioè accanto al file project.json):

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

    Per maggiori dettagli sul filtraggio dei risultati, consulta la documentazione sul filtraggio di Trivy.

    Il tuo server MCP viene configurato automaticamente con l’osservabilità utilizzando AWS Distro for Open Telemetry (ADOT), tramite la configurazione dell’auto-strumentazione nel tuo Dockerfile.

    Puoi trovare le tracce nella Console AWS CloudWatch selezionando “GenAI Observability” nel menu. Nota che affinché le tracce vengano popolate, dovrai abilitare Transaction Search.

    Per ulteriori dettagli, consulta la documentazione di AgentCore sull’osservabilità.

    Usa il generatore connection per integrare questo progetto con altri nel tuo workspace. Le seguenti connessioni coinvolgono questo progetto:

    Strands AgentsTypeScriptModel Context Protocol
    TypeScript Agent to MCPCollega un TypeScript Agent a un server MCP
    Strands AgentsPythonModel Context Protocol
    Python Agent to MCPCollega un Python Agent a un server MCP
    Model Context ProtocolPythonAmazon DynamoDBPython
    Python MCP Server to Python DynamoDBCollega un Python MCP Server a una tabella DynamoDB
    Amazon Bedrock AgentCore GatewayModel Context Protocol
    AgentCore Gateway to MCP ServerAggrega un server MCP dietro un AgentCore Gateway