Skip to main content
Glama

🧠 NotebookLM MCP Server

Bridge the Gap Between Google NotebookLM and Your AI Workspace

NPM Version License: MIT Build Status

Stop jumping between browser tabs. NotebookLM MCP brings the full analytical power of Google NotebookLM directly into your local terminal, IDE, and AI assistants like Claude, Cursor, and VS Code.

Manage notebooks, ingest diverse sources, trigger deep research, and generate studio-quality contentβ€”all via a single, standardized Model Context Protocol (MCP) interface.

New to MCP? The Model Context Protocol is a standard for connecting LLMs to external data sources and tools. This package speaks MCP over stdio β€” your AI client (Claude Desktop, Cursor, VS Code, etc.) spawns notebooklm-mcp serve as a subprocess and the two communicate over JSON-RPC. The 27 tools below become callable functions in the model's tool list.


πŸ”₯ Key Capabilities

  • ⚑ Seamless Authentication: Log in once with notebooklm-mcp auth. Our automated CDP-based flow handles secure cookie extraction so you can focus on your data.

  • πŸ”„ Resilient Connectivity: Built-in background session restoration. If your session expires, the server transparently reconnects without breaking your workflow.

  • πŸ“‚ Universal Ingestion: Instantly add URLs, YouTube transcripts, Google Drive files, or raw text snippets to any notebook.

  • πŸ•΅οΈ Autonomous Research: Harness Google's Deep Research engine. Start a task, poll its progress, and import structured insights directly into your project.

  • 🎭 Creative Studio: Programmatically generate Audio Overviews (podcasts), Briefing Docs, Infographics, Slide Decks, and Quizzes from your sources.


Related MCP server: notebooklm-py-diet-mcp

πŸš€ Quick Start

1. Installation

Requires Node.js β‰₯ 20 and Google Chrome or Chromium (for auth).

Run it instantly with npx:

npx -y @m4ykeldev/notebooklm-mcp serve

Or install globally for better performance:

npm install -g @m4ykeldev/notebooklm-mcp

Developers who want to hack on the source: this repo uses pnpm (pinned via packageManager in package.json). After cloning, run corepack enable && pnpm install. See CONTRIBUTING.md on GitHub for the full dev / release flow.

2. The "One-Click" Login

Say goodbye to manual cookie hunting. Our smart auth flow does the heavy lifting for you.

notebooklm-mcp auth

A secure Chrome window will open. Simply log into your Google account, and we'll handle the rest. Your session is stored locally and securely.

Auth fallbacks if automated Chrome can't run:

notebooklm-mcp auth --manual              # interactive copy/paste from your browser
notebooklm-mcp auth --file tokens.json    # import a previously exported bundle
notebooklm-mcp auth --show-tokens         # verify the cached session

For headless / CI environments, set NOTEBOOKLM_COOKIES (and optionally NOTEBOOKLM_CSRF_TOKEN, NOTEBOOKLM_SESSION_ID) instead of running the auth flow. Token resolution order: env var β†’ ~/.notebooklm-mcp/auth.json β†’ error.


πŸ€– AI Assistant Integration

Pick your client below β€” every section shows the config file path per OS, a minimal copy-paste block, and the advanced variant with --query-timeout and NOTEBOOKLM_COOKIES env override.

Client

Config file

Format

Claude Desktop

claude_desktop_config.json

JSON

Claude Code (CLI)

~/.claude.json or claude mcp add

JSON / CLI

Codex CLI

~/.codex/config.toml

TOML

OpenAI Agents SDK (Python)

in-code

Python

OpenAI Agents SDK (TypeScript)

in-code

TypeScript

Gemini CLI

~/.gemini/settings.json

JSON

Cursor

~/.cursor/mcp.json

JSON

VS Code (Copilot Chat agent mode)

.vscode/mcp.json

JSON

Windsurf

~/.codeium/windsurf/mcp_config.json

JSON

JetBrains AI Assistant / Junie

~/.junie/mcp/mcp.json

JSON

Zed

~/.config/zed/settings.json

JSON

OpenCode (sst)

opencode.jsonc

JSONC

Cline (VS Code extension)

extension settings UI

JSON

Goose (Block)

~/.config/goose/config.yaml

YAML

5ire

in-app settings

GUI

Aider

not yet supported

β€”

Generic stdio caller

yours

β€”


Claude Desktop

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Linux: ~/.config/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "notebooklm": {
      "command": "npx",
      "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
    }
  }
}
{
  "mcpServers": {
    "notebooklm": {
      "command": "npx",
      "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000", "--debug"],
      "env": {
        "NOTEBOOKLM_COOKIES": "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..."
      }
    }
  }
}

Verify: restart Claude Desktop, click the hammer icon at the bottom-right of the input. Gotchas: absolute paths only; relative paths fail silently on startup.


Claude Code (CLI)

Recommended path is the claude mcp add CLI (writes the JSON for you):

claude mcp add --transport stdio notebooklm -- npx -y @m4ykeldev/notebooklm-mcp serve
{
  "mcpServers": {
    "notebooklm": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
    }
  }
}
claude mcp add --transport stdio \
  --env NOTEBOOKLM_COOKIES="SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..." \
  notebooklm -- npx -y @m4ykeldev/notebooklm-mcp serve --query-timeout 180000

Verify: claude mcp list && claude mcp get notebooklm, or /mcp inside a session. Gotchas: all options before the server name; use -- to separate options from the command. Project-scoped .mcp.json needs interactive approval on first sight.


Codex CLI

  • macOS: ~/.codex/config.toml

  • Linux: ~/.config/codex/config.toml

  • Windows: %APPDATA%\codex\config.toml

[mcp_servers.notebooklm]
command = "npx"
args = ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
[mcp_servers.notebooklm]
command = "npx"
args = ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000"]
env = { NOTEBOOKLM_COOKIES = "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..." }

Verify: codex --list-tools should list the NotebookLM tools. Gotchas: Codex CLI's MCP schema is still being formalized β€” double-check against the latest openai/codex README.


OpenAI Agents SDK β€” Python

Wire it in code (no config file):

from agents.mcp import MCPServerStdio

async with MCPServerStdio(
    name="NotebookLM",
    params={
        "command": "npx",
        "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"],
    },
) as server:
    tools = await server.list_tools()
    print([t.name for t in tools])  # 27 tools
async with MCPServerStdio(
    name="NotebookLM",
    params={
        "command": "npx",
        "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000"],
        "env": {"NOTEBOOKLM_COOKIES": "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..."},
    },
) as server:
    ...

OpenAI Agents SDK β€” TypeScript

import { MCPServerStdio } from "@openai/agents";

const server = new MCPServerStdio({
  command: "npx",
  args: ["-y", "@m4ykeldev/notebooklm-mcp", "serve"],
});

await server.connect();
const tools = await server.listTools();
console.log(tools.map((t) => t.name)); // 27 tools
const server = new MCPServerStdio({
  command: "npx",
  args: ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000"],
  env: { NOTEBOOKLM_COOKIES: "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..." },
});

Gemini CLI

~/.gemini/settings.json (user-global) or .gemini/settings.json (per-project).

{
  "mcpServers": {
    "notebooklm": {
      "command": "npx",
      "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
    }
  }
}
{
  "mcpServers": {
    "notebooklm": {
      "command": "npx",
      "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"],
      "timeout": 180000,
      "env": {
        "NOTEBOOKLM_COOKIES": "$NOTEBOOKLM_COOKIES"
      }
    }
  }
}

Verify: gemini mcp list, or /mcp in a session. Gotchas: undefined $VAR resolves to empty string β€” pre-export them in your shell.


Cursor

  • macOS / Linux: ~/.cursor/mcp.json (global) or .cursor/mcp.json (per-project)

  • Windows: %APPDATA%\Cursor\mcp.json

{
  "mcpServers": {
    "notebooklm": {
      "command": "npx",
      "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
    }
  }
}
{
  "mcpServers": {
    "notebooklm": {
      "command": "npx",
      "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000"],
      "env": {
        "NOTEBOOKLM_COOKIES": "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..."
      }
    }
  }
}

Verify: Cursor Settings β†’ MCP should show notebooklm in green, or MCP: View Server Status in the Command Palette. Gotchas: Cursor only loads MCP servers at startup β€” fully quit and relaunch after edits. Soft ~40-tool ceiling across all enabled servers combined.


VS Code (Copilot Chat agent mode)

.vscode/mcp.json (per-project). Top-level key is servers (not mcpServers β€” Microsoft renamed this).

{
  "servers": {
    "notebooklm": {
      "command": "npx",
      "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
    }
  }
}
{
  "servers": {
    "notebooklm": {
      "command": "npx",
      "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000"],
      "env": {
        "NOTEBOOKLM_COOKIES": "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..."
      }
    }
  }
}

Verify: Command Palette β†’ MCP: Open User Configuration. Ask Copilot Chat in agent mode to list NotebookLM notebooks.


Windsurf

  • macOS / Linux: ~/.codeium/windsurf/mcp_config.json

  • Windows: %APPDATA%\Codeium\Windsurf\mcp_config.json

{
  "mcpServers": {
    "notebooklm": {
      "command": "npx",
      "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
    }
  }
}
{
  "mcpServers": {
    "notebooklm": {
      "command": "npx",
      "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000"],
      "env": {
        "NOTEBOOKLM_COOKIES": "${env:NOTEBOOKLM_COOKIES}"
      }
    }
  }
}

Verify: open the Cascade sidebar β†’ MCP settings β†’ confirm notebooklm is active. Gotchas: prefer ${env:VAR} / ${file:/path} interpolation over inlining cookies; Windsurf substitutes at server-launch time so secrets stay out of the config file.


JetBrains AI Assistant / Junie

  • macOS / Linux: ~/.junie/mcp/mcp.json (user-global) or .junie/mcp/mcp.json (per-project)

  • Windows: %APPDATA%\JetBrains\Junie\mcp.json

{
  "mcpServers": {
    "notebooklm": {
      "command": "npx",
      "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
    }
  }
}
{
  "mcpServers": {
    "notebooklm": {
      "command": "npx",
      "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000"],
      "env": {
        "NOTEBOOKLM_COOKIES": "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..."
      }
    }
  }
}

Verify: Settings (Ctrl+Alt+S) β†’ Tools β†’ Junie β†’ MCP Settings β€” notebooklm should appear in the discovered list.


Zed

~/.config/zed/settings.json β€” the relevant key is context_servers (Zed's MCP equivalent).

{
  "context_servers": {
    "notebooklm": {
      "command": "npx",
      "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
    }
  }
}
{
  "context_servers": {
    "notebooklm": {
      "command": "npx",
      "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000"],
      "env": {
        "NOTEBOOKLM_COOKIES": "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..."
      }
    }
  }
}

Verify: Zed's AI Agent Panel lists notebooklm as an available context source.


OpenCode (sst)

opencode.jsonc (project root) or ~/.config/opencode/config.json.

{
  "mcp": {
    "servers": {
      "notebooklm": {
        "command": "npx",
        "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
      }
    }
  }
}
{
  "mcp": {
    "servers": {
      "notebooklm": {
        "command": "npx",
        "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000"],
        "env": {
          "NOTEBOOKLM_COOKIES": "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..."
        }
      }
    }
  }
}

Verify: start OpenCode and ask "List my NotebookLM notebooks." β€” the model should call notebook_list. Gotchas: OpenCode's MCP schema is still evolving; confirm against the OpenCode docs if startup fails.


Cline (VS Code extension)

Managed via Cline's MCP settings UI inside VS Code. Underlying file (don't edit by hand): ~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json.

  1. Open the Cline panel β†’ click the MCP icon β†’ Configure MCP Servers.

  2. Paste:

