Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault

No arguments

Capabilities

Features and capabilities supported by this server

CapabilityDetails
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

NameDescription
notebook_listA

List all notebooks (id + title + metadata).

Returns a bounded page: limit (default 50) items from offset (default 0), plus total / offset / has_more. Page forward by re-calling with offset += limit while has_more is true.

notebook_createB

Create a new notebook with the given title.

notebook_describeA

Fetch a notebook's AI-generated description. Accepts a notebook name or ID.

Returns the resolved notebook_id plus the AI description. Pass include_metadata=True to additionally fetch the notebook's metadata (details + source list) and surface it under a metadata key; the default output (include_metadata omitted) is unchanged.

notebook_renameB

Rename a notebook. Accepts a notebook name or ID.

notebook_deleteA

Delete a notebook (irreversible). Accepts a notebook name or ID.

Two-step confirmation: called with confirm=False (the default) it does NOT delete — it returns a needs_confirmation preview of the resolved notebook. Call again with confirm=True to perform the delete.

source_listA

List a notebook's sources. Accepts a notebook name or ID.

detail (default full): full gives each source's metadata plus string kind / status_label labels; compact returns only id / title / kind / status_label / created_at — a low-token roster.

Pass status to list only sources whose status_label matches (error = a broken import's ghost row). Pass label (name or ID) to restrict to that label's members; composes with status.

source_readA

Read a source at one of two detail levels. Accepts a notebook/source name or ID.

detail selects what you get back (two distinct shapes):

  • summary — a tiny AI digest for low-token triage: {notebook_id, source_id, summary, keywords}. Cheap to fan out across many sources before deciding which to pull in full.

  • full (DEFAULT) — the source metadata (incl. string kind/status_label) plus the extracted content, the full char_count, and a truncated flag. content is ALWAYS bounded: omitting max_chars caps it at the first 10,000 chars; raise max_chars and/or page with offset (slice [offset : offset+max_chars]). char_count stays the FULL length. content is null (char_count 0) when the source isn't ready yet or has no extractable text.

output_format (text default / markdown, needs the server's markdownify extra) and max_chars / offset apply only to detail="full" (ignored for summary). Prefer chat_ask for querying large sources rather than pulling the whole body.

source_renameC

Rename a source. Accepts a notebook/source name or ID.

source_deleteA

Delete a source (irreversible). Accepts a notebook/source name or ID.

Two-step confirmation: with confirm=False (default) it returns a needs_confirmation preview of the resolved source without deleting; call again with confirm=True to perform the delete.

source_waitA

Wait for sources to finish processing. Accepts a notebook name or ID.

Waits for a subset when sources (list or comma/JSON string) is given, a single source when source (name or ID) is given, else every source. All three modes return the SAME structured aggregate, so an agent never has to branch on the shape:

{"notebook_id", "ok", "ready", "timed_out", "failed", "not_found"}

plus per-bucket *_count + total_count. ready holds sources that reached READY (with kind / status_label labels); timed_out / failed / not_found hold {"source_id", "error"} entries. ok is true iff all error buckets empty. Subset and all-sources modes report partial progress (a slow or failed source no longer discards the ones that did become ready).

A READY web-page entry may carry a non-blocking warning when its indexed text is thin (likely dead link / soft-404 / paywall); advisory only (still READY, still ok — verify with source_read (detail="full")).

An unresolved ref in sources / source raises NOT_FOUND before the wait — an input error, distinct from a resolved source the backend reports missing / failed / slow (which lands in a bucket).

source_addA

Add a source to a notebook — single, batch, or in-channel bytes. Accepts a notebook name or ID.

Call in exactly ONE of two modes:

Single mode — pass source_type; it selects the required input:

  • url / youtube — require url (youtube → a YouTube link).

  • text — requires text; title optional.

  • file — over stdio, requires path (a local path on the server host). Over the remote (http) connector the host filesystem is unreachable, so it returns upload_required with two actor paths: human_upload (open the signed URL in a browser) and agent_upload (an agent POSTs the bytes as the raw body); agent_instructions gives the rule (try agent_upload, else human_upload.url). Alternatively pass bytes_base64 to add a SMALL file in-channel (any transport, no signed URL): standard base64 (not URL-safe) ≤ 10,000 chars (≈ 7 KB); filename seeds the title/extension. A bigger file must take the signed URL (≤ 200 MiB).

  • drive — requires document_id + mime_type (one of google-doc|google-slides|google-sheets|pdf; required, no default — a wrong default fails non-Doc imports, #1827).

The single-mode content inputs are mutually exclusive — supply only the one your source_type requires (bytes_base64 is the file alternative to path). An explicit title for url/youtube/drive is honored via a post-add rename; a miss returns title_override_applied: false (#1960).

Pass wait=true to block until the ONE added source finishes processing and return the source_wait aggregate (buckets + per-bucket *_count + total_count) with a top-level source_id (present even on timeout/failure); timeout/interval tune the poll. wait is single-mode only and NOT for a remote file signed-URL upload (add it, then source_wait). Without wait the added source is echoed under source with string kind / status_label labels; imports are ASYNCHRONOUS so the echo is usually still processing/preparing — confirm with source_wait or source_list(status="error"). A failed import is flagged inline (status_label="error" + a warning); source_wait also flags a READY web page with suspiciously thin text (dead link/soft-404/paywall).

Batch mode — pass urls (a list of http/https URLs, YouTube links included) to add many in one call instead of one round-trip each. Each entry is validated and added independently; the response is an explicit per-item list so partial failure is never hidden::

{"notebook_id": …, "added": <int>, "failed": <int>,
 "results": [{"input": "<url>", "status": "added", "source_id": …,
              "title": …, "status_label": …, "warning"?: …},
             {"input": "<url>", "status": "error",
              "error": {"code": …, "message": …, "retriable": …, "hint"?: …}}]}

results is positional (results[i] is for urls[i]); status is "added" or "error" (the ADD outcome). An "added" item also carries the source's status_label and, when the add response already reflects a failed import, an inline warning — same failure-signaling as single mode. A per-URL input failure (bad URL / 404 / SSRF-blocked host) isolates as an error item; a fatal service failure (expired auth, rate limit, upstream 5xx) aborts the whole call. Batch is URL-only: a non-URL entry (plain text, a local path, file:///ftp://) is reported as a per-item VALIDATION error. The single-mode named inputs (incl. bytes_base64/filename/wait) are not valid with urls; allow_internal applies to every entry.

source_add_drive_fileA

Add a Google Drive file by downloading it server-side and uploading it (supports epub/docx/txt/md/rtf/odt/csv/tsv/pdf).

Probes the Drive file and routes: a downloadable type is fetched server-side and uploaded; a Google-native Doc/Slides/Sheet isn't downloadable and returns a pointer error → use source_add(source_type='drive', mime_type=…) for those (or for a Drive PDF you'd rather add by reference). Use source_add(source_type='file') when you hold the bytes locally.

Accepts a notebook name or ID and a Drive file id or share URL (/d/<id>, /file/d/<id>/…, ?id=<id>). The fetch runs server-side with the profile's session, so it works on the remote (http) connector too — no upload_required step. Processed ASYNCHRONOUSLY; pass wait=true to block until READY (else confirm via source_wait / source_list(status="error")).

chat_askA

Ask a notebook's sources a question, and/or recall prior turns. Accepts a notebook name or ID.

Pass conversation_id to continue a specific conversation; omit it to continue the notebook's most-recent conversation (or start a new one).

source_ids (optional) scopes the question to specific sources by id/prefix/title; omit it to query every source. It accepts a real list, a JSON-array string, or a comma-separated string (the comma form cannot carry a source title that itself contains a comma — use a JSON array or a real list for those).

history (optional, default 0): the max number of prior Q&A pairs (each a {question, answer}) to also return (oldest-first), from the conversation as it stood before this question. There is no unbounded "all" value — pass a generously large number (e.g. 100) for the whole conversation. Omit question (leave it empty) with history > 0 to recall prior pairs without asking anything new; a recall-only call also echoes the conversation_id it read. Pass neither and the call is rejected.

Returns the answer plus citation references (when a question is asked). The internal raw_response debugging blob is never included. references controls citation detail: lite (default) returns source_id / citation_number / cited_text; full adds chunk-level char offsets and scores.

suggest_followups (optional, default False): when True the result also carries a suggested_prompts list of AI-suggested follow-up questions (each a {title, prompt}), scoped to the same source_ids and steered by question when one is given. It works on its own too — pass it with no question (and history 0) to get suggested questions without asking anything. When omitted/False the result never contains a suggested_prompts key.

chat_configureA

Configure a notebook's chat behavior. Accepts a notebook name or ID.

Two mutually-exclusive ways to configure:

  • chat_mode is a preset — one of default / learning-guide / concise / detailed. It replaces the whole block, so it can't be combined with goal / response_length (that's rejected).

  • goal (custom persona; selects the CUSTOM goal) and response_length (default / longer / shorter) set a custom config. A partial call (just one) merges with the current settings — the omitted field is preserved. Only a bare call (no preset, neither field) is rejected, as it would reset every setting to its default.

suggest_promptsA

Get AI-suggested, ready-to-send prompts for a studio surface. Accepts a notebook name or ID.

surface selects what the prompts are written for (default ask):

  • ask — chat questions to ask the notebook's content.

  • audio-deep-dive / audio-brief / audio-critique / audio-debate — prompts to steer an Audio Overview in that format.

  • video-explainer / video-short — prompts to steer a Video Overview.

  • quiz / flashcards — prompts to steer quiz / flashcard generation.

Each result is a ready-to-send instruction you can pass to the matching generator (chat_ask for ask; studio_generate's instructions for the studio formats). source_ids (optional) scopes the suggestions to specific sources; omit for all. query optionally steers the suggestions.

Related: chat_ask(suggest_followups=true) returns ask-surface suggestions inline with a question (ask + follow-ups in one call); this tool is the standalone selector across every surface.

note_saveA

Create a note, or update an existing one (upsert). Accepts a notebook name or ID.

Mode is chosen SOLELY by note:

  • note omitted → create a new note; title AND content are both required. Returns status="created".

  • note given (a note name or id) → update that note; supply title and/or content (at least one — title-only renames, content-only replaces the body). A ref that doesn't resolve is a not-found error, NEVER a stray create. Returns status="updated".

studio_listA

List a notebook's Studio panel — text notes AND generated artifacts.

Accepts a notebook name or ID. Returns a merged items list; each item has id / title / type (note or a hyphenated artifact kind); artifacts also carry status_label / url. Bounded page of limit (default 50) from offset, with total / offset / has_more.

  • detail ladder (NOTE bodies only; read a report/data-table body via studio_download): summary (default) gives each note a bounded content_preview + char_count (artifacts add created_at + generation_prompt, the free-text prompt the artifact was generated from, null when it records none); full = whole content; compact = a id/title/type/status_label/created_at roster.

  • kind filters to one type.

  • item (name or id) fetches just that item as a 1-element list with the note's FULL content (an artifact also carries its generation_prompt); no match is NOT_FOUND. limit / offset / detail are ignored with item; kind scopes resolution.

studio_generateA

Start generating a studio artifact. Accepts a notebook name or ID.

Non-blocking: returns immediately with a task_id; poll studio_status(notebook, task_id) until is_complete is true. Exception: mind-map renders synchronously (no task_id) — its node tree is under mind_map (or null), the map's id under mind_map_id.

artifact_type selects the artifact kind (each routes to its own generator):

  • audio — podcast-style overview (audio_format: deep-dive|brief|critique|debate, audio_length: short|default|long).

  • video — video overview (video_format: explainer|brief|cinematic|short, style: auto|custom|classic|whiteboard| kawaii|anime|watercolor|retro-print|heritage|paper-craft, style_prompt: free-text custom-style prompt — requires style=custom).

  • cinematic-video — AI-generated documentary video.

  • slide-deck — slide deck (deck_format: detailed|presenter, deck_length: default|short).

  • quiz / flashcards — study aids (quantity: fewer|standard|more, difficulty: easy|medium|hard).

  • infographic — single-image infographic (orientation: landscape|portrait|square, detail: concise|standard|detailed, style: auto|sketch-note|professional|bento-grid|editorial| instructional|bricks|clay|anime|kawaii|scientific).

  • data-table — extracted data table.

  • mind-map — mind map (map_kind: interactive|note-backed).

  • report — text report (report_format: briefing-doc|study-guide|blog-post|custom).

Each per-kind option is valid ONLY for the kind(s) listed above; passing one to a different artifact_type is a validation error, not a silent no-op. Options default to the standard choice when omitted.

source_ids (optional) scopes generation to specific sources; omit it to use every source. It accepts a real list, a JSON-array string, or a comma-separated string (a source title containing a comma needs the JSON-array or list form). instructions is free-text guidance for kinds that accept it (including mind-map). language (optional) is a language code, e.g. en/ja/zh_Hans.

studio_statusA

Poll a generation task's status. Accepts a notebook name or ID.

Stateless: pass the task_id from studio_generate. Returns status / url / error / is_complete / media_ready; poll until done. A pending url is provisional — trust it only if media_ready.

studio_downloadA

Download a generated artifact. Accepts a notebook name or ID.

Target the artifact in ONE of two ways (exactly one):

  • artifact — a name-or-id ref (title / id / unique-id-prefix), the form the other artifact_* tools take; resolves to its type + id.

  • artifact_type — one of audio|video|slide-deck|infographic|report| mind-map|data-table|quiz|flashcards, optionally with artifact_id (full or unique-prefix) for a specific one; omit artifact_id to get the latest artifact of that type.

output_format overrides the default file format where supported: slide-deck → pdf|pptx; quiz/flashcards → json|markdown|html.

Over stdio the artifact is written to path (required). Over the remote (http) connector the server filesystem is unreachable, so the tool returns a clickable resource_link plus {"status": "download_ready", "url": …} — a short-lived signed URL; path is ignored. A text kind (report/data-table) also returns the body inline (bounded content + char_count + truncated) for link-incapable hosts. On the remote connector an explicit artifact_id (and output_format) is validated up front — an unknown/ambiguous id fails immediately, not as a 400 when opened.

studio_renameA

Rename a Studio item (title only) — a text note OR an artifact.

Accepts a notebook name or ID plus an item name-or-id ref resolved over the merged notes+artifacts list (mirroring studio_delete). Routing is by resolved type: a note is renamed through the note system, preserving its content via a get-then-update; every artifact type — audio, video, slide-deck, quiz, flashcards, infographic, data-table, report, and BOTH mind-map kinds — through the artifact rename RPC (note-backed mind maps route back through the note system inside the shared core). Callers need not know which backing an item has.

Returns item_id / type plus the applied new_title and is_mind_map.

studio_retryA

Retry a failed Studio artifact in place (the UI "Retry" action).

Accepts a notebook/artifact name or ID. Non-blocking: on acceptance it returns the kicked-off task_id (equal to the artifact id) and the new status; poll studio_status(notebook, task_id) until complete. A synchronous refusal (rate limit / quota / not-retryable) surfaces as an error.

studio_deleteA

Delete a Studio item (irreversible) — a text note OR an artifact.

Accepts a notebook name or ID plus an item name-or-id ref resolved over the merged notes+artifacts list. Routing is by resolved type: a note is deleted via the note system; an artifact via the artifact delete RPC (which itself clears a note-backed mind map through the note system rather than hard-removing it — Google may garbage collect it later).

Two-step confirmation: with confirm=False (default) it returns a needs_confirmation preview of the resolved item without deleting; call again with confirm=True to perform the delete. Deleting an already-absent full id is idempotent (no error) — it routes down the artifact path (a present note would have been found in the list).

research_startA

Start a research session in a notebook. Accepts a notebook name or ID.

Non-blocking. Carry the returned poll_task_id into research_status / research_import / research_cancel — the single id that drives polling (it resolves deep vs fast for you). Poll research_status until completed, then research_import to add the sources.

source is web (default) or drive. mode is fast (default) or deep (deep is web-only).

research_statusA

Check a notebook's research status. Accepts a notebook name or ID.

Returns status (no_research|in_progress|completed|failed|not_found), poll_task_id, the sources, and report metadata. Poll until completed, then pass poll_task_id to research_import.

report and each source's report_markdown are omitted by default; set include_report=True (optionally report_max_chars) to include them, truncated to that length. report_char_count is the full size; report_truncated flags an omitted/truncated report. source_limit / source_offset page sources.

poll_task_id (optional) pins one of several in-flight tasks; omit it for a single task (ambiguous with two+ running). An unmatched pin reports not_found. task_id is a deprecated alias (removed in v0.9.0).

research_cancelA

Cancel an in-flight research run in a notebook.

Accepts a notebook name or ID and the poll_task_id to cancel — the value from research_start / research_status. run_id is a deprecated alias (removed in v0.9.0).

Sends the cancel unless the run is already TERMINAL (completed / failed), which returns cancel_requested: false with the observed status and no RPC. Otherwise returns cancel_requested: true with run_status_before; a just-started run reading not_found / no_research (replication lag) is cancelled too. Fire-and-forget; poll research_status afterward to confirm.

research_importA

Import a completed research task's sources into the notebook.

Accepts a notebook name or ID and the poll_task_id to import — the value from research_start / research_status. task_id is a deprecated alias (removed in v0.9.0).

The id pins the task. Timeout-tolerant: a timed-out import reconciles what committed. Idempotent: sources already present (by URL) are skipped as already_present; allow_duplicate re-adds them.

cited_only imports only report-cited sources (all, if none resolve). max_sources caps the count.

share_statusA

Get a notebook's sharing status. Accepts a notebook name or ID.

Returns is_public, access (restricted | anyone_with_link), the share_url, and the list of shared_users ({email, permission, display_name, avatar_url}). permission / access are string labels.

NOTE: view_level is intentionally NOT returned here — the read API does not report it (it would always read "full"). Set it via share_set_access, which echoes the value it just set.

share_set_accessA

Set a notebook's link-access settings. Accepts a notebook name or ID.

Provide public (True = anyone-with-link, False = restricted) and/or view_level (full or chat). Public widening (public=True on a restricted notebook) returns a needs_confirmation preview unless confirm=True; restricting and view_level changes are not gated.

Returns the updated status (or preview). view_level is echoed only when set here (the read API can't report it); with both fields it is applied before public so a partial failure fails closed.

share_set_userA

Grant or change a user's access to a notebook. Accepts a notebook name or ID.

Confirm-gated: every grant/regrade returns a needs_confirmation preview unless confirm=True. Upsert by email (one backend op for an add or a permission change). permission: editor or viewer (not OWNER). notify (default False) emails the user on grant/re-grade; message is an optional welcome note. Returns the updated status (or a preview).

share_remove_userA

Remove a user's access to a notebook. Accepts a notebook name or ID.

Confirm-gated: called with confirm=False (default) it does NOT mutate — it returns a needs_confirmation preview. Call with confirm=True to actually remove the user.

server_infoA

Report the server version and local authentication health.

Returns the package version and an auth block (authenticated / storage_exists / json_valid / cookies_present / sid_cookie / profile). Use it to confirm the server is logged in before driving notebook tools; if authenticated is false, run notebooklm login on the server host.

Set include_account=True to also fetch an account block: the signed-in identity {email, authuser} (in-memory/persisted first, then a single live WIZ_global_data probe when authenticated — email is None only when it can't be discovered at all) plus quota-pacing fields {available, notebook_limit, source_limit, tier, output_language} (output_language is the global account setting, e.g. "en"/"ja", or None when unset or unparseable). The quota fields need a live session (a few reads), so the block is off by default — the default call is a fast, network-free probe. When the session is missing or stale the quota fields degrade to {available: False, reason: ...} (identity still included) rather than failing the whole call.

profile names the resolved storage profile the probe ran against (e.g. "default"); the booleans are the actual health signals.

The absolute on-disk storage path is deliberately not returned: it leaks the server-host OS username / filesystem layout to any (possibly remote) caller, while telling the agent nothing it can act on.

await_uploadA

Wait for a file uploaded via a source_add(source_type="file") link to land.

Pass the human_upload.url (or the bare token) that source_add returned. Polls the server in-process until the browser/agent upload commits the source:

  • {"status":"received","source_id",...,"file":{...}} — the upload landed.

  • {"status":"pending",...} — nothing yet after ~timeout s; re-invoke with the same link (the wait resumes; a transport reset does not lose it).

  • {"status":"expired_or_invalid",...} — the link failed; mint a fresh one via source_add(source_type="file").

account_listA

Lista las cuentas de Google (perfiles) disponibles para NotebookLM.

Cada perfil es una cuenta con su propia cuota. Devuelve profile, account (email), authenticated y default. Para anadir una cuenta, el usuario debe correr en su maquina: notebooklm login --master-token --account EMAIL -p NOMBRE_PERFIL.

account_useA

Elige la cuenta con la que trabajaras el resto de la sesion.

profile es el nombre que devuelve account_list. Cambiar de cuenta suelta el notebook activo (los notebooks no se comparten entre cuentas).

notebook_useA

Fija el notebook activo (acepta titulo, prefijo unico o id).

Despues de esto puedes omitir notebook en las demas tools: se rellena solo. Pasa otro para cambiar.

healthA

Diagnostico: dice que anda y que no, y que hacer si algo falla.

Se puede llamar sin haber elegido cuenta. Comprueba auth, config y rutas de cada perfil configurado. Si ok es False, mira fix.

session_statusB

Dice que cuenta y que notebook estan activos ahora mismo.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

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/Solar2004/nblm-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server