<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://notebooklm.roomi-fields.com/blog</id>
    <title>NotebookLM automation notes</title>
    <updated>2026-10-18T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://notebooklm.roomi-fields.com/blog"/>
    <subtitle>NotebookLM MCP + HTTP REST API Blog</subtitle>
    <icon>https://notebooklm.roomi-fields.com/img/favicon.ico</icon>
    <rights>MIT — roomi-fields</rights>
    <entry>
        <title type="html"><![CDATA[Does NotebookLM have an API? The 2026 answer]]></title>
        <id>https://notebooklm.roomi-fields.com/blog/does-notebooklm-have-an-api</id>
        <link href="https://notebooklm.roomi-fields.com/blog/does-notebooklm-have-an-api"/>
        <updated>2026-10-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[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.]]></summary>
        <content type="html"><![CDATA[<p>Yes and no, and the honest answer changed during 2026. Google does publish an
API for Gemini Notebook Enterprise, in preview, behind a Cloud project and a
licence. The consumer NotebookLM you log into with a personal Google account
still has no developer key, and the standalone Podcast API that some posts
point at is deprecated and not taking new customers.</p>
<p>Most answers you will find say flatly "there is no API". That was true and is
now wrong, which is worse than either.</p>
<!-- -->
<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>
<p>Google documents a REST surface for Gemini Notebook Enterprise, including
notebook operations and audio overviews — a notebook holds one audio overview
at a time, created through <code>notebooks.audioOverviews.create</code>. It is marked
pre-GA, which means the terms and the shape can both move.</p>
<p>The access path is the part people miss. It needs a Google Cloud project and a
Gemini Enterprise or Education Premium licence, set up by an administrator. It
is not a key you sign up for on a developer console, and it does not reach the
notebooks in your personal account.</p>
<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>
<p>Deprecated. Google is not allowlisting new customers for it. If a tutorial
tells you to request access, that tutorial is out of date.</p>
<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>
<p>Community projects that drive the same interfaces the web app uses. There are
several, in Python and in Node, exposing them as a CLI, as an MCP server, or as
a local REST API. They work, they are fast, and they reach your own notebooks
with your own login.</p>
<p>They also share one honest caveat: nothing about those interfaces is promised.
Google can change them, and when it does the project breaks until someone
fixes it. That has happened — the mid-2026 interface rebuild broke every such
tool at once.</p>
<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>
<p>Three questions settle it.</p>
<p><strong>Do you have an enterprise licence and an administrator?</strong> Then use the
official API. It is supported, it is the only route with a contract behind it,
and nothing below competes with that.</p>
<p><strong>Do you need your own personal notebooks?</strong> Then the official API is out, and
a community tool is the only route that exists.</p>
<p><strong>Do you need it to keep working unattended?</strong> Weigh how quickly the project
you pick has recovered from past breakages. That is the only signal that
matters, and the commit history tells you more than the README.</p>
<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>
<ul>
<li class="">When the work is contractual — a client deliverable, a regulated pipeline, an
SLA. An undocumented interface has no promise attached to it.</li>
<li class="">When you only need text generation over documents. The Gemini API is public,
supported and cheaper to reason about; NotebookLM's value is its grounding
and citation behaviour, not its text generation.</li>
<li class="">When you cannot run a browser anywhere. Login still happens in a real Chrome,
once, even for the tools that avoid the browser afterwards.</li>
</ul>
<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>
<p>Our own route is both an MCP server and a local REST API, so an agent and a
workflow tool can use the same install.</p>
<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>
<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
full endpoint list is in <a class="" href="https://notebooklm.roomi-fields.com/notebooklm-rest-api">the API reference</a>.</p>]]></content>
        <author>
            <name>Romain Peyrichou</name>
            <uri>https://github.com/roomi-fields</uri>
        </author>
        <category label="notebooklm" term="notebooklm"/>
        <category label="api" term="api"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Your MCP server is probably listening on 0.0.0.0]]></title>
        <id>https://notebooklm.roomi-fields.com/blog/mcp-server-listening-on-0-0-0-0</id>
        <link href="https://notebooklm.roomi-fields.com/blog/mcp-server-listening-on-0-0-0-0"/>
        <updated>2026-10-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[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.]]></summary>
        <content type="html"><![CDATA[<p>Until version 4.0.0 this server bound to every network interface, accepted any
browser origin, and required no credential on any of its 45 routes. Anyone on
the same Wi-Fi could drive it. Any web page you visited could drive it too.</p>
<p>Someone reported it. We fixed it, published the advisory, and then found a
second hole of the same family a few weeks later. Here is what we learned,
written down because the pattern is not ours alone — researchers scanning
public MCP servers keep finding the same three mistakes.</p>
<!-- -->
<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>
<p>It means the server answers on your laptop's address on the local network, not
just on <code>localhost</code>. On a home network that is your household. On café Wi-Fi,
a conference network or a shared office, it is everyone within reach.</p>
<p>What they get is whatever your tools do. For us that was reading your
notebooks, adding sources, generating content and sharing a notebook publicly.
For other servers it has been arbitrary code execution — Penpot's MCP server
and MCPJam's inspector both shipped unauthenticated execution endpoints bound
to every interface.</p>
<p>The exposure is not exotic. A survey of reachable MCP servers found hundreds
with this shape, and a large minority with no authentication mechanism at all.</p>
<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>
<p>No, and this is the part that surprises people. A web page you visit can make
requests to <code>localhost</code> from inside your browser. If the server answers them,
the page is driving your tools with your session, from the outside.</p>
<p>That is not theory. CVE-2025-49596 in the MCP Inspector scored 9.4 precisely
because a malicious site could reach a service listening only on loopback and
get to code execution.</p>
<p>The defence is to refuse requests that carry a foreign origin, rather than
merely declining to send a permissive header back. Those are different things:
the second blocks the page from <em>reading</em> the reply, while the request still
executes. For anything that writes, that distinction is the whole game.</p>
<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>
<p><strong>Bind to loopback by default, and fail loudly otherwise.</strong> Our server now
refuses to start on a public interface unless a token is set. Not a warning —
a refusal, because a warning in a log nobody reads is not a control.</p>
<p><strong>Refuse foreign origins outright.</strong> Requests from an origin that is not
allow-listed get a 403 before any handler runs, reads included.</p>
<p><strong>Require a token when exposed, and compare it in constant time.</strong> The
comparison detail is small but free: compare digests, not strings.</p>
<p>In a container the first rule inverts — a published port is useless on
loopback — so the entrypoint binds to all interfaces and exits with an
explanation if no token is set.</p>
<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>
<p>File paths. Three of our tools take a path from the caller: one reads a file to
upload, two write one. The data directory was an allowed root, and that
directory holds the live Google session.</p>
<p>So a document could tell an agent to add the session file as a source, and
another tool could then make that notebook public. Not a file leak — an account
takeover, via a tool that looks like it only reads documents.</p>
<p>Three things made it work, and all three are worth checking in your own code:</p>
<ul>
<li class="">the path was checked before it was resolved, so the check applied to a string
that was not what got opened;</li>
<li class="">symlinks were never followed, so a link inside an allowed directory walked
straight out of it;</li>
<li class="">containment was a string prefix test, so <code>/data-evil</code> passed a check for
<code>/data</code>.</li>
</ul>
<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>
<ul>
<li class="">Default to loopback. Make exposure a deliberate act that fails without a
credential.</li>
<li class="">Treat every caller-supplied path as hostile. An agent acts on text it was
handed, so your tool arguments are reachable by whoever wrote that text.</li>
<li class="">Check what your tools can reach, not just what they are for. Ours could reach
the session that authorises them.</li>
<li class="">Write the guard, then break it on purpose and confirm it fails. Two of ours
did not bite on the first attempt.</li>
</ul>
<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>
<p>If your server is stdio-only, it has no port and none of this applies. Most of
the risk arrives with the HTTP transport, which people add for n8n or for a
remote machine and then forget is listening.</p>
<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>
<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>
<p>The full model, including what the container requires, is in
<a class="" href="https://notebooklm.roomi-fields.com/security">the security page</a>. Past advisories are listed there too.</p>]]></content>
        <author>
            <name>Romain Peyrichou</name>
            <uri>https://github.com/roomi-fields</uri>
        </author>
        <category label="mcp" term="mcp"/>
        <category label="security" term="security"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Generating NotebookLM audio overviews programmatically]]></title>
        <id>https://notebooklm.roomi-fields.com/blog/notebooklm-audio-overviews-programmatically</id>
        <link href="https://notebooklm.roomi-fields.com/blog/notebooklm-audio-overviews-programmatically"/>
        <updated>2026-10-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[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.]]></summary>
        <content type="html"><![CDATA[<p>The audio overview is the feature that made NotebookLM famous, and the one
people most want to run in a loop — one podcast per report, per client, per
week. Doing that without clicking is possible by three different routes, and
they are not equivalent.</p>
<!-- -->
<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>
<p>Google documents audio overview creation in the Gemini Notebook Enterprise
API. A notebook holds one audio overview at a time, so a loop means creating
notebooks, not stacking overviews.</p>
<p>It is pre-GA, and it needs a Cloud project plus an enterprise or education
licence with an administrator to turn it on. If you have that, stop reading —
it is supported and nothing below is.</p>
<p>The separate Podcast API that older tutorials point at is deprecated and not
taking new customers.</p>
<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>
<p>The oldest community approach: a real browser clicks the same buttons you
would. It works, it reaches your personal notebooks, and it is slow — minutes
per generation, most of it waiting.</p>
<p>Its weakness is the web app. When Google rebuilt the interface in mid-2026,
every selector moved and every browser-driven tool broke at once.</p>
<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>
<p>Newer tools call the same internal requests the web app makes, skipping the
page entirely. Generation that took minutes through the browser takes seconds
to kick off, and the result is read back directly rather than scraped.</p>
<p>It is immune to visual redesigns, because there is no selector to break. It is
not immune to the interface itself changing, which is a different and rarer
event.</p>
<p>Our own server does this first and falls back to the browser when the internal
route does not answer — deliberately, because the two break for different
reasons and rarely at the same time.</p>
<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>
<p><strong>You must own the notebook.</strong> Google refuses Studio generation on notebooks
merely shared with you. The refusal arrives as a permission status buried in
the response, which is easy to misread as "the identifier changed" — we lost
two investigations to exactly that before reading the raw body.</p>
<p><strong>One overview per notebook.</strong> Plan the loop around notebooks, not around
generations.</p>
<p><strong>Generation costs allowance.</strong> Usage is compute-based and refreshes every
five hours. Audio is one of the expensive features, so a batch will hit the
ceiling sooner than the same number of questions would.</p>
<p><strong>The download is not the obvious URL.</strong> The media link serves a viewer page,
not the file, so a naive fetch returns HTML that looks like a success.</p>
<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>
<ul>
<li class=""><strong>For a handful a month.</strong> The web app is three clicks and no maintenance.</li>
<li class=""><strong>When you need a specific voice, length or script.</strong> You get the format
NotebookLM produces; a text-to-speech pipeline over your own script gives
you control it does not.</li>
<li class=""><strong>When the output is client-facing and must arrive on a date.</strong> An
undocumented interface and a compute allowance are two reasons it might not.</li>
</ul>
<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>
<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>
<p>Generation, listing and download are covered in
<a class="" href="https://notebooklm.roomi-fields.com/CONTENT-MANAGEMENT">content management</a>; the REST equivalents are
in <a class="" href="https://notebooklm.roomi-fields.com/notebooklm-rest-api">the API reference</a>.</p>]]></content>
        <author>
            <name>Romain Peyrichou</name>
            <uri>https://github.com/roomi-fields</uri>
        </author>
        <category label="notebooklm" term="notebooklm"/>
        <category label="audio" term="audio"/>
        <category label="automation" term="automation"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Getting NotebookLM citations as structured JSON]]></title>
        <id>https://notebooklm.roomi-fields.com/blog/notebooklm-citations-as-json</id>
        <link href="https://notebooklm.roomi-fields.com/blog/notebooklm-citations-as-json"/>
        <updated>2026-10-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[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.]]></summary>
        <content type="html"><![CDATA[<p>NotebookLM's best feature is that every claim points at the passage it came
from. Its worst export story is that those pointers stay in the web app. Copy
an answer out and you get prose with little numbers in it.</p>
<p>If you are feeding answers to anything downstream — a review, a database, an
agent that must not invent — the citation is the part you actually need.</p>
<!-- -->
<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>
<p>Two things worth separating. The <strong>source name</strong> tells you which document a
claim came from. The <strong>excerpt</strong> is the passage itself, the few sentences the
model drew on.</p>
<p>The first is cheap to get and almost always enough to audit an answer. The
second is what lets a downstream reader judge without opening the source, and
it costs more to obtain.</p>
<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>
<p>Ask for a machine-readable citation format when you make the request. Our
server takes a <code>source_format</code> on every question:</p>
<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>
<p><code>json</code> is the one to use when something other than a person reads the result.
<code>expanded</code> is the one for a human report.</p>
<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>
<p>Because of where each lives. Source names sit in the answer's markup and come
back in one pass. Excerpts are revealed by opening each citation, which means
asking for each one in turn and collecting what comes back.</p>
<p>That is slower, and it is why the two are separate options rather than one.
If you only need to know <em>which</em> document answered, do not pay for the rest.</p>
<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>
<p>The pattern we keep coming back to: write each answer, with its citations, as
a document in a store you control — a vault, a table, a search index. Then
query that store instead of re-asking.</p>
<p>It costs one pass through NotebookLM and nothing thereafter, which matters
more since usage became a compute allowance rather than a query count. It also
gives you something NotebookLM does not: a corpus of past answers you can
search, diff and cite.</p>
<p>We emit those documents against a published schema so the shape does not drift
between versions.</p>
<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>
<ul>
<li class=""><strong>When you are reading the answers yourself, in the app.</strong> The clickable
markers are better than anything you would export.</li>
<li class=""><strong>When the answer is a one-off.</strong> The citation machinery earns its keep over
a corpus, not over a question.</li>
<li class=""><strong>When you need page numbers or offsets.</strong> You get the passage and the source
name, not a position in the original document.</li>
</ul>
<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>
<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>
<p>The request and response shapes are in
<a class="" href="https://notebooklm.roomi-fields.com/notebooklm-rest-api">the API reference</a>; the storage pattern is in
<a class="" href="https://notebooklm.roomi-fields.com/notebooklm-rtfm">the RTFM integration page</a>.</p>]]></content>
        <author>
            <name>Romain Peyrichou</name>
            <uri>https://github.com/roomi-fields</uri>
        </author>
        <category label="notebooklm" term="notebooklm"/>
        <category label="citations" term="citations"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[How to use NotebookLM from Claude Code]]></title>
        <id>https://notebooklm.roomi-fields.com/blog/notebooklm-from-claude-code</id>
        <link href="https://notebooklm.roomi-fields.com/blog/notebooklm-from-claude-code"/>
        <updated>2026-10-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[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.]]></summary>
        <content type="html"><![CDATA[<p>Claude Code is good at reasoning and bad at knowing what is in your PDFs. If
you have already put those documents into NotebookLM, you can hand the agent a
way to ask them — and get back answers that name the source and quote the
passage, instead of a confident paragraph you then have to verify.</p>
<p>Two commands and one login.</p>
<!-- -->
<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>
<p>Grounding, and a way to show its work. A NotebookLM answer comes back with the
sources it used and the exact passages it drew on. For an agent that matters
more than for a human reader: the agent can carry the citation into whatever it
writes next, and you can check it without re-reading the corpus.</p>
<p>It also gains the Studio side — audio overviews, reports, mind maps, study
aids — which it can trigger and then collect.</p>
<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>
<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>
<p>That registers the server and an agent skill that teaches Claude when to reach
for it. Node 22 or newer.</p>
<p>Then log into Google once, in a terminal rather than through the agent:</p>
<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>
<p>A visible Chrome opens, you log in, and the session is saved. Run it in a
terminal because the login can take minutes and an MCP client will time the
tool call out first.</p>
<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>
<p>NotebookLM has no developer key for personal accounts. Reaching your own
notebooks means holding your own session, the way your browser does. That
session lives on your machine, outside the project directory, and it survives
restarts and days.</p>
<p>It also means the session is worth protecting, which is why the server listens
on loopback and refuses to bind anywhere else without a token.</p>
<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>
<p>Ask the agent in plain language — "what do my notebooks say about X" — and let
it pick the notebook. Under the hood it lists your notebooks, asks the
question, and returns the answer with citations attached.</p>
<p>The one option worth knowing is the citation format. Ask for the machine
-readable one when the answer feeds something else: you get the source names
and the cited excerpts as data rather than as footnote markers in prose.</p>
<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>
<ul>
<li class=""><strong>For code.</strong> NotebookLM reasons over documents, not over a repository. For
code, a code-aware index serves the agent far better.</li>
<li class=""><strong>For one quick question about one PDF.</strong> Attaching the file to the
conversation is faster than curating a notebook.</li>
<li class=""><strong>For unattended loops that must not stall.</strong> Usage is compute-based and
refreshes every 5 hours; a long run can stop mid-way. Plan for it, or cache.</li>
<li class=""><strong>For notebooks shared with you rather than owned by you.</strong> Google refuses
Studio generation on those, and no client can work around it.</li>
</ul>
<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>
<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>
<p>There is no <code>/plugin update</code>. Full setup, including Cursor, Codex and the REST
route, is in <a class="" href="https://notebooklm.roomi-fields.com/install">the install guide</a>.</p>]]></content>
        <author>
            <name>Romain Peyrichou</name>
            <uri>https://github.com/roomi-fields</uri>
        </author>
        <category label="notebooklm" term="notebooklm"/>
        <category label="claude-code" term="claude-code"/>
        <category label="mcp" term="mcp"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[PleasePrompto/notebooklm-mcp is archived: what to use instead]]></title>
        <id>https://notebooklm.roomi-fields.com/blog/notebooklm-mcp-archived-alternative</id>
        <link href="https://notebooklm.roomi-fields.com/blog/notebooklm-mcp-archived-alternative"/>
        <updated>2026-10-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[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.]]></summary>
        <content type="html"><![CDATA[<p><code>PleasePrompto/notebooklm-mcp</code> is the server most guides still point at. Its
author archived it, and the package on npm has not moved since. If you
installed it on the strength of a 2026 tutorial, you are running something
nobody is fixing.</p>
<p>This is not a dunk. It was good work, it taught the pattern everyone else
copied, and the author said so plainly rather than letting it rot quietly.</p>
<!-- -->
<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>
<p>Not immediately, and that is the trap. These tools drive interfaces Google
does not document. They keep working until Google changes something, and then
they stop — all at once, for everyone.</p>
<p>That happened in mid-2026, when the web app was rebuilt. Every project in this
space broke the same week. The maintained ones shipped fixes; the others
stayed broken.</p>
<p>So the question is not whether your install works today. It is who answers
when it stops.</p>
<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>
<p>Several projects are active, in different shapes:</p>
<ul>
<li class=""><strong>A Python CLI plus MCP server</strong>, with the broadest coverage of the internal
interfaces and the most contributors. If you work in Python, start there.</li>
<li class=""><strong>A Node MCP server with a local REST API</strong> — ours. One install serves both
an agent and a workflow tool over HTTP.</li>
<li class=""><strong>A separate CLI-first project</strong> with a very large tool surface, which is
worth knowing costs an agent context on every turn.</li>
</ul>
<p>Pick on language, on whether you need HTTP, and on how fast the project
recovered last time Google moved.</p>
<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>
<p>Less than you would expect. Most of its tool names were copied by everyone
after it, so an agent's habits largely carry over. In our case 17 of its 19
tool names work unchanged.</p>
<p>Two were renamed, because the thing they did grew: generating an audio
overview became generating <em>content</em> of several kinds, and downloading audio
became downloading content.</p>
<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>
<p>One environment variable has the same name and a different meaning in
different projects. In the archived server, the transport variable chose
between the stdio and HTTP ways of talking to the <em>client</em>. In ours, it chooses
between the internal-API and browser ways of talking to <em>NotebookLM</em>.</p>
<p>Copy a configuration across without reading it and you will set something
real, that does something else, silently. Check every variable you carry over
rather than assuming a shared vocabulary.</p>
<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>
<ul>
<li class=""><strong>If your install works and the work is finished.</strong> An archived tool that
already produced what you needed owes you nothing.</li>
<li class=""><strong>If you only ever ask one notebook one kind of question.</strong> The web app is
right there, and it is better at that than any of us.</li>
<li class=""><strong>If you have an enterprise licence.</strong> Google's own API is supported and
nothing here competes with a contract.</li>
</ul>
<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>
<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>
<p>The tool-by-tool mapping, the environment variable table and the full feature
comparison are on <a class="" href="https://notebooklm.roomi-fields.com/compare">the migration page</a>.</p>]]></content>
        <author>
            <name>Romain Peyrichou</name>
            <uri>https://github.com/roomi-fields</uri>
        </author>
        <category label="notebooklm" term="notebooklm"/>
        <category label="mcp" term="mcp"/>
        <category label="migration" term="migration"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Running NotebookLM across multiple Google accounts]]></title>
        <id>https://notebooklm.roomi-fields.com/blog/notebooklm-multiple-google-accounts</id>
        <link href="https://notebooklm.roomi-fields.com/blog/notebooklm-multiple-google-accounts"/>
        <updated>2026-10-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[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.]]></summary>
        <content type="html"><![CDATA[<p>One Google account gives you one allowance. Several give you several, and a
server that switches between them when one runs out keeps a long run moving.</p>
<p>That is the whole idea, and it works. What is worth saying plainly is what it
does not do, and what it asks you to hold on disk.</p>
<!-- -->
<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>
<p>Since 2 September 2026, NotebookLM meters compute on a rolling five-hour
window rather than counting chats per day. Rotation therefore multiplies a
budget, not a quota.</p>
<p>The difference matters when you plan. With a daily count you could say "three
accounts, 150 questions". With an allowance you cannot: the same three
accounts carry a long conversation over forty sources far less far than they
carry short, fresh questions.</p>
<p>What you get is continuity — the run does not stop at the first exhausted
account — not a number to promise.</p>
<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>
<p>The server keeps a session per account, notices the usage refusal, and moves
to the next account that still has room. Each account has its own browser
profile, so switching does not disturb the one currently in use.</p>
<p>Re-authentication mid-run works the same way: the session for that account is
refreshed on its own profile, then promoted, rather than restarting
everything.</p>
<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>
<p>Not in the project directory. They sit in the operating system's application
data directory, outside any repository by construction. That is deliberate —
you do not want a live Google session inside something you might commit or
copy.</p>
<p>One consequence surprises people: <strong>sessions do not travel</strong>. Copying cookies
from one machine to another fails. Google binds them server-side to the device
and address that created them, even when the local expiry says they are valid.
Log in on the machine that will run the work.</p>
<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>
<p>It holds live logins. Anything that can read it can act as you.</p>
<p>We learned this the uncomfortable way. Our own file-upload tool treated that
directory as an allowed location, so a document could have told an agent to
add the session file as a source — and another tool could then have made the
notebook public. It is fixed, and the lesson generalises: check what your
tools can reach, not only what they are for.</p>
<p>If you run several accounts, you are concentrating several logins in one
place. Treat it accordingly.</p>
<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>
<ul>
<li class=""><strong>When you re-ask the same questions.</strong> Cache the answers instead. Paying
twice across two accounts is still paying twice.</li>
<li class=""><strong>When the accounts are not yours.</strong> Using colleagues' accounts to stretch
an allowance is a policy problem before it is a technical one.</li>
<li class=""><strong>When one paid plan would do.</strong> AI Plus doubles the allowance and AI Pro
quadruples it, with one login to secure instead of three.</li>
<li class=""><strong>When the work must be reproducible.</strong> Which account answered changes
nothing about correctness, but it does complicate an audit trail.</li>
</ul>
<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>
<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>
<p>Adding accounts, inspecting their state and forcing a switch are covered in
<a class="" href="https://notebooklm.roomi-fields.com/notebooklm-multi-account">multi-account</a>. Where sessions are stored, and how
to move them, is in <a class="" href="https://notebooklm.roomi-fields.com/CONFIGURATION">configuration</a>.</p>]]></content>
        <author>
            <name>Romain Peyrichou</name>
            <uri>https://github.com/roomi-fields</uri>
        </author>
        <category label="notebooklm" term="notebooklm"/>
        <category label="accounts" term="accounts"/>
        <category label="quotas" term="quotas"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[NotebookLM in n8n, Zapier and Make: there is no connector]]></title>
        <id>https://notebooklm.roomi-fields.com/blog/notebooklm-n8n-zapier-make</id>
        <link href="https://notebooklm.roomi-fields.com/blog/notebooklm-n8n-zapier-make"/>
        <updated>2026-10-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[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.]]></summary>
        <content type="html"><![CDATA[<p>Zapier's NotebookLM page says the integration has not been built. Make has no
module. n8n has no node. Every walkthrough you find does something adjacent —
saving files to Drive, which you then add to a notebook by hand.</p>
<p>That is the honest state. What follows is the workaround that actually
automates the part people want: asking a question and getting a
citation-backed answer into the workflow.</p>
<!-- -->
<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>
<p>Because a connector needs an API with a key, and the consumer NotebookLM has
neither. Google's documented API is the enterprise one, behind a Cloud project
and an administrator. A connector built on it would serve the subset of users
who could already script it.</p>
<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>
<p>Run a small HTTP server on a machine your workflow can reach. It holds your
Google session and exposes the operations as ordinary endpoints. Your workflow
then uses the same HTTP node it would use for any other service.</p>
<p>In n8n that is one HTTP Request node: POST the question, read the answer and
its citations out of the response, pass them to the next step. In Make and
Zapier it is their generic webhook or HTTP action.</p>
<p>The answer arrives as data, so it can go to a sheet, a Slack message, a
database row or a document, like anything else in the workflow.</p>
<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>
<p>Somewhere the workflow engine can reach, which is the real constraint.</p>
<p>Self-hosted n8n on the same machine is the simple case: the server stays on
loopback and nothing is exposed. Cloud-hosted n8n, Zapier or Make cannot reach
your laptop, so you need the server on a host they can see — and at that point
you are exposing an endpoint that holds a live Google session.</p>
<p>If you do that, set a token. Our server refuses to start on a public interface
without one, which is deliberate: the failure is louder than a leak.</p>
<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>
<p>The jobs where the answer is one step of several. A weekly digest that asks
each notebook what changed. A support flow that answers from internal
documentation with the passage attached. A research pipeline that files each
answer with its citations into a table.</p>
<p>The pattern that pays best is answer-once-then-store. Usage is a compute
allowance now, refreshed every five hours, so a workflow that re-asks the same
question every run is spending for nothing.</p>
<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>
<ul>
<li class=""><strong>When latency matters.</strong> An answer takes seconds, not milliseconds. Do not
put it in front of a user who is waiting.</li>
<li class=""><strong>When the workflow must never stall.</strong> The allowance can run out mid-run.</li>
<li class=""><strong>When you would be exposing the server to the public internet just to reach
a cloud workflow tool.</strong> Weigh that against moving the workflow instead.</li>
<li class=""><strong>When a plain Gemini API call would do.</strong> If you do not need grounding in
your own documents, you do not need any of this.</li>
</ul>
<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>
<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>
<p>Node 22 or newer. The worked n8n flow is in
<a class="" href="https://notebooklm.roomi-fields.com/notebooklm-n8n">the n8n guide</a>; the full endpoint list is in
<a class="" href="https://notebooklm.roomi-fields.com/notebooklm-rest-api">the API reference</a>.</p>]]></content>
        <author>
            <name>Romain Peyrichou</name>
            <uri>https://github.com/roomi-fields</uri>
        </author>
        <category label="notebooklm" term="notebooklm"/>
        <category label="n8n" term="n8n"/>
        <category label="zapier" term="zapier"/>
        <category label="automation" term="automation"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[NotebookLM usage limits changed: what breaks in your automation]]></title>
        <id>https://notebooklm.roomi-fields.com/blog/notebooklm-usage-limits-automation</id>
        <link href="https://notebooklm.roomi-fields.com/blog/notebooklm-usage-limits-automation"/>
        <updated>2026-10-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[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.]]></summary>
        <content type="html"><![CDATA[<p>If your script waits until midnight for the quota to reset, it is waiting for
something that no longer happens. On 2 September 2026 Google replaced
NotebookLM's fixed daily chat caps with a compute-based allowance that
refreshes every five hours, up to a weekly ceiling.</p>
<p>Our own documentation said "50 queries per day, resets at midnight UTC" until
this week. It was wrong, and we had been repeating it for months.</p>
<!-- -->
<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>
<p>Not requests. Google's own wording is that limits are compute-based and depend
on "the complexity of your prompt" and "the models and features you use".
Chat length and the number of sources count too.</p>
<p>The practical consequence: two scripts issuing the same number of questions
can consume wildly different amounts. A long conversation across forty sources
is not the same purchase as forty short, fresh questions.</p>
<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>
<p>Every five hours, on a rolling window, until you hit a weekly ceiling. There is
no daily reset and no fixed hour to wait for. The remaining balance and the
reset time are shown in the app under <strong>Settings → Usage</strong>, and in the chat
when you get close.</p>
<p>Paid plans multiply the allowance rather than changing the mechanism — two
times on AI Plus, four on AI Pro, more above that.</p>
<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>
<p><strong>Stop counting.</strong> A counter that stops at 50 either stops too early or too
late, and you cannot tell which.</p>
<p><strong>Prefer short, stateless questions.</strong> Each one costs less than extending a
conversation that carries its whole history. If you do not need the thread,
do not open one.</p>
<p><strong>Narrow the source list.</strong> Asking against the three relevant sources instead
of the whole notebook is cheaper as well as more accurate.</p>
<p><strong>Make the run resumable.</strong> The allowance will run out mid-batch sooner or
later. A run that records each answer as it arrives loses nothing; a run that
writes at the end loses everything.</p>
<p><strong>Treat the refusal as a signal, not an error.</strong> When the server reports the
limit, back off for the window rather than retrying immediately.</p>
<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>
<p>Yes, with a caveat worth being clear about. Rotation moves work onto another
account's allowance when the first runs out. It multiplies a budget, not a
quota, and it does nothing about the fact that you can no longer predict how
far that budget goes.</p>
<p>It is also a per-account login each time, with everything that implies for
where those sessions live.</p>
<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>
<ul>
<li class=""><strong>When you re-ask the same questions.</strong> Answer once, store the result, query
your own store afterwards. Paying the allowance twice for the same answer is
the most common waste we see.</li>
<li class=""><strong>When you only need generation, not grounding.</strong> The Gemini API is public
and supported, with limits you can plan against.</li>
<li class=""><strong>When the deadline is fixed.</strong> A compute-based allowance with a weekly
ceiling is not something to promise a delivery date on.</li>
</ul>
<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>
<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>
<p>The batch pattern, including how to cache answers so a re-run costs nothing,
is in <a class="" href="https://notebooklm.roomi-fields.com/batch-1000-questions">running a thousand questions</a>. Account rotation
is in <a class="" href="https://notebooklm.roomi-fields.com/notebooklm-multi-account">multi-account</a>.</p>]]></content>
        <author>
            <name>Romain Peyrichou</name>
            <uri>https://github.com/roomi-fields</uri>
        </author>
        <category label="notebooklm" term="notebooklm"/>
        <category label="quotas" term="quotas"/>
        <category label="automation" term="automation"/>
    </entry>
</feed>