{
  "mcpServers": {
    "notebooklm": {
      "command": "npx",
      "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve"]
    }
  }
}
  1. Save. Cline restarts the server automatically.

{
  "mcpServers": {
    "notebooklm": {
      "command": "npx",
      "args": ["-y", "@m4ykeldev/notebooklm-mcp", "serve", "--query-timeout", "180000"],
      "env": {
        "NOTEBOOKLM_COOKIES": "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..."
      }
    }
  }
}

Verify: ask Cline "List my NotebookLM notebooks." β€” the tool-call panel shows notebook_list.


Goose (Block)

~/.config/goose/config.yaml (or via goose configure). Goose calls MCP servers "extensions".

extensions:
  notebooklm:
    type: stdio
    command: npx
    args:
      - "-y"
      - "@m4ykeldev/notebooklm-mcp"
      - serve
extensions:
  notebooklm:
    type: stdio
    command: npx
    args:
      - "-y"
      - "@m4ykeldev/notebooklm-mcp"
      - serve
      - "--query-timeout"
      - "180000"
    env:
      NOTEBOOKLM_COOKIES: "SID=...; HSID=...; SSID=...; APISID=...; SAPISID=..."

Verify: goose configure β†’ confirm the extension is enabled, then goose session and ask "List my NotebookLM notebooks."


5ire

GUI app (no user-editable config file):

  1. Open 5ire β†’ Settings (Mod+K β†’ Providers).

  2. Click Add MCP Server.

  3. Name: notebooklm

  4. Type: Stdio

  5. Command: npx

  6. Args: -y @m4ykeldev/notebooklm-mcp serve (add --query-timeout 180000 if needed)

  7. Env vars (optional): NOTEBOOKLM_COOKIES=SID=...; HSID=...; SSID=...; APISID=...; SAPISID=...

  8. Save and restart.

Verify: ask in chat "List my NotebookLM notebooks." β€” tool-call panel shows notebook_list.


Aider

Aider does not yet have first-class MCP-server client integration. Workarounds: run notebooklm-mcp serve separately and pipe responses, or use the generic stdio caller inside a small wrapper script. Track upstream support via the Aider Discord.


Generic stdio caller

If your client speaks the MCP protocol over stdio but isn't listed above, every config above reduces to the same primitive:

spawn:   npx -y @m4ykeldev/notebooklm-mcp serve
stdio:   parent <- stdout (JSON-RPC responses) | parent -> stdin (JSON-RPC requests)
env:     (optional)
  NOTEBOOKLM_COOKIES=...        # skip the auth flow in CI
  NOTEBOOKLM_CSRF_TOKEN=...
  NOTEBOOKLM_SESSION_ID=...
flags:   (optional)
  --query-timeout <ms>          # per-RPC timeout, default 120000
  --debug                       # verbose stderr logging

On connection the server advertises 27 tools β€” see the Complete Tool Reference below.


Verify any wiring

After restarting your client, ask:

"List my NotebookLM notebooks."

If the model invokes notebook_list and returns a table of titles, you're connected.


🧩 Agent Skill

skills/notebooklm/SKILL.md teaches an agent when and how to use these tools (setup, query β†’ studio β†’ research workflows, confirmation rules, failure handling). Copy the skills/notebooklm/ folder into your agent's skills directory (for Claude Code: ~/.claude/skills/).


πŸ’¬ Example Prompts

Once wired up, your AI can drive NotebookLM end-to-end with natural language. The model picks the right tool from the 27 below.

Goal

Sample prompt

Tools the model will call

Inventory

"Show me every NotebookLM project I own"

notebook_list

Start a project

"Create a notebook called 'Q3 Earnings' and add the AAPL 10-Q PDF at https://…"

notebook_create, source_add_url

Grounded Q&A

"From the AAPL notebook, what is the year-over-year services revenue change?"

notebook_query

Multi-source brief

"In my 'Climate Policy' notebook, generate a one-page briefing doc focused on IRA tax credits"

report_create, studio_status

Studio podcast

"Make a 10-min audio overview of my 'AI Safety Reading' notebook"

audio_overview_create, studio_status

Deep Research β†’ import

"Run deep research on 'kelp aquaculture in Maine' and import the findings into my 'Climate' notebook"

research_start, research_status, research_import

Cleanup

"Delete the 'Old Drafts' notebook I no longer need"

notebook_list, notebook_delete

πŸ›  Complete Tool Reference (27)

Every tool carries a title, a description of what it returns, and MCP annotations (read-only, destructive, idempotent), so clients can tell safe lookups from changes. Since v0.5.0 each tool also publishes an outputSchema and returns its result as structuredContent (typed fields) alongside the usual JSON text. The server also sends usage instructions at initialization.

Renamed in v0.4.0. Tool names now follow one resource_action scheme. If your client allow-lists tools by name (e.g. mcp__notebooklm__notebook_add_url in Claude Code permissions), update it:

Before

Now

notebook_add_url / notebook_add_text / notebook_add_drive

source_add_url / source_add_text / source_add_drive

source_describe

source_get

notebook_describe

notebook_summarize

refresh_auth / save_auth_tokens

auth_refresh / auth_save_tokens

πŸ“” Notebook Management

Tool

Description

notebook_list

Get an overview of your notebooks (titles, sources, ownership), up to max_results (default 100).

notebook_create

Create a new NotebookLM project instantly from your terminal or AI assistant.

notebook_get

Retrieve deep metadata and a full list of sources for a specific notebook.

notebook_summarize

Get an AI-generated summary of the notebook plus the questions NotebookLM suggests asking.

notebook_rename

Update the title of an existing notebook.

notebook_delete

Permanently remove a notebook (requires explicit confirmation).

πŸ“„ Source Ingestion & Management

Tool

Description

source_add_url

Add any public website or YouTube video as a source. Returns the new source's ID.

source_add_text

Ingest raw text snippets or local file contents. Returns the new source's ID.

source_add_drive

Import a Google Drive file by its file ID. Returns the new source's ID.

source_get

Get a source's title, type and extracted-text length (the text itself: next tool).

source_get_content

Extract the full underlying text of a source for processing by other AI tools.

source_sync_drive

Sync selected Google Drive sources to pull the latest changes into NotebookLM.

source_delete

Remove a specific source from your notebook.

πŸ”¬ Research & Deep Analysis

Tool

Description

research_start

Launch an autonomous research task using Google's engine (Web or Drive sources).

research_status

Track the progress of active research tasks and view discovered insights.

research_import

Instantly import the findings of a research task as new sources in your notebook.

notebook_query

Ask questions answered only from your sources, with follow-ups in the same conversation.

🎬 Studio (AI Content Generation)

Tool

Description

audio_overview_create

Transform your notebook's sources into a professional, podcast-style audio discussion.

video_overview_create

Generate a structured video explainer based on your project data.

report_create

Create professional Briefing Docs, Study Guides, or Blog Posts tailored to your sources.

slide_deck_create

Turn your research into a presenter-ready slide deck automatically.

infographic_create

Visualize complex data and relationships with an AI-generated infographic.

flashcards_create

Generate interactive study flashcards to master your notebook's content.

quiz_create

Create a comprehensive quiz to test knowledge grounded in your provided sources.

studio_status

Check the generation status of your Studio artifacts and get download links.

πŸ”‘ Authentication Helpers

Tool

Description

auth_refresh

Manually trigger a session refresh if you encounter connection issues.

auth_save_tokens

Manually save cookie data (legacy fallback method).


πŸŽ› CLI Reference

notebooklm-mcp serve [--query-timeout <ms>] [--debug]
notebooklm-mcp auth  [--manual] [--file <path>] [--show-tokens]
notebooklm-mcp --version

Flag

Default

Description

serve --query-timeout

120000

Per-RPC timeout in ms. Bump for large studio jobs or slow research.

serve --debug

off

Verbose stderr logging of every RPC + retry.

auth --manual

off

Skip Chrome automation; paste cookies yourself.

auth --file <path>

β€”

Import a previously exported tokens JSON.

auth --show-tokens

β€”

Print the cached session's metadata (cookie names, age, CSRF/SID presence β€” never the secret values).


🩹 Troubleshooting

Symptom

Likely cause

Fix

"Could not find Google Chrome or Chromium"

No Chrome/Chromium on PATH

Install Chrome or run notebooklm-mcp auth --manual

"Authentication expired" inside the AI session

Cookies stale

The server auto-refreshes once; if it can't, re-run notebooklm-mcp auth

"NotebookLM redirected to … (Google sign-in)" or "page has no CSRF token"

Google session signed out

Re-run notebooklm-mcp auth. The server does not open a browser on its own for this

HTTP 401 with valid cookies (v0.3.1 and older)

NotebookLM moved to notebook.google.com

Upgrade to the latest version

research_import says "Imported X of Y" with X < Y

NotebookLM could not fetch some URLs

Retry, or pick other results. Drive results are skipped; only web results import

Tool calls hang past 2 min

Big studio job over default timeout

Restart server with --query-timeout 300000

"file_path … outside the allowed roots"

source_add_text got a path outside cwd / tmp

Copy the file into your working directory or pass content inline

MCP client reports server crashed on startup

dist/cli.js missing (dev clone)

pnpm install && pnpm run build

Multiple Chrome windows pop up on concurrent failures

Older version without single-flight mutex

Upgrade to β‰₯ v0.2.5


πŸ’‘ Pro Tips

  • Custom Timeouts: Working with massive sources? Increase the timeout: notebooklm-mcp serve --query-timeout 180000

  • Check Connections: Use notebooklm-mcp auth --show-tokens to verify your session validity without exposing the secrets.

  • CI / headless: Set NOTEBOOKLM_COOKIES (plus NOTEBOOKLM_CSRF_TOKEN, NOTEBOOKLM_SESSION_ID) to skip the browser flow entirely.


πŸ›‘ Security & Privacy

  • Local Storage with hardened perms. Tokens live at ~/.notebooklm-mcp/auth.json (mode 0600) inside ~/.notebooklm-mcp/ (mode 0700). Nothing leaves your machine except calls to Google.

  • Path-traversal guard. source_add_text rejects file_path arguments outside the working directory or the OS temp directory β€” a hostile MCP prompt cannot ask the server to read your ~/.ssh/id_rsa.

  • Loopback-only Chrome DevTools. The automated auth flow launches Chrome with an OS-assigned ephemeral port bound to 127.0.0.1 β€” no fixed-port squatting, no LAN exposure.

  • Single-flight auth refresh. Concurrent requests that hit an expired session share one refresh promise instead of each spawning their own Chrome.

  • Supply-chain gated releases. Every publish runs gitleaks β†’ osv-scanner β†’ pnpm audit (high+) β†’ npm audit signatures (Sigstore) β†’ lockfile registry pinning β†’ publish-manifest preview before pnpm publish ships via OIDC trusted publishers. See CONTRIBUTING.md β†’ Releasing on GitHub.

  • Test coverage: 100% statements / branches / functions / lines, enforced by CI.

  • Unofficial Tool: This project is an independent community effort and is not affiliated with Google. It interfaces with internal endpoints and may be affected by changes to the NotebookLM web platform.

πŸ“„ License

Open-source and available under the MIT License.


Crafted with precision for the AI-first developer. Part of the Model Context Protocol ecosystem.

Available Tools

27 tools
audio_overview_createCreate Audio OverviewA

Start generating an Audio Overview: a podcast-style conversation between two AI hosts about the notebook's sources. Uses the user's NotebookLM quota and takes several minutes, so agree on the options with the user first: with confirm=false it does nothing and returns pending_confirmation. With confirm=true it returns the artifact_id; poll studio_status until that artifact is completed. Once completed, studio_status gives an audio download_url.

