nostr-ops-mcp について
nostr-ops-mcpは、AIエージェント向けにNOSTRの投稿、検索、IDのエンコード、暗号化DMを提供するMCPサーバーです。イベント種別や宛先の許可リスト、レート制限、任意の確認、監査ログで書き込みを制御します。
主な機能
- 01NOSTRイベントの投稿と検索
- 02NIP-19のエンコードとデコード
- 03NIP-05 IDの検証
- 04暗号化DMの送受信
- 05書き込み許可リストとレート制限
- 06構造化監査ログ
活用シーン
- 01NOSTRノートの定期投稿
- 02イベント検索とプロフィール取得
- 03DMの監視と注文対応
- 04IDを使った投稿の制限
MCP 対応
MCPサーバーとして、NOSTRの署名、投稿、検索、エンコード、DM用ツールをMCPクライアントに提供します。許可リスト、レート制限、任意の確認、監査ログで書き込みを制御できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y nostr-ops-mcpNOSTR_RELAYSComma-separated wss:// relay URLsNOSTR_NIP46_URIシークレットNIP-46 bunker URI (preferred signer; keeps the nsec off this machine)NOSTR_PRIVATE_KEYシークレットnsec private key (alternative to NOSTR_NIP46_URI; read-only mode if neither is set)NOSTR_ALLOWED_KINDSComma-separated event kinds the server may publish (required when a signer is configured)ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
nostr-ops-mcp
LLM エージェントのための NOSTR アイデンティティ。 NOSTR プロトコルの基本機能(署名、公開、クエリ、NIP-19 のエンコード/デコード、NIP-05 の検索、暗号化 DM)を、エージェントが呼び出せるツールとして提供する MCP サーバーです。Claude Desktop、Claude Code、Cursor、その他 MCP に対応したクライアントに追加できます。生の nsec ではなく、NIP-46 のバンカーキーをエージェントに渡します。kind の許可リストを設定し、管理可能な制限の範囲内でエージェントに代わりに投稿させることができます。
v0.1 — 読み取り、書き込み、DM の全機能に対応。 16 個のツールを、多層防御の安全機能で保護しています。kind の許可リスト(デフォルトですべて拒否)、受信者の許可リスト、レート制限、任意で有効化できる二段階確認、構造化監査ログを備えています。nsec(開発用)と NIP-46 バンカー(本番用)の両方をサポートします。
できること
- npub で kind:1 のノートを投稿するボット — 日次サマリー、予約投稿、受信イベントへのプログラムによるリアクション。
- NOSTR のセールスエージェント —
marketplace-mcpと組み合わせ、同じアイデンティティで NIP-15 の出店情報と商品を公開します。 - プロフィール管理 — kind:0 に対する
nostr_publish_metadata(プロフィールの上書きは、古いリレーデータがなければ元に戻せないため、必ず確認が求められます)。 - DM を活用したワークフロー — 受信 DM を監視し(
nostr_list_dms)、注文を復号してnostr_send_dmで返信するストアフロントエージェント。デフォルトでは無効で、NOSTR_DM_TOOLS_ENABLEDを設定すると有効になります。 - サーバーをまたいだアイデンティティの共有 — 同じ NIP-46 バンカー URI を
nostr-ops-mcpとmarketplace-mcpで共有できます。1 つのキー、1 つのアイデンティティ、2 つの専門的なツール群です。
本番環境で使用できる理由の要となるのが、この安全機能群です。エージェントがあなたになりすまして投稿できるキーを持っている場合、制約がなければ数秒であなたの評判を損なう可能性があります。このサーバーは、署名を許可する kind、レート、任意の二段階確認を管理し、すべての呼び出しを構造化監査ログに記録します。
16 個のツール
読み取り専用 — ローカル(ネットワーク不要、署名者不要)
| ツール | 用途 |
|---|---|
nostr_decode | NIP-19 文字列(npub / nsec / note / nevent / naddr / nprofile)を解析します。nsec のデコードは NOSTR_ALLOW_NSEC_DECODE=true の場合に限り許可されます。 |
nostr_encode | 生のフィールドから NIP-19 文字列を作成します。nsec のエンコードには意図的に対応していません。 |
読み取り専用 — ネットワーク(クエリ/プロフィール/nip05 には署名者不要)
| ツール | 用途 |
|---|---|
nostr_get_pubkey | 署名者の公開鍵と npub を返します。署名者が設定されていない場合は、明確なエラーを返します。 |
nostr_list_relays | 設定済みリレープールと、各リレーの接続状態を返します。 |
nostr_query_events | 中核となるツールです。NIP-01 フィルター:kinds、authors、e_tag / p_tag / d_tag / t_tag のタグフィルター(内部では NIP-01 の #e / #p / #d / #t に対応づけられます。ホスト型 API スキーマとの互換性のため v0.2.0 で名称を変更)、since / until / limit。 |
nostr_get_profile | 公開鍵または npub を指定して kind:0 のメタデータを取得し、解析します。解析済みの JSON コンテンツ(name、about、picture、nip05、lud16 など)を返します。 |
nostr_verify_nip05 | /.well-known/nostr.json 経由で name@domain を公開鍵に解決します。検証モード用の expected_pubkey を指定できます。 |
書き込み(署名者が必要。KindAllowlist、RateLimiter、任意の確認による制限あり)
| ツール | 用途 |
|---|---|
nostr_publish_event | 基本となる書き込みツールです。kind / content / tags を渡します。 |
nostr_publish_text_note | kind:1 用の便利なツールです。返信/メンション/ハッシュタグのショートカットから NIP-10 タグを自動で組み立てます。 |
nostr_publish_metadata | kind:0 のプロフィール用です。プロフィールの上書きは取り扱いに慎重さを要するため、NOSTR_REQUIRE_CONFIRM の設定にかかわらず、必ず二段階確認を求めます。 |
nostr_publish_addressable_event | kind 30000〜39999(置き換え可能)用です。d タグを自動設定します。ブリッジの marketplace-mcp は NIP-15 にこれを使用します。 |
nostr_delete_event | NIP-09 の kind:5 によるソフト削除です。ベストエフォートで実行され、リレーが無視する場合があります。 |
nostr_confirm_publish | トークンで制限された投稿を実行します。トークンは 1 回限りで、安全性チェックのパイプラインも再実行されます。 |
DM(高リスク:デフォルトでは無効。NOSTR_DM_TOOLS_ENABLED=true で有効化)
| ツール | 目的 |
|---|---|
nostr_send_dm | デフォルトで NIP-44 暗号化を使用する NIP-04(kind:4)DMです。レガシー互換性のため、NIP-04 もサポートしています。NOSTR_DM_ALLOWLIST で制限されます。 |
nostr_list_dms | 相手とのスレッドを取得して復号します。イベントごとに NIP-44 と NIP-04 を自動判定します。 |
nostr_decrypt_dm | 単一の暗号文を復号します(別の場所からすでにイベントを取得している場合に使用します)。 |
NIP-17 のシール済み/ギフトラップ DM はまだサポートされていません。噂イベントとギフトラップによって複雑さが大幅に増すため、今後の v0.2 に延期されています。
要件
- Node 20+
- NOSTR 署名者 — 強く推奨: Amber(Android)、nsec.app(Web)、またはその他の NIP-46 実装による NIP-46 バンカー URI。レガシー方式:
.env内の生の nsec。ディスク上に nsec が検出されると、サーバーは起動時に stderr へ警告を記録します。
インストール
# From npm (once published)
npx -y nostr-ops-mcp
# From source
git clone <repo>
cd nostr-ops-mcp
corepack enable pnpm
pnpm install
pnpm build
設定
cp .env.example .env
# edit .env: set NOSTR_NIP46_URI (recommended) OR NOSTR_PRIVATE_KEY
# set NOSTR_RELAYS (comma-separated wss://)
# set NOSTR_ALLOWED_KINDS (required when a signer is configured)
サーバーは、このバイナリ自身のディレクトリ(dist/ と同じ場所)から .env を自動的に読み込みます。複数の MCP サーバーを同じ Claude Code セッションで実行したときに環境変数が競合しないよう、意図的に cwd からは読み込みません。
必須
| 変数 | 目的 |
|---|---|
NOSTR_RELAYS | カンマ区切りの wss:// リレー。空の場合、サーバーは起動を拒否します。 |
NOSTR_ALLOWED_KINDS | サーバーによる署名を許可するイベント種別番号のカンマ区切りリスト。署名者を設定する場合は必須です。例:テキストノートと NIP-15 マーケットプレイスの場合は 1,30017,30018。デフォルトでは、kind:0(プロフィール)と kind:5(削除)は省かれます。どちらも誤用されやすいためです。 |
署名者 — 最大 1 つまで指定
| 変数 | 目的 |
|---|---|
NOSTR_NIP46_URI | Amber/nsec.app/Alby Account/その他の NIP-46 バンカーから取得した bunker://<pubkey>?relay=...&secret=...。推奨です。 |
NOSTR_PRIVATE_KEY | 生の nsec1...。開発用/レガシー用のみです。サーバーは起動時に警告します。 |
任意の安全設定
| 変数 | デフォルト | 目的 |
|---|---|---|
NOSTR_READ_ONLY | false | 読み取り専用を強制し、すべての書き込みツールを無効にします。 |
NOSTR_DM_TOOLS_ENABLED | false | send_dm/list_dms/decrypt_dm をオプトインで有効にします。 |
NOSTR_DM_ALLOWLIST | 未設定 | DM の宛先として許可する 16 進数の公開鍵。空の場合、NOSTR_DM_TOOLS_ENABLED のみで制御します。 |
NOSTR_REQUIRE_CONFIRM | false | 2 段階確認を有効にします。書き込みツールがトークンを返し、nostr_confirm_publish が実行します。 |
NOSTR_MAX_EVENTS_PER_MINUTE | 10 | 書き込みに対する直近 60 秒間のレート制限です。 |
NOSTR_MAX_DMS_PER_MINUTE | 5 | DM に対する同様のレート制限です。 |
NOSTR_ALLOW_NSEC_DECODE | false | nostr_decode が生の秘密鍵データを返すことを許可します。本当に必要な場合を除き、有効にしないでください。 |
NOSTR_LOG_PATH | ./nostr-mcp.log | サーバーログのパスです。 |
NOSTR_AUDIT_PATH | ./nostr-mcp-audit.log | 構造化監査ログです(ツール呼び出しごとに JSON を 1 行記録します)。 |
MCP クライアントに接続
Claude Code(プロジェクト単位)
claude mcp add nostr-ops -s project node "$(pwd)/dist/index.js"
Claude Desktop/Cursor/その他のクライアント
{
"mcpServers": {
"nostr-ops": {
"command": "npx",
"args": ["-y", "nostr-ops-mcp"],
"env": {}
}
}
}
サーバーは自身の .env を読み込むため、クライアント設定の env ブロックは空のままにしてください。コミットするファイルにはシークレットを含めないでください。
安全モデル
すべての書き込みツールは、次の順序でパイプラインを実行します。
NOSTR_READ_ONLYゲート — 即座に拒否します。- 署名者の有無 — nsec も NIP-46 URI も設定されていない場合は拒否します。
- KindAllowlist — イベントの kind が
NOSTR_ALLOWED_KINDSに含まれていない場合は拒否します。 - RateLimiter — 直近 60 秒間の
eventsバケットが上限に達している場合は拒否します。 - 確認ゲート —
NOSTR_REQUIRE_CONFIRM=trueの場合(またはpublish_metadataのように常に確認が必要なツールの場合)、署名する代わりに 16 バイトの 16 進数トークンを返します。 - 署名と公開 — NDK 経由で実行します。署名者とのハンドシェイクは初回使用時に遅延実行されます(bunker とのハンドシェイクが非同期である NIP-46 では特に重要です)。
- 監査ログ — 試行ごとに追記専用の JSON 行を記録します(成功/ブロック/エラー)。
DM ツールには、さらに 3 つのチェックが加わります。NOSTR_DM_TOOLS_ENABLED、DmAllowlist(受信者ごと)、および独立した dms レートバケットです。
安全性の最後の砦は署名者です。 NIP-46 を使用している場合、bunker はあらゆる署名リクエストを拒否できます。これが最も強力な安全境界です。このサーバーのチェックは、その上に重ねる多重の保護策です。
呼び出しが実際に成功したことを確認する
tail -n 5 nostr-mcp-audit.log
公開成功時:{"ts":"...","tool":"nostr_publish_text_note","outcome":"ok","result":{"event_id":"...","relays_accepted":[...]}}。ブロック時やエラー時の行も同様の構造です。監査ログは意図的に追記専用です。運用上の衛生管理の一環として、定期的にローテーションしてください。
テスト
pnpm typecheck # tsc --noEmit
pnpm test # 13 vitest cases (KindAllowlist, RateLimiter, nip19 roundtrip)
pnpm build # dist/index.js (~58 KB ESM bundle)
ライブリレーを使ったエンドツーエンドテストでは、使い捨ての nsec と公開リレーをいくつか(damus.io、nos.lol)設定し、簡単なループを実行します。nostr_publish_text_note → nostr_query_events の順に呼び出し、ノートが往復できたことを確認します。nostr_send_dm → nostr_list_dms のループでは、DM の経路を検証できます(自分宛てに DM を送れば、クローズドループで確認できます)。
関連サーバー
nwc-mcp— NWC 経由の Lightning ウォレットです。これらを組み合わせると、sats を使う NOSTR エージェントを構築できます。marketplace-mcp— NIP-15 マーケットプレイスでの公開(Shopstr 互換)を行います。このサーバーと同じ署名者設定を使用します。
ライセンス
MIT — LICENSE を参照してください。
お問い合わせ/問題の報告
LLMOps.Pro が開発しました。
- NOSTR:
npub1hdg932jvwc3jdvkqywgqv0ue4nn60exrf92asy8mtazt3hjg7d2s2yw0nw— フォロー、DM、zap をお願いします。 - Lightning アドレス:
[email protected]— サポートへの zap や、「役に立った」というチップはこちらへ。 - バグ報告/機能リクエスト: GitHub の issue を作成してください(リンクは後日追加予定です)。
- セキュリティ上の問題: 公開 issue を作成する前に、NOSTR の DM で非公開に報告してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。