A standalone remote MCP server that exposes any hosted SilverBullet space to Claude over HTTP, with built-in OAuth 2.1 and collision-safe writes.
SilverBullet MCP server demonstrates solid tool design with clear naming (verb_noun pattern), comprehensive descriptions (avg 180 chars), and well-structured schemas. All 9 tools have input schemas with typed parameters and descriptions. Strengths: collision-safe write semantics, pagination guidance, and explicit version markers. Weaknesses: append_to_page and prepend_to_page lack lastModified in responses (breaks write chaining); no error recovery guidance; missing tool annotations (readOnlyHint, destructiveHint); output schemas documented in descriptions but not in formal JSON Schema format.
Append content at the end of an existing page. Does not create the page if it does not exist (use create_page first). Returns no lastModified in the response.
Create a brand-new page. Errors if the page already exists. Returns a JSON envelope {path, lastModified} — the lastModified is the version marker for future write_page calls.
Soft-delete a page into _trash/. The page is moved to a timestamped location under _trash/ and can be recovered by moving it back out. Returns no content in the response.
Return every markdown page in the SilverBullet space, sorted by last modified. Each entry carries {page, path, lastModified}. The lastModified here is rounded to the nearest second and is intended only for showing recency — it is NOT a valid expected_last_modified for write_page. To obtain a usable version marker, call read_page (or create_page / write_page).
Move or rename a page. Errors if the destination already exists or if from == to. Returns a JSON envelope {path, lastModified} on success. The lastModified is rounded to the nearest second and is for display only — not valid for write_page.
append_to_page and prepend_to_page do not return lastModified, breaking write chaining. If an agent appends content then immediately calls write_page, it lacks the version marker needed for collision detection.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) declared in tool definitions. Agents cannot infer which tools are safe to retry or which modify state without reading descriptions.
Error responses lack recovery guidance. Descriptions mention 'errors if page already exists' but do not specify what error code/message is returned or how the agent should respond (retry, lookup, ask user).
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
Insert content at the top of an existing page. Does not create the page if it does not exist (use create_page first). Returns no lastModified in the response.
Return a page as two content blocks: [0] a JSON envelope {path, lastModified}, [1] the raw markdown body. The lastModified is the version marker — pass it back as expected_last_modified in write_page to ensure you have seen the current content before overwriting.
Substring search across all pages in the space. Returns up to 20 results sorted by match count (most matches first). Each hit includes {page, path, lastModified, snippet, matches}. The lastModified is rounded to the nearest second and is for display only — not valid for write_page.
Overwrite or create a page with collision detection. Requires expected_last_modified (from a prior read_page, create_page, or write_page) to ensure you have seen the current content. If the page has been modified since you last read it, returns a conflict error with remediation guidance. Returns a JSON envelope {path, lastModified} on success.
Output schemas documented in prose descriptions but not formalized as JSON Schema. Agents cannot programmatically validate responses or extract fields with confidence.
search_pages returns up to 20 results but no pagination mechanism (cursor, offset, limit param). If a space has >20 matching pages, agent cannot retrieve the rest.