NameRequiredDescriptionDefault
formatNoFormat: brief, critique, debate, deep_dive. deep_dive is the default two-host discussion
lengthNoLength: default, long, short
confirmYesMust be true to start generation. With false the tool only returns pending_confirmation and does nothing
languageNoBCP-47 language code such as en, es or fr; omit for NotebookLM's default
source_idsNoLimit generation to these source IDs (from notebook_get); omit to use every source in the notebook
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create
focus_promptNoOptional instruction on what to focus on or emphasise, e.g. "the methodology section"

Output Schema

NameRequiredDescription
statusYes
messageNoHuman-readable outcome or next step
artifact_idNoID of the new artifact, as listed by studio_status

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnly=false, openWorld=true, idempotent=false, destructive=false. The description adds what actually matters for a long-running job: it consumes user quota, runs for several minutes, is gated by a confirmation flag, is asynchronous, and the result must be polled via studio_status before a download_url exists. None of that is recoverable from the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, front-loaded with what the tool produces before the operational caveats. No filler, no repetition of the title, and every clause carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, and the description still closes the loop on async completion (poll studio_status, then fetch download_url). For a 7-parameter, non-idempotent, quota-consuming generation tool, nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter including confirm, format, source_ids, and language is already documented in the schema. The description restates the confirm contract and the provenance of source_ids and notebook_id rather than adding new syntax or constraints. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Start generating an Audio Overview') and immediately defines the artifact: 'a podcast-style conversation between two AI hosts about the notebook's sources'. That level of detail is enough to separate it from siblings like video_overview_create, infographic_create, or slide_deck_create without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the preconditions ('uses the user's NotebookLM quota and takes several minutes, so agree on the options with the user first'), the exact two-phase invocation contract (confirm=false returns pending_confirmation, confirm=true returns artifact_id), and the follow-up path ('poll studio_status until that artifact is completed'). It also implicitly routes the agent to notebook_get for source_ids and studio_status for retrieval.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

auth_refreshRefresh NotebookLM sessionA
Idempotent

Re-read the NotebookLM page with the saved cookies to refresh the CSRF token and session ID. Returns a confirmation, or an authentication error if the Google session is signed out; then ask the user to run npx -y @m4ykeldev/notebooklm-mcp auth in a terminal. Call it once after an auth error, then retry.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
statusYes
messageNoHuman-readable outcome or next step

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (idempotent, non-destructive, open-world), but the description adds real context beyond them: it reads the live page with saved cookies, its failure mode is an auth error when the Google session is signed out, and the remediation path. It stops short of describing how a stale/missing cookie differs from a signed-out state.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action and its mechanism, then failure handling and the call-once instruction. Compact overall, though the semicolon clause carrying the remediation command is slightly awkward to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter session-refresh tool with an output schema already documenting return values, the description covers mechanism, failure mode, and next step. An agent has everything needed to call it correctly and react to failure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters, so the baseline is 4. The description correctly adds no parameter detail because none exists; there is nothing the schema fails to cover.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (re-read/refresh) and resource (CSRF token and session ID) and explains the mechanism (saved cookies). An agent can distinguish it from the auth_save_tokens sibling by the 'refresh existing session' framing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to call it ('once after an auth error, then retry') and what to do on failure (direct the user to run the CLI auth command). It does not contrast with the sibling auth_save_tokens, so the save-vs-refresh choice is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

auth_save_tokensSave NotebookLM cookiesA
DestructiveIdempotent

Manual fallback: save NotebookLM cookies the user pasted, plus an optional CSRF token and session ID, to ~/.notebooklm-mcp/auth.json, replacing what is stored there. Returns a confirmation; the next call uses the new tokens. Prefer the CLI auth command. Use this only when the user hands you cookies, and never echo them back.

NameRequiredDescriptionDefault
cookiesNoCookie header string as copied from the browser ("SID=...; HSID=...; ..."); must include SID, HSID, SSID, APISID, SAPISID
csrf_tokenNoCSRF token (SNlM0e); optional, extracted from the page when omitted
session_idNoSession ID (FdrFJe); optional, extracted from the page when omitted

Output Schema

NameRequiredDescription
statusYes
messageNoHuman-readable outcome or next step

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the overwrite behavior is partly covered; the description usefully specifies what is destroyed (the existing ~/.notebooklm-mcp/auth.json contents), that the next call consumes the new tokens, and adds a security constraint about not echoing secrets. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and destination are front-loaded, and most sentences carry distinct information (destination, replacement, confirmation, alternative, constraint). It is slightly dense with five clauses, but every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no elaboration, annotations carry the safety profile, and the schema fully documents parameters; the description covers destination, overwrite semantics, and security handling. It is nearly complete, with only the sibling auth_refresh relationship left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and each parameter (cookies, csrf_token, session_id) is fully documented there, including the required SID/HSID/SSID/APISID fields. The description only restates that csrf_token and session_id are optional, adding no syntax or format detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (save) and resource (NotebookLM cookies plus optional CSRF/session IDs) and names the exact destination file (~/.notebooklm-mcp/auth.json), so the purpose is unambiguous. It does not explicitly differentiate itself from the sibling auth_refresh, which is the nearest alternative, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit alternative ('Prefer the CLI auth command') and a precise gating condition ('Use this only when the user hands you cookies'), plus a handling constraint ('never echo them back'). It frames itself as a manual fallback, so an agent knows both when to reach for it and when not to.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

flashcards_createCreate flashcardsA

Start generating a set of study flashcards from the notebook's sources. Uses the user's NotebookLM quota and takes several minutes, so agree on the options with the user first: with confirm=false it does nothing and returns pending_confirmation. With confirm=true it returns the artifact_id; poll studio_status until that artifact is completed. This artifact has no download file: the user opens it in the notebook in NotebookLM.

NameRequiredDescriptionDefault
confirmYesMust be true to start generation. With false the tool only returns pending_confirmation and does nothing
difficultyNoDifficulty: easy, hard, medium (default medium)
source_idsNoLimit generation to these source IDs (from notebook_get); omit to use every source in the notebook
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create

Output Schema

NameRequiredDescription
statusYes
messageNoHuman-readable outcome or next step
artifact_idNoID of the new artifact, as listed by studio_status

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond the annotations: consumes the user's NotebookLM quota, takes several minutes, confirm=false is a no-op returning pending_confirmation, confirm=true returns artifact_id, and the artifact has no downloadable file (viewed in-app). None of this is derivable from the annotation set.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tightly packed sentences, front-loaded with the core action and the quota/time cost, followed by the confirm-gate behavior and the polling follow-up. Every clause carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a long-running, quota-consuming async generation tool this covers cost, latency, the confirmation contract, the completion-tracking path, and the fact that no download artifact is produced. An agent has everything needed to call and follow up correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters including the confirm gate and difficulty. The description largely restates the confirm behavior (pending_confirmation/artifact_id) rather than adding syntax or format detail beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: generating study flashcards from a notebook's sources. It is clearly distinguishable from sibling artifact creators (quiz_create, report_create, slide_deck_create) and names the scoping input (notebook sources).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear precondition ('agree on the options with the user first') and post-call workflow ('poll studio_status until that artifact is completed'). It stops short of explicitly contrasting with alternative artifact types (e.g. quiz_create) for the same notebook, so it is strong but not fully routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

infographic_createCreate infographicA

Start generating an infographic: a single image that summarises the notebook's sources visually. Uses the user's NotebookLM quota and takes several minutes, so agree on the options with the user first: with confirm=false it does nothing and returns pending_confirmation. With confirm=true it returns the artifact_id; poll studio_status until that artifact is completed. Once completed, studio_status gives an image download_url.

NameRequiredDescriptionDefault
confirmYesMust be true to start generation. With false the tool only returns pending_confirmation and does nothing
languageNoBCP-47 language code such as en, es or fr; omit for NotebookLM's default
source_idsNoLimit generation to these source IDs (from notebook_get); omit to use every source in the notebook
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create
orientationNoOrientation: landscape, portrait, square
detail_levelNoLevel of detail: concise, detailed, standard
focus_promptNoOptional instruction on what to focus on or emphasise, e.g. "the methodology section"

Output Schema

NameRequiredDescription
statusYes
messageNoHuman-readable outcome or next step
artifact_idNoID of the new artifact, as listed by studio_status

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavioral detail beyond annotations: it consumes NotebookLM quota, takes several minutes, requires a two-step confirmation flow (confirm=false returns pending_confirmation; confirm=true returns artifact_id), and requires polling studio_status until completion. This goes well beyond what the annotations disclose.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core purpose, then usage guidance, then the two-phase workflow. No filler; every sentence contributes critical information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists and annotations cover safety signals, the description is complete: it explains the asynchronous generation flow, the confirmation requirement, and the polling step needed to retrieve the result. No essential invocation detail is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all seven parameters are fully documented in the schema itself. The description only reiterates the confirm behavior and does not add new meaning beyond the schema for other parameters like orientation, detail_level, or focus_prompt.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb and resource: 'Start generating an infographic: a single image that summarises the notebook's sources visually.' It distinguishes the artifact type from other creative outputs (audio, video, slides, reports), though it does not explicitly contrast with those sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear usage context: agree on options first, use confirm=false for a dry run, confirm=true to start generation, then poll studio_status. It does not, however, explicitly state when to choose an infographic over a sibling tool like slide_deck_create.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notebook_createCreate notebookA

Create an empty NotebookLM notebook. Returns the new notebook; keep its id for every later call. Each call creates another notebook, so first look for one with this title in notebook_list. Then fill it: source_add_url, source_add_text or source_add_drive for sources you have, research_start to find some.

NameRequiredDescriptionDefault
titleYesTitle for the new notebook

Output Schema

NameRequiredDescription
statusYes
messageNoHuman-readable outcome or next step
notebookYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false; the description reinforces the non-idempotent trait concretely ('Each call creates another notebook') and explains the return value's role ('keep its id for every later call'). It doesn't mention auth requirements, rate limits, or title uniqueness enforcement, so it stops short of fully rich disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences: identity, duplicate-avoidance prerequisite, then follow-up actions. The safety-relevant warning is front-loaded ahead of the downstream workflow, and nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no prose explanation, and annotations cover the safety profile. The description supplies exactly the missing pieces for a non-idempotent creation tool: duplicate-check guidance and the id-retention habit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter and schema coverage is 100%, so the schema already documents 'title' as the notebook title. The description adds no format, length, or uniqueness constraints on the title, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create an empty NotebookLM notebook') plus the scope qualifier 'empty', which tells the agent this tool allocates a container rather than populating it. This distinguishes it cleanly from source_add_*, research_start, and notebook_rename among the siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly warns that every call creates another notebook and directs the agent to check notebook_list for an existing one with the same title first. It also prescribes the follow-up path by naming source_add_url, source_add_text, source_add_drive, and research_start as the fill options.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notebook_deleteDelete notebookA
DestructiveIdempotent

Permanently delete a notebook and everything in it. With confirm=false it does nothing and returns pending_confirmation; with confirm=true it deletes and returns a confirmation message. This cannot be undone: name the notebook to the user and get explicit approval first.

NameRequiredDescriptionDefault
confirmYesMust be true to delete. With false the tool only returns pending_confirmation
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create

Output Schema

NameRequiredDescription
statusYes
messageNoHuman-readable outcome or next step

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description still adds real value by spelling out the confirm two-phase flow (returns pending_confirmation vs performs deletion), the irreversibility ('This cannot be undone'), and an explicit approval requirement. It doesn't mention permission/scope needs, so not a full 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the irreversible action, then the confirm mechanics, then the safety instruction. Every sentence earns its place with no restatement of the name or title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive two-parameter tool with full schema coverage, an output schema, and annotations covering the safety hints, the description supplies the remaining needed context: irreversibility, confirm behavior, and the approval precondition. Nothing an agent needs to invoke it safely is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and both parameters (notebook_id, confirm) are already documented in the schema with the same confirm semantics. The description adds no format or syntax detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Permanently delete a notebook') and states the full scope ('everything in it'), immediately distinguishing it from siblings like notebook_rename or notebook_get. An agent can tell what this does and how destructive it is without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear preconditions: name the notebook to the user and get explicit approval before invoking, and explains the confirm=true/false gate. It doesn't explicitly name alternatives (e.g., notebook_rename for non-destructive edits), so it stops short of full when/when-not routing, but the usage context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notebook_getGet notebookA
Read-onlyIdempotent

