Repository navigation
sourcebolt v0.2.0
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.exeon Windows) on your PATH. - Claude Desktop: download
sourcebolt-mcp-<os>-<arch>.mcpbbelow 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 isghcr.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-readyserver.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_generategenerates every Studio type:audio,video,report,interactive_report,slide_deck,mind_map,quiz,flashcards,infographicanddata_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 returnsUNSUPPORTED_BY_TRANSPORTnaming the option, before the quota check. Proven values (default first): audio formatdeep_dive,critique, lengthdefault,short; video formatcinematic,short; slide deck formatdetailed_deck,presenter_slides, lengthdefault,short; quiz quantitystandard,more, difficultymedium,easy; flashcards quantitystandard,fewer, difficultymedium,hard, imagesinclude,text_only; infographic orientationlandscape,portrait, detailstandard,concise, styleauto,sketch_note.instructionsis 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).reportneedsreport.titleandreport.descriptionplusinstructionsas the prompt;suggestsurfacereportreturns such triples.languageaccepts only the captured codesen(default) anden_in; cinematic video takes none.video.generate_laterasks 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_askoptionsave_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). Returnsnote_idandnote_title, ornote_errorwith the answer kept.deletekindssource,noteandchat_history(a conversation's whole history; ids are conversation ids). Same preview andconfirm:truegate as notebooks; refs are matched strictly against a fresh list of the notebook's items. Thechat_historypreview 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 getsUNSUPPORTED_BY_TRANSPORT, notNOT_FOUND).source_readmodeguide: the source guide's summary astextpluskeywords.studio_listdecodes rows of every Studio type with their status (pendingwhile queued, generating or deferred).
Changed
- Breaking:
studio_listreports flashcards, quiz and mind map artifacts as kindsflashcards,quizandmind_map(all wereinteractive), and slide decks asslide_deck(wasslides), the namesstudio_generateuses. Filters on the old names match nothing. - Breaking:
studio_generateflashcards 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_configureaccepts modedefault,learning_guideorcustomand response_lengthdefault,longerorshorter, the values captures #3 and #3b saved; modedefaultwith response_lengthdefaultresets a notebook. Modesconciseanddetailedare removed. suggestsurfacereportno longer returnsaudience: the number has no verified meaning.suggestsurfacereportsends the live request (artifact options block and every source when none are given).notebook_listresults carryhas_more, true when notebooks after the returned page also match; page withoffset.notebook_listreturns 20 notebooks by default instead of 50.totalstill counts every match; passoffsetfor the next page or a largerlimit(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, seebench/RESULTS.md).note_savecreates 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
v9rmvdform). Markdown load-source and chat suggestions were not captured and keep their earlier requests. note_list(and sonote_saveand the note delete) skips rows that are not notes, such as note-backed mind maps.source_readreports drift instead of returning empty text when an answer has no text blocks and no HTML.source_addlists 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_list2.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). Seebench/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. serveruns with GOGC=200 unlessGOGCis set: fewer collections per tool call (cachednotebook_listabout 20% faster) at the cost of a somewhat larger heap under load.
Fixed
-
loginreplaces 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 alogouthint. -
The cookie-import error names exactly the cookies sourcebolt checks (
SID,__Secure-1PSIDTS, andOSIDorAPISID+SAPISID). -
chat_configuresent 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_askstreams copy the answer's rich block only whensave_as_noteis set. -
studio_listwith kindslide_deckmatched nothing. -
source_readreturned 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
enanden_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; researchdiscover. - 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_configureserializes its own changes per notebook; a change made at the same moment in the web app can still be overwritten.studio_listleaves 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 (
hizoJcmarkdown mode; no UI path found, so the catalog's request is kept unverified).
Full changelog: v0.1.0...v0.2.0