nostrclaw
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@nostrclawAudit wss://relay.hivescope.xyz — is it healthy and what's its traffic?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
nostrclaw
Leer en español: README.es.md
An MCP server that lets Claude analyse a Nostr relay: is it healthy, what does it advertise, what is going through it, and which keys look suspicious or automated, who vouches for them, and who is interacting with a note. By default it is read-only. Optionally (off until you enable it) Claude can also draft and publish notes, replies and reactions, and delete your own events through a remote signer (NIP-46: Clave, nsec.app, a bunker) — your private key never reaches this program and every publication needs your explicit confirmation. See Publishing and docs/signing-design.md.
Written in TypeScript on the official MCP SDK and nostr-tools. It runs locally over stdio (Claude Code, Claude Desktop) and talks to the relays you allow, nothing else.
0.14.0: the trust score's level now comes from the trusted keys' network only (a trusted key or 3+ keys they follow follow it → established; one → some; none → unknown), and being muted by that network takes points and lowers it. Measured on real accounts: the old rule rated 13 of 15 spam accounts "some", the new one none. Same rule as Quill.
Quick start
git clone https://github.com/rzazo24/nostrclaw && cd nostrclaw
npm install && npm run build
# Claude Code
claude mcp add nostrclaw -e NOSTRCLAW_RELAYS=wss://relay.hivescope.xyz -- node "$PWD/dist/index.js"Claude Desktop (claude_desktop_config.json):
{ "mcpServers": { "nostrclaw": {
"command": "node", "args": ["/absolute/path/to/nostrclaw/dist/index.js"],
"env": { "NOSTRCLAW_RELAYS": "wss://relay.hivescope.xyz" }
} } }Then ask Claude things like “Audit my relay”, “What is the traffic of the last 24 hours made of?” or “Look at this key: npub1…”. The audit_relay prompt walks through a full review.
Related MCP server: Nostr Tools for AI Agents
Tools
Tool | What it does |
| How the server is configured (allowed relays, limits) and that it is read-only |
| Reachability and latency (HTTP and WebSocket), NIP-11 document (NIPs, limits, policies) and, if the relay publishes them, its public statistics |
| Newest events, filterable by kind, author and age; content cleaned and truncated; signatures verified |
| NIP-45 |
| Analysis of a sample: counts by kind, events per hour, top authors, the same text from several keys, bursts from one key, share of single-event authors, and a short list of signals |
| One key: profile (kind 0), follows, relay list, activity on this relay |
| Lists the authors of a window whose behaviour looks like spam (text shared with other keys — near-copies included —, bursts, link-only posting), each point with a stated reason. Short greetings ("Azul", "gm") don't count as copying, and "high" needs two behaviour signals. Missing profile/follows/relay list on this relay adds to the score but never flags a key on its own; keys with no behaviour signal are only counted. A triage aid, not a verdict |
| One event: replies (classic kind 1, and NIP-22 comments kind 1111 counted apart), reactions, reposts and zaps (with their sats and, when the signed zap request checks out, who sent them), counted from the events that reference it (up to 500; NIP-45 COUNT with tag filters answers a silent 0 on khatru+sqlite, so it is not used), reaction breakdown and distinct reactors |
| Several configured relays side by side: NIP-11 (software, NIPs, limits), latency, events per hour, kinds held, and propagation: the recent events of a reference relay (yours by default) are looked up by id on every other relay, so you see what share reached each one. Busy public relays only return their newest events, so samples are never compared directly. A relay that fails is reported and the rest still compared; an empty answer comes with the reason the relay gave |
| For one note: who replied, reacted or reposted, and a verdict per person: |
| Web-of-trust score for keys from the follow lists the relays hold: followers, followers that are themselves followed, closeness to keys you trust ( |
| For up to 20 event ids, which configured relays hold each (kind and age only, no content) |
recent_events, count_events, activity_report and author_report also take relays (2 to 8 configured relays) to ask all of them at once: answers are merged without duplicates, recent_events shows which relays hold each event, count_events gives one count per relay (not added up), and every result includes perRelay (what each returned, whether it was cut at the limit, its oldest/newest event). A relay that fails is reported and the rest still answer. With one relay the output is as before.
The two comparison tools need at least two relays in NOSTRCLAW_RELAYS (comma-separated).
recent_events, count_events and activity_report also accept a tags filter ({"e": [id]}, {"p": [pubkey]}, {"t": ["bitcoin"]}).
Publishing (optional, NIP-46)
Off by default. Enable it with NOSTRCLAW_ENABLE_SIGNING=1 and nine more tools appear:
Tool | What it does |
| Resumes the saved session, or returns a |
| Connection state, which npub it signs as, the policy in force, signatures made and requested in the last hour |
| Closes the session and deletes the saved app key |
| Prepares an unsigned event and checks it against your policy. Publishes nothing |
| Fetches an event and drafts a reaction (NIP-25) with the |
| Fetches a note and drafts a reply with the NIP-10 thread tags ( |
| Drafts a NIP-09 deletion request for up to 5 of your own events. It fetches each one and refuses any that your key did not sign (so it cannot touch other people's events). Off by default: add |
| Drafts a replacement of one of your relay lists: kind |
| Takes a draft id, first checks the signer is awake (a quick |
| Re-sends an event nostrclaw itself signed (kept 15 minutes) to the relays that did not accept it, with no new signature; at most 3 retries; it cannot send anything else |
Pairing through a bunker:// address (recommended for Clave)
A nostrconnect:// link works, but on iPhone Clave only answers signature requests while it is open on screen. Paired through a bunker:// address, Clave can be woken in the background by its push service. Copy the address from your signer, then run this in your own terminal (not through the assistant: the address carries a secret):
node dist/index.js connect-bunker --claude nostrclaw-sign # asks for the address without showing itIt never prints the address or its secret, pairs with a new app key, and replaces the saved session only when the signer answers (the previous one is copied to signer.json.bak-before-bunker). Then restart Claude Code and call signer_connect: it resumes the saved session. The trust level you give it in the signer is your decision and does not change (keep it low: see the safety model).
How it stays under your control:
Your key never leaves your signer. nostrclaw holds only an app key that identifies it to the signer, saved with mode
0600.A human decides, through a channel the model cannot write to. If your client supports it,
publish_eventasks you (MCP elicitation) showing the exact event, who signs it and where it goes; without an explicit yes nothing is signed. Your signer then asks for its own approval.Clave in the background: paired through a
bunker://address (see above), Clave answered with the app in the background even at low trust: the connection resumed on its own and a signature request arrived to be approved (measured 2026-10-09, running Claude Code from Termius on the same iPhone as Clave, the setup that failed withnostrconnect://: one reaction, signed in about 6 s, published to 6 relays). Paired through anostrconnect://link, with manual approval (low trust) Clave shows a blank notification and waits for you; tap it and approve, and for signing keep it open on screen. nostrclaw keeps asking for about two and a half minutes while you do.Use manual approval in the signer (Clave: low trust). If the signer approves by itself, anything that can read the app key saved on your machine — including an assistant with a shell — could ask it for signatures with no prompt; nostrclaw warns when it sees that.
“Always allow” is detected. Without elicitation, the signer's approval is the lock — so it is verified: a signature that comes back faster than a person could decide (default 2 s) is discarded and never published, and further publishing is refused until you fix the signer and reconnect.
Policy you own (
~/.config/nostrclaw/policy.json, no tool can write it): allowed kinds (default notes1and reactions7only; add5to let you delete your own events), signatures per hour (default 5; counts signatures actually made), maximum length, relays, and blocked patterns (anything that looks like annsec1…,bunker://,secret=…). An invalid file stops the server.The model cannot alter or replay anything:
publish_eventtakes only a draft id; the signed event is checked against the draft and goes only to the relays, never back into the conversation.Audit log (
~/.local/state/nostrclaw/audit.jsonl): every step with ids and hashes, never content or secrets.
Quick start with Clave on the iPhone:
claude mcp add nostrclaw -e NOSTRCLAW_ENABLE_SIGNING=1 -e NOSTRCLAW_RELAYS=wss://relay.hivescope.xyz -- node "$PWD/dist/index.js"Then ask Claude to “connect my signer”, open the link it gives you in Clave and approve (do not choose “always allow”), and ask it to “draft a note saying …”. The connection link lists wss://relay.powr.build as well as your relay, because Clave only receives background requests through that one.
Recommended instead for Clave on iPhone: pair once with a bunker:// address (section above) and skip this link.
Your own bunker instead of Clave (optional)
connect-bunker accepts the bunker:// address of any NIP-46 signer, including one you run on your own server (the author uses hivescope-bunker: key encrypted on disk, unlocked by hand after each restart, one connection per app with its own list of kinds and an hourly limit). The pairing is the same: run connect-bunker in your own terminal and paste the address.
Two things change, and you should decide them knowingly:
Your key lives (encrypted) on that server, not in your phone's keychain. Anyone with root on the machine while the bunker is unlocked can sign within the connection's limits.
That signer approves by policy, not by a person, so its signatures come back in a fraction of a second. nostrclaw discards a signature that arrives faster than
minHumanApprovalMs(default 2000), because that usually means "approve always" on a signer that was supposed to ask. With a bunker of your own that is expected, so set"minHumanApprovalMs": 0inpolicy.json(a file only you can edit). What still stands:publish_eventasks you before every signature, through a channel the model cannot write, and the bunker's own connection allows only the kinds and the rate you gave it.
Safety model
An assistant reading a public network is exposed to text written by strangers, so the design assumes everything from the network is hostile:
Read-only by default. The analysis tools publish, sign, delete or change nothing and declare
readOnlyHint. Writing exists only behindNOSTRCLAW_ENABLE_SIGNING=1and the rules above.Untrusted text is fenced. Event content, profile fields and the relay's own description are returned only under an
untrustedkey, with a note telling the model to treat it as data and never follow instructions found in it. Signals and statistics never contain third-party text.Hidden characters are removed from everything third-party (zero-width, bidirectional overrides, control and Unicode “tag” characters) and long text is truncated.
Relay allowlist. Tools only talk to the relays in
NOSTRCLAW_RELAYS, so a prompt cannot make this process connect elsewhere. Local and private addresses are refused unlessNOSTRCLAW_ALLOW_PRIVATE=1, HTTP redirects are not followed and responses are size-limited.Signatures are verified; events with a bad signature are dropped and counted.
Bounded output: limits on events per call, sample sizes and timeouts.
Configuration
Variable | Default | Meaning |
|
| Comma-separated relays the tools may use; the first is the default |
| off |
|
|
| Per-request timeout (500–60000) |
|
| Most events any single call may fetch (1–2000) |
| off |
|
|
| Relays used to talk to the signer |
|
|
|
|
|
|
Troubleshooting: nostrclaw doctor
If something does not work, run the doctor. It is read-only (it never signs, publishes or writes) and it never prints secrets:
node dist/index.js doctor --claude nostrclaw-sign # the settings Claude Code really launches, read from ~/.claude.json
node dist/index.js doctor --claude nostrclaw-sign --check-signer # also resume the session and ping Clave (open it on screen first)
node dist/index.js doctor --json # machine-readable; exit code 1 when there is a problemIt checks the Node version, the configuration, each relay (allowed address, NIP-11, a real query, authentication or payment limits), policy.json, the saved
signer session (permissions, damage, whether it uses relay.powr.build), the audit log, and — with --check-signer — that the signer answers. Every finding says
what is wrong and how to fix it. Without --claude it reads NOSTRCLAW_* from the shell's environment.
Development
npm test # builds, then unit tests (safety, analysis, tools with a pretend network)
RELAY_BIN=/path/to/nostr-relay-khatru npm test # …plus end-to-end tests against a real relay and over real stdioThe signing tests run a pretend NIP-46 signer (test/fake-signer.ts) through the real relay. Without RELAY_BIN the end-to-end tests are skipped (a sibling checkout of nostr-relay-khatru is picked up automatically). CI builds that relay and runs everything.
File | What it does |
| The tools and the |
| The analysis: pure functions over events (no network) |
| Repeated-text clustering (near-copies included) and burst detection |
|
|
|
|
|
|
|
|
| Tags of reactions (NIP-25), replies (NIP-10), hashtags and mentions |
|
|
| Relay allowlist, private-address guard, cleaning of third-party text |
| Minimal read-only Nostr client (REQ, COUNT, NIP-11, |
| Publishing: |
| Configuration and the stdio entry point |
Roadmap
0.1: read-only analysis.
0.2: NIP-46 signing, opt-in — connect to a remote signer, draft events, publish only after explicit human confirmation. Design and threat model in docs/signing-design.md.
0.3 – 0.9 (now):
account_triage,event_engagement,trust_score(web of trust),compare_relaysandevent_locations(propagation between relays),review_interactions(bots),draft_reaction/draft_reply, a quick signer check before asking you,retry_publish,nostrclaw doctor, and analysis across several relays at once.0.10: deleting your own events (NIP-09), opt-in.
Ideas, not started: publishing the package on npm.
License
MIT
Available Tools
12 toolsaccount_triageAccount triageARead-onlyIdempotent
Lists the authors seen in a recent window whose BEHAVIOUR looks like spam or abuse (the same text posted by other keys — near-copies included —, bursts, link-only posting), highest score first, with the reason for every point; missing profile / follow list / relay list on this relay adds to the score but never flags an author on its own. Authors with no behaviour signal are only counted ("quiet"). Established signs lower the score. It looks up the profile, follow list and relay list of the most suspicious candidates. A triage aid, not a verdict: absence of data on this relay does not mean the account is new elsewhere.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | How many authors to list, highest score first. | |
| hours | No | Time window in hours (default 24). | |
| kinds | No | Only these event kinds (e.g. [1] for notes, [7] reactions). | |
| relay | No | Relay URL (wss://…). It must be one of the configured relays; default: the first one. See nostrclaw_status. | |
| sampleLimit | No | Most events to analyse. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), yet the description adds substantial behavioural context: the scoring inputs (near-copies, bursts, link-only posting), that missing profile/follow/relay lists add but never flag alone, that quiet authors are only counted, that established signs lower the score, and that it performs extra lookups on top candidates. These are meaningful operational traits an agent cannot infer from the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded and the dense parentheticals all carry scoring-relevant information rather than filler. It is somewhat run-on and could be broken into shorter sentences, but no sentence is expendable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a heuristic scoring tool with five fully documented parameters and no output schema, the description covers the mechanism, the interpretation caveats, and the lookups it triggers. It stops short of describing the returned structure (e.g. what fields accompany each author's score/reason), which would help since no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters (top, hours, kinds, relay, sampleLimit) are already documented with ranges and defaults. The description adds only a soft hint about the 'recent window' corresponding to the time filter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it lists authors in a recent window whose behaviour looks like spam or abuse, with scored reasons. The scope (behavioural signals, highest score first) is unambiguous. It does not, however, distinguish itself from plausible siblings such as author_report or trust_score, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through 'A triage aid, not a verdict' and the note that missing data alone never flags an author, which frames how to read the output. There is no explicit when-to-use versus when-not, and no alternative sibling (author_report, trust_score) is named for the adjacent questions an agent might have.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
activity_reportActivity reportARead-onlyIdempotent
Analyses a sample of recent events: counts by kind, events per hour, most active authors, repeated text across keys, bursts from one key, share of authors with a single event, and a list of notable signals (possible spam or throw-away keys). The sample is the newest events in the window, up to sampleLimit.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Filter by single-letter tags, e.g. {"e": ["<event id>"]} for events that reference an event, {"p": ["<pubkey>"]} for mentions, {"t": ["bitcoin"]} for hashtags. e and p take 64-hex values. | |
| hours | No | Time window in hours (default 24). | |
| kinds | No | Only these event kinds (e.g. [1] for notes, [7] reactions). | |
| relay | No | Relay URL (wss://…). It must be one of the configured relays; default: the first one. See nostrclaw_status. | |
| relays | No | Several relays (each must be configured): the same question goes to all of them and the answers are merged without duplicates; the result says what each relay returned. Overrides `relay`. | |
| sampleLimit | No | Most events to analyse per relay (a relay may return fewer). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open world). The description adds genuinely non-obvious behavior: results are computed over a sample of the newest events, capped at sampleLimit, so counts are approximate rather than exhaustive, and it flags heuristic outputs like possible spam or throw-away keys. It does not note sampling error magnitude or the merge semantics across multiple relays.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with the verb first and the sampling caveat last; nothing is wasted. It is dense and would read better as a short list, but every clause carries real information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and six all-optional parameters, the description largely compensates by enumerating exactly what the report contains. Remaining gaps are minor: it does not explain how the multi-relay merge or default-relay selection affects the report, though the schema covers those mechanics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (tags, hours, kinds, relay, relays, sampleLimit) is already documented in the schema. The description only echoes sampleLimit and the time window, adding no syntax or format detail beyond the schema, which matches the baseline for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Analyses a sample of recent events') and enumerates seven concrete output metrics, which lets an agent place it as the aggregate-analytics tool rather than a raw lister. It does not name or contrast with the nearest sibling (author_report, count_events), so overlap on 'most active authors' has to be inferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the metric list tells the agent this is for a broad activity overview rather than a targeted query, but there is no explicit when-to-use, no when-not-to-use, and no pointer to alternatives like author_report or count_events.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
author_reportAuthor reportARead-onlyIdempotent
Looks at one public key: its profile (kind 0), follow count, relay list, and its recent events on this relay with the same analysis as activity_report. "first/last" are the oldest/newest events this relay returned, not the age of the account.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many recent events to analyse (per relay when several are given). | |
| relay | No | Relay URL (wss://…). It must be one of the configured relays; default: the first one. See nostrclaw_status. | |
| pubkey | Yes | The author, as 64-character hex or an npub. | |
| relays | No | Several relays (each must be configured): the same question goes to all of them and the answers are merged without duplicates; the result says what each relay returned. Overrides `relay`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered; the description adds real behavioral context beyond that by scoping the result to 'this relay' and by explicitly warning that 'first/last' mean the oldest/newest events the relay returned, not account age. It stops short of describing merge behavior when several relays are supplied, which the schema hints at.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with what the report contains, followed by the single most confusable return-value caveat. The escaped-quote clause is slightly awkward to read but it carries unique information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return-value burden, and it does name the report's major sections (profile, follow count, relay list, recent events) plus one interpretive caveat. Missing pieces such as pagination or the multi-relay merge output shape are minor for a read-only report tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the limit/relay/relays/pubkey semantics are already fully documented, including the relay-override rule and merge behavior. The description adds only indirect cues ('on this relay', the 'first/last' caveat) and says nothing about limit or the multi-relay merge, so the baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific act ('looks at one public key') and enumerates exactly what the report contains: kind-0 profile, follow count, relay list, and recent events. It is clearly per-author rather than relay-wide, so the agent can place it against relay_overview or recent_events, though the link to activity_report is framed as similarity ('same analysis as') rather than as a distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance. The only routing hint is the passing reference to activity_report and the phrase 'on this relay', which implies scope but does not tell the agent which of the twelve siblings to pick for a given question.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_relaysCompare relaysARead-onlyIdempotent
Compares several configured relays side by side: what each says about itself (NIP-11: software, supported NIPs, limits), how fast it answers, how busy it is (events per hour) and what kinds it holds, and — the useful part — PROPAGATION: it takes the recent events of one reference relay (default: the first configured, normally yours) and asks every other relay for those exact ids, so you see what share of them reached each one. Busy public relays return only their newest events, so samples are never compared directly. A relay that fails is reported and the others still compared; "0 events" comes with the reason the relay gave when it has one.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | Window in hours to sample (default 24). | |
| relays | No | Relays to compare (wss://…), at least 2. Each must be one of the configured relays; default: all of them. See nostrclaw_status. | |
| reference | No | The relay whose recent events are looked for on the others (must be one of the compared relays). Default: the first. | |
| sampleLimit | No | Most events to fetch per relay; the reference relay contributes at most 200 of them to the propagation check. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds genuinely non-obvious behavior: busy relays return only newest events so samples aren't compared directly, failing relays are reported while others still compare, and '0 events' comes with the relay's stated reason. This is strong context beyond the annotations, though return shape details are not given.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core comparison and the propagation value proposition, then supporting caveats. It is one dense paragraph and the em-dash aside is slightly rambling but every clause carries useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and read-only annotations already covering safety, the description still explains what the agent will learn (share of events that reached each relay), how failures and zero counts are handled, and sampling caveats. Nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so baseline is 3, but the description adds meaning: the reference relay's events are what get looked for on the others, defaulting to the first configured relay, and the reference contributes at most 200 events to the propagation check. This clarifies the sampleLimit interaction beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (compares) and resource (configured relays) and enumerates the dimensions compared: NIP-11 info, latency, activity, kinds, and propagation. This is clearly differentiated from siblings like relay_overview because it emphasizes the side-by-side propagation check across multiple relays.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Describes the mechanics and defaults (first configured relay as reference) but never explicitly says when to pick this over relay_overview or nostrclaw_status, nor when not to use it. Usage is implied by the propagation emphasis rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
count_eventsCount eventsARead-onlyIdempotent
Counts the events matching a filter using NIP-45 COUNT, without downloading them. Reports clearly when the relay does not support COUNT.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Filter by single-letter tags, e.g. {"e": ["<event id>"]} for events that reference an event, {"p": ["<pubkey>"]} for mentions, {"t": ["bitcoin"]} for hashtags. e and p take 64-hex values. | |
| kinds | No | Only these event kinds (e.g. [1] for notes, [7] reactions). | |
| relay | No | Relay URL (wss://…). It must be one of the configured relays; default: the first one. See nostrclaw_status. | |
| relays | No | Several relays (each must be configured): the same question goes to all of them and the answers are merged without duplicates; the result says what each relay returned. Overrides `relay`. | |
| authors | No | ||
| sinceHours | No | Only events newer than this many hours. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so safety is covered; the description adds real behavioral context beyond them — the NIP-45 mechanism and explicit fallback messaging when a relay lacks COUNT support, which the agent would otherwise have to discover at runtime.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the core action front-loaded and the protocol/fallback caveat immediately after. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With strong annotations and a well-documented 6-parameter schema, the description supplies the missing pieces an agent needs: the counting mechanism and the unsupported-relay behavior. The only minor gap is not hinting at the shape of the returned count/merged-relay result, which is largely self-evident for a count tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 83%, so most parameters (tags, kinds, relay/relays, sinceHours) already carry their own documentation with examples; authors is the only one left bare. The description adds no filter syntax or constraint detail beyond what the schema states, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (counts) + resource (events matching a filter) with a distinguishing trait: it uses NIP-45 COUNT and does not download events, which separates it from fetch-oriented siblings like recent_events or relay_overview. It never names a sibling explicitly, so differentiation is inferable rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'without downloading them' implies when to prefer this over retrieval tools, but no alternative tool is named and no when-not condition or prerequisite (e.g. needing a configured relay) is spelled out in the description. Usage is implied rather than instructed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
event_engagementEvent engagementARead-onlyIdempotent
For one event: the event itself and how much happened around it on this relay — replies, reactions, reposts and zaps (counted from the events that reference it, up to 500), with a breakdown of what the reactions are and how many different people reacted.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The event id: 64-character hex, or a note1… / nevent1… string. | |
| relay | No | Relay URL (wss://…). It must be one of the configured relays; default: the first one. See nostrclaw_status. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, non-destructive, so the safety profile is covered. The description adds substantive behavior beyond that: the count is derived from referencing events, capped at 500, and broken down by reaction type and distinct reactors — meaningful semantics an agent cannot get from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with the core resource front-loaded and no filler. It is slightly overloaded with the enumeration plus the breakdown clause, but every element carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must convey the return shape — and it does: counts of four interaction types, a reaction breakdown, and distinct-reactor counts, with the 500-event cap. Remaining gaps (pagination, behavior when the relay doesn't hold the event) are minor for a read-only lookup tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with only 2 parameters, and the schema already documents the id format and the relay URL/default constraint. The description adds no parameter-level detail (e.g., what happens if the id is malformed or the relay lacks the event), so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (one event) and enumerates exactly what is computed: replies, reactions, reposts, zaps plus reaction breakdown and distinct reactor count. It is clearly distinct from generic siblings like recent_events or count_events, though it never explicitly names an alternative to differentiate against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"For one event" implies the usage context (single-event lookup vs. aggregate/list tools), but there is no explicit when-to-use guidance, no when-not, and no pointer to a sibling for broader queries. Usage is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
event_locationsEvent locationsARead-onlyIdempotent
For up to 20 event ids: which of the configured relays hold each one. Shows the kind and age only, not the content. Useful to check whether a note spread to other relays, or whether a relay dropped something.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | Event ids: 64-character hex, or note1… / nevent1… strings. | |
| relays | No | Relays to compare (wss://…), at least 2. Each must be one of the configured relays; default: all of them. See nostrclaw_status. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive). The description adds real behavioral context beyond them: the 20-id cap and, importantly, that only kind and age are returned, not content — valuable given there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core operation, then the return scope, then the use case. Nothing is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of conveying return shape and does so at a high level (per-relay presence, kind, age). It omits output formatting details and behavior when fewer than two configured relays exist, which is a minor gap for a read-only lookup tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters (ids, relays) are fully documented in the schema, including hex/note1 formats, the max of 20, wss:// relays, minimum of 2, and the default. The description largely restates the 20-id limit and 'configured relays' constraint rather than adding syntax the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: for up to 20 event ids, report which configured relays hold each one. The output content ('kind and age only, not the content') makes the purpose unmistakable and separates it from relay_overview and compare_relays.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the two concrete decision contexts: checking whether a note spread to other relays, and whether a relay dropped something. However, it names no explicit alternative or exclusion (e.g., when to use compare_relays or relay_overview instead).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nostrclaw_statusnostrclaw statusARead-onlyIdempotent
Shows how this server is configured: which relays it may talk to, its limits, and that it is read-only (signing is not enabled).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuine value beyond those booleans by disclosing that signing is not enabled, which tells the agent what operations are impossible on this server, plus that the output covers allowed relays and limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with what the tool reports, then the three content categories. Every clause earns its place and nothing is padded or repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameters, the description carries the burden of telling the agent what comes back, and it does enumerate the returned content (relays, limits, read-only status). It stops short of describing the shape or format of the response, which is a minor gap for a diagnostic tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, which is the baseline-4 case; there is nothing for the description to disambiguate and no misleading parameter language. No further param detail is needed or possible.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Shows') and resource ('how this server is configured') and enumerates the concrete content: relays it may talk to, its limits, and read-only status. This is clearly distinguishable from data-oriented siblings like relay_overview or recent_events, though it never names or contrasts with any sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: an agent can infer this is for inspecting/verifying server configuration and capabilities, but there is no explicit when-to-use, when-not-to-use, or named alternative. With eleven sibling tools and no routing guidance, an agent must reason about fit on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recent_eventsRecent eventsARead-onlyIdempotent
Fetches recent events from a relay, newest first, optionally filtered by kind, author and age. Content is cleaned (hidden characters removed) and truncated. Signatures are verified; events with a bad signature are dropped and counted.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Filter by single-letter tags, e.g. {"e": ["<event id>"]} for events that reference an event, {"p": ["<pubkey>"]} for mentions, {"t": ["bitcoin"]} for hashtags. e and p take 64-hex values. | |
| kinds | No | Only these event kinds (e.g. [1] for notes, [7] reactions). | |
| limit | No | How many events (1-100). | |
| relay | No | Relay URL (wss://…). It must be one of the configured relays; default: the first one. See nostrclaw_status. | |
| relays | No | Several relays (each must be configured): the same question goes to all of them and the answers are merged without duplicates; the result says what each relay returned. Overrides `relay`. | |
| authors | No | Only these authors (64-hex public keys). | |
| sinceHours | No | Only events newer than this many hours. | |
| maxContentChars | No | Truncate each content to this many characters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive/openWorld, so the safety profile is done. The description adds genuinely non-obvious behavior: content is cleaned of hidden characters and truncated, signatures are verified, and bad-signature events are silently dropped but counted. That post-processing disclosure is valuable context beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with purpose, then filters, then processing caveats. No filler or repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter read tool with no output schema and annotations already covering safety, the description covers purpose, ordering, filtering and the cleaning/verification pipeline. It could say more about how dropped events are reported or how multi-relay results are surfaced, but nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents tags, kinds, limit, relay/relays, authors, sinceHours and maxContentChars in detail. The description only restates a subset (kind, author, age) and adds the ordering fact; it contributes little parameter meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('fetches recent events from a relay'), plus ordering ('newest first') and the filter axes (kind, author, age). It is clearly distinguishable from count_events or relay_overview by implication, but it never names a sibling to sharpen the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'optionally filtered by kind, author and age' implies the intended use case, but there is no explicit when-to-use versus alternatives such as count_events (counting) or compare_relays (relay comparison), and no exclusions. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
relay_overviewRelay overviewARead-onlyIdempotent
First look at a relay: reachability and latency (HTTP and WebSocket), its NIP-11 information document (name, supported NIPs, limits, policies) and, when the relay publishes them, its public statistics (events stored, authors, connections, last-24h activity).
| Name | Required | Description | Default |
|---|---|---|---|
| relay | No | Relay URL (wss://…). It must be one of the configured relays; default: the first one. See nostrclaw_status. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered. The description adds real behavioral context beyond them: that statistics are only present 'when the relay publishes them', so the agent knows that section can legitimately be absent rather than a failure. It does not discuss latency thresholds or error shapes, keeping it at a 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence that leads with the framing ('First look at a relay') and then lists outputs in priority order. The parenthetical enumerations are dense but each item is informative; only the nested parentheses make it slightly heavy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and discharges it well by listing the three result groups and flagging that stats are conditional. For a single-optional-parameter read tool this is nearly complete; only error/timeout behavior is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter already documents the wss:// URL format, the configured-relay constraint, the default, and a pointer to nostrclaw_status. The description adds nothing about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (a relay) and enumerates exactly what the tool returns: reachability/latency over HTTP and WebSocket, the NIP-11 document, and public statistics. That is far more than a restated title. It stops short of naming a sibling, though the singular 'a relay' implicitly contrasts with multi-relay tools like compare_relays.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'First look at a relay' implies this is the entry-point/diagnostic call before deeper tools, which is genuine usage context. However, no alternative is named and no when-not condition is given, so the routing guidance remains implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_interactionsReview who interacts with a noteARead-onlyIdempotent
For one note: who replied to it, reacted to it or reposted it on the configured relays, and for each distinct person a verdict — promotional-bot, automated, suspicious, unknown or established — that combines what the key DOES (above all what it says to OTHER people: the same text or links in its answers to strangers; also the same text again and again, links in most notes, bursts) with its web-of-trust score. Behaviour outweighs trust: a spam bot can be followed by other bots and still look "somewhat trusted". "automated" is a bot that publishes in bulk or periodically but does not push the same advert at strangers; "promotional-bot" does. Replies are examined first. A triage aid, not a verdict; give your own key in trusted for a much better signal.
| Name | Required | Description | Default |
|---|---|---|---|
| relays | No | Relays to read from; each must be configured. Default: all configured. | |
| eventId | Yes | The note: 64-character hex, or note1… / nevent1…. | |
| trusted | No | Keys you trust (hex or npub), e.g. your own. | |
| maxAuthors | No | Most distinct people to examine (replies first). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open world), but the description adds substantial non-obvious behavior: how the verdict is derived (what the key does to others, repeated text, link density, bursts, web-of-trust), the explicit rule that behaviour outweighs trust, and the distinction between 'automated' and 'promotional-bot.'
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, but the remainder is a dense wall of text with nested quotes and semicolon-chained category definitions that is hard to parse. The information is relevant, yet the structure could be broken into clearer clauses without losing content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does explain what the tool returns (per-distinct-person verdicts) and how they are computed, which is the key burden. It stops short of describing the result shape or ordering, but the essential semantics are present for a 4-parameter triage tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning for `trusted` ('give your own key... for a much better signal') and reinforces that `maxAuthors` prioritizes replies ('replies first'). It does not add format or syntax detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('who replied to it, reacted to it or reposted it' for 'one note') and scopes the output (a per-person verdict). This is clearly distinguishable from sibling tools like author_report, account_triage, and event_engagement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context: it is 'a triage aid, not a verdict,' replies are examined first, and supplying your own key in `trusted` yields 'a much better signal.' It does not, however, name when to prefer it over siblings such as account_triage or event_engagement, so no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trust_scoreTrust score for keysARead-onlyIdempotent
Scores how much the network vouches for keys, using what the configured relays hold about who follows whom: how many keys follow it, how many of those followers are themselves followed (established), how close it is to keys YOU trust (pass them as trusted: a trusted key following it counts most), how many different keys interacted with it, and how long it has been seen. Give pubkeys, or leave them out to examine the NEW keys of a recent window (keys not seen on any relay before it). A web-of-trust aid, not a verdict or an identity check: keys can follow each other in rings, and "unknown" means nothing vouches for it here, not that it is bad.
| Name | Required | Description | Default |
|---|---|---|---|
| relays | No | Relays to read from; each must be configured. Default: all configured. The first one is where new keys are looked for. | |
| pubkeys | No | Keys to score (hex or npub). Omit to take the new keys of the last `recentHours` seen on the FIRST relay and not seen before on any of the relays. | |
| trusted | No | Keys you trust (hex or npub), e.g. your own. Without them the "close to a trusted key" points are not available. | |
| recentHours | No | When no pubkeys are given: the window in which a key must have appeared for the first time (default 48). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/openWorldHint, so the safety profile is covered. The description adds real context beyond that: the caveat that rings can form, that 'unknown' means nothing vouches for it here rather than 'bad', and that it is an aid not a verdict. It stops short of describing return shape or latency/cost of querying many relays.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose before the scoring breakdown and caveats. The long middle sentence listing the five signals is dense but every clause earns its place; nothing is redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with no output schema, the description explains inputs, defaults, and the semantics of an 'unknown' result. It does not describe the return format or score range, which is the main remaining gap given there is no output schema to fall back on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by explaining the scoring weight of `trusted` ('a trusted key following it counts most') and reinforcing the omit-`pubkeys` behavior, adding interpretation the schema alone does not provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Scores how much the network vouches for keys') and then enumerates the exact signals used, so the agent knows precisely what the tool computes. It is clearly distinct from siblings like account_triage or author_report.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly covers the two invocation modes: pass `pubkeys` to score given keys, or omit them to examine the NEW keys of a recent window, and explains the role of `trusted`. It gives clear operating context but never names an alternative sibling tool for adjacent questions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
12 tool updates
v0.14.0- First observed
account_triage - First observed
activity_report - First observed
author_report - First observed
compare_relays - First observed
count_events - First observed
event_engagement - First observed
event_locations - First observed
nostrclaw_status - First observed
recent_events - First observed
relay_overview - First observed
review_interactions - First observed
trust_score
TDQS
Scored across 12 tools
Most tools have clearly distinct scopes: relay configuration/metadata, event fetching/counting, aggregate reports, single-entity analysis, and multi-relay comparison. Potential confusion remains between event_engagement and review_interactions, which both inspect interactions around one event/note, and between account_triage and trust_score, which both score keys from different evidence, but their descriptions differentiate them well.
All tool names use lower snake_case, which is consistent and readable. However the pattern mixes noun-first names such as activity_report and trust_score with verb-first names such as count_events and compare_relays, and nostrclaw_status carries a server prefix, so it is not a strict verb_noun convention.
12 tools is well within the ideal 3-15 range for a multi-purpose relay analysis server. Each tool appears to serve a distinct investigative function, including status, relay metadata, event retrieval/counting, aggregate reports, single-author/event/relay analysis, and trust/triage.
The surface covers the apparent read-only Nostr investigation domain comprehensively: configuration, relay metadata, event retrieval/counting, activity/author reports, triage, engagement, relay comparison, trust scoring, interaction review, and event location checks. Minor gaps include no dedicated single-event content retrieval by id and no standalone profile lookup beyond author_report.
Maintenance
Related MCP Connectors
Approve Nostr signatures with your own browser signer without exposing a private key.
Agent registry with Nostr identity, reputation, escrow, observability, and Lightning payments.
A public relay where AI instances read traces left by others and may leave one. No auth.
Browse and inspect sites in your own Kitsuvo browser through an opt-in authenticated relay.
Related MCP Servers
- AlicenseBqualityDmaintenanceA Model Context Protocol server that enables LLMs like Claude to interact with the Nostr social network, allowing for fetching user profiles, text notes, and zap payment information.1810 npm38MIT
- AlicenseCqualityCmaintenance23 tools for AI agents working with Nostr Open source. No API key. No account. NIP-46 remote signing Publish notes, reply, react, repost Encrypted DMs (NIP-04 + NIP-44) Fetch events, profiles, social graph2310 npm1MIT
- AlicenseNot gradedqualityAmaintenanceTrust-aware Nostr MCP server. 236 tools for identity, social, DMs, trust scoring, AI-to-AI dispatch, Lightning payments, privacy proofs, and encrypted vaults. NIP-46 bunker auth; keys never leave the signing device.232 npm1MIT
- AlicenseAqualityDmaintenanceA read-only MCP server for safely exploring Nostr, enabling agents to resolve identifiers, fetch profiles and events, query notes, and inspect relay metadata. It does not accept private keys or publish events.53 npmMIT