Get one notebook's details. Returns its title, emoji, ownership, timestamps and sources, each with id, title and type (web_page, youtube, pasted_text, pdf, google_docs, ...). Use it to find source IDs for notebook_query and the Studio tools, or to check that a source you just added has appeared.

NameRequiredDescriptionDefault
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create

Output Schema

NameRequiredDescription
statusYes
messageNoHuman-readable outcome or next step
notebookYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is fully covered by structured data. The description's return-field summary is useful but largely duplicates the existing output schema, adding little behavioral context beyond what annotations and schema supply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with the purpose front-loaded and no filler, and the return/source-type enumeration is at least informative. The field list is mildly redundant given a full output schema exists, keeping it just short of a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not explain return values, and it correctly focuses on purpose and downstream ID use. It is essentially complete for a simple read tool, though it omits failure behavior (invalid or missing notebook_id).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single notebook_id parameter is documented in the schema as coming from notebook_list or notebook_create. The description adds nothing about the parameter, so the baseline 3 for a fully covered schema is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get one notebook's details') and explicitly scopes to a single notebook, which cleanly separates it from notebook_list. It also enumerates what the response contains (title, emoji, ownership, timestamps, sources), so an agent knows exactly what it is retrieving.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage contexts: fetching source IDs for notebook_query and the Studio tools, or verifying that a newly added source appeared. It names the downstream consumers explicitly, but never states when not to use it (e.g. use notebook_list to enumerate) or any prerequisite such as the notebook existing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notebook_listList notebooksA
Read-onlyIdempotent

List the user's NotebookLM notebooks, owned and shared. Returns each notebook's id, title, emoji, sources (id, title, type), ownership and timestamps, plus a count. Start here to find a notebook_id by title; once you have the id, notebook_get reads one notebook. There is no paging: if count equals max_results, call again with a higher max_results.

NameRequiredDescriptionDefault
max_resultsNoMaximum number of notebooks to return (default 100)

Output Schema

NameRequiredDescription
countYesNumber of notebooks returned
statusYes
messageNoHuman-readable outcome or next step
notebooksYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnly/idempotent/openWorld/no-destructive, so the safety profile is covered. What the description adds beyond that is genuinely useful: the scope of results (owned and shared) and, critically, the non-obvious paging behavior keyed off count vs max_results. It stops short of describing ordering or total-availability limits, so not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each carrying distinct load: contents returned, routing to the sibling tool, and the paging caveat. Front-loaded with the core purpose and no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so field enumeration is technically redundant but harmless, and the description's real gaps to close β€” result scope and the absence of paging β€” are both addressed. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter (max_results) is documented, so the baseline is 3. The description earns extra credit by explaining the semantic consequence of max_results β€” the result set is truncated with no paging cursor, and count == max_results signals more data. That is meaning the schema alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource ('List the user's NotebookLM notebooks, owned and shared') and it explicitly distinguishes itself from notebook_get by stating 'Start here to find a notebook_id by title; once you have the id, notebook_get reads one notebook.' An agent can pick between the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit entry-point guidance ('Start here to find a notebook_id by title') and names the natural follow-up tool and its condition. It also covers the retry condition ('if count equals max_results, call again with a higher max_results'), leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notebook_queryAsk the notebookA

Ask NotebookLM a question that it answers only from the notebook's sources (all of them, or source_ids). Returns the answer and a conversation_id. The answer text keeps NotebookLM's bracketed citation numbers such as [1], but not which passage each number points to. Pass conversation_id back to ask a follow-up; this server remembers the conversation's history while it keeps running.

NameRequiredDescriptionDefault
queryYesThe question, in natural language
source_idsNoAnswer only from these source IDs (from notebook_get); omit to use every source
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create
conversation_idNoconversation_id returned by a previous notebook_query, to ask a follow-up in the same conversation

Output Schema

NameRequiredDescription
answerYesNotebookLM's answer, with bracketed citation numbers such as [1]
statusYes
messageNoHuman-readable outcome or next step
conversation_idYesPass back as conversation_id to ask a follow-up

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond the annotations: it discloses that the answer keeps bracketed citation numbers like [1] but loses the passage mapping, that it returns a conversation_id, and that server-side conversation memory is ephemeral ("while it keeps running"). The readOnlyHint=false is consistent with creating conversation state, so there is no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, front-loaded with the core action and scope, then return shape, then the follow-up mechanism. No filler or repetition of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return fields need not be re-explained, and the description covers the remaining gaps: source scoping, citation limitation, and conversation persistence. An agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description still adds meaning: it clarifies the source_ids scoping behavior (all sources otherwise) and explains the follow-up role of conversation_id, going slightly beyond the per-field schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (ask a question) and resource (NotebookLM notebook) with an explicit scope restriction: it answers only from the notebook's sources, all of them or source_ids. This distinguishes it from siblings like notebook_summarize or research_start without opening their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operational context: restrict answers to all sources or specific source_ids, and pass conversation_id back to continue a conversation. However, it never explicitly contrasts this with alternative tools (e.g., notebook_summarize), so the agent must infer when Q&A is preferred over other retrieval options.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notebook_renameRename notebookA
Idempotent

Change a notebook's title; its sources and chat stay as they are. Returns a confirmation message with the new title. Find the notebook_id with notebook_list first.

NameRequiredDescriptionDefault
new_titleYesNew title for the notebook
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create

Output Schema

NameRequiredDescription
statusYes
messageNoHuman-readable outcome or next step

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=false, idempotent=true, destructive=false. The description adds real value beyond that by specifying the mutation scope (sources and chat are untouched) and the return shape (a confirmation message with the new title). It does not cover permissions or failure modes, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each earning its place, with the mutation and its non-effects front-loaded and the prerequisite last. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be elaborated, yet the description still summarizes the confirmation message. For a two-param idempotent rename, everything an agent needs is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both params are fully documented in the schema. The description's mention of notebook_id/notebook_list marginally reinforces this but adds no syntax or format detail beyond the schema. Baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Change a notebook's title') and immediately scopes what is NOT affected ('its sources and chat stay as they are'). This clearly distinguishes it from siblings like notebook_create, notebook_delete, or source_* tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a concrete prerequisite: 'Find the notebook_id with notebook_list first.' Clear context for invocation, but no explicit when-not-to-use or alternative-selection guidance (e.g., when to rename vs. create).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notebook_summarizeSummarise notebookA
Read-onlyIdempotent

Ask NotebookLM for an AI-generated overview of the whole notebook. Returns a short summary of what its sources cover and the questions NotebookLM suggests asking about them. Use it to get oriented in an unfamiliar notebook; ask specific questions with notebook_query and list the sources with notebook_get.

NameRequiredDescriptionDefault
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create

Output Schema

NameRequiredDescription
statusYes
messageNoHuman-readable outcome or next step
summaryYesOverview of what the sources cover
suggested_questionsYesQuestions NotebookLM suggests asking with notebook_query

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower. The description still adds non-obvious behavior: the output is AI-generated, contains the notebook's coverage plus NotebookLM's suggested follow-up questions, and is a whole-notebook (not per-source) view. That is real context beyond the annotations and output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the action, then the return content, then the routing guidance. Every sentence carries information an agent needs; nothing is decorative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, read-only tool with an output schema and full annotation coverage, the description supplies everything still needed: what it does, what it returns conceptually, and when to prefer siblings. No material gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

A single parameter with 100% schema description coverage, so the schema already documents notebook_id and its provenance (notebook_list / notebook_create). The description adds no syntax or format detail beyond that. Baseline 3 is correct when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("AI-generated overview of the whole notebook") and explicitly scopes it to the entire notebook rather than individual sources or targeted Q&A. It distinguishes itself from notebook_query and notebook_get by name, so an agent can route without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit positive trigger ("use it to get oriented in an unfamiliar notebook") and names two alternatives with their own conditions: notebook_query for specific questions, notebook_get for listing sources. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

quiz_createCreate quizA

Start generating a multiple-choice quiz from the notebook's sources. Uses the user's NotebookLM quota and takes several minutes, so agree on the options with the user first: with confirm=false it does nothing and returns pending_confirmation. With confirm=true it returns the artifact_id; poll studio_status until that artifact is completed. This artifact has no download file: the user opens it in the notebook in NotebookLM.

NameRequiredDescriptionDefault
confirmYesMust be true to start generation. With false the tool only returns pending_confirmation and does nothing
difficultyNoDifficulty: easy, hard, medium (default medium)
source_idsNoLimit generation to these source IDs (from notebook_get); omit to use every source in the notebook
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create
question_countNoNumber of questions (default 5)

Output Schema

NameRequiredDescription
statusYes
messageNoHuman-readable outcome or next step
artifact_idNoID of the new artifact, as listed by studio_status

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes beyond annotations by disclosing quota consumption, multi-minute latency, the confirm=false no-op, the artifact_id return, the need to poll studio_status, and the absence of a downloadable file. These operational details are exactly what an agent needs for a long-running write.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four compact sentences with no filler; the purpose and the critical confirm/polling behavior are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema and annotations, the description covers the remaining agent-critical context: cost, latency, confirmation flow, polling handoff, and artifact access. Nothing essential is omitted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents confirm, difficulty, question_count, source_ids, and notebook_id. The description restates confirm semantics but adds no new parameter-level details beyond the schema, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific action (start generating) and resource (multiple-choice quiz from notebook sources), which distinguishes it from other studio creation tools such as flashcards_create or audio_overview_create. The description is front-loaded and specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear procedural guidance: agree on options first, use confirm=false for a no-op preview, confirm=true to start. It does not explicitly name when to choose this over sibling creation tools, so it gives clear context rather than a full alternatives map.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

report_createCreate reportA

Start generating a written report from the notebook's sources: a Briefing Doc, Study Guide, Blog Post, or your own brief with report_format "Create Your Own" and custom_prompt. Uses the user's NotebookLM quota and takes several minutes, so agree on the options with the user first: with confirm=false it does nothing and returns pending_confirmation. With confirm=true it returns the artifact_id; poll studio_status until that artifact is completed. This artifact has no download file: the user opens it in the notebook in NotebookLM.

NameRequiredDescriptionDefault
confirmYesMust be true to start generation. With false the tool only returns pending_confirmation and does nothing
languageNoBCP-47 language code such as en, es or fr; omit for NotebookLM's default
source_idsNoLimit generation to these source IDs (from notebook_get); omit to use every source in the notebook
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create
custom_promptNoWhat the report should be, used when report_format is "Create Your Own"
report_formatNoFormat: Briefing Doc, Study Guide, Blog Post, Create Your Own

Output Schema

