Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者提供的说明(英文原文)
Nostr publishing, queries, and DMs for AI agents, with allowlists, rate limits, and an audit log.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
NOSTR_RELAYS, NOSTR_NIP46_URI, NOSTR_PRIVATE_KEY, NOSTR_ALLOWED_KINDS标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"nostr-ops": {
"command": "npx",
"args": [
"-y",
"nostr-ops-mcp"
],
"env": {
"NOSTR_RELAYS": "your-value",
"NOSTR_NIP46_URI": "your-value",
"NOSTR_PRIVATE_KEY": "your-value",
"NOSTR_ALLOWED_KINDS": "your-value"
}
}
}
}在终端中运行这条命令
claude mcp add nostr-ops --env NOSTR_RELAYS=your-value --env NOSTR_NIP46_URI=your-value --env NOSTR_PRIVATE_KEY=your-value --env NOSTR_ALLOWED_KINDS=your-value -- npx -y nostr-ops-mcp运行前请先填写空着的值。
粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"nostr-ops": {
"command": "npx",
"args": [
"-y",
"nostr-ops-mcp"
],
"env": {
"NOSTR_RELAYS": "your-value",
"NOSTR_NIP46_URI": "your-value",
"NOSTR_PRIVATE_KEY": "your-value",
"NOSTR_ALLOWED_KINDS": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"nostr-ops": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"nostr-ops-mcp"
],
"env": {
"NOSTR_RELAYS": "your-value",
"NOSTR_NIP46_URI": "your-value",
"NOSTR_PRIVATE_KEY": "your-value",
"NOSTR_ALLOWED_KINDS": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
NOSTR_ALLOWED_KINDS env这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月8日
注册名称已通过 GitHub 账户 llmops-pro 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
你需要填写:NOSTR_RELAYS, NOSTR_NIP46_URI, NOSTR_PRIVATE_KEY
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(0.2.3)于5个月前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Node.js。
同一分类中有:Spec Driven Development, Remote Desktop Commander, Talexio MCP by usefulapi
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:↓ 每周下载量i★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Read employees, approved pay lines, approved time off and shift templates in Talexio.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
A NOSTR identity for your LLM agent. MCP server that exposes NOSTR protocol primitives — sign, publish, query, NIP-19 encode/decode, NIP-05 lookup, encrypted DMs — as tools your agent can call. Drop it into Claude Desktop, Claude Code, Cursor, or any MCP-speaking client. Hand the agent a NIP-46 bunker key (not a raw nsec). Set a kind allowlist. Let it post on your behalf within rails you control.
v0.1 — full read + write + DM surface. 16 tools wrapped in a defense-in-depth safety stack: kind allowlist (deny-by-default), recipient allowlist, rate limits, optional two-step confirmation, structured audit log. Supports both nsec (dev) and NIP-46 bunker (production).
marketplace-mcp to publish NIP-15 stalls + products as the same identity.nostr_publish_metadata for kind:0 (always demands confirmation — overwriting your profile is irreversible without older relay data).nostr_list_dms), decrypts orders, and replies via nostr_send_dm. Default-off behind NOSTR_DM_TOOLS_ENABLED.nostr-ops-mcp and marketplace-mcp. One key, one identity, two specialized tool surfaces.The safety stack is the load-bearing reason this is usable in production: an agent with the keys to publish *as you* can ruin your reputation in seconds if unconstrained. The server enforces what kinds it'll sign, what rate, optional second-step confirmation, and writes every call to a structured audit log.
| Tool | Purpose |
|---|---|
nostr_decode | Parse NIP-19 strings (npub / nsec / note / nevent / naddr / nprofile). nsec decoding gated behind NOSTR_ALLOW_NSEC_DECODE=true. |
nostr_encode | Build NIP-19 strings from raw fields. nsec encoding deliberately not supported. |
| Tool | Purpose |
|---|---|
nostr_get_pubkey | Returns the signer's pubkey + npub. Errors clearly if no signer configured. |
nostr_list_relays | Configured relay pool + each relay's connection status. |
nostr_query_events | The workhorse. NIP-01 filters: kinds, authors, e_tag / p_tag / d_tag / t_tag tag filters (mapped to NIP-01 #e/#p/#d/#t internally — renamed in v0.2.0 for hosted-API schema compatibility), since / until / limit. |
nostr_get_profile | Fetch + parse kind:0 metadata for a pubkey or npub. Returns the parsed JSON content (name, about, picture, nip05, lud16, …). |
nostr_verify_nip05 | Resolve name@domain → pubkey via /.well-known/nostr.json. Optional expected_pubkey for verification mode. |
| Tool | Purpose |
|---|---|
nostr_publish_event | The primitive write tool. Pass kind / content / tags. |
nostr_publish_text_note | Convenience for kind:1. Reply/mention/hashtag shortcuts auto-assemble into NIP-10 tags. |
nostr_publish_metadata | Kind:0 profile. Always demands two-step confirmation regardless of NOSTR_REQUIRE_CONFIRM — overwriting your profile is hard to reason about. |
nostr_publish_addressable_event | Kinds 30000–39999 (replaceable). Sets the d tag automatically. The bridge marketplace-mcp uses for NIP-15. |
nostr_delete_event | NIP-09 kind:5 soft delete. Best-effort — relays may ignore. |
nostr_confirm_publish | Execute a token-gated publish. Single-use; safety pipeline re-runs. |
NOSTR_DM_TOOLS_ENABLED=true)| Tool | Purpose |
|---|---|
nostr_send_dm | NIP-04 (kind:4) DM with NIP-44 encryption by default; NIP-04 supported for legacy compat. Gated by NOSTR_DM_ALLOWLIST. |
nostr_list_dms | Fetch + decrypt the thread with a counterparty. Auto-detects NIP-44 vs NIP-04 per event. |
nostr_decrypt_dm | Decrypt a single ciphertext (when you already have the event from elsewhere). |
NIP-17 sealed/gift-wrapped DMs are not yet supported — deferred to a future v0.2 (rumor events + gift-wrapping add nontrivial complexity).
.env. The server logs a stderr warning at startup when nsec-on-disk is detected.# From npm (once published)
npx -y nostr-ops-mcp
git clone cd nostr-ops-mcp corepack enable pnpm pnpm install pnpm build
cp .env.example .env
The server auto-loads .env from this binary's own directory (next to dist/) — deliberately NOT from cwd, to avoid env-var collision when multiple MCP servers run in the same Claude Code session.
| Var | Purpose |
|---|---|
NOSTR_RELAYS | Comma-separated wss:// relays. Server refuses to start if empty. |
NOSTR_ALLOWED_KINDS | Comma-separated event-kind numbers the server may sign. Required when a signer is configured. Example: 1,30017,30018 for text-note + NIP-15 marketplace. Default omits kind:0 (profile) and kind:5 (delete) — both easy to misuse. |
| Var | Purpose |
|---|---|
NOSTR_NIP46_URI | bunker:// ?relay=...&secret=... from Amber / nsec.app / Alby Account / any NIP-46 bunker. Recommended. |
NOSTR_PRIVATE_KEY | Raw nsec1.... Dev/legacy only. Server warns at startup. |
| Var | Default | Purpose |
|---|---|---|
NOSTR_READ_ONLY | false | Force read-only — disables all write tools. |
NOSTR_DM_TOOLS_ENABLED | false | Opt-in for send_dm / list_dms / decrypt_dm. |
NOSTR_DM_ALLOWLIST | unset | Hex pubkeys allowed as DM recipients. Empty = NOSTR_DM_TOOLS_ENABLED alone gates. |
NOSTR_REQUIRE_CONFIRM | false | Two-step confirm: write tools return a token, nostr_confirm_publish executes. |
NOSTR_MAX_EVENTS_PER_MINUTE | 10 | Rolling 60s rate limit on writes. |
NOSTR_MAX_DMS_PER_MINUTE | 5 | Same but for DMs. |
NOSTR_ALLOW_NSEC_DECODE | false | Allow nostr_decode to return raw private key material. Don't enable unless you really need it. |
NOSTR_LOG_PATH | ./nostr-mcp.log | Server log path. |
NOSTR_AUDIT_PATH | ./nostr-mcp-audit.log | Structured audit log (one JSON line per tool call). |
claude mcp add nostr-ops -s project node "$(pwd)/dist/index.js"
{
"mcpServers": { "nostr-ops": { "command": "npx", "args": ["-y", "nostr-ops-mcp"], "env": {} } } }
Because the server loads its own .env, leave the env block empty in the client config — keep secrets out of any committed file.
Every write tool runs the pipeline in this order:
NOSTR_ALLOWED_KINDS.events bucket is full.NOSTR_REQUIRE_CONFIRM=true (or the tool always-confirms, like publish_metadata), return a 16-byte hex token instead of signing.DM tools add three more checks on top: NOSTR_DM_TOOLS_ENABLED, DmAllowlist (per-recipient), and a separate dms rate bucket.
The floor is your signer. If using NIP-46, the bunker can refuse any sign request — that's the strongest safety boundary. This server's checks are belt-and-suspenders on top.
tail -n 5 nostr-mcp-audit.log
Successful publish: {"ts":"...","tool":"nostr_publish_text_note","outcome":"ok","result":{"event_id":"...","relays_accepted":[...]}}. Blocked / error lines are equally structured. The audit log is append-only by intent — rotate it as part of your operational hygiene.
pnpm typecheck # tsc --noEmit
pnpm test # 13 vitest cases (KindAllowlist, RateLimiter, nip19 roundtrip) pnpm build # dist/index.js (~58 KB ESM bundle)
For end-to-end testing against live relays, configure a throwaway nsec + a couple of public relays (damus.io, nos.lol) and run a small loop: nostr_publish_text_note → nostr_query_events to confirm the note round-tripped. The nostr_send_dm → nostr_list_dms loop validates the DM path (you can DM yourself for a closed-loop check).
nwc-mcp — Lightning wallet over NWC. Pair these to build sats-spending NOSTR agents.marketplace-mcp — NIP-15 marketplace publish (Shopstr-compatible). Uses the same signer setup as this server.MIT — see LICENSE.
Built by LLMOps.Pro.
npub1hdg932jvwc3jdvkqywgqv0ue4nn60exrf92asy8mtazt3hjg7d2s2yw0nw — follow, DM, zap.sovereigncitizens@getalby.com — for support zaps and "this was useful" tips.