Skip to content

TypeScript MCP Server

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

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

Model Context Protocol (MCP) は、AI アシスタントが外部ツールやリソースと対話できるようにするオープン標準です。LLM が以下を行うための一貫した方法を提供します:

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

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

Terminal window
pnpm nx g @aws/nx-plugin:ts#mcp-server
変更されるファイルを確認するためにドライランを実行することもできます
Terminal window
pnpm nx g @aws/nx-plugin:ts#mcp-server --dry-run
パラメータデフォルト説明
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プロジェクトグラフを計算できるよう、必要に応じてインストールは実行されます)。最後に一度だけインストールします。

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

  • Directoryyour-project/
    • Directorysrc/
      • Directorymcp-server/ (or custom name if specified)
        • index.ts Exports your server
        • server.ts Main server definition
        • stdio.ts Entry point for STDIO transport, useful for simple local MCP servers
        • http.ts Entry point for Streamable HTTP transport, useful for hosting your MCP server
        • Directorytools/
          • divide.ts Sample tool
        • Directoryresources/
          • sample-guidance.ts Sample resource
        • Dockerfile Entry point for hosting your MCP server (excluded when infra is set to None)
    • project.json Updated with MCP server serve target
infra = agentcore

このジェネレーターは、選択した iac に基づいてインフラストラクチャをコードとして提供するため、関連する CDK コンストラクトまたは Terraform モジュールを含む packages/common にプロジェクトを作成します。

共通のインフラストラクチャコードプロジェクトは、次のように構成されています:

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

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

  • Directorypackages/common/constructs/src
    • Directoryapp
      • Directorymcp-servers
        • Directory<mcp-server-name>
          • <mcp-server-name>.ts CDK construct for deploying your MCP Server
infra = none

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

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

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

ツールは、AI アシスタントがアクションを実行するために呼び出すことができる関数です。各ツールは tools/ 配下の独自のファイルに存在し、register<Name>Tool 関数をエクスポートします。その後、server.ts からその関数を呼び出します。例えば、tools/my-tool.ts を追加します:

tools/my-tool.ts
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { z } from 'zod';
export const registerMyTool = (server: McpServer) => {
server.registerTool("toolName", {
description: "tool description",
inputSchema: { param1: z.string(), param2: z.number() } // Input schema using Zod
},
async ({ param1, param2 }) => {
// Tool implementation
return {
content: [{ type: "text", text: "Result" }]
};
}
);
};

次に、server.tscreateServer 内に登録します:

server.ts
import { registerMyTool } from './tools/my-tool.js';
export const createServer = async () => {
const server = new McpServer({ name: 'my-server', version: '1.0.0' });
registerMyTool(server);
return server;
};

リソースは AI アシスタントにコンテキストを提供します。ツールと同様に、各リソースは resources/ 配下の独自のファイルに存在し、server.ts から呼び出される register<Name>Resource 関数をエクスポートします。ファイルから静的リソースを追加したり、動的リソースを追加したりできます:

resources/my-resource.ts
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
export const registerMyResource = (server: McpServer) => {
const exampleContext = 'some context to return';
server.registerResource('resource-name', 'example://resource', {}, async (uri) => ({
contents: [{ uri: uri.href, text: exampleContext }],
}));
// Dynamic resource
server.registerResource('dynamic-resource', 'dynamic://resource', {}, async (uri) => {
const data = await fetchSomeData();
return {
contents: [{ uri: uri.href, text: data }],
};
});
};

MCP をサポートするほとんどの AI アシスタントは、同様の設定アプローチを使用します。MCP サーバーの詳細を含む設定ファイルを作成または更新する必要があります:

{
"mcpServers": {
"your-mcp-server": {
"command": "npx",
"args": ["tsx", "/path/to/your-mcp-server/stdio.ts"]
}
}
}

MCP サーバーを開発している間、AI アシスタントが常に最新バージョンのツール/リソースを認識できるように --watch フラグを設定することをお勧めします:

{
"mcpServers": {
"your-mcp-server": {
"command": "npx",
"args": ["tsx", "--watch", "/path/to/your-mcp-server/stdio.ts"]
}
}
}

特定の 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 ターゲット経由で、ローカルデータベースなどの接続された依存関係を含む)、Streamable HTTP トランスポート経由で接続するように事前設定された MCP Inspector を起動します。

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

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

MCP サーバーをテストして使用する最も簡単な方法は、インスペクターを使用するか、AI アシスタントで設定する(上記のように)ことです。

ただし、<your-server-name>-serve-stdio ターゲットを使用して、STDIO トランスポート でサーバーを直接実行することもできます。

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

このコマンドは tsx --watch を使用して、ファイルが変更されたときにサーバーを自動的に再起動します。

Streamable HTTP トランスポート を使用して MCP サーバーをローカルで実行したい場合は、<your-server-name>-serve ターゲットを使用できます。

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

このコマンドは tsx --watch を使用して、ファイルが変更されたときにサーバーを自動的に再起動します。

infra = agentcore

MCP サーバーを Bedrock AgentCore Runtime にデプロイする

Section titled “MCP サーバーを 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) {
// Add the MCP server to your stack
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 認証を選択すると、ジェネレーターは MCP サーバーを Cognito を使用するように設定します。

生成されたコンストラクトは、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 を作成することもできます。

ジェネレーターは、Rolldown を使用してデプロイメントパッケージを作成する bundle ターゲットを自動的に設定します:

Terminal window
pnpm nx bundle <project-name>

Rolldown の設定は rolldown.config.ts にあり、生成するバンドルごとにエントリーがあります。Rolldown は、定義されている場合、複数のバンドルを並列で作成することを管理します。

bundle ターゲットは、Bedrock AgentCore Runtime でホストする Streamable HTTP MCP サーバーのエントリーポイントとして http.ts を使用します。

ジェネレーターは <your-server-name>-docker ターゲットを設定します。これは、MCP サーバーのソースディレクトリから Dockerfile をバンドル出力ディレクトリにコピーします。これにより、Dockerfile がバンドルされたアーティファクトと同じ場所に配置され、CDK が AgentRuntimeArtifact.fromAsset を使用して Docker イメージを直接ビルドできるようになります。

複数の MCP サーバーが定義されている場合、すべての MCP サーバーの Docker コンテキストを準備する docker ターゲットも生成されます。

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

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

スキャンはイメージビルドと同じコンテナエンジン(docker または finch)を使用するため、追加のツールは必要ありません。スキャンはイメージが変更された場合にのみ再実行されるため、変更されていないイメージは再スキャンされません。提供される trivy ルートスクリプトは、ワークスペース内のすべてのイメージをスキャンします:

Terminal window
pnpm trivy

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

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

.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 MCPConnect a TypeScript Agent to an MCP server
Strands AgentsPythonModel Context Protocol
Python Agent to MCPConnect a Python Agent to an MCP server
Model Context ProtocolAmazon Aurora
MCP Server to Relational DatabaseConnect a TypeScript MCP Server to an Aurora relational database
Model Context ProtocolAmazon DynamoDB
MCP Server to TypeScript DynamoDBConnect a TypeScript MCP Server to a DynamoDB table
Amazon Bedrock AgentCore GatewayModel Context Protocol
AgentCore Gateway to MCP ServerAggregate an MCP server behind an AgentCore Gateway