NameRequiredDescription
statusYes
messageNoHuman-readable outcome or next step
artifact_idNoID of the new artifact, as listed by studio_status

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: states quota consumption, multi-minute latency, the exact no-op behavior of confirm=false (returns pending_confirmation), the artifact_id returned by confirm=true, and the non-obvious fact that this artifact has no downloadable file and must be opened in NotebookLM. That is exactly the context annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: purpose first, then cost/workflow, then return-value caveat. Only mild redundancy with the schema's confirm description, and the long single-paragraph form makes the workflow steps slightly harder to scan than they could be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a long-running, quota-consuming generation tool with an output schema, the description supplies everything needed to call it safely: prerequisites, side effects, confirmation semantics, follow-up polling, and where the result is consumed. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real value by linking report_format to the 'Create Your Own' option that requires custom_prompt, a relationship the per-field schema text does not make explicit. Minor: it does not mention language or source_ids scoping.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Start generating a written report from the notebook's sources') and enumerates the concrete formats available. It is clearly distinguishable from the sibling studio generators (audio_overview_create, video_overview_create, quiz_create, etc.) because it names 'written report' and its formats.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to 'agree on the options with the user first' because it consumes the user's quota and takes minutes, and describes the two-step workflow (confirm=false previews, confirm=true starts, then poll studio_status). It names the follow-up tool and the condition that triggers it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

research_importImport research resultsA

Add results of a finished research task to the notebook as sources. Only web results can be imported: without source_indices it imports every web result and skips Drive ones. NotebookLM fetches each URL and skips any it can't reach, so it returns "Imported X of Y research sources". If none could be fetched the call fails and the task shows import_failed; a retry may succeed.

NameRequiredDescriptionDefault
task_idYestask_id from research_start
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create
source_indicesNoIndices into the task's sources as listed by research_status (omit to import every web result)

Output Schema

NameRequiredDescription
statusYes
messageNoHuman-readable outcome or next step

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover safety (readOnly=false, destructive=false, openWorld=true, idempotent=false); the description goes further by disclosing partial-success semantics ('fetches each URL and skips any it can't reach'), the return message shape, the import_failed error state, and that a retry may succeed. The one notable gap is that it never states whether re-importing the same results creates duplicate sources, which matters given idempotentHint=false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences, front-loaded with the action and the importable-scope constraint before the failure/retry details. No filler and each sentence carries distinct information (scope, filtering, partial success, failure).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter mutating tool with full schema coverage, annotations, and an output schema, the description covers scope, filtering, partial failure, and retry well. The only meaningful omission is duplicate-import behavior on repeated calls.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including the meaning of source_indices and its omit behavior, so the baseline is 3. The description largely restates the same omit rule and adds only the Drive-skip detail, which is a modest gain rather than compensating for any missing schema information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Add results of a finished research task to the notebook as sources') and scopes it to a completed research task, which cleanly separates it from research_start and research_status in the sibling list. An agent can tell what this does without reading the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear precondition ('a finished research task') and an explicit rule for when to pass source_indices versus omitting it, plus the constraint that only web results are importable. It stops short of naming what to do if the task is not yet finished (e.g., poll research_status) or of pointing at an alternative tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

research_startStart researchA

Start a NotebookLM research task that searches the web, or the user's Google Drive, for sources on a topic. Deep mode is more thorough and slower than the default fast mode. Returns a task_id: poll research_status with it, then import the results you want with research_import.

NameRequiredDescriptionDefault
modeNoMode: deep, fast (default: fast)
queryYesTopic or question to research
sourceNoSource: drive, web (default: web)
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create

Output Schema

NameRequiredDescription
statusYes
messageNoHuman-readable outcome or next step
task_idYesPass to research_status and research_import

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=false) already signal a non-idempotent, open-world write; the description adds genuinely new behavior β€” that the task runs asynchronously and must be polled via research_status, and that deep mode is slower but more thorough. It does not mention rate limits or cost, keeping it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, each carrying distinct information: what the tool does, the mode tradeoff, and the follow-up workflow. Nothing is redundant and the core purpose is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value detail is unnecessary, and the description covers what an agent still needs: the returned task_id, the required polling step, and the import step. For a 4-parameter async research tool, nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning about the mode parameter (deep is more thorough and slower than the default fast mode) rather than merely restating the enum values. The source distinction (web vs the user's Drive) and the query's role as topic/question are also clarified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource β€” 'Start a NotebookLM research task' β€” and names the scope (web or Google Drive sources on a topic). It is clearly distinguishable from the sibling research_status (polling) and research_import (ingest) tools, which it explicitly routes to.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit downstream routing: poll with research_status using the returned task_id, then import with research_import. It also explains the deep/fast tradeoff so the agent can pick a mode. It does not state conditions under which not to start research, or prerequisites like notebook existence, so it stops short of full when/when-not coverage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

research_statusCheck researchA
Read-onlyIdempotent

Check research tasks in a notebook: one task, or all of them. Returns each task's status (in_progress, completed, imported, import_failed, or unknown for a state this server doesn't recognise), query, summary and found sources (url, title, description, type). Poll until the status is no longer in_progress; a source's position in this list is the index research_import takes.

NameRequiredDescriptionDefault
task_idNotask_id from research_start; omit to list every research task in the notebook
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create

Output Schema

NameRequiredDescription
statusYes
messageNoHuman-readable outcome or next step
resultsYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld and non-destructive. Beyond that, the description discloses the state machine's terminal semantics, the 'unknown' case for unrecognised states, and the positional coupling with research_import β€” meaningful behavioral context not present in the annotations. No rate-limit or eventual-consistency caveats, so not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose in the first clause and packs status values, polling guidance and the cross-tool index link into three dense sentences with little waste. Slightly run-on, but each sentence carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be re-explained, yet the description still summarises the payload shape. With annotations covering the safety profile and the schema covering parameters, nothing an agent needs in order to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already fully documented in the schema. The description's 'one task, or all of them' reinforces the task_id omission behavior but adds no syntax or format detail beyond that, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Check research tasks in a notebook') plus the scope ('one task, or all of them'), and enumerates the exact status strings returned. The closing reference to research_import's index argument distinguishes it from research_start and research_import without needing to open either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit operational guidance ('Poll until the status is no longer in_progress') and tells the agent how to use the result with research_import. It does not explicitly name research_start as the counterpart for initiating a task or state exclusions, so it stops short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

slide_deck_createCreate slide deckA

Start generating a slide deck from the notebook's sources. Uses the user's NotebookLM quota and takes several minutes, so agree on the options with the user first: with confirm=false it does nothing and returns pending_confirmation. With confirm=true it returns the artifact_id; poll studio_status until that artifact is completed. Once completed, studio_status gives a download_url for the deck as a PDF.

NameRequiredDescriptionDefault
formatNoFormat: detailed_deck, presenter_slides
lengthNoLength: default, short
confirmYesMust be true to start generation. With false the tool only returns pending_confirmation and does nothing
languageNoBCP-47 language code such as en, es or fr; omit for NotebookLM's default
source_idsNoLimit generation to these source IDs (from notebook_get); omit to use every source in the notebook
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create
focus_promptNoOptional instruction on what to focus on or emphasise, e.g. "the methodology section"

Output Schema

NameRequiredDescription
statusYes
messageNoHuman-readable outcome or next step
artifact_idNoID of the new artifact, as listed by studio_status

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds real behavioral context beyond the annotations: it warns that generation consumes the user's NotebookLM quota and takes several minutes, and it explains the confirm=false no-op versus confirm=true commit and the required polling loop with download_url. It does not, however, state whether a started generation can be cancelled or how duplicate calls behave, so there is room beyond a 3 but it is not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, followed by a cost/latency warning and then the confirm workflow. Every sentence carries actionable information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an async, quota-consuming generation tool this covers the critical path (confirm gate, artifact_id, polling via studio_status, PDF download). An output schema exists so return values need not be detailed, though cancellation/error-recovery behavior is not addressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description's confirm detail largely restates the schema ('Must be true to start generation. With false the tool only returns pending_confirmation and does nothing') and it says nothing about format, length, language, source_ids, or focus_prompt, so it adds little parameter meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Start generating a slide deck from the notebook's sources'), and the resource is inherently distinct from the other studio artifacts (audio_overview_create, video_overview_create, infographic_create, report_create). An agent can identify exactly what this produces without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit pre-conditions and a workflow: agree on options with the user first, use confirm=false to preview, confirm=true to commit, then poll studio_status for completion. This is unambiguous when-to-use and what-to-do-next guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

source_add_driveAdd Google Drive sourceA

Add a Google Drive file as a source, by its Drive file ID and MIME type; the signed-in Google account must be able to open the file. Returns the new source (id, title, type). The source is a snapshot: when the Drive file changes, refresh it with source_sync_drive. For a public web page use source_add_url instead.

NameRequiredDescriptionDefault
titleYesTitle shown for the source in the notebook
file_idYesGoogle Drive file ID, the part after /d/ in the file's URL
doc_typeYesMIME type of the Drive file, e.g. application/vnd.google-apps.document for a Google Doc or application/pdf
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create

Output Schema

NameRequiredDescription
sourceYes
statusYes
messageNoHuman-readable outcome or next step

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare a non-read-only, non-idempotent, open-world write. The description adds context annotations cannot: the source is a snapshot that goes stale and must be refreshed via source_sync_drive, plus the account-level permission prerequisite. It doesn't state what happens on duplicate adds, which is the main remaining gap given idempotentHint=false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, zero filler, front-loaded with the action and required inputs before the constraints and alternatives. Every sentence carries distinct information: action, lifecycle, and routing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be re-explained; the brief '(id, title, type)' mention is harmless. With prerequisites, snapshot/lifecycle behavior, and sibling routing all covered, an agent has everything needed to invoke this correctly on the first try.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter already carries its own description (including the '/d/' hint for file_id and the MIME-type examples). The description only restates that file ID and MIME type are needed, adding no syntax or constraint beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Add a Google Drive file as a source') and pins the required identifiers (Drive file ID, MIME type). It also names the sibling it is not (source_add_url), so an agent can distinguish it without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the precondition ('the signed-in Google account must be able to open the file'), names the refresh path (source_sync_drive) for later changes, and routes public web pages to source_add_url instead. When-to-use, when-to-refresh, and the alternative are all explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

source_add_textAdd text sourceA

Add text as a source: pass it in content, or point file_path at a local file (content wins if both are set). A file_path outside the server's working directory and the OS temp directory is refused; read such a file yourself and pass content. Returns the new source (id, title, type pasted_text). For a web page or YouTube video use source_add_url; for a Drive file, source_add_drive.

NameRequiredDescriptionDefault
titleYesTitle shown for the source in the notebook
contentNoText to add. Takes precedence over file_path
file_pathNoLocal file to read the text from, under the server's working directory or the OS temp directory
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create

Output Schema

NameRequiredDescription
sourceYes
statusYes
messageNoHuman-readable outcome or next step

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only mark it as non-read-only, non-idempotent and open-world. The description adds non-obvious behavioral facts beyond that: the content-vs-file_path precedence rule, the security refusal for paths outside the working directory/temp dir, and the shape of the created record (id, title, type pasted_text).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences: what it does, the two input modes with a precedence tiebreak and a failure escape hatch, then the sibling routing. No filler and the core behavior is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present the return value need not be spelled out, and everything an agent needs to invoke correctly β€” input precedence, sandbox limits, and which sibling to use instead β€” is covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters are already documented. The description largely restates what the schema says (content takes precedence, file_path must be under the working/temp directory), adding no new syntax or format guidance, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource ('Add text as a source') and immediately names the two sibling tools it is NOT for (source_add_url for web/YouTube, source_add_drive for Drive files). An agent can distinguish this from every adjacent add tool without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing rules are given: URL/YouTube content goes to source_add_url, Drive files to source_add_drive, and there is a concrete fallback instruction (read out-of-sandbox files yourself and pass content) for a case that would otherwise fail.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

source_add_urlAdd web page or YouTube sourceA

Add a web page or a YouTube video to a notebook by URL. NotebookLM fetches the page itself, so it must be publicly reachable. Returns the new source (id, title, type web_page or youtube); the title can show the URL until processing finishes. If NotebookLM cannot fetch the page the call fails: check notebook_get before retrying.

