Skip to content

sourcebolt v0.2.0

Choose a tag to compare

@github-actions github-actions released this 20 Oct 17:57
· 67 commits to main since this release
0a327d4

sourcebolt is a fast MCP server for Google NotebookLM: internal RPC first, with headless-browser and page (DOM) fallbacks.

Install

  • Binaries: download the archive for your platform below and put sourcebolt (sourcebolt.exe on Windows) on your PATH.
  • Claude Desktop: download sourcebolt-mcp-<os>-<arch>.mcpb below and double-click it.
  • Claude Code plugin: /plugin install sourcebolt --marketplace candidloom-hub/sourcebolt
  • Go: go install github.com/candidloom-hub/sourcebolt/cmd/sourcebolt@v0.2.0
  • Docker: ghcr.io/candidloom-hub/sourcebolt:0.2.0; the image with the browser fallback is ghcr.io/candidloom-hub/sourcebolt:0.2.0-browser.
  • VS Code, Cursor and other clients: see docs/install-links.md and docs/clients.md.
  • npm, PyPI and the MCP registry: not published yet.

Verify

cosign verify-blob --bundle checksums.txt.sigstore.json --certificate-identity https://github.com/candidloom-hub/sourcebolt/.github/workflows/release.yml@refs/tags/v0.2.0 --certificate-oidc-issuer https://token.actions.githubusercontent.com checksums.txt

The bundles are listed in sourcebolt-mcp-checksums.txt. Each archive has a CycloneDX SBOM (.cdx.json).

Every Studio type, chat settings, saving answers as notes, deletes for sources, notes and chat history, a large performance pass, new user docs, and new distribution channels. Shapes are pinned by live captures #2, #3 and #3b (2026-10-20); see research/rpc-catalog.md (rows marked "live").

