Skip to content

Pythonの MCPサーバー

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

大規模言語モデル(LLM)にコンテキストを提供するためのPython Model Context Protocol (MCP) サーバーを生成し、オプションでAmazon Bedrock AgentCoreにデプロイします。

Model Context Protocol (MCP) はAIアシスタントが外部ツールやリソースと相互作用するためのオープンスタンダードです。LLMが以下を行うための一貫した方法を提供します:

  • アクション実行や情報取得のためのツール(関数)を実行
  • コンテキストやデータを提供するリソースにアクセス

Python MCPサーバーは2つの方法で生成できます:

  1. インストール Nx Console VSCode Plugin まだインストールしていない場合
  2. VSCodeでNxコンソールを開く
  3. クリック Generate (UI) "Common Nx Commands"セクションで
  4. 検索 @aws/nx-plugin - py#mcp-server
  5. 必須パラメータを入力
    • クリック Generate
    パラメータデフォルト説明
    project 必須string-MCP サーバーを追加するプロジェクト
    name string-MCP サーバーの名前(デフォルト: mcp-server)
    auth iam | cognitoiamMCPサーバーへの認証に使用する方法。infraが設定されている場合にのみ適用されます(infraがnoneの場合は無視されます)。
    iac inherit | cdk | terraforminherit優先するIaCプロバイダー。デフォルトでは初期選択から継承されます。
    infra agentcore | noneagentcoreMCPサーバーをホストするインフラストラクチャのタイプ。ホスティングが不要な場合はnoneを選択してください。
    preferInstallDependencies booleantrueジェネレーター実行後に依存関係のインストールを優先するかどうか。複数のジェネレーターをバッチ処理する際にインストールを延期する場合はfalseに設定します(後続のジェネレーターがNxプロジェクトグラフを計算できるよう、必要に応じてインストールは実行されます)。最後に一度だけインストールします。

    ジェネレータは既存のPythonプロジェクトに以下のファイルを追加します:

    • Directoryyour-project/
      • Directoryyour_module/
        • Directorymcp_server/ (カスタム名指定時はその名前)
          • __init__.py Pythonパッケージ初期化ファイル
          • server.py サンプルツールとリソースを含むメインサーバー定義
          • stdio.py STDIOトランスポート用エントリポイント(簡易ローカルMCPサーバー向け)
          • http.py ストリーミング可能なHTTPトランスポート用エントリポイント(MCPサーバーホスティング向け)
          • Dockerfile MCPサーバーホスティング用Dockerfile(infraNoneの場合は生成されない)
      • pyproject.toml MCP依存関係が追加された設定ファイル
      • project.json MCPサーバー実行ターゲットが追加された設定ファイル
    infra = agentcore

    このジェネレータは選択した iacProvider に基づいてInfrastructure as Codeを生成するため、packages/common に関連するCDKコンストラクトまたはTerraformモジュールを含むプロジェクトを作成します。

    共通のInfrastructure as Codeプロジェクトは以下の構造を持ちます:

    • Directorypackages/common/constructs
      • Directorysrc
        • Directoryapp/ プロジェクト/ジェネレータ固有のインフラストラクチャ用コンストラクト
        • Directorycore/ app 内のコンストラクトで再利用される汎用コンストラクト
        • index.ts app からコンストラクトをエクスポートするエントリーポイント
      • project.json プロジェクトのビルドターゲットと設定

    MCP サーバーをデプロイするために、以下のファイルが生成されます:

    • Directorypackages/common/constructs/src
      • Directoryapp
        • Directorymcp-servers
          • Directory<project-name>
            • <project-name>.ts MCP サーバーをデプロイするための CDK コンストラクト
            • Dockerfile CDK コンストラクトで使用されるパススルー Dockerfile
    infra = none

    infraNoneを選択した場合、CDKコンストラクトやTerraformモジュールは生成されません — MCPサーバーはローカルのSTDIO / HTTP使用のみに設定されます。このモードでは、認証するホストエンドポイントが存在しないため、authオプションは無視されます。

    Bedrock AgentCore Runtimeにデプロイすると、MCPサーバーはコンテナイメージとしてビルドされ、Amazon ECRにプッシュされ、AgentCore Runtimeで実行されます。AIアシスタントはAgentCore Runtimeのデータプレーンエンドポイントを呼び出し、tools/*およびresources/*の呼び出しをstreamable HTTPトランスポートを介してサーバーに転送します。

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

    ツールはAIアシスタントが呼び出せるアクション実行関数です。Python MCPサーバーはMCP Python SDK (FastMCP)ライブラリを使用し、デコレータベースのツール定義を提供します。

    server.pyファイルに新しいツールを追加できます:

    @mcp.tool(description="Your tool description")
    def your_tool_name(param1: str, param2: int) -> str:
    """型ヒント付きのツール実装"""
    # ツールロジックをここに記述
    return f"Result: {param1} with {param2}"

    FastMCPライブラリは以下を自動処理します:

    • 関数の型ヒントに基づく型検証
    • MCPプロトコル用JSONスキーマ生成
    • エラーハンドリングとレスポンスフォーマット

    リソースはAIアシスタントにコンテキストを提供します。@mcp.resourceデコレータでリソースを追加できます:

    @mcp.resource("example://static-resource", description="静的リソース例")
    def static_resource() -> str:
    """静的なコンテンツを返す"""
    return "AIにコンテキストを提供する静的コンテンツ"
    @mcp.resource("dynamic://resource/{item_id}", description="動的リソース例")
    def dynamic_resource(item_id: str) -> str:
    """パラメータに基づく動的コンテンツを返す"""
    # item_idに基づくデータ取得
    data = fetch_data_for_item(item_id)
    return f"{item_id}の動的コンテンツ: {data}"

    MCPをサポートするほとんどのAIアシスタントは類似した設定方法を採用しています。MCPサーバーの詳細を記載した設定ファイルを作成または更新する必要があります:

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

    特定のAIアシスタントでMCPを設定するには、以下のドキュメントを参照してください:

    MCPサーバー(およびローカルデータベースなど、接続されているすべてのもの)をローカルで実行するには、プロジェクトのdevターゲットを使用します:

    Terminal window
    pnpm nx dev your-project

    プロジェクトに複数のコンポーネント(MCPサーバー、エージェントなど)を追加している場合、これによりすべてが起動します。このMCPサーバーのみを実行するには、その<your-server-name>-devターゲットを指定します:

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

    ジェネレータは<your-server-name>-inspectターゲットを設定します。このターゲットはMCPサーバーをローカルで起動し(<your-server-name>-devターゲット経由で、ローカルデータベースなどの接続された依存関係を含む)、ストリーミング可能HTTPトランスポートで接続するように事前設定されたMCP Inspectorを起動します。

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

    これによりhttp://localhost:6274でインスペクタが起動します。「Connect」ボタンから接続を開始してください。

    MCPサーバーをテストする最も簡単な方法は、インスペクタを使用するかAIアシスタントと連携することです(上記参照)。

    STDIOトランスポートで直接サーバーを実行するには<your-server-name>-serve-stdioターゲットを使用します。

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

    このコマンドはuv runを使用してSTDIOトランスポートでMCPサーバーを実行します。

    ストリーミング可能HTTPトランスポートでローカル実行する場合は<your-server-name>-serveターゲットを使用します。

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

    このコマンドはuv run uvicorn --reloadを使用してHTTPトランスポートでMCPサーバーを実行し(通常はポート8000)、ファイル変更時に自動的に再起動します。

    infra = agentcore

    Bedrock AgentCore Runtimeへのデプロイ

    Section titled “Bedrock AgentCore Runtimeへのデプロイ”

    infraagentcoreを選択した場合、関連するCDKまたはTerraformのインフラストラクチャーコードが生成されます。これを使用してMCPサーバーをAmazon Bedrock AgentCore Runtimeにデプロイできます。

    MCPサーバー用のCDKコンストラクトが生成されます。ジェネレーター実行時に選択したnameに基づいて命名されます(デフォルトは<ProjectName>McpServer)。

    このCDKコンストラクトをCDKアプリケーションで使用できます:

    import { MyProjectMcpServer } from ':my-scope/common-constructs';
    export class ExampleStack extends Stack {
    constructor(scope: Construct, id: string) {
    // スタックにMCPサーバーを追加
    new MyProjectMcpServer(this, 'MyProjectMcpServer');
    }
    }

    ジェネレーターは、MCPサーバーの認証を設定するためのauthオプションを提供します。MCPサーバー生成時にIAM(デフォルト)またはCognito認証を選択できます。

    デフォルトではMCPサーバーはIAM認証で保護されます。引数なしでデプロイできます:

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

    grantInvokeAccessメソッドを使用してBedrock AgentCore Runtime上のMCPサーバー起動権限を付与できます。例:py#agentジェネレーターで作成したエージェントに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);
    }
    }

    Cognito認証を選択すると、ジェネレーターはCognito認証を使用するようにMCPサーバーを設定します。

    生成されたコンストラクトは、Cognito認証を設定するidentityプロパティを受け入れます:

    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,
    });
    }
    }

    UserIdentityコンストラクトはts#website#authジェネレーターを使用して生成できます。また、独自のCDK UserPoolUserPoolClientを作成することもできます。

    Bedrock AgentCore Runtime向けにMCPサーバーをビルドするため、プロジェクトにbundleターゲットが追加されます。このターゲットは:

    • uv exportを使用してPython依存関係をrequirements.txtにエクスポート
    • ターゲットプラットフォーム(aarch64-manylinux_2_28)向けにuv pip installで依存関係をインストール

    また、MCPサーバー固有のdockerターゲットが追加されます。このターゲットはDockerfileとバンドルされたアーティファクトをdockerコンテキストディレクトリにコピーします。これによりDockerfileがビルド出力と同じ場所に配置され、CDKがAgentRuntimeArtifact.fromAssetを使用して直接Dockerイメージをビルドできるようになります。

    このプロジェクト用にビルドされたDockerイメージは、ビルドの一部としてTrivyを使用して脆弱性がスキャンされます。TrivyはECRホスト版Trivyイメージから実行されます。

    trivyターゲットがプロジェクトに追加され、ビルドされたイメージをスキャンし、HIGHまたはCRITICALの深刻度の脆弱性が見つかった場合、ビルドは失敗します。生成されたDockerfileは、生成時点でこれらの深刻度の既知の修正可能な脆弱性がないベースイメージを使用し、バンドルされたツール(npmなど)をアップグレードしてその状態を維持します。

    スキャンはイメージビルドと同じコンテナエンジン(dockerまたはfinch)を使用するため、追加のツールは必要ありません。スキャンはイメージが変更されたときにのみ再実行されるため、変更されていないイメージは再スキャンされません。

    特定の脆弱性を抑制したい場合があります。例えば、まだ修正が利用できず、リスクを許容可能と評価した場合などです。

    プロジェクトのルート(つまりproject.jsonの隣)にある.trivyignoreファイルに脆弱性ID(1行に1つ)を追加してください:

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

    検出結果のフィルタリングの詳細については、Trivyフィルタリングドキュメントを参照してください。

    お客様の MCP サーバーは、Dockerfile で自動計装を構成することにより、AWS Distro for Open Telemetry (ADOT) を使用したオブザーバビリティが自動的に設定されます。

    トレースは CloudWatch AWS コンソールのメニューで「GenAI Observability」を選択すると確認できます。トレースが表示されるためには、Transaction Search の有効化が必要なことにご注意ください。

    詳細については、AgentCore ドキュメントのオブザーバビリティ項目を参照してください。

    connectionジェネレータを使用して、このプロジェクトをワークスペース内の他のプロジェクトと統合できます。このプロジェクトに関連する接続は以下の通りです:

    Strands AgentsTypeScriptModel Context Protocol
    TypeScript Agent to MCPTypeScript AgentをMCPサーバーに接続する
    Strands AgentsPythonModel Context Protocol
    Python Agent to MCPPython AgentをMCPサーバーに接続する
    Model Context ProtocolPythonAmazon DynamoDBPython
    Python MCP Server to Python DynamoDBPython MCP ServerをDynamoDBテーブルに接続する
    Amazon Bedrock AgentCore GatewayModel Context Protocol
    AgentCore Gateway to MCP ServerAgentCore GatewayでMCPサーバーを集約する