NameRequiredDescriptionDefault
urlYesPublic http(s) URL of a web page or a YouTube video
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create

Output Schema

NameRequiredDescription
sourceYes
statusYes
messageNoHuman-readable outcome or next step

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly=false, openWorld=true, idempotent=false, destructive=false), and the description adds genuinely new behavior: fetching is server-side, the page must be publicly reachable, the title may temporarily be the URL while processing, and the call fails outright on fetch failure. The return-value portion overlaps the output schema, so it earns slightly less credit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with what the tool does, then the fetch prerequisite, then the failure/retry caveat. No filler or restated title text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the prerequisite, the async title caveat, and the failure mode, which is more than most add-style tools. The output schema already exists, so the brief return summary is redundant rather than missing, leaving little an agent needs that is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented in the schema, including that the URL must be public http(s). The description restates the public-reachability constraint but adds no syntax, format, or validation detail beyond what the schema supplies. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Add a web page or a YouTube video to a notebook by URL'), and the resource qualifier immediately separates it from sibling text/drive importers like source_add_text and source_add_drive. An agent can distinguish it without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear prerequisite ('must be publicly reachable') and a recovery path ('check notebook_get before retrying'), which is real when-to-use guidance. It does not explicitly name source_add_text/source_add_drive as the alternatives for non-URL content, so the routing is implied by the siblings rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

source_deleteDelete sourceA
DestructiveIdempotent

Permanently remove one source from a notebook. With confirm=false it does nothing and returns pending_confirmation; with confirm=true it deletes and returns a confirmation message. This cannot be undone: name the source to the user and get explicit approval first.

NameRequiredDescriptionDefault
confirmYesMust be true to delete. With false the tool only returns pending_confirmation
source_idYesSource ID, as listed in the notebook's sources by notebook_get
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create

Output Schema

NameRequiredDescription
statusYes
messageNoHuman-readable outcome or next step

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds materially beyond them: the dry-run behavior of confirm=false, the returned sentinel value pending_confirmation, the irreversibility warning, and the human-approval requirement. This is exactly the extra behavioral context a destructive tool should carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, zero filler: the destructive purpose leads, the confirm semantics follow, and the safety warning closes. Each sentence earns its place and the most important constraint (irreversible) is not buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter destructive tool with an output schema and full annotation coverage, the description supplies everything an agent needs: what happens on each confirm value, the return sentinel, the irreversibility, and the approval gate. Nothing required for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents notebook_id, source_id, and confirm. The description restates confirm's semantics ('with confirm=false it does nothing') but adds no syntax, format, or sourcing detail beyond what the schema provides; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Permanently remove one source from a notebook') and scopes it to a single source within a notebook, clearly distinguishing it from read siblings like source_get and source_get_content. An agent can tell immediately what this does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the two-step confirmation flow (confirm=false returns pending_confirmation, confirm=true deletes) and adds a procedural rule: name the source to the user and get explicit approval first. There is no competing delete sibling to disambiguate against, so the absence of named alternatives is acceptable, but no explicit 'do not use for X' boundary is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

source_getDescribe sourceA
Read-onlyIdempotent

Get one source's metadata. Returns its id, title, type (web_page, youtube, pasted_text, pdf, google_docs, ...) and content_length, the number of characters NotebookLM extracted from it. The text itself is left out because it can be very long; fetch it with source_get_content.

NameRequiredDescriptionDefault
source_idYesSource ID, as listed in the notebook's sources by notebook_get
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create

Output Schema

NameRequiredDescription
sourceYes
statusYes
messageNoHuman-readable outcome or next step

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and open-world, so safety is covered. The description adds genuinely non-obvious behavior: what fields come back, the meaning of content_length (characters extracted by NotebookLM), and the deliberate omission of the body text. It does not discuss failure modes (e.g., unknown source_id), but for a simple read that is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences: purpose first, then the concrete return payload, then the exclusion and the redirect. Every sentence carries information and nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, yet the description still summarizes the shape and explains the one surprising omission (body text). Combined with the sibling redirect, an agent has everything needed to call this correctly and to know when not to.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (both notebook_id and source_id are documented with where to obtain them), so the schema carries parameter meaning. The description adds nothing about parameter formats or constraints, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Get one source's metadata') and enumerates the returned fields (id, title, type, content_length), so the agent knows exactly what it gets. It also distinguishes itself from the sibling source_get_content by name, which removes any ambiguity between the two.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent to source_get_content when the extracted text is needed, with the reason ('the text itself is left out because it can be very long'). That is a clear alternative and condition, though it does not state positive scenarios where this metadata call is the right first step (e.g., verifying source type before acting on it).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

source_get_contentGet source textA
Read-onlyIdempotent

Get the full text NotebookLM extracted from a source, with tables flattened to "cell | cell" rows. Returns { text }, which can be long: a long Wikipedia article came to about 100,000 characters. Prefer notebook_query to answer questions; use this when the user needs the verbatim text.

NameRequiredDescriptionDefault
source_idYesSource ID, as listed in the notebook's sources by notebook_get
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create

Output Schema

NameRequiredDescription
textYesThe extracted text; null if NotebookLM returned none
statusYes
messageNoHuman-readable outcome or next step

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuine behavioral context beyond that: the return shape { text }, the fact that tables are flattened to 'cell | cell' rows, and a concrete size warning (~100,000 chars for a long Wikipedia article).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tightly packed sentences, front-loaded with the core purpose, then output format/size, then routing guidance. No filler; every clause carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema existing, the description still communicates the practically important return characteristics (shape, table flattening, potential length) that an agent needs for context-window planning. Combined with the routing advice, nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both notebook_id and source_id are already documented in the schema with their provenance (notebook_get, notebook_list/create). The description adds no further parameter meaning, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (get) and resource (full source text extracted by NotebookLM), and immediately distinguishes itself from source_get by clarifying it returns the extracted text rather than metadata. The table-flattening detail makes the output format unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: prefer notebook_query for answering questions, and use this only when the user needs verbatim text. Both the when and the when-not are named with the alternative tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

source_sync_driveSync Google Drive sourcesA
DestructiveIdempotent

Re-import Google Drive sources (added with source_add_drive) so the notebook uses the latest version of each file, replacing the stored snapshot. With confirm=false it does nothing and returns pending_confirmation; with confirm=true it syncs and returns how many sources were synced.

NameRequiredDescriptionDefault
confirmYesMust be true to sync. With false the tool only returns pending_confirmation
source_idsYesIDs of the Drive sources to sync, from notebook_get
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create

Output Schema

NameRequiredDescription
statusYes
messageNoHuman-readable outcome or next step

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds the concrete consequence: the stored snapshot is replaced. It also discloses the two return modes (pending_confirmation vs. count of synced sources). It stops short of covering failure modes or permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste, front-loaded with the destructive effect and then the confirm branch. Both sentences earn their place by conveying behavior not present in structured fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, idempotent mutation with a full schema and an output schema, the description covers the essential what, the snapshot-replacement consequence, and the confirm gating. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents confirm, source_ids and notebook_id. The description restates the confirm semantics rather than adding new syntax or constraints. Baseline 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Re-import Google Drive sources') and names the originating sibling (source_add_drive) plus the effect ('replacing the stored snapshot'). An agent can distinguish this from source_add_drive and other source tools without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear context: use it to make the notebook use the latest version of files previously added via source_add_drive. It also routes behavior by flag ('with confirm=false it does nothing'). It does not explicitly state when NOT to use it or name a preferred alternative for other refresh cases, which keeps it below a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

studio_statusCheck Studio artifactsA
Read-onlyIdempotent

List the notebook's Studio artifacts. Returns each one's id, type (audio, video, report, flashcards, quiz, infographic, slide_deck), status (pending, generating, completed or failed) and download_url: set for completed audio, video, infographics and slide decks (PDF), null otherwise. It lists older artifacts too: after a *_create call, poll every 30-60 seconds and find yours by its artifact_id.

NameRequiredDescriptionDefault
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create

Output Schema

NameRequiredDescription
statusYes
messageNoHuman-readable outcome or next step
artifactsYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safe read-only, idempotent profile. The description adds important behavioral context beyond that: it lists the returned fields and their status values, specifies when download_url is populated, notes that older artifacts are also listed, and recommends a polling cadence after creation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action, then adds return details and polling guidance in two compact sentences. Every sentence contributes useful information without unnecessary padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter list/status tool with an output schema and rich annotations, the description is complete. It covers the return shape, status lifecycle, download_url behavior, and the polling workflow after creation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the single notebook_id parameter is fully documented in the schema. The description adds only the implicit scoping to the notebook and does not provide meaningful new syntax or format details beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (List) and resource (Studio artifacts), scoped to the notebook. It clearly distinguishes this status-listing tool from the many sibling creation tools like audio_overview_create and video_overview_create.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage context: after a *_create call, poll every 30-60 seconds and locate the artifact by artifact_id. It does not explicitly name alternatives or state when not to use the tool, but the polling instructions are actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

video_overview_createCreate Video OverviewA

Start generating a Video Overview: a narrated video with visuals that explains the notebook's sources. Uses the user's NotebookLM quota and takes several minutes, so agree on the options with the user first: with confirm=false it does nothing and returns pending_confirmation. With confirm=true it returns the artifact_id; poll studio_status until that artifact is completed. Once completed, studio_status gives a video download_url.

NameRequiredDescriptionDefault
formatNoFormat: brief, explainer
confirmYesMust be true to start generation. With false the tool only returns pending_confirmation and does nothing
languageNoBCP-47 language code such as en, es or fr; omit for NotebookLM's default
source_idsNoLimit generation to these source IDs (from notebook_get); omit to use every source in the notebook
notebook_idYesNotebook ID, as returned by notebook_list or notebook_create
focus_promptNoOptional instruction on what to focus on or emphasise, e.g. "the methodology section"
visual_styleNoVisual style: anime, auto_select, classic, custom, heritage, kawaii, paper_craft, retro_print, watercolor, whiteboard

Output Schema