Added

  • sourcebolt doctor --dom-check <notebook> asks one question through the browser (DOM) fallback, so you can confirm it works on your machine before you need it.
  • Distribution: a Claude Code plugin marketplace in the repo (/plugin install sourcebolt --marketplace candidloom-hub/sourcebolt), MCP Bundles (sourcebolt-mcp-<os>-<arch>.mcpb) attached to releases, VS Code and Cursor one-click install links (docs/install-links.md), glama.json, gemini-extension.json, and a registry-ready server.json (GHCR image only until npm and PyPI are published).
  • User docs rewritten: getting started, per-client setup, troubleshooting by error message, FAQ, performance, "Why sourcebolt" and a sourced comparison page; plus a privacy page.
  • studio_generate generates every Studio type: audio, video, report, interactive_report, slide_deck, mind_map, quiz, flashcards, infographic and data_table. Each kind has its own option object whose schema enums list only the values a live capture sent; an omitted option takes the web app's default. A value the web app offers but no capture sent returns UNSUPPORTED_BY_TRANSPORT naming the option, before the quota check. Proven values (default first): audio format deep_dive, critique, length default, short; video format cinematic, short; slide deck format detailed_deck, presenter_slides, length default, short; quiz quantity standard, more, difficulty medium, easy; flashcards quantity standard, fewer, difficulty medium, hard, images include, text_only; infographic orientation landscape, portrait, detail standard, concise, style auto, sketch_note. instructions is optional for audio, video, slide deck and quiz, required for report, mind map, flashcards and data table, and refused by infographic and interactive report (each as captured). report needs report.title and report.description plus instructions as the prompt; suggest surface report returns such triples. language accepts only the captured codes en (default) and en_in; cinematic video takes none. video.generate_later asks for deferred generation (the web app's "Generate later"; cinematic only; the artifact lists as pending). Sources default to every source of the notebook.
  • chat_ask option save_as_note: saves the answer as a note the way the web app's "Save to note" does (the answer's passages and rich text go along; the server picks the title). Returns note_id and note_title, or note_error with the answer kept.
  • delete kinds source, note and chat_history (a conversation's whole history; ids are conversation ids). Same preview and confirm:true gate as notebooks; refs are matched strictly against a fresh list of the notebook's items. The chat_history preview shows each conversation's created and updated times and, when its whole history can be read, the first question; only the newest 20 conversations are reachable (an older id gets UNSUPPORTED_BY_TRANSPORT, not NOT_FOUND).
  • source_read mode guide: the source guide's summary as text plus keywords.
  • studio_list decodes rows of every Studio type with their status (pending while queued, generating or deferred).

Changed

  • Breaking: studio_list reports flashcards, quiz and mind map artifacts as kinds flashcards, quiz and mind_map (all were interactive), and slide decks as slide_deck (was slides), the names studio_generate uses. Filters on the old names match nothing.
  • Breaking: studio_generate flashcards default to the web app's defaults (standard, medium, with images), which capture #3 sent, instead of fewer, hard, text only (still available as options).
  • Breaking: chat_configure accepts mode default, learning_guide or custom and response_length default, longer or shorter, the values captures #3 and #3b saved; mode default with response_length default resets a notebook. Modes concise and detailed are removed.
  • suggest surface report no longer returns audience: the number has no verified meaning.
  • suggest surface report sends the live request (artifact options block and every source when none are given).
  • notebook_list results carry has_more, true when notebooks after the returned page also match; page with offset.
  • notebook_list returns 20 notebooks by default instead of 50. total still counts every match; pass offset for the next page or a larger limit (pages come from the 30 s cache, so paging makes no extra Google call). Each listed notebook is sent twice (structured content and its JSON text fallback) and decoded by the client, so the smaller page cuts the cached call's overhead by about half (B3, see bench/RESULTS.md).
  • note_save creates a note in one call with its title and content, as the web app's "Copied text" flow does; updates send the live note-edit shape.
  • Notebook rename, text load-source and artifact-read requests match the live web app (options block added, full v9rmvd form). Markdown load-source and chat suggestions were not captured and keep their earlier requests.
  • note_list (and so note_save and the note delete) skips rows that are not notes, such as note-backed mind maps.
  • source_read reports drift instead of returning empty text when an answer has no text blocks and no HTML.
  • source_add lists the notebook before adding, so that a source missing from the add answer is only reported added when its row is new; a match with a source that already existed is pending.

Performance

  • Tool-call overhead (B3, 100 notebooks, 2-CPU CI, p50): uncached notebook_list 2.20 -> 0.76 ms, cached 0.99 -> 0.40 ms; decoding a 40 KB answer 508 -> 225 us with 9 instead of 93 allocations; cold start and idle memory lower (tool schemas are resolved on first use). See bench/RESULTS.md.
  • On Linux the server turns off transparent huge pages for its own process (prctl), which cut idle RSS by about 2 MB on hosts whose THP mode is "always". The fallback browser inherits the setting.
  • serve runs with GOGC=200 unless GOGC is set: fewer collections per tool call (cached notebook_list about 20% faster) at the cost of a somewhat larger heap under load.

Fixed

  • login replaces a profile whose encryption key is gone from the OS keyring (it could never be read again) instead of failing with a file-not-found error; other unreadable profiles get a logout hint.

  • The cookie-import error names exactly the cookies sourcebolt checks (SID, __Secure-1PSIDTS, and OSID or APISID+SAPISID).

  • chat_configure sent no options block; the web app sends it. Two changes on one notebook at once could lose one of them; the read and the write now run one at a time per notebook.

  • chat_ask streams copy the answer's rich block only when save_as_note is set.

  • studio_list with kind slide_deck matched nothing.

  • source_read returned a source's text as one run-on line: text blocks sit one level deeper than the research catalog said.

  • Chat citations: a marker lists passage indices, not a range (checked against both live captures). Answers citing a single passage had no citations, and answers whose markers cite several passages lost some. Exact duplicates are dropped and malformed indices skipped.

  • source_add: an item missing from a successful add answer was reported failed although Google had added it (seen live with YouTube). It is now looked up in the notebook: found is added, not found is failed, a failed lookup is pending.

Known limitations

  • Replaces the 0.1.0 list. Not available yet: Studio option values no capture sent (audio formats brief and debate, long audio, video formats explainer and brief and their visual styles, quiz fewer and hard, flashcards more and easy, square infographics, detailed infographics, other infographic styles), languages other than en and en_in, deferred generation for anything but cinematic video, free text where a kind was captured without it (infographic, interactive report) or required where only captured with it (report, mind map, flashcards, data table), report templates by name (their texts live in the web app), and notes as Studio sources; artifact, label and collection deletes; Drive and file sources; source refresh; followup suggestions; label create and auto-label; research discover.
  • Combinations are assumed independent: options proven in different captures (for example a cinematic video without "Generate later", or a quiz topic with the default quantity) are sent together although no capture sent that exact mix.
  • chat_configure serializes its own changes per notebook; a change made at the same moment in the web app can still be overwritten.
  • studio_list leaves media URLs empty: no finished video was captured, and the two slide-deck download URLs cannot be told apart (PDF or PPTX) in the sanitized capture.
  • Saving a chat answer re-encodes the answer's rich text the way both captured saves did; rich structures neither capture had (tables, images in answers) are sent as the stream had them.
  • Not capturable from the web UI: conversation-list paging (the UI keeps one thread per notebook and never pages, so only the newest 20 conversations are listed) and markdown load-source (hizoJc markdown mode; no UI path found, so the catalog's request is kept unverified).

Full changelog: v0.1.0...v0.2.0