{"name":"io.github.llmops-pro/nostr-ops-mcp","slug":"llmops-pro-nostr-ops-mcp","title":null,"description":"Nostr publishing, queries, and DMs for AI agents, with allowlists, rate limits, and an audit log.","url":"https://mcp.market/server/llmops-pro-nostr-ops-mcp","rating":null,"grade":"B","score":71,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":13,"stars":0,"forks":0,"downloads_week":28,"last_push_at":"2026-06-15T09:57:32.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/llmops-pro/nostr-ops-mcp","website":null,"version":"0.2.3","remotes":[],"packages":[{"registryType":"npm","identifier":"nostr-ops-mcp","version":"0.2.3","transport":{"type":"stdio"},"environmentVariables":[{"description":"Comma-separated wss:// relay URLs","isRequired":true,"name":"NOSTR_RELAYS"},{"description":"NIP-46 bunker URI (preferred signer; keeps the nsec off this machine)","isSecret":true,"name":"NOSTR_NIP46_URI"},{"description":"nsec private key (alternative to NOSTR_NIP46_URI; read-only mode if neither is set)","isSecret":true,"name":"NOSTR_PRIVATE_KEY"},{"description":"Comma-separated event kinds the server may publish (required when a signer is configured)","name":"NOSTR_ALLOWED_KINDS"}]}],"tools":[{"name":"nostr_confirm_publish","description":"Execute a previously-prepared signed publish, identified by its one-time token. Only meaningful when NOSTR_REQUIRE_CONFIRM=true, or when called after publish_metadata (which always confirms). Token is consumed (single-use); the safety pipeline (read-only, signer, kind allowlist, rate limit, dm allowlist) re-runs before signing. Dispatches to the right execute path based on which tool issued the to","write_action":true,"price_micros":0,"input_schema":null},{"name":"nostr_decode","description":"Decode a NIP-19 bech32-encoded identifier (npub / nsec / note / nevent / naddr / nprofile) into its raw fields. Local-only \\u2014 no network call. Refuses nsec unless NOSTR_ALLOW_NSEC_DECODE=true; guards against accidentally surfacing a private key in tool output.","write_action":false,"price_micros":0,"input_schema":null},{"name":"nostr_decrypt_dm","description":"Decrypt a single DM ciphertext using the signer's encrypt/decrypt interface. Useful when you already have a kind:4 event from elsewhere (e.g., nostr_query_events) and just need the plaintext. Auto-detects NIP-44 vs NIP-04 by default. Same NOSTR_DM_TOOLS_ENABLED gate as send/list \\u2014 reading plaintext is still a confidentiality surface.","write_action":false,"price_micros":0,"input_schema":null},{"name":"nostr_delete_event","description":"Publish a NIP-09 kind:5 deletion request for a previously-published event. **Soft delete** \\u2014 relays may or may not honor it, and copies on relays you didn't reach stay. Requires kind 5 to be in NOSTR_ALLOWED_KINDS.","write_action":true,"price_micros":0,"input_schema":null},{"name":"nostr_encode","description":"Encode a raw NIP-19 record (npub / note / nevent / naddr / nprofile) into its bech32 form. Local-only \\u2014 no network call. Does NOT support nsec encoding (private keys must not transit the agent).","write_action":false,"price_micros":0,"input_schema":null},{"name":"nostr_get_profile","description":"Fetch and parse a NOSTR profile (kind:0 metadata) for the given pubkey or npub. Convenience wrapper over nostr_query_events with kinds=[0], limit=1. Returns the parsed JSON content (name, about, picture, nip05, lud16, etc.) plus the source event id and timestamp. Returns `profile: null` if no kind:0 event was found for that pubkey on the configured relay pool.","write_action":false,"price_micros":0,"input_schema":null},{"name":"nostr_get_pubkey","description":"Return the configured signer's public key as hex + npub. Errors clearly if no signer is configured (server is in read-only mode). For NIP-46 signers, this blocks until the bunker handshake completes.","write_action":false,"price_micros":0,"input_schema":null},{"name":"nostr_list_dms","description":"Fetch + decrypt the DM thread between the configured signer and a counterparty. Pulls kind:4 events in both directions (sent and received), decrypts each via the signer's encrypt/decrypt interface (auto-selects NIP-44 or NIP-04 based on the ciphertext), and returns the thread sorted oldest-first. Decryption failures are surfaced per-event instead of failing the whole call.","write_action":false,"price_micros":0,"input_schema":null},{"name":"nostr_list_relays","description":"List the configured relay pool with each relay's current connection status.","write_action":false,"price_micros":0,"input_schema":null},{"name":"nostr_publish_addressable_event","description":"Publish a parameterized-replaceable / addressable event (kind 30000\\u201339999). The marketplace MCP's load-bearing bridge \\u2014 NIP-15 stalls (kind 30017) and products (kind 30018) flow through this. Sets the `d` tag automatically from the `d_tag` input. Republishing with the same (kind, pubkey, d_tag) replaces the prior version on relays that honor replaceability.","write_action":true,"price_micros":0,"input_schema":null},{"name":"nostr_publish_event","description":"Sign and broadcast a raw NOSTR event of any allowed kind. The primitive write tool \\u2014 other publish_* tools are convenience wrappers around this. Runs the full safety pipeline: read-only gate, signer presence, kind allowlist, rate limit, optional two-step confirmation.","write_action":true,"price_micros":0,"input_schema":null},{"name":"nostr_publish_metadata","description":"Publish a kind:0 profile metadata event. **Always demands two-step confirmation** (regardless of NOSTR_REQUIRE_CONFIRM) because it overwrites your public profile and is hard to reason about safely from an LLM context. Requires kind 0 to be in NOSTR_ALLOWED_KINDS \\u2014 explicitly opt in.","write_action":true,"price_micros":0,"input_schema":null},{"name":"nostr_publish_text_note","description":"Convenience wrapper for publishing a kind:1 text note. Builds the `e` / `p` / `t` tags from the structured inputs (replies, mentions, hashtags) so the agent doesn't have to assemble them. Requires kind 1 to be in NOSTR_ALLOWED_KINDS.","write_action":true,"price_micros":0,"input_schema":null},{"name":"nostr_query_events","description":"Query events from the configured relay pool using NIP-01 filters. Supports kinds, authors, since/until/limit, and tag filters (#e, #p, #d, #t). Returns an array of events as plain objects (id, kind, pubkey, created_at, content, tags, sig). The workhorse read tool.","write_action":false,"price_micros":0,"input_schema":null},{"name":"nostr_send_dm","description":"Encrypt + send a NIP-04 (kind:4) direct message. Defaults to NIP-44 encryption (current standard); pass version=\"nip04\" only for legacy compatibility. Gated by NOSTR_DM_TOOLS_ENABLED + NOSTR_DM_ALLOWLIST + rate limit. For modern sealed DMs (NIP-17) wait for the next version.","write_action":true,"price_micros":0,"input_schema":null},{"name":"nostr_verify_nip05","description":"Verify a NIP-05 identifier resolves to the expected pubkey. Fetches `https://{domain}/.well-known/nostr.json?name={name}` and looks up `names[name]`. If `expected_pubkey` is provided, returns verified=true only if the resolved pubkey matches; otherwise returns verified=true on any successful resolution + the resolved pubkey. Also surfaces the recipient's relay hints if the well-known doc advertise","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":71,"grade":"B","scanned_at":"2026-09-27T05:29:04.594Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-27T05:29:04.616Z","components":{"code":{"score":25,"max":25,"notes":["2 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":8,"max":15,"notes":["last push 104 days ago"]},"identity":{"score":7,"max":10,"notes":["registry namespace matches repository owner"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"nostr-ops-mcp","version":"0.2.3","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":4,"publishedAt":"2026-06-12T09:55:01.903Z","repositoryUrl":"git+https://github.com/llmops-pro/nostr-ops-mcp.git","weeklyDownloads":28}],"repo":{"found":true,"owner":"llmops-pro","repo":"nostr-ops-mcp","archived":false,"pushedAt":"2026-06-15T09:57:32Z","stars":0,"forks":0,"openIssues":0,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/273571316?v=4","ownerCreatedAt":"2026-04-04T13:33:51Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/273571316?v=4&s=128","source":"github"},"presence":{"stars":0,"forks":0,"downloadsWeek":28,"license":"MIT","lastPushAt":"2026-06-15T09:57:32.000Z","score":13}}}},"grade_history":[],"reviews":[]}