NameRequiredDescription
statusYes
messageNoHuman-readable outcome or next step
artifact_idNoID of the new artifact, as listed by studio_status

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false), and the description adds substantial context beyond them: it consumes the user's NotebookLM quota, takes several minutes, confirm=false is a true no-op returning pending_confirmation, and confirm=true returns an artifact_id to be polled. This is exactly the operational detail an agent needs before committing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences with no filler: the outcome first, then the confirmation protocol, then the polling/download path. Every clause carries operational value and the confirm semantics are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a long-running, quota-consuming generation tool, the description supplies the full lifecycle (confirm gate, artifact_id, polling, download_url) even though an output schema exists. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all seven parameters including enums for format, visual_style, and language. The description only elaborates on confirm, which the schema already explains, so it adds little parameter meaning beyond the structured fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Start generating a Video Overview: a narrated video with visuals that explains the notebook's sources'), which clearly distinguishes it from audio_overview_create, slide_deck_create, and infographic_create without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit operating context: agree on options with the user first, use confirm=false for a dry run, and poll studio_status after confirm=true. It routes the agent to the right follow-up tool, though it never explicitly contrasts itself with the sibling overview/deck creators when choosing output medium.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 27 tool updatesv0.5.0
    • Changedaudio_overview_create1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "artifact_id": {
        +      "description": "ID of the new artifact, as listed by studio_status",
        +      "type": "string"
        +    },
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "status": {
        +      "enum": [
        +        "success",
        +        "pending_confirmation"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedauth_refresh1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "status": {
        +      "const": "success",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedauth_save_tokens1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "status": {
        +      "const": "success",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedflashcards_create1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "artifact_id": {
        +      "description": "ID of the new artifact, as listed by studio_status",
        +      "type": "string"
        +    },
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "status": {
        +      "enum": [
        +        "success",
        +        "pending_confirmation"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedinfographic_create1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "artifact_id": {
        +      "description": "ID of the new artifact, as listed by studio_status",
        +      "type": "string"
        +    },
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "status": {
        +      "enum": [
        +        "success",
        +        "pending_confirmation"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changednotebook_create1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "notebook": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "created_at": {
        +          "description": "ISO 8601 timestamp",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "emoji": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "description": "Notebook ID",
        +          "type": "string"
        +        },
        +        "is_shared": {
        +          "type": "boolean"
        +        },
        +        "modified_at": {
        +          "description": "ISO 8601 timestamp",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "ownership": {
        +          "enum": [
        +            "mine",
        +            "shared"
        +          ],
        +          "type": "string"
        +        },
        +        "sources": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "id": {
        +                "description": "Source ID",
        +                "type": "string"
        +              },
        +              "title": {
        +                "type": "string"
        +              },
        +              "type": {
        +                "description": "web_page, youtube, pasted_text, pdf, google_docs, google_slides_sheets, ... or unknown",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "id",
        +              "title",
        +              "type"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "title",
        +        "emoji",
        +        "sources",
        +        "is_shared",
        +        "ownership",
        +        "created_at",
        +        "modified_at"
        +      ],
        +      "type": "object"
        +    },
        +    "status": {
        +      "const": "success",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "notebook"
        +  ],
        +  "type": "object"
        +}
    • Changednotebook_delete1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "status": {
        +      "enum": [
        +        "success",
        +        "pending_confirmation"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changednotebook_get1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "notebook": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "created_at": {
        +          "description": "ISO 8601 timestamp",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "emoji": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "description": "Notebook ID",
        +          "type": "string"
        +        },
        +        "is_shared": {
        +          "type": "boolean"
        +        },
        +        "modified_at": {
        +          "description": "ISO 8601 timestamp",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "ownership": {
        +          "enum": [
        +            "mine",
        +            "shared"
        +          ],
        +          "type": "string"
        +        },
        +        "sources": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "id": {
        +                "description": "Source ID",
        +                "type": "string"
        +              },
        +              "title": {
        +                "type": "string"
        +              },
        +              "type": {
        +                "description": "web_page, youtube, pasted_text, pdf, google_docs, google_slides_sheets, ... or unknown",
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "id",
        +              "title",
        +              "type"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "title",
        +        "emoji",
        +        "sources",
        +        "is_shared",
        +        "ownership",
        +        "created_at",
        +        "modified_at"
        +      ],
        +      "type": "object"
        +    },
        +    "status": {
        +      "const": "success",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "notebook"
        +  ],
        +  "type": "object"
        +}
    • Changednotebook_list1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "count": {
        +      "description": "Number of notebooks returned",
        +      "type": "number"
        +    },
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "notebooks": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "created_at": {
        +            "description": "ISO 8601 timestamp",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "emoji": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "id": {
        +            "description": "Notebook ID",
        +            "type": "string"
        +          },
        +          "is_shared": {
        +            "type": "boolean"
        +          },
        +          "modified_at": {
        +            "description": "ISO 8601 timestamp",
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "ownership": {
        +            "enum": [
        +              "mine",
        +              "shared"
        +            ],
        +            "type": "string"
        +          },
        +          "sources": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "id": {
        +                  "description": "Source ID",
        +                  "type": "string"
        +                },
        +                "title": {
        +                  "type": "string"
        +                },
        +                "type": {
        +                  "description": "web_page, youtube, pasted_text, pdf, google_docs, google_slides_sheets, ... or unknown",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "title",
        +                "type"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "title": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "title",
        +          "emoji",
        +          "sources",
        +          "is_shared",
        +          "ownership",
        +          "created_at",
        +          "modified_at"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "status": {
        +      "const": "success",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "notebooks",
        +    "count"
        +  ],
        +  "type": "object"
        +}
    • Changednotebook_query1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "answer": {
        +      "description": "NotebookLM's answer, with bracketed citation numbers such as [1]",
        +      "type": "string"
        +    },
        +    "conversation_id": {
        +      "description": "Pass back as conversation_id to ask a follow-up",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "status": {
        +      "const": "success",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "answer",
        +    "conversation_id"
        +  ],
        +  "type": "object"
        +}
    • Changednotebook_rename1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "status": {
        +      "const": "success",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changednotebook_summarize1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "status": {
        +      "const": "success",
        +      "type": "string"
        +    },
        +    "suggested_questions": {
        +      "description": "Questions NotebookLM suggests asking with notebook_query",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "summary": {
        +      "description": "Overview of what the sources cover",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "summary",
        +    "suggested_questions"
        +  ],
        +  "type": "object"
        +}
    • Changedquiz_create1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "artifact_id": {
        +      "description": "ID of the new artifact, as listed by studio_status",
        +      "type": "string"
        +    },
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "status": {
        +      "enum": [
        +        "success",
        +        "pending_confirmation"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedreport_create1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "artifact_id": {
        +      "description": "ID of the new artifact, as listed by studio_status",
        +      "type": "string"
        +    },
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "status": {
        +      "enum": [
        +        "success",
        +        "pending_confirmation"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedresearch_import1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "status": {
        +      "const": "success",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedresearch_start1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "status": {
        +      "const": "success",
        +      "type": "string"
        +    },
        +    "task_id": {
        +      "description": "Pass to research_status and research_import",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "task_id"
        +  ],
        +  "type": "object"
        +}
    • Changedresearch_status1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "results": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "query": {
        +            "type": "string"
        +          },
        +          "sources": {
        +            "description": "Found sources; a source's position here is its index for research_import",
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "description": {
        +                  "type": [
        +                    "string",
        +                    "null"
        +                  ]
        +                },
        +                "title": {
        +                  "type": "string"
        +                },
        +                "type": {
        +                  "description": "web, google_doc, google_slides, google_sheets, deep_report or unknown",
        +                  "type": "string"
        +                },
        +                "url": {
        +                  "description": "null for results research_import cannot import, such as Drive files",
        +                  "type": [
        +                    "string",
        +                    "null"
        +                  ]
        +                }
        +              },
        +              "required": [
        +                "url",
        +                "title",
        +                "description",
        +                "type"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "status": {
        +            "enum": [
        +              "in_progress",
        +              "completed",
        +              "imported",
        +              "import_failed",
        +              "unknown"
        +            ],
        +            "type": "string"
        +          },
        +          "summary": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "task_id": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "task_id",
        +          "status",
        +          "query",
        +          "summary",
        +          "sources"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "status": {
        +      "const": "success",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "results"
        +  ],
        +  "type": "object"
        +}
    • Changedslide_deck_create1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "artifact_id": {
        +      "description": "ID of the new artifact, as listed by studio_status",
        +      "type": "string"
        +    },
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "status": {
        +      "enum": [
        +        "success",
        +        "pending_confirmation"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedsource_add_drive1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "source": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "id": {
        +          "description": "Source ID",
        +          "type": "string"
        +        },
        +        "title": {
        +          "type": "string"
        +        },
        +        "type": {
        +          "description": "web_page, youtube, pasted_text, pdf, google_docs, google_slides_sheets, ... or unknown",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "title",
        +        "type"
        +      ],
        +      "type": "object"
        +    },
        +    "status": {
        +      "const": "success",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "source"
        +  ],
        +  "type": "object"
        +}
    • Changedsource_add_text1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "source": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "id": {
        +          "description": "Source ID",
        +          "type": "string"
        +        },
        +        "title": {
        +          "type": "string"
        +        },
        +        "type": {
        +          "description": "web_page, youtube, pasted_text, pdf, google_docs, google_slides_sheets, ... or unknown",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "title",
        +        "type"
        +      ],
        +      "type": "object"
        +    },
        +    "status": {
        +      "const": "success",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "source"
        +  ],
        +  "type": "object"
        +}
    • Changedsource_add_url1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "source": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "id": {
        +          "description": "Source ID",
        +          "type": "string"
        +        },
        +        "title": {
        +          "type": "string"
        +        },
        +        "type": {
        +          "description": "web_page, youtube, pasted_text, pdf, google_docs, google_slides_sheets, ... or unknown",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "title",
        +        "type"
        +      ],
        +      "type": "object"
        +    },
        +    "status": {
        +      "const": "success",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "source"
        +  ],
        +  "type": "object"
        +}
    • Changedsource_delete1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "status": {
        +      "enum": [
        +        "success",
        +        "pending_confirmation"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedsource_get1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "source": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "content_length": {
        +          "description": "Characters of text NotebookLM extracted; 0 if it returned none",
        +          "type": "number"
        +        },
        +        "id": {
        +          "description": "Source ID",
        +          "type": "string"
        +        },
        +        "title": {
        +          "type": "string"
        +        },
        +        "type": {
        +          "description": "web_page, youtube, pasted_text, pdf, google_docs, google_slides_sheets, ... or unknown",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "title",
        +        "type",
        +        "content_length"
        +      ],
        +      "type": "object"
        +    },
        +    "status": {
        +      "const": "success",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "source"
        +  ],
        +  "type": "object"
        +}
    • Changedsource_get_content1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "status": {
        +      "const": "success",
        +      "type": "string"
        +    },
        +    "text": {
        +      "description": "The extracted text; null if NotebookLM returned none",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "text"
        +  ],
        +  "type": "object"
        +}
    • Changedsource_sync_drive1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "status": {
        +      "enum": [
        +        "success",
        +        "pending_confirmation"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedstudio_status1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "artifacts": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "download_url": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "id": {
        +            "description": "Artifact ID, as returned by the *_create tools",
        +            "type": "string"
        +          },
        +          "status": {
        +            "enum": [
        +              "pending",
        +              "generating",
        +              "completed",
        +              "failed"
        +            ],
        +            "type": "string"
        +          },
        +          "type": {
        +            "description": "audio, video, report, flashcards, quiz, infographic, slide_deck, data_table or unknown",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "type",
        +          "status",
        +          "download_url"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "status": {
        +      "const": "success",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "artifacts"
        +  ],
        +  "type": "object"
        +}
    • Changedvideo_overview_create1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "artifact_id": {
        +      "description": "ID of the new artifact, as listed by studio_status",
        +      "type": "string"
        +    },
        +    "message": {
        +      "description": "Human-readable outcome or next step",
        +      "type": "string"
        +    },
        +    "status": {
        +      "enum": [
        +        "success",
        +        "pending_confirmation"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
  2. 33 tool updatesv0.4.0
    • Changedaudio_overview_create6 fields changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Must be true to start generation"New value: +"Must be true to start generation. With false the tool only returns pending_confirmation and does nothing"
      • changedInput schema / properties / focus_prompt / description
        Previous value: -"Focus prompt for the audio"New value: +"Optional instruction on what to focus on or emphasise, e.g. \"the methodology section\""
      • changedInput schema / properties / format / description
        Previous value: -"Format: brief, critique, debate, deep_dive"New value: +"Format: brief, critique, debate, deep_dive. deep_dive is the default two-host discussion"
      • changedInput schema / properties / language / description
        Previous value: -"BCP-47 language code (e.g. en, es)"New value: +"BCP-47 language code such as en, es or fr; omit for NotebookLM's default"
      • changedInput schema / properties / notebook_id / description
        Previous value: -"The notebook ID"New value: +"Notebook ID, as returned by notebook_list or notebook_create"
      • changedInput schema / properties / source_ids / description
        Previous value: -"Source IDs (omit for all)"New value: +"Limit generation to these source IDs (from notebook_get); omit to use every source in the notebook"
    • Addedauth_refresh
    • Addedauth_save_tokens
    • Changedflashcards_create4 fields changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Must be true to start generation"New value: +"Must be true to start generation. With false the tool only returns pending_confirmation and does nothing"
      • changedInput schema / properties / difficulty / description
        Previous value: -"Difficulty: easy, hard, medium"New value: +"Difficulty: easy, hard, medium (default medium)"
      • changedInput schema / properties / notebook_id / description
        Previous value: -"The notebook ID"New value: +"Notebook ID, as returned by notebook_list or notebook_create"
      • changedInput schema / properties / source_ids / description
        Previous value: -"Source IDs (omit for all)"New value: +"Limit generation to these source IDs (from notebook_get); omit to use every source in the notebook"
    • Changedinfographic_create6 fields changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Must be true to start generation"New value: +"Must be true to start generation. With false the tool only returns pending_confirmation and does nothing"
      • changedInput schema / properties / detail_level / description
        Previous value: -"Details: concise, detailed, standard"New value: +"Level of detail: concise, detailed, standard"
      • changedInput schema / properties / focus_prompt / description
        Previous value: -"Focus prompt"New value: +"Optional instruction on what to focus on or emphasise, e.g. \"the methodology section\""
      • changedInput schema / properties / language / description
        Previous value: -"BCP-47 language code"New value: +"BCP-47 language code such as en, es or fr; omit for NotebookLM's default"
      • changedInput schema / properties / notebook_id / description
        Previous value: -"The notebook ID"New value: +"Notebook ID, as returned by notebook_list or notebook_create"
      • changedInput schema / properties / source_ids / description
        Previous value: -"Source IDs (omit for all)"New value: +"Limit generation to these source IDs (from notebook_get); omit to use every source in the notebook"
    • Removednotebook_add_drive
    • Removednotebook_add_text
    • Removednotebook_add_url
    • Changednotebook_delete2 fields changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Must be true to confirm deletion"New value: +"Must be true to delete. With false the tool only returns pending_confirmation"
      • changedInput schema / properties / notebook_id / description
        Previous value: -"The notebook ID"New value: +"Notebook ID, as returned by notebook_list or notebook_create"
    • Removednotebook_describe
    • Changednotebook_get1 field changed
      • changedInput schema / properties / notebook_id / description
        Previous value: -"The notebook ID"New value: +"Notebook ID, as returned by notebook_list or notebook_create"
    • Changednotebook_list1 field changed
      • changedInput schema / properties / max_results / description
        Previous value: -"Maximum notebooks to return (default 100)"New value: +"Maximum number of notebooks to return (default 100)"
    • Changednotebook_query4 fields changed
      • changedInput schema / properties / conversation_id / description
        Previous value: -"Conversation ID for follow-up questions"New value: +"conversation_id returned by a previous notebook_query, to ask a follow-up in the same conversation"
      • changedInput schema / properties / notebook_id / description
        Previous value: -"The notebook ID"New value: +"Notebook ID, as returned by notebook_list or notebook_create"
      • changedInput schema / properties / query / description
        Previous value: -"Question to ask"New value: +"The question, in natural language"
      • changedInput schema / properties / source_ids / description
        Previous value: -"Specific source IDs to query (omit for all)"New value: +"Answer only from these source IDs (from notebook_get); omit to use every source"
    • Changednotebook_rename1 field changed
      • changedInput schema / properties / notebook_id / description
        Previous value: -"The notebook ID"New value: +"Notebook ID, as returned by notebook_list or notebook_create"
    • Addednotebook_summarize
    • Changedquiz_create4 fields changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Must be true to start generation"New value: +"Must be true to start generation. With false the tool only returns pending_confirmation and does nothing"
      • changedInput schema / properties / difficulty / description
        Previous value: -"Difficulty: easy, hard, medium"New value: +"Difficulty: easy, hard, medium (default medium)"
      • changedInput schema / properties / notebook_id / description
        Previous value: -"The notebook ID"New value: +"Notebook ID, as returned by notebook_list or notebook_create"
      • changedInput schema / properties / source_ids / description
        Previous value: -"Source IDs (omit for all)"New value: +"Limit generation to these source IDs (from notebook_get); omit to use every source in the notebook"
    • Removedrefresh_auth
    • Changedreport_create5 fields changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Must be true to start generation"New value: +"Must be true to start generation. With false the tool only returns pending_confirmation and does nothing"
      • changedInput schema / properties / custom_prompt / description
        Previous value: -"Custom prompt (when format='Create Your Own')"New value: +"What the report should be, used when report_format is \"Create Your Own\""
      • changedInput schema / properties / language / description
        Previous value: -"BCP-47 language code"New value: +"BCP-47 language code such as en, es or fr; omit for NotebookLM's default"
      • changedInput schema / properties / notebook_id / description
        Previous value: -"The notebook ID"New value: +"Notebook ID, as returned by notebook_list or notebook_create"
      • changedInput schema / properties / source_ids / description
        Previous value: -"Source IDs (omit for all)"New value: +"Limit generation to these source IDs (from notebook_get); omit to use every source in the notebook"
    • Changedresearch_import2 fields changed
      • changedInput schema / properties / notebook_id / description
        Previous value: -"The notebook ID"New value: +"Notebook ID, as returned by notebook_list or notebook_create"
      • changedInput schema / properties / task_id / description
        Previous value: -"Research task ID"New value: +"task_id from research_start"
    • Changedresearch_start2 fields changed
      • changedInput schema / properties / notebook_id / description
        Previous value: -"The notebook ID"New value: +"Notebook ID, as returned by notebook_list or notebook_create"
      • changedInput schema / properties / query / description
        Previous value: -"Research query"New value: +"Topic or question to research"
    • Changedresearch_status2 fields changed
      • changedInput schema / properties / notebook_id / description
        Previous value: -"The notebook ID"New value: +"Notebook ID, as returned by notebook_list or notebook_create"
      • changedInput schema / properties / task_id / description
        Previous value: -"Specific task ID to check (omit for all)"New value: +"task_id from research_start; omit to list every research task in the notebook"
    • Removedsave_auth_tokens
    • Changedslide_deck_create5 fields changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Must be true to start generation"New value: +"Must be true to start generation. With false the tool only returns pending_confirmation and does nothing"
      • changedInput schema / properties / focus_prompt / description
        Previous value: -"Focus prompt"New value: +"Optional instruction on what to focus on or emphasise, e.g. \"the methodology section\""
      • changedInput schema / properties / language / description
        Previous value: -"BCP-47 language code"New value: +"BCP-47 language code such as en, es or fr; omit for NotebookLM's default"
      • changedInput schema / properties / notebook_id / description
        Previous value: -"The notebook ID"New value: +"Notebook ID, as returned by notebook_list or notebook_create"
      • changedInput schema / properties / source_ids / description
        Previous value: -"Source IDs (omit for all)"New value: +"Limit generation to these source IDs (from notebook_get); omit to use every source in the notebook"
    • Addedsource_add_drive
    • Addedsource_add_text
    • Addedsource_add_url
    • Changedsource_delete3 fields changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Must be true to confirm deletion"New value: +"Must be true to delete. With false the tool only returns pending_confirmation"
      • changedInput schema / properties / notebook_id / description
        Previous value: -"The notebook ID"New value: +"Notebook ID, as returned by notebook_list or notebook_create"
      • changedInput schema / properties / source_id / description
        Previous value: -"The source ID"New value: +"Source ID, as listed in the notebook's sources by notebook_get"
    • Removedsource_describe
    • Addedsource_get
    • Changedsource_get_content2 fields changed
      • changedInput schema / properties / notebook_id / description
        Previous value: -"The notebook ID"New value: +"Notebook ID, as returned by notebook_list or notebook_create"
      • changedInput schema / properties / source_id / description
        Previous value: -"The document ID to retrieve"New value: +"Source ID, as listed in the notebook's sources by notebook_get"
    • Changedsource_sync_drive3 fields changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Must be true to confirm sync"New value: +"Must be true to sync. With false the tool only returns pending_confirmation"
      • changedInput schema / properties / notebook_id / description
        Previous value: -"The notebook ID"New value: +"Notebook ID, as returned by notebook_list or notebook_create"
      • changedInput schema / properties / source_ids / description
        Previous value: -"Source IDs to sync"New value: +"IDs of the Drive sources to sync, from notebook_get"
    • Changedstudio_status1 field changed
      • changedInput schema / properties / notebook_id / description
        Previous value: -"The notebook ID"New value: +"Notebook ID, as returned by notebook_list or notebook_create"
    • Changedvideo_overview_create6 fields changed
      • changedInput schema / properties / confirm / description
        Previous value: -"Must be true to start generation"New value: +"Must be true to start generation. With false the tool only returns pending_confirmation and does nothing"
      • changedInput schema / properties / focus_prompt / description
        Previous value: -"Focus prompt"New value: +"Optional instruction on what to focus on or emphasise, e.g. \"the methodology section\""
      • changedInput schema / properties / language / description
        Previous value: -"BCP-47 language code"New value: +"BCP-47 language code such as en, es or fr; omit for NotebookLM's default"
      • changedInput schema / properties / notebook_id / description
        Previous value: -"The notebook ID"New value: +"Notebook ID, as returned by notebook_list or notebook_create"
      • changedInput schema / properties / source_ids / description
        Previous value: -"Source IDs (omit for all)"New value: +"Limit generation to these source IDs (from notebook_get); omit to use every source in the notebook"
      • changedInput schema / properties / visual_style / description
        Previous value: -"Style: anime, auto_select, classic, custom, heritage, kawaii, paper_craft, retro_print, watercolor, whiteboard"New value: +"Visual style: anime, auto_select, classic, custom, heritage, kawaii, paper_craft, retro_print, watercolor, whiteboard"
  3. 1 tool updatev0.3.2
    • Changedresearch_import1 field changed
      • changedInput schema / properties / source_indices / description
        Previous value: -"Specific source indices to import (omit for all)"New value: +"Indices into the task's sources as listed by research_status (omit to import every web result)"
  4. 27 tool updatesv0.3.1
    • First observedaudio_overview_create
    • First observedflashcards_create
    • First observedinfographic_create
    • First observednotebook_add_drive
    • First observednotebook_add_text
    • First observednotebook_add_url
    • First observednotebook_create
    • First observednotebook_delete
    • First observednotebook_describe
    • First observednotebook_get
    • First observednotebook_list
    • First observednotebook_query
    • First observednotebook_rename
    • First observedquiz_create
    • First observedrefresh_auth
    • First observedreport_create
    • First observedresearch_import
    • First observedresearch_start
    • First observedresearch_status
    • First observedsave_auth_tokens
    • First observedslide_deck_create
    • First observedsource_delete
    • First observedsource_describe
    • First observedsource_get_content
    • First observedsource_sync_drive
    • First observedstudio_status
    • First observedvideo_overview_create

TDQS

A4.2/5.0

Scored across 27 tools

Disambiguation5/5

The tools divide cleanly by domain and action: notebook CRUD, source ingestion/retrieval, Studio artifact generation, research, query, and auth. Parallel families like the seven *_create Studio tools are distinguished by artifact type in the name and description, so an agent can select correctly.

Naming Consistency5/5

All names use snake_case and a consistent domain-first, action-second pattern (notebook_list, source_add_url, report_create, research_start). Occasional extra qualifiers such as source_get_content and auth_save_tokens remain predictable.

Tool Count3/5

27 tools is heavy: the Studio suite could consolidate seven near-identical *_create tools into one parameterised tool, and source ingestion could be unified. However each tool maps to a distinct capability, so the count is borderline rather than arbitrary.

Completeness4/5

Core notebooks, sources, Studio artifacts, research, query, and auth workflows are covered. Gaps include deleting or updating Studio artifacts and refreshing non-Drive URL sources, but agents can work around these.

Maintenance

ActivityMaintained
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers