MCP Server について
MCP Serverは、MCPサーバーを構築する開発者向けのNode.js実装です。レイヤー化されたクリーンアーキテクチャを採用し、SSEとSTDIOのトランスポートに対応し、ツール、リソース、プロンプトを拡張できます。
主な機能
- 01SSEとSTDIOのトランスポート
- 02レイヤー化されたクリーンアーキテクチャ
- 03ツール、リソース、プロンプトの拡張
- 04ログとエラー処理
- 05テスト対応
活用シーン
- 01HTTP SSEでMCPサーバーを構築
- 02STDIOでローカルMCPサーバーを実行
- 03カスタムツール、リソース、プロンプトの追加
MCP 対応
MCPサーバーを実装し、SSEまたはSTDIO経由でクライアントと通信します。拡張可能なツール、リソース、プロンプトを提供できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
MCP サーバー
AI モデルとリアルタイムで通信するために、複数のトランスポート方式(SSE および STDIO)をサポートする、堅牢な Model Context Protocol(MCP)サーバー実装です。
🚀 機能
- 完全な MCP 実装:Model Context Protocol の完全かつ標準準拠の実装
- 複数のトランスポート:SSE(Server-Sent Events)および STDIO によるシームレスな通信
- 堅牢なアーキテクチャ:保守性と拡張性を高めるため、クリーンアーキテクチャと SOLID 原則に基づいて構築
- 強力なツール群:ツール、リソース、プロンプトを簡単に拡張可能
- 開発者に優しい設計:包括的なログ記録、エラー処理、テストをサポート
🏗️ アーキテクチャ
SOLID 原則に準拠した、クリーンなレイヤーアーキテクチャを採用しています。
| レイヤー | 役割 | コンポーネント |
|---|---|---|
| ドメイン | 中核となるビジネスロジック | インターフェース、モデル、エンティティ |
| アプリケーション | ユースケース、アプリケーションのフロー | サービス、ユースケース、DTO |
| インフラストラクチャ | 技術的な処理 | 実装、アダプター、外部サービス |
| プレゼンテーション | ユーザーインターフェース | API コントローラー、HTTP エンドポイント |
アーキテクチャ図
┌─────────────────────┐ ┌─────────────────────┐
│ Presentation │ │ Application │
│ Layer │ │ Layer │
│ - Express API │─────▶│ - Use Cases │
│ - Controllers │ │ - Services │
└─────────────────────┘ └──────────┬──────────┘
│
▼
┌─────────────────────┐ ┌─────────────────────┐
│ Infrastructure │ │ Domain │
│ Layer │◀─────│ Layer │
│ - Implementations │ │ - Interfaces │
│ - Adapters │ │ - Models │
└─────────────────────┘ └─────────────────────┘
💻 要件
- Node.js 18 以上
- Yarn または npm パッケージマネージャー
📦 インストール
# Clone the repository
git clone https://github.com/your-username/mcp-server.git
cd mcp-server
# Install dependencies
yarn install
# Build the project
yarn build
🚀 サーバーの起動
# Start the server
yarn start
# Build and start in one command (for development)
yarn rebuild
デフォルトでは、サーバーはポート 3001 で起動します。PORT 環境変数を使用して設定できます。
🔌 トランスポートの選択肢
MCP サーバーは、次の 2 つのトランスポート方式をサポートしています。
| トランスポート | 説明 | 用途 |
|---|---|---|
| SSE | HTTP 経由の Server-Sent Events | Web アプリケーション、ブラウザーのクライアント |
| STDIO | 標準入出力ストリーム | CLI ツール、ローカルアプリケーション |
🛣️ API エンドポイント
- SSE:
/sse- リアルタイム通信のための SSE 接続を確立します - メッセージ:
/messages- JSON-RPC メッセージをサーバーに送信します
🧪 テスト
公式の MCP Inspector ツールを使用して、サーバーの実装をテストします。
- MCP サーバーをビルドして起動します
yarn build
yarn rebuild # if using SSE transport (builds & starts)
# OR
yarn start # manual start
- サーバーに対して Inspector を実行します
npx @modelcontextprotocol/inspector node build/index.js
- Inspector UI にアクセスします http://127.0.0.1:6274 🚀
🧩 機能の拡張
新しいツールの追加
// tools/custom/my-tool.ts
import { z } from "zod";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { ITool } from "../core/domain/interfaces/tool.interface.js";
import { ILogger } from "../core/domain/interfaces/logger.interface.js";
export class MyTool implements ITool {
private readonly logger: ILogger;
constructor(logger: ILogger) {
this.logger = logger;
}
public register(server: McpServer): void {
server.tool(
"my-tool",
"Description of my tool",
{
param1: z.string().describe("Parameter description"),
},
async ({ param1 }) => {
this.logger.info(`MyTool called with param1: ${param1}`);
return {
content: [
{
type: "text",
text: `Result: ${param1}`,
},
],
};
},
);
this.logger.info("MyTool registered");
}
}
新しいリソースの追加
// resources/custom/my-resource.ts
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { IResource } from "../core/domain/interfaces/resource.interface.js";
import { ILogger } from "../core/domain/interfaces/logger.interface.js";
export class MyResource implements IResource {
private readonly logger: ILogger;
constructor(logger: ILogger) {
this.logger = logger;
}
public register(server: McpServer): void {
server.resource('my-resource', 'my-data.json', async () => {
this.logger.info('My resource accessed');
return {
contents: [
{
uri: 'my-data.json',
text: JSON.stringify({ key: "value" }, null, 2),
mimeType: 'application/json',
},
],
};
});
this.logger.info('My resource registered');
}
}
新しいプロンプトの追加
// prompts/custom/my-prompt.ts
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { IPrompt } from "../core/domain/interfaces/prompt.interface.js";
import { ILogger } from "../core/domain/interfaces/logger.interface.js";
export class MyPrompt implements IPrompt {
private readonly logger: ILogger;
constructor(logger: ILogger) {
this.logger = logger;
}
public register(server: McpServer): void {
server.prompt(
'my-prompt',
'Description of my prompt',
() => {
this.logger.info('My prompt accessed');
return {
messages: [
{
role: 'user',
content: {
type: 'text',
text: 'Initial user message',
},
},
{
role: 'assistant',
content: {
type: 'text',
text: 'Initial assistant response',
},
},
],
};
},
);
this.logger.info('My prompt registered');
}
}
📝 適用されている SOLID 原則
| 原則 | 実装 |
|---|---|
| 単一責任 | 各クラスが明確な責任を 1 つ持ちます |
| オープン/クローズド | 既存のコードを変更せずにシステムを拡張できます |
| リスコフの置換 | 派生型は基底型と置き換え可能です |
| インターフェース分離 | クライアントごとに特化したインターフェースを用意します |
| 依存性逆転 | 上位モジュールは抽象に依存します |
📄 ライセンス
このプロジェクトは MIT License の下でライセンスされています。詳細は LICENSE ファイルを参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。