{"name":"dev.forgesworn/bray","slug":"forgesworn-bray","title":null,"description":"Trust-aware Nostr for AI agents -- 235 tools covering social, DMs, zaps, trust, and identity","url":"https://mcp.market/server/forgesworn-bray","rating":null,"grade":"B","score":82,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":32,"stars":1,"forks":1,"downloads_week":693,"last_push_at":"2026-09-24T19:13:44.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/forgesworn/bray","website":null,"version":"1.27.7","remotes":[],"packages":[{"registryType":"npm","identifier":"nostr-bray","version":"1.27.7","transport":{"type":"stdio"},"environmentVariables":[{"description":"Nostr secret key (nsec, hex, or BIP-39 mnemonic)","isRequired":true,"format":"string","isSecret":true,"name":"NOSTR_SECRET_KEY"},{"description":"Comma-separated list of Nostr relay WebSocket URLs","isRequired":true,"format":"string","name":"NOSTR_RELAYS"},{"description":"Nostr Wallet Connect URI for Lightning zaps","format":"string","isSecret":true,"name":"NWC_URI"}]}],"tools":[{"name":"canary-beacon-check","description":"Check a CANARY beacon's status. Pass a beaconId to check a locally tracked beacon,","write_action":false,"price_micros":0,"input_schema":null},{"name":"canary-beacon-create","description":"Create an encrypted liveness beacon for a CANARY group.","write_action":true,"price_micros":0,"input_schema":null},{"name":"canary-group-create","description":"Create an encrypted CANARY verification group. All members share a secret seed","write_action":true,"price_micros":0,"input_schema":null},{"name":"canary-group-current","description":"Get the current verification word for a CANARY group.","write_action":false,"price_micros":0,"input_schema":null},{"name":"canary-group-join","description":"Join an existing CANARY group using a shared seed (received via NIP-17 DM).","write_action":false,"price_micros":0,"input_schema":null},{"name":"canary-group-members","description":"List members and admins of a CANARY group.","write_action":false,"price_micros":0,"input_schema":null},{"name":"canary-group-verify","description":"Verify a spoken word against a CANARY group.","write_action":false,"price_micros":0,"input_schema":null},{"name":"canary-session-create","description":"Create a CANARY verification session for two-party spoken verification.","write_action":true,"price_micros":0,"input_schema":null},{"name":"canary-session-current","description":"Get the current verification words for an active CANARY session.","write_action":false,"price_micros":0,"input_schema":null},{"name":"canary-session-verify","description":"Verify a spoken word against an active CANARY session.","write_action":false,"price_micros":0,"input_schema":null},{"name":"cast-spell","description":"Execute a NIP-A7 Spell (kind 777). Fetches the Spell event, resolves runtime variables ($me → your pubkey, $contacts → your follow list) and relative timestamps (e.g. \"7d\", \"30d\"), builds a REQ filter, and queries relays. Pass either an event ID or a Spell event object from a prior relay-query.","write_action":true,"price_micros":0,"input_schema":null},{"name":"dispatch-ack","description":"Acknowledge receipt of a dispatch task. Tells the sender \"got it, working on it\" before you have a full result. Use when a task will take time to complete.","write_action":false,"price_micros":0,"input_schema":null},{"name":"dispatch-cancel","description":"Cancel a dispatch task you previously sent or received. Notifies the other party that the task should be abandoned.","write_action":true,"price_micros":0,"input_schema":null},{"name":"dispatch-capability-discover","description":"Discover dispatch-capable agents on Nostr. Searches for NIP-89 capability cards (kind 31990) tagged with the dispatch protocol. Optionally filter by task type. Returns agent names, descriptions, supported task types, repos, and availability.","write_action":false,"price_micros":0,"input_schema":null},{"name":"dispatch-capability-publish","description":"Publish your agent's dispatch capabilities as a NIP-89 capability card (kind 31990). Lets other agents discover you on Nostr without needing a pre-shared identities file. The card advertises what task types you support, which repos you can work on, and your availability.","write_action":true,"price_micros":0,"input_schema":null},{"name":"dispatch-capability-read","description":"Read a specific agent's dispatch capability card. Fetches their NIP-89 kind 31990 event to see what task types they support, which repos they work on, and their current availability.","write_action":false,"price_micros":0,"input_schema":null},{"name":"dispatch-check","description":"Check for incoming collaboration tasks from trusted Nostr identities. Returns dispatch messages: think tasks, build tasks, results, acks, status updates. Only shows messages from identities in the dispatch trust list, validated for freshness. Defaults to messages received since this session started (prevents re-processing old tasks). Pass since=0 to see all available messages regardless of age.","write_action":false,"price_micros":0,"input_schema":null},{"name":"dispatch-failure","description":"Report that a dispatch task failed after you attempted it. Use when you tried to complete the task but encountered errors. Optionally include partial results so work is not lost.","write_action":false,"price_micros":0,"input_schema":null},{"name":"dispatch-propose","description":"Propose an alternative approach for a dispatch task. Use when you can't do exactly what was asked but have a better idea. The sender receives the proposal via dispatch-check.","write_action":false,"price_micros":0,"input_schema":null},{"name":"dispatch-query","description":"Ask the task sender a clarifying question before delivering results. Use mid-task when you need more information to proceed. The sender receives the question via dispatch-check and can reply.","write_action":false,"price_micros":0,"input_schema":null},{"name":"dispatch-refuse","description":"Refuse a dispatch task you cannot or should not complete. Tells the sender \"I cannot do this\" with a reason. Use when the task is outside your capabilities, scope, or permissions.","write_action":false,"price_micros":0,"input_schema":null},{"name":"dispatch-reply","description":"Send a result back for a completed dispatch task. Use after finishing a think or build task received via dispatch-check. Only replies to trusted identities. Do not use this for human conversations — only for responding to tasks from other AI agents.","write_action":true,"price_micros":0,"input_schema":null},{"name":"dispatch-send","description":"Send a collaboration task to a trusted Nostr identity. Think tasks request read-only code analysis. Build tasks request implementation with code changes. The recipient's AI agent receives the task via encrypted NIP-17 DM and processes it with dispatch-check. Uses the active identity as sender — switch identity first if needed.","write_action":true,"price_micros":0,"input_schema":null},{"name":"dispatch-status","description":"Send a status update to collaborators. Use to broadcast availability (e.g. \"busy until 14:00\"), queue depth, or progress on long-running tasks.","write_action":true,"price_micros":0,"input_schema":null},{"name":"execute-action","description":"Execute an action found via search-actions. Pass the exact action name and its parameters.","write_action":true,"price_micros":0,"input_schema":null},{"name":"handler-discover","description":"Discover MCP-capable handlers on Nostr. Searches for kind 31990 events that include mcp transport tags. Optionally filter by supported event kind. Returns handler names, descriptions, supported kinds, and transport endpoints.","write_action":false,"price_micros":0,"input_schema":null},{"name":"handler-publish","description":"Publish a NIP-XX Machine Application Handler card (kind 31990) advertising MCP transport endpoints. Lets other agents and tools discover MCP servers on Nostr by the event kinds they support. Provide at least one of stdio_command or http_url.","write_action":true,"price_micros":0,"input_schema":null},{"name":"identity-accept-migration","description":"Accept a migration from an external signer (Amber, nsec.app, etc). Signs and publishes the acceptance event via the current signer. Optionally verifies the migration event from the old key. Requires a Heartwood-compatible signer or local key.","write_action":false,"price_micros":0,"input_schema":null},{"name":"identity-backup","description":"Fetch profile, contacts, relay list, and attestations for a pubkey. Returns a portable JSON bundle (no private keys).","write_action":false,"price_micros":0,"input_schema":null},{"name":"identity-backup-shamir","description":"Split the active identity's private key into Shamir shard files using threshold secret sharing. Any \"threshold\" shards can reconstruct the key. Files written with 0600 permissions via atomic rename. Returns file paths only — shard content never appears in the response.","write_action":false,"price_micros":0,"input_schema":null},{"name":"identity-create","description":"Generate a fresh Nostr identity with a BIP-39 mnemonic seed. Returns { npub, mnemonic }. Store the mnemonic securely — it will not be shown again. Use this when the user needs a brand new identity unrelated to the current one.","write_action":true,"price_micros":0,"input_schema":null},{"name":"identity-derive","description":"Derive a child Nostr identity from the master key by purpose and index. Deterministic — same inputs always produce the same npub. Returns { npub, purpose, index }. Use identity_switch after deriving to operate as the new identity.","write_action":false,"price_micros":0,"input_schema":null},{"name":"identity-derive-persona","description":"Derive a named persona (e.g. \"work\", \"personal\", \"anonymous\"). Like identity_derive but uses a human-readable name. Returns { npub, personaName, index }. Follow with identity_switch to activate.","write_action":false,"price_micros":0,"input_schema":null},{"name":"identity-list","description":"List all known identities (master + all derived). Returns array of { npub, purpose, index, personaName }. Never includes private keys. Use this to see what identities are available before switching.","write_action":false,"price_micros":0,"input_schema":null},{"name":"identity-migrate","description":"Migrate from an old identity to the active one. Shows preview first — set confirm: true to execute. Publishes linkage proof and re-signs migratable events.","write_action":false,"price_micros":0,"input_schema":null},{"name":"identity-prove","description":"Create a cryptographic linkage proof between the master key and the active identity. \"blind\" (default) proves they share a master without revealing how the child was derived. \"full\" also reveals the purpose and index. Returns a LinkageProof object that can be verified by anyone with nsec-tree. Use trust_proof_publish to make it permanent on relays.","write_action":true,"price_micros":0,"input_schema":null},{"name":"identity-restore","description":"Re-sign migratable events (profile, contacts, relay list) under the active identity. Skips attestations (trust chain protection).","write_action":false,"price_micros":0,"input_schema":null},{"name":"identity-restore-shamir","description":"Reconstruct a secret from Shamir shard files. Returns the restored npub for verification.","write_action":false,"price_micros":0,"input_schema":null},{"name":"identity-switch","description":"Switch the active Nostr identity. ALL subsequent tool calls will sign events and query relays as the new identity. Pass \"master\" to return to root. Returns { npub } of the now-active identity. This is the key tool for multi-persona workflows.","write_action":false,"price_micros":0,"input_schema":null},{"name":"label-create","description":"Label an event, pubkey, or addressable event using NIP-32 (kind 1985).","write_action":true,"price_micros":0,"input_schema":null},{"name":"label-read","description":"Query NIP-32 labels for a target event, pubkey, or address.","write_action":false,"price_micros":0,"input_schema":null},{"name":"label-remove","description":"Delete a label event via kind 5 deletion. Only works for labels you authored.","write_action":true,"price_micros":0,"input_schema":null},{"name":"label-search","description":"Find all events/pubkeys that have been given a specific label in a namespace.","write_action":false,"price_micros":0,"input_schema":null},{"name":"label-self","description":"Self-label your own content (kind 1985). Useful for content warnings, categories,","write_action":false,"price_micros":0,"input_schema":null},{"name":"list-bookmark","description":"Manage bookmarks (NIP-51). Without a name, manages general bookmarks (kind 10003).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list-bookmark-read","description":"Read bookmarks. Without a name, reads general bookmarks (kind 10003).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list-check-muted","description":"Check if a pubkey, event ID, keyword, or hashtag is on your mute list.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list-followset-create","description":"Create a named follow set (NIP-51, kind 30000).","write_action":true,"price_micros":0,"input_schema":null},{"name":"list-followset-manage","description":"Add or remove pubkeys from a named follow set (NIP-51, kind 30000).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list-followset-read","description":"Read a named follow set by name (NIP-51, kind 30000).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list-mute","description":"Manage your mute list (NIP-51, kind 10000). Add or remove pubkeys, event IDs, keywords, or hashtags.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list-mute-read","description":"Read your current mute list (NIP-51, kind 10000). Returns all muted pubkeys, events, keywords, and hashtags.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list-pin","description":"Manage pinned events (NIP-51, kind 10001). Add or remove event IDs from your pin list.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list-pin-read","description":"Read your pinned events list (NIP-51, kind 10001).","write_action":false,"price_micros":0,"input_schema":null},{"name":"listing-close","description":"Mark a classified listing as sold or closed (NIP-99, kind 30402).","write_action":false,"price_micros":0,"input_schema":null},{"name":"listing-create","description":"Create a classified listing (NIP-99, kind 30402). Publishes a replaceable event with title,","write_action":true,"price_micros":0,"input_schema":null},{"name":"listing-read","description":"Read classified listing(s) (NIP-99, kind 30402) by author and optional slug.","write_action":false,"price_micros":0,"input_schema":null},{"name":"listing-search","description":"Search classified listings (NIP-99, kind 30402) by hashtag or geohash location.","write_action":false,"price_micros":0,"input_schema":null},{"name":"marketplace-announce","description":"Publish a kind 31402 service announcement on Nostr.","write_action":true,"price_micros":0,"input_schema":null},{"name":"marketplace-call","description":"Make an authenticated API call using L402 credentials obtained from marketplace-pay.","write_action":false,"price_micros":0,"input_schema":null},{"name":"marketplace-compare","description":"Compare two or more L402 services side by side — pricing, capabilities, and shared features.","write_action":false,"price_micros":0,"input_schema":null},{"name":"marketplace-credentials-clear","description":"Clear all stored L402 credentials from memory. Use when switching identity or cleaning up.","write_action":false,"price_micros":0,"input_schema":null},{"name":"marketplace-discover","description":"Discover L402/x402 paid API services announced on Nostr (kind 31402).","write_action":false,"price_micros":0,"input_schema":null},{"name":"marketplace-inspect","description":"Get full details of a specific L402 service by event ID, or by provider pubkey + identifier.","write_action":false,"price_micros":0,"input_schema":null},{"name":"marketplace-pay","description":"Pay an L402 invoice via NWC and store credentials for authenticated API calls.","write_action":true,"price_micros":0,"input_schema":null},{"name":"marketplace-probe","description":"Send an HTTP request to an endpoint and inspect the response.","write_action":true,"price_micros":0,"input_schema":null},{"name":"marketplace-reputation","description":"Check a service provider's reputation — number of active services, announcement history, and topics covered.","write_action":false,"price_micros":0,"input_schema":null},{"name":"marketplace-retire","description":"Retire (delete) a service announcement by publishing a kind 5 deletion event. The service will no longer appear in discovery results.","write_action":false,"price_micros":0,"input_schema":null},{"name":"marketplace-search","description":"Full-text search across L402 service names, descriptions, topics, and capabilities.","write_action":false,"price_micros":0,"input_schema":null},{"name":"marketplace-update","description":"Update an existing kind 31402 service announcement. Same pubkey + identifier replaces the previous version (NIP-33 replaceable).","write_action":true,"price_micros":0,"input_schema":null},{"name":"moderation-filter","description":"Filter a set of events against the active identity's mute list.","write_action":false,"price_micros":0,"input_schema":null},{"name":"nip05-lookup","description":"Resolve a NIP-05 identifier (user@domain) to a Nostr pubkey. Also returns relay hints if the server provides them. Use this to find someone's pubkey from their human-readable address.","write_action":false,"price_micros":0,"input_schema":null},{"name":"nip05-relays","description":"Fetch relay hints from a NIP-05 identifier. The NIP-05 server can suggest preferred relays for each pubkey. Returns a map of pubkey to relay URLs. Useful for relay discovery before messaging someone.","write_action":false,"price_micros":0,"input_schema":null},{"name":"nip05-verify","description":"Verify that a NIP-05 identifier (user@domain) resolves to the expected pubkey. Returns { verified: true/false }. Use this to confirm someone's claimed NIP-05 identity.","write_action":false,"price_micros":0,"input_schema":null},{"name":"privacy-commit","description":"Create a Pedersen commitment to a secret value. Returns a public commitment point (safe to share) and a blinding factor (keep secret). The commitment cryptographically binds you to the value without revealing it.","write_action":true,"price_micros":0,"input_schema":null},{"name":"privacy-open","description":"Verify a Pedersen commitment opening. Given the original value and blinding factor, check they match the public commitment. Returns true if the commitment is valid.","write_action":false,"price_micros":0,"input_schema":null},{"name":"privacy-prove-age","description":"Prove age is within a range without revealing the exact age. Supports formats like \"18+\" (adult), \"13-17\" (teen), \"8-12\" (child). Optionally bind to a subject pubkey to prevent transplanting.","write_action":false,"price_micros":0,"input_schema":null},{"name":"privacy-prove-range","description":"Prove a secret value is within [min, max] without revealing the value. Returns a cryptographic range proof that anyone can verify against the commitment. Optional binding context prevents proof transplanting between credentials.","write_action":false,"price_micros":0,"input_schema":null},{"name":"privacy-prove-threshold","description":"Prove a value exceeds a threshold without revealing the exact value. Useful for income verification, balance checks, credit scoring. The proof shows value >= threshold.","write_action":false,"price_micros":0,"input_schema":null},{"name":"privacy-publish-proof","description":"Publish a range proof as a kind 30078 (NIP-78) Nostr event. Includes the commitment, proof, range description, and optional subject pubkey. The proof can then be discovered and verified by anyone.","write_action":true,"price_micros":0,"input_schema":null},{"name":"privacy-read-proof","description":"Fetch and verify range proof events from relays. Returns a list of proofs with their verification status, labels, ranges, and subject pubkeys.","write_action":false,"price_micros":0,"input_schema":null},{"name":"privacy-verify-age","description":"Verify an age range proof. Checks that the subject is within the expected age range without learning their exact age.","write_action":false,"price_micros":0,"input_schema":null},{"name":"privacy-verify-range","description":"Verify a range proof. Checks that the committed value is within [min, max] without learning the value. Supply the same binding context used during proof creation.","write_action":false,"price_micros":0,"input_schema":null},{"name":"privacy-verify-threshold","description":"Verify a threshold proof. Checks that the committed value is >= threshold without learning the value.","write_action":false,"price_micros":0,"input_schema":null},{"name":"relay-add","description":"Add a single relay to the active identity's relay set (in-memory only — does not publish kind 10002).","write_action":false,"price_micros":0,"input_schema":null},{"name":"relay-auth","description":"Authenticate to a relay that requires NIP-42 AUTH. Connects to the relay, waits for an AUTH challenge, signs a kind 22242 event, and sends it back. Returns { authenticated: true/false }. Use this when a relay-query fails due to AUTH requirements, then retry the query.","write_action":false,"price_micros":0,"input_schema":null},{"name":"relay-compare","description":"Compare 2 or more relays side-by-side. For each relay: NIP-11 metadata, response time,","write_action":false,"price_micros":0,"input_schema":null},{"name":"relay-count","description":"Count events matching a filter without fetching them (NIP-45). Sends a COUNT request to each relay. Falls back to fetch-and-count (capped at 1000) if the relay does not support NIP-45. Results show per-relay counts with fallback/estimated flags. Filter fields may be supplied either as top-level arguments or wrapped in a single \"filter\" object (both shapes are accepted).","write_action":false,"price_micros":0,"input_schema":null},{"name":"relay-discover","description":"Discover relays used by your contacts. Fetches kind 10002 (NIP-65) relay lists from your follow list,","write_action":false,"price_micros":0,"input_schema":null},{"name":"relay-diversity","description":"Analyse your relay set for centralisation risk. Checks unique operators, software diversity,","write_action":false,"price_micros":0,"input_schema":null},{"name":"relay-info","description":"Fetch the NIP-11 relay information document for a relay URL.","write_action":false,"price_micros":0,"input_schema":null},{"name":"relay-list","description":"List the relay set (read/write) for the active identity. Optionally check for shared relays with another identity.","write_action":false,"price_micros":0,"input_schema":null},{"name":"relay-nip-search","description":"Find relays that support specific NIPs. Queries NIP-11 info documents and filters to relays","write_action":false,"price_micros":0,"input_schema":null},{"name":"relay-query","description":"Query events from Nostr relays by kind, author, ids, tags, or time range. Useful for discovering events, scanning for specific kinds, or investigating unknown event schemas. Uses explicit relays if provided, otherwise the active identity's read relays. Filter fields may be supplied either as top-level arguments or wrapped in a single \"filter\" object (both shapes are accepted).","write_action":false,"price_micros":0,"input_schema":null},{"name":"relay-recommend","description":"Recommend relays for your use case. Uses contact relay discovery, NIP-11 metadata, and health checks","write_action":false,"price_micros":0,"input_schema":null},{"name":"relay-set","description":"Publish a kind 10002 relay list for the active identity. Warns if a relay list already exists.","write_action":true,"price_micros":0,"input_schema":null},{"name":"safety-activate","description":"Switch to an alternative identity configuration.","write_action":false,"price_micros":0,"input_schema":null},{"name":"safety-configure","description":"Configure an alternative identity persona and pre-warm relay connections.","write_action":false,"price_micros":0,"input_schema":null},{"name":"search-actions","description":"Search … additional actions by describing what you want to do.","write_action":false,"price_micros":0,"input_schema":null},{"name":"whoami","description":"Returns the active identity's npub. The simplest way to check which identity is currently in use.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":82,"grade":"B","scanned_at":"2026-09-27T23:15:33.459Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-27T23:15:33.358Z","components":{"code":{"score":25,"max":25,"notes":["187 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":15,"max":15,"notes":["last push 3 days ago"]},"identity":{"score":7,"max":10,"notes":["registry namespace matches repository owner"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"nostr-bray","version":"1.27.7","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":16,"publishedAt":"2026-04-07T21:39:39.250Z","repositoryUrl":"git+https://github.com/forgesworn/bray.git","weeklyDownloads":693}],"repo":{"found":true,"owner":"forgesworn","repo":"bray","archived":false,"pushedAt":"2026-09-24T19:13:44Z","stars":1,"forks":1,"openIssues":3,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/269157051?v=4","ownerCreatedAt":"2026-03-18T09:46:34Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/269157051?v=4&s=128","source":"github"},"presence":{"stars":1,"forks":1,"downloadsWeek":693,"license":"MIT","lastPushAt":"2026-09-24T19:13:44.000Z","score":32}}}},"grade_history":[],"reviews":[]}