microCMS MCP Server を Docker コンテナとして起動し、HTTP トランスポート経由でリモート MCP サーバーとして利用する手順です。
- Docker / Docker Compose がインストール済みであること
- Node.js 18+ / pnpm がインストール済みであること(ビルド用)
- microCMS のサービス ID と API キーを取得済みであること
Docker イメージはビルド済みの dist/ ディレクトリを COPY する設計です。先にローカルでビルドしてください。
pnpm install
pnpm build.env.example をコピーして .env を作成します。
cp .env.example .env.env を編集し、利用するモードに応じて設定してください。
単一サービスモード:
MICROCMS_SERVICE_ID=your-service-id
MICROCMS_API_KEY=your-api-key複数サービスモード:
MICROCMS_SERVICES=[{"id":"blog","apiKey":"your-blog-api-key"},{"id":"shop","apiKey":"your-shop-api-key"}]認証トークン(推奨):
MCP_AUTH_TOKEN=your-secret-token# ビルドして起動
docker compose up -d --build
# ログを確認
docker compose logs -f# ヘルスチェックエンドポイント
curl http://localhost:3000/health
# → {"status":"ok"}
# コンテナのヘルス状態を確認
docker inspect --format='{{.State.Health.Status}}' microcms-mcp-server-microcms-mcp-1
# → healthyDocker で起動したリモート MCP サーバーに各クライアントから接続する方法です。
mcp-remote を使って接続します。
claude_desktop_config.json に以下を追加:
{
"mcpServers": {
"microcms-remote": {
"command": "npx",
"args": [
"-y", "mcp-remote",
"http://localhost:3000/mcp",
"--header", "Authorization:${MCP_AUTH_TOKEN}"
],
"env": {
"MCP_AUTH_TOKEN": "Bearer your-secret-token"
}
}
}
}Cursor の MCP 設定(Settings > MCP Servers)に以下を追加:
{
"mcpServers": {
"microcms-remote": {
"command": "npx",
"args": [
"-y", "mcp-remote",
"http://localhost:3000/mcp",
"--header", "Authorization:${MCP_AUTH_TOKEN}"
],
"env": {
"MCP_AUTH_TOKEN": "Bearer your-secret-token"
}
}
}
}Claude Code の設定ファイル(.mcp.json または settings.json)に以下を追加:
{
"mcpServers": {
"microcms-remote": {
"command": "npx",
"args": [
"-y", "mcp-remote",
"http://localhost:3000/mcp",
"--header", "Authorization:${MCP_AUTH_TOKEN}"
],
"env": {
"MCP_AUTH_TOKEN": "Bearer your-secret-token"
}
}
}
}mcp-remote の --header フラグでは、ヘッダー名と値をコロン(:)で区切ります。
--header "Authorization:Bearer your-token"
環境変数方式を推奨します。 理由:
- 設定ファイルにトークンを直書きするリスクを回避できる
- シェルエスケープの問題を避けられる
- 一部のクライアント(Cursor の Windows 版など)で
--headerの値にスペースが含まれる場合のパースバグを回避できる
環境変数方式の設定例:
{
"args": [
"-y", "mcp-remote",
"http://localhost:3000/mcp",
"--header", "Authorization:${MCP_AUTH_TOKEN}"
],
"env": {
"MCP_AUTH_TOKEN": "Bearer your-secret-token"
}
}認証なしで起動する場合は、MCP_AUTH_TOKEN を設定せず、--header 引数も省略してください。
{
"args": ["-y", "mcp-remote", "http://localhost:3000/mcp"]
}| 変数名 | デフォルト | 説明 |
|---|---|---|
MICROCMS_SERVICE_ID |
- | microCMS サービス ID(単一サービスモード) |
MICROCMS_API_KEY |
- | microCMS API キー(単一サービスモード) |
MICROCMS_SERVICES |
- | サービス JSON 配列(複数サービスモード、設定時は単一より優先) |
MCP_TRANSPORT |
stdio |
トランスポートモード(Docker では http 固定) |
MCP_HTTP_PORT |
3000 |
HTTP サーバーのポート番号 |
MCP_HTTP_HOST |
0.0.0.0 |
HTTP サーバーのバインドアドレス |
MCP_AUTH_TOKEN |
- | Bearer 認証トークン(未設定の場合、認証なし) |
# ログを確認
docker compose logs microcms-mcp
# よくある原因
# - dist/ が存在しない → pnpm build を実行
# - 環境変数が未設定 → .env ファイルを確認
# - ポートが競合 → MCP_HTTP_PORT を変更# コンテナが起動しているか確認
docker compose ps
# ヘルスチェック
curl -v http://localhost:3000/health
# ポートマッピングの確認
docker compose port microcms-mcp 3000
# ファイアウォールの確認(Linux)
sudo ss -tlnp | grep 3000# MCP_AUTH_TOKEN が正しく設定されているか確認
docker compose exec microcms-mcp printenv MCP_AUTH_TOKEN
# ヘッダーの形式を確認(コロンの直後にスペースを入れない)
# ✅ Authorization:Bearer your-token
# ❌ Authorization: Bearer your-token
# ❌ Authorization:bearer your-token(大文字小文字に注意)mcp-remote はセッション管理のために mcp-session-id ヘッダーを自動的に付与します。サーバー側のセッションは 30 分でタイムアウトし、自動的にクリーンアップされます。
セッション切断時のエラーが発生した場合は、クライアント側で MCP サーバーを再接続してください。
本番環境では HTTPS を使用してください。直接 TLS を終端するのではなく、リバースプロキシの利用を推奨します。
[Client] → HTTPS → [Nginx/Caddy] → HTTP → [microcms-mcp:3000]
Caddy を使った例:
mcp.example.com {
reverse_proxy microcms-mcp:3000
}
MCP_AUTH_TOKENには十分な長さのランダム文字列を使用してください- コンテナは非 root ユーザー(
node)で実行されます - API キーはコンテナの環境変数として渡されます。Docker secrets や外部シークレット管理の利用も検討してください
- 不要なポートを外部に公開しないよう、ファイアウォールで制限してください