notebooklm-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| refresh_authA | Reload auth tokens from disk or run headless re-authentication. Call this after running Returns status indicating if tokens were refreshed successfully. |
| save_auth_tokensA | Save NotebookLM cookies (FALLBACK method - try IMPORTANT FOR AI ASSISTANTS:
Args: cookies: Cookie header from Chrome DevTools (only needed if CLI fails) csrf_token: Deprecated - auto-extracted session_id: Deprecated - auto-extracted request_body: Optional - contains CSRF if extracting manually request_url: Optional - contains session ID if extracting manually |
| batchA | Perform batch operations across multiple notebooks. Actions:
Args: action: Operation to perform (query, add_source, create, delete, studio) query: Question to ask (for action=query) source_url: URL to add (for action=add_source) titles: Comma-separated notebook titles (for action=create) artifact_type: Artifact type (for action=studio): audio, video, report, etc. notebook_names: Comma-separated notebook names or IDs tags: Comma-separated tags to select notebooks all: Apply to ALL notebooks confirm: Must be True for delete action |
| notebook_queryA | Ask AI about EXISTING sources already in notebook. NOT for finding new sources. Use research_start instead for: deep research, web search, find new sources, Drive search. Args: notebook_id: Notebook UUID query: Question to ask source_ids: Source IDs to query (default: all) conversation_id: For follow-up questions timeout: Request timeout in seconds (default: from env NOTEBOOKLM_QUERY_TIMEOUT or 120.0) new_conversation: Start a fresh conversation when conversation_id is omitted |
| chat_configureB | Configure notebook chat settings. Args: notebook_id: Notebook UUID goal: default|learning_guide|custom custom_prompt: Required when goal=custom (max 10000 chars) response_length: default|longer|shorter |
| notebook_query_startA | Start a notebook query asynchronously for large notebooks that may timeout. Use this instead of notebook_query when querying notebooks with many sources (50+) where the response may take longer than 60 seconds. Returns immediately with a query_id. Poll notebook_query_status with the query_id to get the result. Workflow: notebook_query_start -> poll notebook_query_status until completed. Args: notebook_id: Notebook UUID query: Question to ask source_ids: Source IDs to query (default: all) conversation_id: For follow-up questions timeout: Request timeout in seconds (default: from env NOTEBOOKLM_QUERY_TIMEOUT or 120.0) new_conversation: Start a fresh conversation when conversation_id is omitted |
| notebook_query_statusA | Check the status of an async notebook query started with notebook_query_start. Returns the query result when completed, or current status if still in progress. Poll this tool every few seconds until status is 'completed' or 'error'. Args: query_id: The query ID returned by notebook_query_start |
| chat_listA | List chat sessions for a notebook. Args: notebook_id: Notebook ID or title alias limit: Max chat sessions to return (default: 20) |
| chat_getA | Get full transcript of a specific chat session. Args: notebook_id: Notebook ID or title alias conversation_id: Optional conversation ID (defaults to latest active session) |
| chat_exportA | Export a chat transcript to Markdown or JSON. Args: notebook_id: Notebook ID or title alias conversation_id: Optional conversation ID format: Export format: 'md' or 'json' (default: 'md') |
| cross_notebook_queryA | Query multiple notebooks and get aggregated answers with per-notebook citations. Specify notebooks by name, by tags, or use all=True for all notebooks. Args: query: Question to ask across notebooks notebook_names: Comma-separated notebook names or IDs (e.g. "AI Research, Dev Tools") tags: Comma-separated tags to select notebooks (e.g. "ai,mcp") all: Query ALL notebooks (use with caution — rate limits apply) |
| download_artifactA | Download any NotebookLM artifact to a file. Unified download tool replacing 9 separate download tools. Supports all artifact types: audio, video, report, mind_map, slide_deck, infographic, data_table, quiz, flashcards. Args:
notebook_id: Notebook UUID
artifact_type: Type of artifact to download:
- audio: Audio Overview (MP4/MP3)
- video: Video Overview (MP4)
- report: Report (Markdown)
- mind_map: Mind Map (JSON)
- slide_deck: Slide Deck (PDF or PPTX)
- infographic: Infographic (PNG)
- data_table: Data Table (CSV)
- quiz: Quiz (json|markdown|html)
- flashcards: Flashcards (json|markdown|html)
output_path: Path to save the file
artifact_id: Optional specific artifact ID (uses latest if not provided)
output_format: For quiz/flashcards only: json|markdown|html (default: json)
slide_deck_format: For slide_deck only: pdf (default) or pptx
wait: Poll while the artifact download is still propagating
wait_timeout: Maximum seconds to wait when Returns: dict with status and saved file path Example: download_artifact(notebook_id="abc123", artifact_type="audio", output_path="podcast.mp3") download_artifact(notebook_id="abc123", artifact_type="quiz", output_path="quiz.html", output_format="html") download_artifact(notebook_id="abc123", artifact_type="slide_deck", output_path="slides.pptx", slide_deck_format="pptx") |
| download_all_artifactsA | Download all completed studio artifacts of one notebook — or every notebook. Creates a subdirectory of output_dir named after each notebook title and saves every completed artifact there, named after its title with the type's default extension (report → .md, mind_map → .json, video → .mp4, slide_deck → .pdf/.pptx, ...). Artifacts that are still generating or failed are skipped and listed in the result. A failure on one artifact (or one notebook in a sweep) does not stop the others. Args: notebook_id: Notebook UUID (omit when all_notebooks=True) output_dir: Base directory for the per-notebook folders (default: cwd) artifact_types: Restrict to these types, e.g. ["video", "slide_deck", "mind_map", "report"]. Default: all types. output_format: For quiz/flashcards only: json|markdown|html slide_deck_format: For slide decks only: pdf (default) or pptx all_notebooks: Sweep every notebook in the account instead of one skip_existing: Skip artifacts whose target file already exists — makes repeated runs incremental Returns: dict with status, output_dir, and per-artifact items (single notebook) or per-notebook outcomes (sweep), plus downloaded/failed counts Example: download_all_artifacts(notebook_id="abc123", output_dir="exports") download_all_artifacts(all_notebooks=True, output_dir="exports", skip_existing=True) |
| export_artifactA | Export a NotebookLM artifact to Google Docs or Sheets. Supports:
Args: notebook_id: Notebook UUID artifact_id: Artifact UUID to export export_type: "docs" or "sheets" title: Title for exported document (optional) Returns: URL to the created Google Doc/Sheet |
| labelA | Manage source labels in a notebook. Unified tool for all label operations. Labels let you organize sources into thematic categories. Requires 5+ sources for auto-labeling. Sources can belong to multiple labels simultaneously. Supports: auto, list, reorganize, create, rename, set_emoji, move_source, delete Args: notebook_id: Notebook UUID action: Operation to perform: - auto: AI auto-labels all sources into thematic categories - list: List current labels (triggers AI if none exist) - reorganize: Force AI re-categorization (requires confirm=True unless unlabeled_only=True) - create: Create a new empty label (requires name) - rename: Rename a label (requires label_id, name) - set_emoji: Set or clear emoji on a label (requires label_id, emoji) - move_source: Assign a source to a label (requires label_id, source_id) - delete: Delete label(s) permanently (requires label_id or label_ids, confirm=True) label_id: Label UUID (required for rename, set_emoji, move_source, delete) label_ids: List of label UUIDs for batch delete (alternative to label_id) name: Label display name (required for create and rename) emoji: Emoji character for set_emoji (e.g. "📊"), or "" to clear source_id: Source UUID to assign (required for move_source) unlabeled_only: For reorganize: if True, only label sources not yet in any label. If False (default), replaces ALL existing labels from scratch (requires confirm=True). confirm: Must be True for delete action and for reorganize with unlabeled_only=False Returns: Action-specific response with status Example: label(notebook_id="abc", action="auto") label(notebook_id="abc", action="list") label(notebook_id="abc", action="reorganize", confirm=True) label(notebook_id="abc", action="reorganize", unlabeled_only=True) label(notebook_id="abc", action="create", name="Research", emoji="📚") label(notebook_id="abc", action="rename", label_id="xyz", name="Better Name") label(notebook_id="abc", action="set_emoji", label_id="xyz", emoji="🎯") label(notebook_id="abc", action="move_source", label_id="xyz", source_id="src-id") label(notebook_id="abc", action="delete", label_id="xyz", confirm=True) |
| notebook_listB | List all notebooks. Args: max_results: Maximum number of notebooks to return (default: 100) |
| notebook_getC | Get notebook details with sources. Args: notebook_id: Notebook UUID |
| notebook_describeA | Get AI-generated notebook summary with suggested topics. Args: notebook_id: Notebook UUID Returns: summary (markdown), suggested_topics list |
| notebook_createB | Create a new notebook. Args: title: Optional title for the notebook |
| notebook_renameC | Rename a notebook. Args: notebook_id: Notebook UUID new_title: New title |
| notebook_deleteA | Delete notebook permanently. IRREVERSIBLE. Requires confirm=True. Args: notebook_id: Notebook UUID confirm: Must be True after user approval |
| noteA | Manage notes in a notebook. Unified tool for all note operations. Supports: create, list, update, delete Args: notebook_id: Notebook UUID action: Operation to perform: - create: Create a new note - list: List all notes in notebook - update: Update an existing note - delete: Delete a note permanently (requires confirm=True) note_id: Note UUID (required for update/delete) content: Note content (required for create, optional for update) title: Note title (optional for create/update) confirm: Must be True for delete action Returns: Action-specific response with status Example: note(notebook_id="abc", action="list") note(notebook_id="abc", action="create", content="My note", title="Title") note(notebook_id="abc", action="update", note_id="xyz", content="Updated") note(notebook_id="abc", action="delete", note_id="xyz", confirm=True) |
| pipelineA | Manage and execute multi-step notebook pipelines. Actions:
Args: action: Operation to perform (run, list) notebook_id: Target notebook UUID (required for action=run) pipeline_name: Pipeline name (required for action=run, e.g. "ingest-and-podcast") input_url: URL variable for pipelines that need it (replaces $INPUT_URL) |
| research_startA | Deep research / fast research: Search web or Google Drive to FIND NEW sources. Use this for: "deep research on X", "find sources about Y", "search web for Z", "search Drive". Workflow: research_start -> poll research_status -> research_import. Args: query: What to search for (e.g. "quantum computing advances") source: web|drive (where to search) mode: fast (~30s, ~10 sources) | deep (~5min, ~40 sources, web only) notebook_id: Existing notebook (creates new if not provided) title: Title for new notebook |
| research_statusA | Poll research progress. Blocks until complete or timeout. Args: notebook_id: Notebook UUID poll_interval: Seconds between polls (default: 30) max_wait: Max seconds to wait (default: 900, 0=single poll) compact: If True (default), truncate report and limit sources shown to save tokens. Use compact=False to get full details. task_id: Optional Task ID to poll for a specific research task. query: Optional query text for fallback matching when task_id changes (deep research). Contributed by @saitrogen (PR #15). auto_import: If True, automatically import sources when research completes. If False (default), returns next_action hint to call research_import manually. |
| research_importA | Import discovered sources into notebook. Call after research_status shows status="completed". Args: notebook_id: Notebook UUID task_id: Research task ID source_indices: Source indices to import (default: all) timeout: Import timeout in seconds (default: 300, increase for large notebooks) cited_only: Import only sources cited by the research report. Overrides source_indices when enabled. |
| server_infoA | Get version, auth status, and conservative MCP capability visibility. AI assistants: If update_available is True, inform the user that a new version is available and suggest updating with the provided command. auth_status is the result of an AuthHealthChecker probe. The checker
runs a multi-probe strategy (homepage fetch + API fallback) with
30-second TTL caching and mtime-based bypass on auth-file changes.
The reported value may therefore be up to 30 seconds old, and an
external auth_status meanings:
Returns: dict with version info: - version: Current installed version - latest_version: Latest version on PyPI (or None if check failed) - update_available: True if a newer version is available - auth_status: configured | stale | unverified | not_configured | error - update_command: Command to run to update - mcp_capabilities: Built-in tool groups visible in this server process - provider_capabilities: Explicitly unprobed provider/account capabilities |
| notebook_share_statusA | Get current sharing settings and collaborators. Args: notebook_id: Notebook UUID Returns: is_public, access_level, collaborators list, and public_link if public |
| notebook_share_publicA | Enable or disable public link access. Args: notebook_id: Notebook UUID is_public: True to enable public link, False to disable (default: True) Returns: public_link if enabled, None if disabled |
| notebook_share_inviteA | Invite a collaborator by email. Args: notebook_id: Notebook UUID email: Email address to invite role: "viewer" or "editor" (default: viewer) Returns: success status |
| notebook_share_batchA | Invite multiple collaborators in a single request. Args: notebook_id: Notebook UUID recipients: List of dicts, each with 'email' (str) and optional 'role' (str). Role defaults to 'viewer'. Example: [{"email": "a@b.com", "role": "editor"}] confirm: Must be True after user approval Returns: invited_count, recipients list, and message |
| tagA | Manage notebook tags and find relevant notebooks by tag matching. Actions:
Args: action: Operation to perform (add, remove, list, select) notebook_id: Notebook UUID (required for add, remove) tags: Comma-separated tags (required for add, remove; e.g. "ai,research,llm") notebook_title: Optional display title (for add) query: Search query (required for select; e.g. "ai mcp" or "ai,mcp") |
| source_addA | Add a source to a notebook. Unified tool for all source types. Supports: url, text, drive, file Args: notebook_id: Notebook UUID source_type: Type of source to add: - url: Web page or YouTube URL - text: Pasted text content - drive: Google Drive document - file: Local file upload. The canonical local-admission contract has 43 case-insensitive extensions. Admission does not guarantee provider processing success for an individual file. OFFICIAL_FILE_EXTENSIONS: .pdf, .txt, .md, .docx, .csv, .pptx, .epub, .avif, .bmp, .gif, .heic, .heif, .ico, .jp2, .jpe, .jpeg, .jpg, .png, .tif, .tiff, .webp, .3g2, .3gp, .aac, .aif, .aifc, .aiff, .amr, .au, .avi, .cda, .m4a, .mid, .mp3, .mp4, .mpeg, .ogg, .opus, .ra, .ram, .snd, .wav, .wma Image-bearing sources may feed Studio video generation's visual-crop pipeline; charts, photos, and diagrams may be extracted as on-screen aids. url: URL to add (for source_type=url) urls: List of URLs to add in bulk (for source_type=url, alternative to url) text: Text content to add (for source_type=text) title: Display title (for text sources) file_path: Local file path on the machine running the MCP server (for source_type=file). A path on a different client/agent host is not accessible to the server. document_id: Google Drive document ID (for source_type=drive) doc_type: Drive doc type: doc|slides|sheets|pdf (for source_type=drive) wait: If True, wait for source processing to complete before returning wait_timeout: Max seconds to wait if wait=True (default 120) Example: source_add(notebook_id="abc", source_type="url", url="https://example.com") source_add(notebook_id="abc", source_type="url", urls=["https://a.com", "https://b.com"]) source_add(notebook_id="abc", source_type="url", url="https://example.com", wait=True) source_add(notebook_id="abc", source_type="file", file_path="/path/to/doc.pdf", wait=True) source_add(notebook_id="abc", source_type="file", file_path="/path/to/screenshot.png", wait=True) |
| source_list_driveA | List sources with types and Drive freshness status. Use before source_sync_drive to identify stale sources. Args: notebook_id: Notebook UUID skip_freshness: If True, skip per-source freshness checks for faster listing |
| source_sync_driveA | Sync Drive sources with latest content. Requires confirm=True. Call source_list_drive first to identify stale sources. Args: source_ids: Source UUIDs to sync confirm: Must be True after user approval |
| source_renameB | Rename a source in a notebook. Args: notebook_id: Notebook UUID containing the source source_id: Source UUID to rename new_title: New display title for the source |
| source_deleteA | Delete source(s) permanently. IRREVERSIBLE. Requires confirm=True. Args: source_id: Source UUID to delete (single) source_ids: List of source UUIDs to delete (bulk, alternative to source_id) confirm: Must be True after user approval |
| source_describeA | Get AI-generated source summary with keyword chips. Args: source_id: Source UUID Returns: summary (markdown with bold keywords), keywords list |
| source_get_contentA | Get raw text content of a source (no AI processing). Returns the original indexed text from PDFs, web pages, pasted text, or YouTube transcripts. Much faster than notebook_query for content export. Args:
source_id: Source UUID
wait: Poll until indexed content is available
wait_timeout: Maximum seconds to wait when Returns: content (str), title (str), source_type (str), char_count (int) |
| studio_createA | Create any NotebookLM studio artifact. Unified creation tool. Supports: audio, video, infographic, slide_deck, report, flashcards, quiz, data_table, mind_map Args: notebook_id: Notebook UUID artifact_type: Type of artifact to create: - audio: Audio Overview (podcast) - video: Video Overview - infographic: Visual infographic - slide_deck: Presentation slides (PDF) - report: Text report (Briefing Doc, Study Guide, etc.) - flashcards: Study flashcards - quiz: Multiple choice quiz - data_table: Structured data table - mind_map: Visual mind map source_ids: Source IDs to use (default: all sources) confirm: Must be True after user approval Example: studio_create(notebook_id="abc", artifact_type="audio", confirm=True) studio_create(notebook_id="abc", artifact_type="quiz", question_count=5, confirm=True) |
| studio_statusA | Check studio content generation status and get URLs, or rename an artifact. Args: notebook_id: Notebook UUID action: Action to perform: - status (default): List all artifacts with their status and URLs - rename: Rename an artifact (requires artifact_id and new_title) - list_types: List all supported artifact types with their options artifact_id: For status, return only this artifact. Required for action="rename". new_title: Required for action="rename" - the new title for the artifact include_details: Include prompts, source IDs, report content, and media details limit: Maximum artifacts to return for status (1-100, default 20) offset: Number of artifacts to skip for status pagination Returns: Dictionary with status and results. For action="status": - status: "success" - artifacts: Lean page of artifacts, each containing: - artifact_id: UUID - title: Artifact title - type: audio, video, report, etc. - status: completed, in_progress, failed - created_at: Creation timestamp - error_reason: Failure guidance when status is failed With include_details=True, artifacts also include prompts, source IDs, report content, media URLs, and other rich fields. - summary: Counts of total, completed, in_progress - pagination: returned, offset, limit, and has_more |
| studio_deleteA | Delete studio artifact. IRREVERSIBLE. Requires confirm=True. Args: notebook_id: Notebook UUID artifact_id: Artifact UUID (from studio_status) confirm: Must be True after user approval |
| studio_reviseA | Revise individual slides in an existing slide deck. Creates a NEW artifact. Only slide decks support revision. The original artifact is not modified. Poll studio_status after calling to check when the new deck is ready. Args: notebook_id: Notebook UUID artifact_id: UUID of the existing slide deck to revise (from studio_status) slide_instructions: List of revision instructions, each with: - slide: Slide number (1-based, slide 1 = first slide) - instruction: Text describing the desired change Example: [{"slide": 1, "instruction": "Make the title larger"}] confirm: Must be True after user approval Example: studio_revise( notebook_id="abc", artifact_id="xyz", slide_instructions=[ {"slide": 1, "instruction": "Make the title larger"}, {"slide": 3, "instruction": "Remove the image"} ], confirm=True ) |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jacob-bd/gemini-notebook-mcp-cli'
If you have feedback or need assistance with the MCP directory API, please join our Discord server