NestJS MCP Server - Model Context Protocol Example について
マイクロサービス構成で MCP を実装する NestJS のサンプルで、NestJS と MCP の連携を調べる開発者向けです。サーバーが現在時刻の情報を提供し、LangChain.js を使うバックエンドが MCP ツールで問い合わせを処理します。
主な機能
- 01NestJS マイクロサービス構成の例
- 02現在時刻を取得するツール
- 03LangChain.js バックエンド連携
- 04複数の MCP サーバーへの接続
活用シーン
- 01MCP ツールを使って時刻の問い合わせに答えるバックエンドの構築
- 02NestJS プロジェクトでの MCP クライアントとサーバーの連携確認
MCP 対応
現在時刻ツールを公開する MCP サーバーと、MCP クライアント SDK で接続するバックエンドを含みます。バックエンドは複数の MCP サーバーに接続し、そのツールを LLM で利用できます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
http://localhost:3000/sseclaude mcp add --transport http nestjs-mcp-server-langchainjs-demo http://localhost:3000/sse{"mcpServers":{"nestjs-mcp-server-langchainjs-demo":{"type":"http","url":"http://localhost:3000/sse"}}}Cursor で開く{"servers":{"nestjs-mcp-server-langchainjs-demo":{"type":"http","url":"http://localhost:3000/sse"}}}VS Code で開く{"mcpServers":{"nestjs-mcp-server-langchainjs-demo":{"type":"http","url":"http://localhost:3000/sse"}}}{"mcpServers":{"nestjs-mcp-server-langchainjs-demo":{"serverUrl":"http://localhost:3000/sse"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
NestJS MCP サーバー - Model Context Protocol の例
このリポジトリでは、マイクロサービスアーキテクチャを採用した Model Context Protocol(MCP)の NestJS 実装を紹介します。主に次の 2 つのサービスで構成されています。
- mcp-server:LLM に現在時刻のコンテキストを提供する機能を備えています
- mcp-backend:LangChain.js を使用し、MCP クライアント SDK と連携して MCP サーバーに接続するクライアントです
はじめに
前提条件
- Node.js(v20 以降)
- npm
インストール
- リポジトリをクローンします
- 依存関係をインストールします:
npm install
.env.exampleを.envに名前変更し、OpenAI API キーを追加します:
cp .env.example .env
次に、.env ファイルを編集して OpenAI API キーを追加します:
OPENAI_API_KEY=your_openai_api_key_here
OPENAI_API_URL=https://api.openai.com/v1
PORT=3001
サービスの実行
すべての機能を利用するには、両方のサービスを実行する必要があります:
MCP サーバーの起動
npm run start:dev mcp-server
これにより、MCP サーバーがポート 3000(デフォルト)で起動します。
MCP バックエンドの起動
npm run start:dev mcp-backend
これにより、MCP バックエンドがポート 3001(デフォルト)で起動します。
使用例
両方のサービスが起動したら、MCP バックエンドに POST リクエストを送信して動作をテストできます:
リクエストの例
次の JSON ボディを指定して、http://localhost:3001 に POST リクエストを送信します:
{
"message": "What time is it in Viet Nam?"
}
cURL を使用する場合
curl -X POST http://localhost:3001 -H "Content-Type: application/json" -d "{\"message\": \"What time is it in Viet Nam?\"}"
Postman を使用する場合
http://localhost:3001への新しい POST リクエストを作成します- Content-Type ヘッダーを
application/jsonに設定します - リクエストボディで「raw」と「JSON」を選択し、次の内容を入力します:
{ "message": "What time is it in Viet Nam?" } - リクエストを送信します
レスポンスには、MCP サーバーの時刻コンテキスト機能を通じて取得した、ベトナムの現在時刻が含まれます。
複数の MCP サーバーへの接続
バックエンドは複数の MCP サーバーに同時に接続できます。サーバーを追加するには、apps/mcp-backend/src/mcp-backend.module.ts の McpClientModule.register 設定を変更します:
McpClientModule.register({
throwOnLoadError: true,
prefixToolNameWithServerName: false, // Set to true to prefix tool names with server names
additionalToolNamePrefix: '',
mcpServers: {
myServer: {
transport: 'sse',
url: 'http://localhost:3000/sse',
useNodeEventSource: true,
reconnect: {
enabled: true,
maxAttempts: 5,
delayMs: 2000,
},
},
// Add additional servers here
anotherServer: {
transport: 'sse',
url: 'http://localhost:4000/sse', // Different port for another server
useNodeEventSource: true,
reconnect: {
enabled: true,
maxAttempts: 5,
delayMs: 2000,
},
},
},
}),
複数のサーバーに接続する場合:
- ツール名の競合を避けるために、
prefixToolNameWithServerName: trueの設定を検討してください mcpServersオブジェクト内の各サーバーに、一意のキーを設定してください- 各サーバーが異なるポートで実行されていることを確認してください
MCP クライアントは、設定されているすべてのサーバーからツールを自動的に取得し、LLM が利用できるようにします。
アーキテクチャ
- mcp-server:Model Context Protocol を通じてツールを公開します。これには、現在時刻を取得する機能が含まれます
- mcp-backend:MCP サーバーに接続して利用可能なツールを取得し、LangChain.js とともに使用してユーザーのクエリを処理します
使用技術
- NestJS
- LangChain.js
- Model Context Protocol(MCP)
- @langchain/mcp-adapters:LangChain.js 用の MCP クライアントアダプター
- @rekog/mcp-nest:NestJS 用の MCP サーバー実装
プロジェクト構成
mcp-server/
├── apps/
│ ├── mcp-server/ # MCP server implementation
│ └── mcp-backend/ # MCP client implementation
├── dist/ # Compiled output
├── node_modules/
├── .env # Environment variables
└── package.json
ライセンス
このプロジェクトは UNLICENSED License の下でライセンスされています。詳細については LICENSE ファイルをご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。