NATSのMCPサーバーでClaudeからPub/Subを操作する
非公式のmcp-natsを使い、SubjectやJetStreamストリームをClaudeから探索する手順と、認証方式ごとの使い分け・公式実装が存在しない点を扱います。
NATSのMCPサーバーとは何か
mcp-natsは、Go製のNATSメッセージングシステム向けMCPサーバーです。作者個人(sinadarbouy)が開発しているコミュニティ実装で、NATS本体を開発するnats-ioorganizationは公式のMCPサーバーを提供していません。README上も「NATS公式」であるとは書かれておらず、独立した第三者ツールとして配布されています。第三者レビューサービス「MCP Review」による認証(Certified)バッジは付いていますが、これはNATS.io自身の公式認定ではありません。
このサーバーが対象にするのは、Subject階層の探索・Stream(JetStreamの永続化されたメッセージ列)の状態確認・Key-Valueバケットの読み書き・Object Storeの操作といった、NATSクライアントライブラリでいちいちコードを書かないと確認できない情報です。既定の操作は読み取り専用に寄せて設計されており、サーバーの状態確認やStreamの中身の閲覧はすぐに使えます。
導入前に確認すること
- Go 1.25以上(ソースからビルドする場合)、またはDockerでコンテナイメージを使う方法
- 接続先のNATSサーバー(URLと、必要なら認証情報)
- Claude CodeまたはClaude Desktopなど、MCPクライアントとして動く環境
- JetStreamのStreamやKey-Valueバケットを扱う場合は、対象アカウントにその権限があること
インストールする
Goのツールチェーンがあれば1コマンドでインストールできます。
go install github.com/sinadarbouy/mcp-nats/cmd/mcp-nats@latestDockerイメージも公開されており、マルチアーキテクチャのイメージにSigstore Cosignで署名されています。タグ付きリリースを検証したい場合は次のコマンドで署名を確認できます。
cosign verify ghcr.io/sinadarbouy/mcp-nats:0.1.4 \
--certificate-identity-regexp 'https://github.com/sinadarbouy/mcp-nats/.github/workflows/(release\.yml@refs/tags/v.*|sign-image\.yml@refs/heads/main)' \
--certificate-oidc-issuer https://token.actions.githubusercontent.comClaude Desktopに接続する
Dockerイメージをstdioトランスポートで起動する構成であれば、次のような設定になります(公式のCursor向けインストールリンクに埋め込まれた設定をClaude Desktop形式に書き直したものです)。
{
"mcpServers": {
"nats": {
"command": "docker",
"args": [
"run", "-i", "--rm", "--init",
"-e", "NATS_URL",
"-e", "NATS_NO_AUTHENTICATION",
"ghcr.io/sinadarbouy/mcp-nats:0.1.4",
"--transport", "stdio"
],
"env": {
"NATS_URL": "nats://localhost:4222",
"NATS_NO_AUTHENTICATION": "true"
}
}
}
}ローカルで動かしているNATSサーバーに、認証なしで接続する最小構成です。本番相当の環境に繋ぐ場合は、後述の認証方式に沿ってNATS_USER/NATS_PASSWORDまたは資格情報ファイルに切り替えてください。
Claude Codeにリモートサーバーとして接続する
mcp-natsはトランスポートの既定値がStreamable HTTPです。--transportフラグを省略してサーバーを起動すると、--addressで指定したアドレス(既定は0.0.0.0:8000)の/mcpエンドポイントで待ち受けます。Claude Codeからはネイティブ対応のHTTPトランスポートとしてそのまま追加できます。
claude mcp add --transport http nats http://localhost:8000/mcp複数のNATSアカウントを資格情報ベースで扱う場合、.mcp.jsonのようなurl型登録ではenvに書いた値はmcp-natsプロセスへ渡りません(envはローカル起動するコマンドの環境変数を差し込むためのフィールドで、リモートのHTTPサーバーには効きません)。資格情報は、次のようにmcp-natsサーバーを起動する側のコマンドで環境変数として渡します。
NATS_URL=nats://localhost:4222 \
NATS_SYS_CREDS=<SYSアカウントcredsのBase64> \
NATS_A_CREDS=<Aアカウントcredsのbase64> \
mcp-nats --address 0.0.0.0:8000.mcp.json側はサーバーのURLだけを指定すれば済みます。
{
"mcpServers": {
"nats": {
"url": "http://localhost:8000/mcp"
}
}
}3つの認証方式をどう使い分けるか
mcp-natsは接続認証の方式を3種類サポートしており、どれを選ぶかは環境の性質で決まります。
| 方式 | 設定方法 | 向いている場面 |
|---|---|---|
| 資格情報ベース | 設定方法NATS_<ACCOUNT>_CREDS環境変数(Base64エンコードした.credsファイル) | 向いている場面複数アカウントを使い分ける本番運用。全ツール呼び出しにaccount_nameパラメータが必要 |
| ユーザー名/パスワード | 設定方法NATS_USER/NATS_PASSWORD環境変数、または--user/--passwordフラグ | 向いている場面シンプルな認証設定のサーバーに繋ぐ場合 |
| 匿名接続 | 設定方法NATS_NO_AUTHENTICATION=true環境変数、または--no-authenticationフラグ | 向いている場面ローカル開発環境や検証用サーバー |
資格情報ベースを選んだ場合だけ、ツールを呼ぶたびにaccount_nameパラメータで対象アカウントを明示する必要がある点が、他の2方式と違うところです。複数のNATSアカウントを1つのサーバープロセスから扱えるのはこの方式だけなので、マルチテナント構成ではこちらを選びます。
Subject階層の探索とJetStreamの確認
NATSはトピックにあたる概念を「Subject」と呼び、ワイルドカードを使った階層構造で管理します。mcp-natsはこのSubject階層をClaudeから覗けるツールと、JetStream(NATSの永続化・再送機能)のStream状態を確認するツールを分けて提供しています。
- 「
orders.*にマッチするSubjectで、直近メッセージが流れているものはどれ?」— Subject探索とメッセージ閲覧の組み合わせ - 「
ORDERSストリームの保持ポリシーと現在のメッセージ数を教えて」— Streamの状態と情報を照会するツール - 「
configバケットのfeature-flagキーを見て、最後に更新されたのはいつ?」— Key-Valueバケットの読み取り - 「サーバーのRTT(往復遅延時間)を測定して」— Server Management配下のping/RTTツール
読み取り専用の操作に加えて、Object StoreとKey-Valueのバケットに対しては作成・削除・Watch(変更の監視)まで一通りのCRUD操作がツール化されています。メッセージのPublish(発行)もサポートしており、非同期発行にも対応しています。ただしPublish操作はブローカーへの書き込みそのものなので、匿名接続や共有トークンのまま本番Subjectに向けて使うのは避けたほうが安全です。
アカウント運用まわりのツールも用意されています。アカウントの接続数や統計情報のレポート生成、アカウントの状態をバックアップとして保存・復元する操作、TLSで接続しているサーバーの証明書チェーンを検査する操作までカバーしており、「このアカウントの接続数が急に増えていないか確認して」のような運用監視の依頼にもそのまま使えます。複数アカウントを1つのNATSクラスタで運用している場合、アカウントごとの資格情報を切り替えながらこれらのレポートを横断的に見比べる作業は本来手間がかかりますが、資格情報ベースの認証と組み合わせれば、アカウント名を指定するだけで同じ依頼を繰り返せます。
Kubernetesで運用する場合
Helmチャートが同梱されており、単体でのインストールとOCIレジストリ経由のインストールの両方に対応しています。
helm install mcp-nats oci://ghcr.io/sinadarbouy/charts/mcp-nats \
--version "0.1.4" --namespace mcp-nats --create-namespaceHTTPトランスポート(streamable-httpまたはsse)で動かす場合、/livez(プロセスの生存確認、NATSへの接続は見ない)・/readyz(NATS_URLへのTCP到達性を含めた準備確認)・/healthz(/livezと同等の互換エイリアス)の3つのヘルスエンドポイントが用意されています。Kubernetesのlivenessプローブには/livez、readinessプローブには/readyzを割り当てるのが本来の使い分けです。両方に同じエンドポイントを指定すると、NATSサーバー側の一時的な不調でPodごと再起動されてしまうことがあります。
Helmチャートには、HashiCorp Vault Agent Injectorを使って資格情報をPodに注入する構成例も同梱されています。NATS_<ACCOUNT>_CREDSのような機微な環境変数をHelmのvaluesファイルに平文で書かずに済むため、Vaultをすでに社内標準として使っているクラスタでは、この構成例から始めると秘密情報の管理方法を統一できます。
よくあるつまずき
- 「NATS公式のMCPサーバー」だと思って導入する:
nats-ioorganizationにMCPサーバーは存在しません。mcp-natsは個人開発者によるコミュニティ実装で、「MCP Review」の認証バッジもNATS.io自身の認定ではなく第三者サービスによるものです。導入前提として区別しておくと、障害時の問い合わせ先を誤らずに済みます - 資格情報ベースで接続したのに全ツールがエラーになる:
NATS_<ACCOUNT>_CREDS方式は、ツール呼び出しのたびにaccount_nameパラメータが必須です。ユーザー名/パスワード方式や匿名接続からの移行時にこのパラメータを付け忘れるとエラーになります - livenessとreadinessを同じエンドポイントにする:
/livezはNATSへの接続を見ない生存確認、/readyzはNATSへのTCP到達性まで確認します。Kubernetesで両方を/livezにすると、NATS側の障害を検知できずリクエストを送り続けてしまいます --sse-addressを新規設定で使う: このフラグは--addressの非推奨エイリアスです。新規の設定では--addressを使います- Publish操作を匿名接続のまま本番Subjectに向ける: 匿名接続はローカル開発・検証用の位置づけです。書き込み操作(Publish、Key-Value/Object Storeの変更)を本番相当の環境で使う場合は、資格情報ベースかユーザー名/パスワード認証に切り替えます
まとめ
mcp-natsは、NATS公式ではなく個人開発者が公開しているコミュニティ製のMCPサーバーです。Subject階層の探索やJetStream Streamの状態確認、Key-Value・Object Storeの操作までを自然言語の依頼でカバーでき、Docker・Helmチャート・署名済みコンテナイメージまで揃った実装ですが、NATS.ioの正式なサポート対象ではない点は導入前に理解しておく必要があります。認証は資格情報・ユーザー名パスワード・匿名接続の3方式があり、本番相当の環境では匿名接続を避けて資格情報ベースに寄せるのが安全な運用です。
MCPの基礎から確認したい場合はMCPとは何か、claude mcp addのスコープや認証の詳細はClaude Code MCP設定ガイド、Kubernetes上でMCPサーバーをClaudeから操作したい場合はKubernetes MCPサーバーでClaudeからクラスタを操作するも参考になります。