{
    "version": "https://jsonfeed.org/version/1",
    "title": "NotebookLM automation notes",
    "home_page_url": "https://notebooklm.roomi-fields.com/blog",
    "description": "NotebookLM MCP + HTTP REST API Blog",
    "items": [
        {
            "id": "https://notebooklm.roomi-fields.com/blog/does-notebooklm-have-an-api",
            "content_html": "<p>Yes and no, and the honest answer changed during 2026. Google does publish an\nAPI for Gemini Notebook Enterprise, in preview, behind a Cloud project and a\nlicence. The consumer NotebookLM you log into with a personal Google account\nstill has no developer key, and the standalone Podcast API that some posts\npoint at is deprecated and not taking new customers.</p>\n<p>Most answers you will find say flatly \"there is no API\". That was true and is\nnow wrong, which is worse than either.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-does-the-official-api-cover\">What does the official API cover?<a href=\"https://notebooklm.roomi-fields.com/blog/does-notebooklm-have-an-api#what-does-the-official-api-cover\" class=\"hash-link\" aria-label=\"Direct link to What does the official API cover?\" title=\"Direct link to What does the official API cover?\" translate=\"no\">​</a></h2>\n<p>Google documents a REST surface for Gemini Notebook Enterprise, including\nnotebook operations and audio overviews — a notebook holds one audio overview\nat a time, created through <code>notebooks.audioOverviews.create</code>. It is marked\npre-GA, which means the terms and the shape can both move.</p>\n<p>The access path is the part people miss. It needs a Google Cloud project and a\nGemini Enterprise or Education Premium licence, set up by an administrator. It\nis not a key you sign up for on a developer console, and it does not reach the\nnotebooks in your personal account.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-about-the-podcast-api\">What about the Podcast API?<a href=\"https://notebooklm.roomi-fields.com/blog/does-notebooklm-have-an-api#what-about-the-podcast-api\" class=\"hash-link\" aria-label=\"Direct link to What about the Podcast API?\" title=\"Direct link to What about the Podcast API?\" translate=\"no\">​</a></h2>\n<p>Deprecated. Google is not allowlisting new customers for it. If a tutorial\ntells you to request access, that tutorial is out of date.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"so-what-do-people-actually-use\">So what do people actually use?<a href=\"https://notebooklm.roomi-fields.com/blog/does-notebooklm-have-an-api#so-what-do-people-actually-use\" class=\"hash-link\" aria-label=\"Direct link to So what do people actually use?\" title=\"Direct link to So what do people actually use?\" translate=\"no\">​</a></h2>\n<p>Community projects that drive the same interfaces the web app uses. There are\nseveral, in Python and in Node, exposing them as a CLI, as an MCP server, or as\na local REST API. They work, they are fast, and they reach your own notebooks\nwith your own login.</p>\n<p>They also share one honest caveat: nothing about those interfaces is promised.\nGoogle can change them, and when it does the project breaks until someone\nfixes it. That has happened — the mid-2026 interface rebuild broke every such\ntool at once.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"which-should-you-pick\">Which should you pick?<a href=\"https://notebooklm.roomi-fields.com/blog/does-notebooklm-have-an-api#which-should-you-pick\" class=\"hash-link\" aria-label=\"Direct link to Which should you pick?\" title=\"Direct link to Which should you pick?\" translate=\"no\">​</a></h2>\n<p>Three questions settle it.</p>\n<p><strong>Do you have an enterprise licence and an administrator?</strong> Then use the\nofficial API. It is supported, it is the only route with a contract behind it,\nand nothing below competes with that.</p>\n<p><strong>Do you need your own personal notebooks?</strong> Then the official API is out, and\na community tool is the only route that exists.</p>\n<p><strong>Do you need it to keep working unattended?</strong> Weigh how quickly the project\nyou pick has recovered from past breakages. That is the only signal that\nmatters, and the commit history tells you more than the README.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"when-is-a-community-tool-the-wrong-answer\">When is a community tool the wrong answer?<a href=\"https://notebooklm.roomi-fields.com/blog/does-notebooklm-have-an-api#when-is-a-community-tool-the-wrong-answer\" class=\"hash-link\" aria-label=\"Direct link to When is a community tool the wrong answer?\" title=\"Direct link to When is a community tool the wrong answer?\" translate=\"no\">​</a></h2>\n<ul>\n<li class=\"\">When the work is contractual — a client deliverable, a regulated pipeline, an\nSLA. An undocumented interface has no promise attached to it.</li>\n<li class=\"\">When you only need text generation over documents. The Gemini API is public,\nsupported and cheaper to reason about; NotebookLM's value is its grounding\nand citation behaviour, not its text generation.</li>\n<li class=\"\">When you cannot run a browser anywhere. Login still happens in a real Chrome,\nonce, even for the tools that avoid the browser afterwards.</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"trying-this-one\">Trying this one<a href=\"https://notebooklm.roomi-fields.com/blog/does-notebooklm-have-an-api#trying-this-one\" class=\"hash-link\" aria-label=\"Direct link to Trying this one\" title=\"Direct link to Trying this one\" translate=\"no\">​</a></h2>\n<p>Our own route is both an MCP server and a local REST API, so an agent and a\nworkflow tool can use the same install.</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"># Claude Code</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">/plugin marketplace add roomi-fields/claude-plugins</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">/plugin install notebooklm@roomi-fields</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"># Then log into Google once, in a terminal</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">npx -y -p @roomi-fields/notebooklm-mcp notebooklm-mcp-setup-auth</span><br></div></code></pre></div></div>\n<p>Node 22 or newer. The REST route is in <a class=\"\" href=\"https://notebooklm.roomi-fields.com/install\">the install guide</a>, and the\nfull endpoint list is in <a class=\"\" href=\"https://notebooklm.roomi-fields.com/notebooklm-rest-api\">the API reference</a>.</p>",
            "url": "https://notebooklm.roomi-fields.com/blog/does-notebooklm-have-an-api",
            "title": "Does NotebookLM have an API? The 2026 answer",
            "summary": "Google now ships a Gemini Notebook Enterprise API in preview, the standalone Podcast API is deprecated, and the consumer product still has no developer key. What each route actually gives you.",
            "date_modified": "2026-10-18T00:00:00.000Z",
            "author": {
                "name": "Romain Peyrichou",
                "url": "https://github.com/roomi-fields"
            },
            "tags": [
                "notebooklm",
                "api"
            ]
        },
        {
            "id": "https://notebooklm.roomi-fields.com/blog/mcp-server-listening-on-0-0-0-0",
            "content_html": "<p>Until version 4.0.0 this server bound to every network interface, accepted any\nbrowser origin, and required no credential on any of its 45 routes. Anyone on\nthe same Wi-Fi could drive it. Any web page you visited could drive it too.</p>\n<p>Someone reported it. We fixed it, published the advisory, and then found a\nsecond hole of the same family a few weeks later. Here is what we learned,\nwritten down because the pattern is not ours alone — researchers scanning\npublic MCP servers keep finding the same three mistakes.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-does-binding-to-0000-actually-allow\">What does binding to 0.0.0.0 actually allow?<a href=\"https://notebooklm.roomi-fields.com/blog/mcp-server-listening-on-0-0-0-0#what-does-binding-to-0000-actually-allow\" class=\"hash-link\" aria-label=\"Direct link to What does binding to 0.0.0.0 actually allow?\" title=\"Direct link to What does binding to 0.0.0.0 actually allow?\" translate=\"no\">​</a></h2>\n<p>It means the server answers on your laptop's address on the local network, not\njust on <code>localhost</code>. On a home network that is your household. On café Wi-Fi,\na conference network or a shared office, it is everyone within reach.</p>\n<p>What they get is whatever your tools do. For us that was reading your\nnotebooks, adding sources, generating content and sharing a notebook publicly.\nFor other servers it has been arbitrary code execution — Penpot's MCP server\nand MCPJam's inspector both shipped unauthenticated execution endpoints bound\nto every interface.</p>\n<p>The exposure is not exotic. A survey of reachable MCP servers found hundreds\nwith this shape, and a large minority with no authentication mechanism at all.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"is-binding-to-127001-enough\">Is binding to 127.0.0.1 enough?<a href=\"https://notebooklm.roomi-fields.com/blog/mcp-server-listening-on-0-0-0-0#is-binding-to-127001-enough\" class=\"hash-link\" aria-label=\"Direct link to Is binding to 127.0.0.1 enough?\" title=\"Direct link to Is binding to 127.0.0.1 enough?\" translate=\"no\">​</a></h2>\n<p>No, and this is the part that surprises people. A web page you visit can make\nrequests to <code>localhost</code> from inside your browser. If the server answers them,\nthe page is driving your tools with your session, from the outside.</p>\n<p>That is not theory. CVE-2025-49596 in the MCP Inspector scored 9.4 precisely\nbecause a malicious site could reach a service listening only on loopback and\nget to code execution.</p>\n<p>The defence is to refuse requests that carry a foreign origin, rather than\nmerely declining to send a permissive header back. Those are different things:\nthe second blocks the page from <em>reading</em> the reply, while the request still\nexecutes. For anything that writes, that distinction is the whole game.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-are-the-three-controls\">What are the three controls?<a href=\"https://notebooklm.roomi-fields.com/blog/mcp-server-listening-on-0-0-0-0#what-are-the-three-controls\" class=\"hash-link\" aria-label=\"Direct link to What are the three controls?\" title=\"Direct link to What are the three controls?\" translate=\"no\">​</a></h2>\n<p><strong>Bind to loopback by default, and fail loudly otherwise.</strong> Our server now\nrefuses to start on a public interface unless a token is set. Not a warning —\na refusal, because a warning in a log nobody reads is not a control.</p>\n<p><strong>Refuse foreign origins outright.</strong> Requests from an origin that is not\nallow-listed get a 403 before any handler runs, reads included.</p>\n<p><strong>Require a token when exposed, and compare it in constant time.</strong> The\ncomparison detail is small but free: compare digests, not strings.</p>\n<p>In a container the first rule inverts — a published port is useless on\nloopback — so the entrypoint binds to all interfaces and exits with an\nexplanation if no token is set.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-was-the-second-hole\">What was the second hole?<a href=\"https://notebooklm.roomi-fields.com/blog/mcp-server-listening-on-0-0-0-0#what-was-the-second-hole\" class=\"hash-link\" aria-label=\"Direct link to What was the second hole?\" title=\"Direct link to What was the second hole?\" translate=\"no\">​</a></h2>\n<p>File paths. Three of our tools take a path from the caller: one reads a file to\nupload, two write one. The data directory was an allowed root, and that\ndirectory holds the live Google session.</p>\n<p>So a document could tell an agent to add the session file as a source, and\nanother tool could then make that notebook public. Not a file leak — an account\ntakeover, via a tool that looks like it only reads documents.</p>\n<p>Three things made it work, and all three are worth checking in your own code:</p>\n<ul>\n<li class=\"\">the path was checked before it was resolved, so the check applied to a string\nthat was not what got opened;</li>\n<li class=\"\">symlinks were never followed, so a link inside an allowed directory walked\nstraight out of it;</li>\n<li class=\"\">containment was a string prefix test, so <code>/data-evil</code> passed a check for\n<code>/data</code>.</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-would-we-tell-someone-shipping-an-mcp-server-today\">What would we tell someone shipping an MCP server today?<a href=\"https://notebooklm.roomi-fields.com/blog/mcp-server-listening-on-0-0-0-0#what-would-we-tell-someone-shipping-an-mcp-server-today\" class=\"hash-link\" aria-label=\"Direct link to What would we tell someone shipping an MCP server today?\" title=\"Direct link to What would we tell someone shipping an MCP server today?\" translate=\"no\">​</a></h2>\n<ul>\n<li class=\"\">Default to loopback. Make exposure a deliberate act that fails without a\ncredential.</li>\n<li class=\"\">Treat every caller-supplied path as hostile. An agent acts on text it was\nhanded, so your tool arguments are reachable by whoever wrote that text.</li>\n<li class=\"\">Check what your tools can reach, not just what they are for. Ours could reach\nthe session that authorises them.</li>\n<li class=\"\">Write the guard, then break it on purpose and confirm it fails. Two of ours\ndid not bite on the first attempt.</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"when-is-this-not-your-problem\">When is this not your problem?<a href=\"https://notebooklm.roomi-fields.com/blog/mcp-server-listening-on-0-0-0-0#when-is-this-not-your-problem\" class=\"hash-link\" aria-label=\"Direct link to When is this not your problem?\" title=\"Direct link to When is this not your problem?\" translate=\"no\">​</a></h2>\n<p>If your server is stdio-only, it has no port and none of this applies. Most of\nthe risk arrives with the HTTP transport, which people add for n8n or for a\nremote machine and then forget is listening.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"trying-this-one\">Trying this one<a href=\"https://notebooklm.roomi-fields.com/blog/mcp-server-listening-on-0-0-0-0#trying-this-one\" class=\"hash-link\" aria-label=\"Direct link to Trying this one\" title=\"Direct link to Trying this one\" translate=\"no\">​</a></h2>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">/plugin marketplace add roomi-fields/claude-plugins</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">/plugin install notebooklm@roomi-fields</span><br></div></code></pre></div></div>\n<p>The full model, including what the container requires, is in\n<a class=\"\" href=\"https://notebooklm.roomi-fields.com/security\">the security page</a>. Past advisories are listed there too.</p>",
            "url": "https://notebooklm.roomi-fields.com/blog/mcp-server-listening-on-0-0-0-0",
            "title": "Your MCP server is probably listening on 0.0.0.0",
            "summary": "Ours was, for 45 unauthenticated routes, until a stranger reported it. What the exposure actually allows, why loopback alone is not enough, and the three controls that close it.",
            "date_modified": "2026-10-18T00:00:00.000Z",
            "author": {
                "name": "Romain Peyrichou",
                "url": "https://github.com/roomi-fields"
            },
            "tags": [
                "mcp",
                "security"
            ]
        },
        {
            "id": "https://notebooklm.roomi-fields.com/blog/notebooklm-audio-overviews-programmatically",
            "content_html": "<p>The audio overview is the feature that made NotebookLM famous, and the one\npeople most want to run in a loop — one podcast per report, per client, per\nweek. Doing that without clicking is possible by three different routes, and\nthey are not equivalent.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-official-route\">The official route<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-audio-overviews-programmatically#the-official-route\" class=\"hash-link\" aria-label=\"Direct link to The official route\" title=\"Direct link to The official route\" translate=\"no\">​</a></h2>\n<p>Google documents audio overview creation in the Gemini Notebook Enterprise\nAPI. A notebook holds one audio overview at a time, so a loop means creating\nnotebooks, not stacking overviews.</p>\n<p>It is pre-GA, and it needs a Cloud project plus an enterprise or education\nlicence with an administrator to turn it on. If you have that, stop reading —\nit is supported and nothing below is.</p>\n<p>The separate Podcast API that older tutorials point at is deprecated and not\ntaking new customers.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"driving-the-browser\">Driving the browser<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-audio-overviews-programmatically#driving-the-browser\" class=\"hash-link\" aria-label=\"Direct link to Driving the browser\" title=\"Direct link to Driving the browser\" translate=\"no\">​</a></h2>\n<p>The oldest community approach: a real browser clicks the same buttons you\nwould. It works, it reaches your personal notebooks, and it is slow — minutes\nper generation, most of it waiting.</p>\n<p>Its weakness is the web app. When Google rebuilt the interface in mid-2026,\nevery selector moved and every browser-driven tool broke at once.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"driving-the-internal-interface\">Driving the internal interface<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-audio-overviews-programmatically#driving-the-internal-interface\" class=\"hash-link\" aria-label=\"Direct link to Driving the internal interface\" title=\"Direct link to Driving the internal interface\" translate=\"no\">​</a></h2>\n<p>Newer tools call the same internal requests the web app makes, skipping the\npage entirely. Generation that took minutes through the browser takes seconds\nto kick off, and the result is read back directly rather than scraped.</p>\n<p>It is immune to visual redesigns, because there is no selector to break. It is\nnot immune to the interface itself changing, which is a different and rarer\nevent.</p>\n<p>Our own server does this first and falls back to the browser when the internal\nroute does not answer — deliberately, because the two break for different\nreasons and rarely at the same time.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-actually-bites-in-a-loop\">What actually bites in a loop<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-audio-overviews-programmatically#what-actually-bites-in-a-loop\" class=\"hash-link\" aria-label=\"Direct link to What actually bites in a loop\" title=\"Direct link to What actually bites in a loop\" translate=\"no\">​</a></h2>\n<p><strong>You must own the notebook.</strong> Google refuses Studio generation on notebooks\nmerely shared with you. The refusal arrives as a permission status buried in\nthe response, which is easy to misread as \"the identifier changed\" — we lost\ntwo investigations to exactly that before reading the raw body.</p>\n<p><strong>One overview per notebook.</strong> Plan the loop around notebooks, not around\ngenerations.</p>\n<p><strong>Generation costs allowance.</strong> Usage is compute-based and refreshes every\nfive hours. Audio is one of the expensive features, so a batch will hit the\nceiling sooner than the same number of questions would.</p>\n<p><strong>The download is not the obvious URL.</strong> The media link serves a viewer page,\nnot the file, so a naive fetch returns HTML that looks like a success.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"when-is-this-not-worth-automating\">When is this not worth automating?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-audio-overviews-programmatically#when-is-this-not-worth-automating\" class=\"hash-link\" aria-label=\"Direct link to When is this not worth automating?\" title=\"Direct link to When is this not worth automating?\" translate=\"no\">​</a></h2>\n<ul>\n<li class=\"\"><strong>For a handful a month.</strong> The web app is three clicks and no maintenance.</li>\n<li class=\"\"><strong>When you need a specific voice, length or script.</strong> You get the format\nNotebookLM produces; a text-to-speech pipeline over your own script gives\nyou control it does not.</li>\n<li class=\"\"><strong>When the output is client-facing and must arrive on a date.</strong> An\nundocumented interface and a compute allowance are two reasons it might not.</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"trying-this-one\">Trying this one<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-audio-overviews-programmatically#trying-this-one\" class=\"hash-link\" aria-label=\"Direct link to Trying this one\" title=\"Direct link to Trying this one\" translate=\"no\">​</a></h2>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">/plugin marketplace add roomi-fields/claude-plugins</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">/plugin install notebooklm@roomi-fields</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">npx -y -p @roomi-fields/notebooklm-mcp notebooklm-mcp-setup-auth</span><br></div></code></pre></div></div>\n<p>Generation, listing and download are covered in\n<a class=\"\" href=\"https://notebooklm.roomi-fields.com/CONTENT-MANAGEMENT\">content management</a>; the REST equivalents are\nin <a class=\"\" href=\"https://notebooklm.roomi-fields.com/notebooklm-rest-api\">the API reference</a>.</p>",
            "url": "https://notebooklm.roomi-fields.com/blog/notebooklm-audio-overviews-programmatically",
            "title": "Generating NotebookLM audio overviews programmatically",
            "summary": "A notebook holds one audio overview at a time, the standalone Podcast API is deprecated, and the official route needs an enterprise licence. The three ways to script it and what each costs.",
            "date_modified": "2026-10-18T00:00:00.000Z",
            "author": {
                "name": "Romain Peyrichou",
                "url": "https://github.com/roomi-fields"
            },
            "tags": [
                "notebooklm",
                "audio",
                "automation"
            ]
        },
        {
            "id": "https://notebooklm.roomi-fields.com/blog/notebooklm-citations-as-json",
            "content_html": "<p>NotebookLM's best feature is that every claim points at the passage it came\nfrom. Its worst export story is that those pointers stay in the web app. Copy\nan answer out and you get prose with little numbers in it.</p>\n<p>If you are feeding answers to anything downstream — a review, a database, an\nagent that must not invent — the citation is the part you actually need.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-does-a-citation-contain\">What does a citation contain?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-citations-as-json#what-does-a-citation-contain\" class=\"hash-link\" aria-label=\"Direct link to What does a citation contain?\" title=\"Direct link to What does a citation contain?\" translate=\"no\">​</a></h2>\n<p>Two things worth separating. The <strong>source name</strong> tells you which document a\nclaim came from. The <strong>excerpt</strong> is the passage itself, the few sentences the\nmodel drew on.</p>\n<p>The first is cheap to get and almost always enough to audit an answer. The\nsecond is what lets a downstream reader judge without opening the source, and\nit costs more to obtain.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"how-do-you-get-them-out\">How do you get them out?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-citations-as-json#how-do-you-get-them-out\" class=\"hash-link\" aria-label=\"Direct link to How do you get them out?\" title=\"Direct link to How do you get them out?\" translate=\"no\">​</a></h2>\n<p>Ask for a machine-readable citation format when you make the request. Our\nserver takes a <code>source_format</code> on every question:</p>\n<table><thead><tr><th>Value</th><th>You get</th></tr></thead><tbody><tr><td><code>none</code></td><td>the answer only</td></tr><tr><td><code>inline</code></td><td>markers in the prose</td></tr><tr><td><code>footnotes</code></td><td>markers plus a source list</td></tr><tr><td><code>json</code></td><td>source names and cited excerpts, as data</td></tr><tr><td><code>expanded</code></td><td>footnotes with the excerpts written out</td></tr></tbody></table>\n<p><code>json</code> is the one to use when something other than a person reads the result.\n<code>expanded</code> is the one for a human report.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"why-is-the-excerpt-harder-than-the-name\">Why is the excerpt harder than the name?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-citations-as-json#why-is-the-excerpt-harder-than-the-name\" class=\"hash-link\" aria-label=\"Direct link to Why is the excerpt harder than the name?\" title=\"Direct link to Why is the excerpt harder than the name?\" translate=\"no\">​</a></h2>\n<p>Because of where each lives. Source names sit in the answer's markup and come\nback in one pass. Excerpts are revealed by opening each citation, which means\nasking for each one in turn and collecting what comes back.</p>\n<p>That is slower, and it is why the two are separate options rather than one.\nIf you only need to know <em>which</em> document answered, do not pay for the rest.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-do-you-do-with-them\">What do you do with them?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-citations-as-json#what-do-you-do-with-them\" class=\"hash-link\" aria-label=\"Direct link to What do you do with them?\" title=\"Direct link to What do you do with them?\" translate=\"no\">​</a></h2>\n<p>The pattern we keep coming back to: write each answer, with its citations, as\na document in a store you control — a vault, a table, a search index. Then\nquery that store instead of re-asking.</p>\n<p>It costs one pass through NotebookLM and nothing thereafter, which matters\nmore since usage became a compute allowance rather than a query count. It also\ngives you something NotebookLM does not: a corpus of past answers you can\nsearch, diff and cite.</p>\n<p>We emit those documents against a published schema so the shape does not drift\nbetween versions.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"when-is-this-not-worth-it\">When is this not worth it?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-citations-as-json#when-is-this-not-worth-it\" class=\"hash-link\" aria-label=\"Direct link to When is this not worth it?\" title=\"Direct link to When is this not worth it?\" translate=\"no\">​</a></h2>\n<ul>\n<li class=\"\"><strong>When you are reading the answers yourself, in the app.</strong> The clickable\nmarkers are better than anything you would export.</li>\n<li class=\"\"><strong>When the answer is a one-off.</strong> The citation machinery earns its keep over\na corpus, not over a question.</li>\n<li class=\"\"><strong>When you need page numbers or offsets.</strong> You get the passage and the source\nname, not a position in the original document.</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"trying-this-one\">Trying this one<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-citations-as-json#trying-this-one\" class=\"hash-link\" aria-label=\"Direct link to Trying this one\" title=\"Direct link to Trying this one\" translate=\"no\">​</a></h2>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">/plugin marketplace add roomi-fields/claude-plugins</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">/plugin install notebooklm@roomi-fields</span><br></div></code></pre></div></div>\n<p>The request and response shapes are in\n<a class=\"\" href=\"https://notebooklm.roomi-fields.com/notebooklm-rest-api\">the API reference</a>; the storage pattern is in\n<a class=\"\" href=\"https://notebooklm.roomi-fields.com/notebooklm-rtfm\">the RTFM integration page</a>.</p>",
            "url": "https://notebooklm.roomi-fields.com/blog/notebooklm-citations-as-json",
            "title": "Getting NotebookLM citations as structured JSON",
            "summary": "NotebookLM shows citations as clickable markers in the web app and exports none of them. How to get the source names and the cited passages back as data an agent can act on.",
            "date_modified": "2026-10-18T00:00:00.000Z",
            "author": {
                "name": "Romain Peyrichou",
                "url": "https://github.com/roomi-fields"
            },
            "tags": [
                "notebooklm",
                "citations"
            ]
        },
        {
            "id": "https://notebooklm.roomi-fields.com/blog/notebooklm-from-claude-code",
            "content_html": "<p>Claude Code is good at reasoning and bad at knowing what is in your PDFs. If\nyou have already put those documents into NotebookLM, you can hand the agent a\nway to ask them — and get back answers that name the source and quote the\npassage, instead of a confident paragraph you then have to verify.</p>\n<p>Two commands and one login.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-does-the-agent-actually-gain\">What does the agent actually gain?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-from-claude-code#what-does-the-agent-actually-gain\" class=\"hash-link\" aria-label=\"Direct link to What does the agent actually gain?\" title=\"Direct link to What does the agent actually gain?\" translate=\"no\">​</a></h2>\n<p>Grounding, and a way to show its work. A NotebookLM answer comes back with the\nsources it used and the exact passages it drew on. For an agent that matters\nmore than for a human reader: the agent can carry the citation into whatever it\nwrites next, and you can check it without re-reading the corpus.</p>\n<p>It also gains the Studio side — audio overviews, reports, mind maps, study\naids — which it can trigger and then collect.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"how-do-you-install-it\">How do you install it?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-from-claude-code#how-do-you-install-it\" class=\"hash-link\" aria-label=\"Direct link to How do you install it?\" title=\"Direct link to How do you install it?\" translate=\"no\">​</a></h2>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">/plugin marketplace add roomi-fields/claude-plugins</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">/plugin install notebooklm@roomi-fields</span><br></div></code></pre></div></div>\n<p>That registers the server and an agent skill that teaches Claude when to reach\nfor it. Node 22 or newer.</p>\n<p>Then log into Google once, in a terminal rather than through the agent:</p>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">npx -y -p @roomi-fields/notebooklm-mcp notebooklm-mcp-setup-auth</span><br></div></code></pre></div></div>\n<p>A visible Chrome opens, you log in, and the session is saved. Run it in a\nterminal because the login can take minutes and an MCP client will time the\ntool call out first.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"why-is-the-login-separate\">Why is the login separate?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-from-claude-code#why-is-the-login-separate\" class=\"hash-link\" aria-label=\"Direct link to Why is the login separate?\" title=\"Direct link to Why is the login separate?\" translate=\"no\">​</a></h2>\n<p>NotebookLM has no developer key for personal accounts. Reaching your own\nnotebooks means holding your own session, the way your browser does. That\nsession lives on your machine, outside the project directory, and it survives\nrestarts and days.</p>\n<p>It also means the session is worth protecting, which is why the server listens\non loopback and refuses to bind anywhere else without a token.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-does-a-first-query-look-like\">What does a first query look like?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-from-claude-code#what-does-a-first-query-look-like\" class=\"hash-link\" aria-label=\"Direct link to What does a first query look like?\" title=\"Direct link to What does a first query look like?\" translate=\"no\">​</a></h2>\n<p>Ask the agent in plain language — \"what do my notebooks say about X\" — and let\nit pick the notebook. Under the hood it lists your notebooks, asks the\nquestion, and returns the answer with citations attached.</p>\n<p>The one option worth knowing is the citation format. Ask for the machine\n-readable one when the answer feeds something else: you get the source names\nand the cited excerpts as data rather than as footnote markers in prose.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"when-is-this-not-the-right-tool\">When is this not the right tool?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-from-claude-code#when-is-this-not-the-right-tool\" class=\"hash-link\" aria-label=\"Direct link to When is this not the right tool?\" title=\"Direct link to When is this not the right tool?\" translate=\"no\">​</a></h2>\n<ul>\n<li class=\"\"><strong>For code.</strong> NotebookLM reasons over documents, not over a repository. For\ncode, a code-aware index serves the agent far better.</li>\n<li class=\"\"><strong>For one quick question about one PDF.</strong> Attaching the file to the\nconversation is faster than curating a notebook.</li>\n<li class=\"\"><strong>For unattended loops that must not stall.</strong> Usage is compute-based and\nrefreshes every 5 hours; a long run can stop mid-way. Plan for it, or cache.</li>\n<li class=\"\"><strong>For notebooks shared with you rather than owned by you.</strong> Google refuses\nStudio generation on those, and no client can work around it.</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"upgrading-later\">Upgrading later<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-from-claude-code#upgrading-later\" class=\"hash-link\" aria-label=\"Direct link to Upgrading later\" title=\"Direct link to Upgrading later\" translate=\"no\">​</a></h2>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">/plugin marketplace update roomi-fields</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">/reload-plugins</span><br></div></code></pre></div></div>\n<p>There is no <code>/plugin update</code>. Full setup, including Cursor, Codex and the REST\nroute, is in <a class=\"\" href=\"https://notebooklm.roomi-fields.com/install\">the install guide</a>.</p>",
            "url": "https://notebooklm.roomi-fields.com/blog/notebooklm-from-claude-code",
            "title": "How to use NotebookLM from Claude Code",
            "summary": "Connect your own NotebookLM notebooks to Claude Code as an MCP server, so the agent answers from your documents with citations instead of guessing. Install, login, and the first useful query.",
            "date_modified": "2026-10-18T00:00:00.000Z",
            "author": {
                "name": "Romain Peyrichou",
                "url": "https://github.com/roomi-fields"
            },
            "tags": [
                "notebooklm",
                "claude-code",
                "mcp"
            ]
        },
        {
            "id": "https://notebooklm.roomi-fields.com/blog/notebooklm-mcp-archived-alternative",
            "content_html": "<p><code>PleasePrompto/notebooklm-mcp</code> is the server most guides still point at. Its\nauthor archived it, and the package on npm has not moved since. If you\ninstalled it on the strength of a 2026 tutorial, you are running something\nnobody is fixing.</p>\n<p>This is not a dunk. It was good work, it taught the pattern everyone else\ncopied, and the author said so plainly rather than letting it rot quietly.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"does-an-archived-server-stop-working\">Does an archived server stop working?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-mcp-archived-alternative#does-an-archived-server-stop-working\" class=\"hash-link\" aria-label=\"Direct link to Does an archived server stop working?\" title=\"Direct link to Does an archived server stop working?\" translate=\"no\">​</a></h2>\n<p>Not immediately, and that is the trap. These tools drive interfaces Google\ndoes not document. They keep working until Google changes something, and then\nthey stop — all at once, for everyone.</p>\n<p>That happened in mid-2026, when the web app was rebuilt. Every project in this\nspace broke the same week. The maintained ones shipped fixes; the others\nstayed broken.</p>\n<p>So the question is not whether your install works today. It is who answers\nwhen it stops.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-are-the-alternatives\">What are the alternatives?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-mcp-archived-alternative#what-are-the-alternatives\" class=\"hash-link\" aria-label=\"Direct link to What are the alternatives?\" title=\"Direct link to What are the alternatives?\" translate=\"no\">​</a></h2>\n<p>Several projects are active, in different shapes:</p>\n<ul>\n<li class=\"\"><strong>A Python CLI plus MCP server</strong>, with the broadest coverage of the internal\ninterfaces and the most contributors. If you work in Python, start there.</li>\n<li class=\"\"><strong>A Node MCP server with a local REST API</strong> — ours. One install serves both\nan agent and a workflow tool over HTTP.</li>\n<li class=\"\"><strong>A separate CLI-first project</strong> with a very large tool surface, which is\nworth knowing costs an agent context on every turn.</li>\n</ul>\n<p>Pick on language, on whether you need HTTP, and on how fast the project\nrecovered last time Google moved.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-moves-when-you-switch-from-the-archived-one\">What moves when you switch from the archived one?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-mcp-archived-alternative#what-moves-when-you-switch-from-the-archived-one\" class=\"hash-link\" aria-label=\"Direct link to What moves when you switch from the archived one?\" title=\"Direct link to What moves when you switch from the archived one?\" translate=\"no\">​</a></h2>\n<p>Less than you would expect. Most of its tool names were copied by everyone\nafter it, so an agent's habits largely carry over. In our case 17 of its 19\ntool names work unchanged.</p>\n<p>Two were renamed, because the thing they did grew: generating an audio\noverview became generating <em>content</em> of several kinds, and downloading audio\nbecame downloading content.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-trap-worth-knowing-about\">The trap worth knowing about<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-mcp-archived-alternative#the-trap-worth-knowing-about\" class=\"hash-link\" aria-label=\"Direct link to The trap worth knowing about\" title=\"Direct link to The trap worth knowing about\" translate=\"no\">​</a></h2>\n<p>One environment variable has the same name and a different meaning in\ndifferent projects. In the archived server, the transport variable chose\nbetween the stdio and HTTP ways of talking to the <em>client</em>. In ours, it chooses\nbetween the internal-API and browser ways of talking to <em>NotebookLM</em>.</p>\n<p>Copy a configuration across without reading it and you will set something\nreal, that does something else, silently. Check every variable you carry over\nrather than assuming a shared vocabulary.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"when-should-you-not-migrate-at-all\">When should you not migrate at all?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-mcp-archived-alternative#when-should-you-not-migrate-at-all\" class=\"hash-link\" aria-label=\"Direct link to When should you not migrate at all?\" title=\"Direct link to When should you not migrate at all?\" translate=\"no\">​</a></h2>\n<ul>\n<li class=\"\"><strong>If your install works and the work is finished.</strong> An archived tool that\nalready produced what you needed owes you nothing.</li>\n<li class=\"\"><strong>If you only ever ask one notebook one kind of question.</strong> The web app is\nright there, and it is better at that than any of us.</li>\n<li class=\"\"><strong>If you have an enterprise licence.</strong> Google's own API is supported and\nnothing here competes with a contract.</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"trying-this-one\">Trying this one<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-mcp-archived-alternative#trying-this-one\" class=\"hash-link\" aria-label=\"Direct link to Trying this one\" title=\"Direct link to Trying this one\" translate=\"no\">​</a></h2>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">/plugin marketplace add roomi-fields/claude-plugins</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">/plugin install notebooklm@roomi-fields</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">npx -y -p @roomi-fields/notebooklm-mcp notebooklm-mcp-setup-auth</span><br></div></code></pre></div></div>\n<p>The tool-by-tool mapping, the environment variable table and the full feature\ncomparison are on <a class=\"\" href=\"https://notebooklm.roomi-fields.com/compare\">the migration page</a>.</p>",
            "url": "https://notebooklm.roomi-fields.com/blog/notebooklm-mcp-archived-alternative",
            "title": "PleasePrompto/notebooklm-mcp is archived: what to use instead",
            "summary": "The most-recommended NotebookLM MCP server is no longer maintained. The alternatives, what moves when you switch, and the one environment variable that means something different everywhere.",
            "date_modified": "2026-10-18T00:00:00.000Z",
            "author": {
                "name": "Romain Peyrichou",
                "url": "https://github.com/roomi-fields"
            },
            "tags": [
                "notebooklm",
                "mcp",
                "migration"
            ]
        },
        {
            "id": "https://notebooklm.roomi-fields.com/blog/notebooklm-multiple-google-accounts",
            "content_html": "<p>One Google account gives you one allowance. Several give you several, and a\nserver that switches between them when one runs out keeps a long run moving.</p>\n<p>That is the whole idea, and it works. What is worth saying plainly is what it\ndoes not do, and what it asks you to hold on disk.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-rotation-actually-buys\">What rotation actually buys<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-multiple-google-accounts#what-rotation-actually-buys\" class=\"hash-link\" aria-label=\"Direct link to What rotation actually buys\" title=\"Direct link to What rotation actually buys\" translate=\"no\">​</a></h2>\n<p>Since 2 September 2026, NotebookLM meters compute on a rolling five-hour\nwindow rather than counting chats per day. Rotation therefore multiplies a\nbudget, not a quota.</p>\n<p>The difference matters when you plan. With a daily count you could say \"three\naccounts, 150 questions\". With an allowance you cannot: the same three\naccounts carry a long conversation over forty sources far less far than they\ncarry short, fresh questions.</p>\n<p>What you get is continuity — the run does not stop at the first exhausted\naccount — not a number to promise.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"how-does-the-switch-work\">How does the switch work?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-multiple-google-accounts#how-does-the-switch-work\" class=\"hash-link\" aria-label=\"Direct link to How does the switch work?\" title=\"Direct link to How does the switch work?\" translate=\"no\">​</a></h2>\n<p>The server keeps a session per account, notices the usage refusal, and moves\nto the next account that still has room. Each account has its own browser\nprofile, so switching does not disturb the one currently in use.</p>\n<p>Re-authentication mid-run works the same way: the session for that account is\nrefreshed on its own profile, then promoted, rather than restarting\neverything.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"where-do-the-sessions-live\">Where do the sessions live?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-multiple-google-accounts#where-do-the-sessions-live\" class=\"hash-link\" aria-label=\"Direct link to Where do the sessions live?\" title=\"Direct link to Where do the sessions live?\" translate=\"no\">​</a></h2>\n<p>Not in the project directory. They sit in the operating system's application\ndata directory, outside any repository by construction. That is deliberate —\nyou do not want a live Google session inside something you might commit or\ncopy.</p>\n<p>One consequence surprises people: <strong>sessions do not travel</strong>. Copying cookies\nfrom one machine to another fails. Google binds them server-side to the device\nand address that created them, even when the local expiry says they are valid.\nLog in on the machine that will run the work.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"why-that-directory-deserves-care\">Why that directory deserves care<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-multiple-google-accounts#why-that-directory-deserves-care\" class=\"hash-link\" aria-label=\"Direct link to Why that directory deserves care\" title=\"Direct link to Why that directory deserves care\" translate=\"no\">​</a></h2>\n<p>It holds live logins. Anything that can read it can act as you.</p>\n<p>We learned this the uncomfortable way. Our own file-upload tool treated that\ndirectory as an allowed location, so a document could have told an agent to\nadd the session file as a source — and another tool could then have made the\nnotebook public. It is fixed, and the lesson generalises: check what your\ntools can reach, not only what they are for.</p>\n<p>If you run several accounts, you are concentrating several logins in one\nplace. Treat it accordingly.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"when-is-rotation-the-wrong-answer\">When is rotation the wrong answer?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-multiple-google-accounts#when-is-rotation-the-wrong-answer\" class=\"hash-link\" aria-label=\"Direct link to When is rotation the wrong answer?\" title=\"Direct link to When is rotation the wrong answer?\" translate=\"no\">​</a></h2>\n<ul>\n<li class=\"\"><strong>When you re-ask the same questions.</strong> Cache the answers instead. Paying\ntwice across two accounts is still paying twice.</li>\n<li class=\"\"><strong>When the accounts are not yours.</strong> Using colleagues' accounts to stretch\nan allowance is a policy problem before it is a technical one.</li>\n<li class=\"\"><strong>When one paid plan would do.</strong> AI Plus doubles the allowance and AI Pro\nquadruples it, with one login to secure instead of three.</li>\n<li class=\"\"><strong>When the work must be reproducible.</strong> Which account answered changes\nnothing about correctness, but it does complicate an audit trail.</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"trying-this-one\">Trying this one<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-multiple-google-accounts#trying-this-one\" class=\"hash-link\" aria-label=\"Direct link to Trying this one\" title=\"Direct link to Trying this one\" translate=\"no\">​</a></h2>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">/plugin marketplace add roomi-fields/claude-plugins</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">/plugin install notebooklm@roomi-fields</span><br></div></code></pre></div></div>\n<p>Adding accounts, inspecting their state and forcing a switch are covered in\n<a class=\"\" href=\"https://notebooklm.roomi-fields.com/notebooklm-multi-account\">multi-account</a>. Where sessions are stored, and how\nto move them, is in <a class=\"\" href=\"https://notebooklm.roomi-fields.com/CONFIGURATION\">configuration</a>.</p>",
            "url": "https://notebooklm.roomi-fields.com/blog/notebooklm-multiple-google-accounts",
            "title": "Running NotebookLM across multiple Google accounts",
            "summary": "Rotating accounts multiplies a compute allowance, not a daily quota. How automatic rotation works, where the sessions live, and why that directory deserves more care than most people give it.",
            "date_modified": "2026-10-18T00:00:00.000Z",
            "author": {
                "name": "Romain Peyrichou",
                "url": "https://github.com/roomi-fields"
            },
            "tags": [
                "notebooklm",
                "accounts",
                "quotas"
            ]
        },
        {
            "id": "https://notebooklm.roomi-fields.com/blog/notebooklm-n8n-zapier-make",
            "content_html": "<p>Zapier's NotebookLM page says the integration has not been built. Make has no\nmodule. n8n has no node. Every walkthrough you find does something adjacent —\nsaving files to Drive, which you then add to a notebook by hand.</p>\n<p>That is the honest state. What follows is the workaround that actually\nautomates the part people want: asking a question and getting a\ncitation-backed answer into the workflow.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"why-is-there-no-connector\">Why is there no connector?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-n8n-zapier-make#why-is-there-no-connector\" class=\"hash-link\" aria-label=\"Direct link to Why is there no connector?\" title=\"Direct link to Why is there no connector?\" translate=\"no\">​</a></h2>\n<p>Because a connector needs an API with a key, and the consumer NotebookLM has\nneither. Google's documented API is the enterprise one, behind a Cloud project\nand an administrator. A connector built on it would serve the subset of users\nwho could already script it.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-does-the-workaround-look-like\">What does the workaround look like?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-n8n-zapier-make#what-does-the-workaround-look-like\" class=\"hash-link\" aria-label=\"Direct link to What does the workaround look like?\" title=\"Direct link to What does the workaround look like?\" translate=\"no\">​</a></h2>\n<p>Run a small HTTP server on a machine your workflow can reach. It holds your\nGoogle session and exposes the operations as ordinary endpoints. Your workflow\nthen uses the same HTTP node it would use for any other service.</p>\n<p>In n8n that is one HTTP Request node: POST the question, read the answer and\nits citations out of the response, pass them to the next step. In Make and\nZapier it is their generic webhook or HTTP action.</p>\n<p>The answer arrives as data, so it can go to a sheet, a Slack message, a\ndatabase row or a document, like anything else in the workflow.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"where-does-the-server-have-to-run\">Where does the server have to run?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-n8n-zapier-make#where-does-the-server-have-to-run\" class=\"hash-link\" aria-label=\"Direct link to Where does the server have to run?\" title=\"Direct link to Where does the server have to run?\" translate=\"no\">​</a></h2>\n<p>Somewhere the workflow engine can reach, which is the real constraint.</p>\n<p>Self-hosted n8n on the same machine is the simple case: the server stays on\nloopback and nothing is exposed. Cloud-hosted n8n, Zapier or Make cannot reach\nyour laptop, so you need the server on a host they can see — and at that point\nyou are exposing an endpoint that holds a live Google session.</p>\n<p>If you do that, set a token. Our server refuses to start on a public interface\nwithout one, which is deliberate: the failure is louder than a leak.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-is-worth-automating-this-way\">What is worth automating this way?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-n8n-zapier-make#what-is-worth-automating-this-way\" class=\"hash-link\" aria-label=\"Direct link to What is worth automating this way?\" title=\"Direct link to What is worth automating this way?\" translate=\"no\">​</a></h2>\n<p>The jobs where the answer is one step of several. A weekly digest that asks\neach notebook what changed. A support flow that answers from internal\ndocumentation with the passage attached. A research pipeline that files each\nanswer with its citations into a table.</p>\n<p>The pattern that pays best is answer-once-then-store. Usage is a compute\nallowance now, refreshed every five hours, so a workflow that re-asks the same\nquestion every run is spending for nothing.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"when-is-this-the-wrong-design\">When is this the wrong design?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-n8n-zapier-make#when-is-this-the-wrong-design\" class=\"hash-link\" aria-label=\"Direct link to When is this the wrong design?\" title=\"Direct link to When is this the wrong design?\" translate=\"no\">​</a></h2>\n<ul>\n<li class=\"\"><strong>When latency matters.</strong> An answer takes seconds, not milliseconds. Do not\nput it in front of a user who is waiting.</li>\n<li class=\"\"><strong>When the workflow must never stall.</strong> The allowance can run out mid-run.</li>\n<li class=\"\"><strong>When you would be exposing the server to the public internet just to reach\na cloud workflow tool.</strong> Weigh that against moving the workflow instead.</li>\n<li class=\"\"><strong>When a plain Gemini API call would do.</strong> If you do not need grounding in\nyour own documents, you do not need any of this.</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"trying-this-one\">Trying this one<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-n8n-zapier-make#trying-this-one\" class=\"hash-link\" aria-label=\"Direct link to Trying this one\" title=\"Direct link to Trying this one\" translate=\"no\">​</a></h2>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">git clone https://github.com/roomi-fields/notebooklm-mcp.git</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">cd notebooklm-mcp &amp;&amp; npm install &amp;&amp; npm run build</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">npx -y -p @roomi-fields/notebooklm-mcp notebooklm-mcp-setup-auth</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">HTTP_PORT=3000 node dist/http-wrapper.js</span><br></div></code></pre></div></div>\n<p>Node 22 or newer. The worked n8n flow is in\n<a class=\"\" href=\"https://notebooklm.roomi-fields.com/notebooklm-n8n\">the n8n guide</a>; the full endpoint list is in\n<a class=\"\" href=\"https://notebooklm.roomi-fields.com/notebooklm-rest-api\">the API reference</a>.</p>",
            "url": "https://notebooklm.roomi-fields.com/blog/notebooklm-n8n-zapier-make",
            "title": "NotebookLM in n8n, Zapier and Make: there is no connector",
            "summary": "None of the three has a NotebookLM integration, and Zapier says so on its own page. The workaround is a local HTTP endpoint your workflow calls like any other API.",
            "date_modified": "2026-10-18T00:00:00.000Z",
            "author": {
                "name": "Romain Peyrichou",
                "url": "https://github.com/roomi-fields"
            },
            "tags": [
                "notebooklm",
                "n8n",
                "zapier",
                "automation"
            ]
        },
        {
            "id": "https://notebooklm.roomi-fields.com/blog/notebooklm-usage-limits-automation",
            "content_html": "<p>If your script waits until midnight for the quota to reset, it is waiting for\nsomething that no longer happens. On 2 September 2026 Google replaced\nNotebookLM's fixed daily chat caps with a compute-based allowance that\nrefreshes every five hours, up to a weekly ceiling.</p>\n<p>Our own documentation said \"50 queries per day, resets at midnight UTC\" until\nthis week. It was wrong, and we had been repeating it for months.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-is-actually-metered-now\">What is actually metered now?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-usage-limits-automation#what-is-actually-metered-now\" class=\"hash-link\" aria-label=\"Direct link to What is actually metered now?\" title=\"Direct link to What is actually metered now?\" translate=\"no\">​</a></h2>\n<p>Not requests. Google's own wording is that limits are compute-based and depend\non \"the complexity of your prompt\" and \"the models and features you use\".\nChat length and the number of sources count too.</p>\n<p>The practical consequence: two scripts issuing the same number of questions\ncan consume wildly different amounts. A long conversation across forty sources\nis not the same purchase as forty short, fresh questions.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"when-does-it-come-back\">When does it come back?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-usage-limits-automation#when-does-it-come-back\" class=\"hash-link\" aria-label=\"Direct link to When does it come back?\" title=\"Direct link to When does it come back?\" translate=\"no\">​</a></h2>\n<p>Every five hours, on a rolling window, until you hit a weekly ceiling. There is\nno daily reset and no fixed hour to wait for. The remaining balance and the\nreset time are shown in the app under <strong>Settings → Usage</strong>, and in the chat\nwhen you get close.</p>\n<p>Paid plans multiply the allowance rather than changing the mechanism — two\ntimes on AI Plus, four on AI Pro, more above that.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-should-change-in-a-batch-script\">What should change in a batch script?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-usage-limits-automation#what-should-change-in-a-batch-script\" class=\"hash-link\" aria-label=\"Direct link to What should change in a batch script?\" title=\"Direct link to What should change in a batch script?\" translate=\"no\">​</a></h2>\n<p><strong>Stop counting.</strong> A counter that stops at 50 either stops too early or too\nlate, and you cannot tell which.</p>\n<p><strong>Prefer short, stateless questions.</strong> Each one costs less than extending a\nconversation that carries its whole history. If you do not need the thread,\ndo not open one.</p>\n<p><strong>Narrow the source list.</strong> Asking against the three relevant sources instead\nof the whole notebook is cheaper as well as more accurate.</p>\n<p><strong>Make the run resumable.</strong> The allowance will run out mid-batch sooner or\nlater. A run that records each answer as it arrives loses nothing; a run that\nwrites at the end loses everything.</p>\n<p><strong>Treat the refusal as a signal, not an error.</strong> When the server reports the\nlimit, back off for the window rather than retrying immediately.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"does-rotating-accounts-still-help\">Does rotating accounts still help?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-usage-limits-automation#does-rotating-accounts-still-help\" class=\"hash-link\" aria-label=\"Direct link to Does rotating accounts still help?\" title=\"Direct link to Does rotating accounts still help?\" translate=\"no\">​</a></h2>\n<p>Yes, with a caveat worth being clear about. Rotation moves work onto another\naccount's allowance when the first runs out. It multiplies a budget, not a\nquota, and it does nothing about the fact that you can no longer predict how\nfar that budget goes.</p>\n<p>It is also a per-account login each time, with everything that implies for\nwhere those sessions live.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"when-is-notebooklm-the-wrong-place-for-the-work\">When is NotebookLM the wrong place for the work?<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-usage-limits-automation#when-is-notebooklm-the-wrong-place-for-the-work\" class=\"hash-link\" aria-label=\"Direct link to When is NotebookLM the wrong place for the work?\" title=\"Direct link to When is NotebookLM the wrong place for the work?\" translate=\"no\">​</a></h2>\n<ul>\n<li class=\"\"><strong>When you re-ask the same questions.</strong> Answer once, store the result, query\nyour own store afterwards. Paying the allowance twice for the same answer is\nthe most common waste we see.</li>\n<li class=\"\"><strong>When you only need generation, not grounding.</strong> The Gemini API is public\nand supported, with limits you can plan against.</li>\n<li class=\"\"><strong>When the deadline is fixed.</strong> A compute-based allowance with a weekly\nceiling is not something to promise a delivery date on.</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"trying-this-one\">Trying this one<a href=\"https://notebooklm.roomi-fields.com/blog/notebooklm-usage-limits-automation#trying-this-one\" class=\"hash-link\" aria-label=\"Direct link to Trying this one\" title=\"Direct link to Trying this one\" translate=\"no\">​</a></h2>\n<div class=\"language-bash codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-bash codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">/plugin marketplace add roomi-fields/claude-plugins</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">/plugin install notebooklm@roomi-fields</span><br></div></code></pre></div></div>\n<p>The batch pattern, including how to cache answers so a re-run costs nothing,\nis in <a class=\"\" href=\"https://notebooklm.roomi-fields.com/batch-1000-questions\">running a thousand questions</a>. Account rotation\nis in <a class=\"\" href=\"https://notebooklm.roomi-fields.com/notebooklm-multi-account\">multi-account</a>.</p>",
            "url": "https://notebooklm.roomi-fields.com/blog/notebooklm-usage-limits-automation",
            "title": "NotebookLM usage limits changed: what breaks in your automation",
            "summary": "Since 2 September 2026 NotebookLM meters compute on a rolling 5-hour window instead of counting 50 chats a day. Every script that planned against a daily quota is now planning against a number that does not exist.",
            "date_modified": "2026-10-18T00:00:00.000Z",
            "author": {
                "name": "Romain Peyrichou",
                "url": "https://github.com/roomi-fields"
            },
            "tags": [
                "notebooklm",
                "quotas",
                "automation"
            ]
        }
    ]
}