🎳

MCP Server - Streamable HTTP 最小構成

はじめに

本日、MCP ServerのStreamable HTTPの最小構成版をGitHubに公開しました!
https://github.com/Masa1984a/Minimum_MCP_StreamableHTTP
現在よく見るMCPのほとんどは、STDIOという仕組みをとっています。
これはMCP Serverをローカルにおいて、ファイル処理や外部サービスとつなぐイメージです。
一方で、Streamable HTTPはリモート上にMCP Serverを置いて外部サービスとつなぐイメージで、LLMやAIエージェントサービスから、MCP Server経由で複雑な検索やAIエージェントを動かす世界観の可能性を秘めていると考えています。
今回、このStreamable HTTPの最小構成版を実装しました。Azure前提でTerraformを使って自動ビルドできます。今後、Streamable HTTPのMCP Serverの需要が高まると考えていてぜひ参考にしてください。

詳しい内容はGitHubをご確認頂きたいのですが、Claude Codeにレポジトリ分析してもらいました。結果は下記。

アーキテクチャ構成

3層構造アーキテクチャ

1. アプリケーション層

  • TypeScript + Express.js 5によるHTTPサーバー実装
  • @modelcontextprotocol/sdkを使用したMCPプロトコル実装
  • サンプルツール実装(計算・挨拶機能)
  • ES Modules形式での実装

2. インフラストラクチャ層

  • Terraform IaCによる宣言的インフラ管理
  • Azure Container Registry (ACR):Dockerイメージの保管
  • Azure Container Instances (ACI):コンテナ実行環境
  • 段階的プロビジョニング戦略の採用

3. 自動化層

  • PowerShellによるワンコマンドデプロイメント
  • CI/CDパイプライン対応設計
  • Docker/Podmanによるコンテナビルド自動化

技術スタック詳細

アプリケーション技術スタック

- Node.js 20 (Alpine Linux)
- TypeScript
- Express.js 5.1.0
- @modelcontextprotocol/sdk 1.12.1

インフラストラクチャ/自動化技術スタック

- Terraform 1.5.0+
- Azure Provider 4.0
- Azure Container Registry (Basic SKU)
- Azure Container Instances
- PowerShell

主要な技術的特徴

ステートレス設計

  • セッション管理を排除(sessionIdGenerator: undefined
  • 水平スケーリングに対応
  • サーバーレスアーキテクチャに最適化

デプロイメントフロー

1. TypeScriptビルド (npm run build)
   ↓
2. Terraform初期化とリソース作成
   - Resource Group作成
   - Container Registry作成
   ↓
3. Dockerイメージビルド&ACRプッシュ
   ↓
4. Container Instancesデプロイ

段階的デプロイメント戦略

Terraformの-targetオプションを活用し、以下の順序で安全にデプロイ:

  1. 基盤リソース(Resource Group)
  2. コンテナレジストリ(ACR)
  3. アプリケーション(ACI)

アプリケーション実装の詳細

MCPサーバー実装(server.ts)

// 主要機能
- Express.jsベースのHTTPサーバー(ポート8080- MCPプロトコルのHTTPアダプター実装
- ヘルスチェックエンドポイント(/health)
- エラーハンドリングとロギング

サンプルツール実装

  1. addツール:2つの数値を加算する基本的な計算機能
  2. greetツール:指定された名前で挨拶メッセージを生成

インフラストラクチャ構成

Terraformリソース定義

1. Resource Group: "rg-${prefix}"
   - 全リソースを格納するコンテナ

2. Container Registry: "${prefix}acr"
   - Dockerイメージの保管
   - 管理者アクセス有効(開発用)

3. Container Group: "${prefix}-container"
   - CPU: 0.5コア(設定可能)
   - メモリ: 1GB(設定可能)
   - パブリックFQDN付き

セキュリティ考慮事項

現在の実装

  • Subscription IDはterraform.tfvarsに保存(要.gitignore)
  • ACR管理者権限は開発用設定
  • デフォルトでパブリックアクセス許可

プロダクション推奨事項

  • Service Principalの使用
  • Virtual Network統合
  • Azure Key Vaultによるシークレット管理
  • Application Gatewayによるセキュアなエンドポイント

実装のポイント

エラーハンドリング

  • Express.jsレベルとMCPレベルの2段階エラー処理
  • 適切なHTTPステータスコードの返却
  • JSONRPCエラーフォーマットの準拠

パフォーマンス最適化

  • ステートレス設計による軽量化
  • Alpineベースイメージによる最小化
  • 効率的なHTTPストリーミング実装

活用シナリオ

学習・実験用途

  • MCPプロトコルの理解と実装
  • クラウドネイティブアーキテクチャの学習
  • Infrastructure as Codeの実践

実装参考例として

  • TypeScript + Docker + Terraformの統合パターン
  • Azure Container Instancesの活用方法
  • DevOpsパイプラインの構築例

まとめ

このプロジェクトは、モダンなクラウドアーキテクチャとDevOps実践を組み合わせた優れた参考実装です。特に以下の点で価値があります:

  1. 完全自動化:ワンコマンドでのデプロイメント実現
  2. モダンスタック:最新技術の効果的な組み合わせ
  3. 実践的設計:プロダクション環境への拡張を考慮
  4. 学習価値:各技術要素の統合方法を学べる

MCPプロトコルをクラウドネイティブに実装する際の、実践的なリファレンスアーキテクチャとして活用できる優れたプロジェクトといえるでしょう。

次のステップ

このプロジェクトをベースに、以下の拡張が可能です:

  • Kubernetes (AKS)への移行
  • GitHub ActionsによるCI/CD構築
  • Azure API Managementの統合
  • マルチリージョン展開
  • 監視・ロギングの強化(Application Insights)

では!

Accenture Japan (有志)

Discussion