notebooklm-mcp-pro
Integrates with Google NotebookLM (Gemini Notebook) to let agents list notebooks and sources, read and search source Markdown, query notebooks with citations, export sources to local Markdown files, and optionally manage notes, sources, reports, and notebooks using a Google account session.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@notebooklm-mcp-prosearch all my notebooks for anything about rate limiting"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
notebooklm-mcp-pro
Servidor MCP para NotebookLM (ahora «Gemini Notebook») pensado para que un agente de código lea, busque y razone sobre los documentos de tu cuenta gastando el mínimo de contexto, y que solo pueda escribir o borrar si tú lo habilitas expresamente.
Aprovecha que NotebookLM ya guarda cada fuente convertida a Markdown: el agente puede ver el
índice de encabezados, leer solo la sección que necesita, buscar en local (BM25 / grep) sin gastar
cuota, o exportar todo a una carpeta de .md para trabajar con sus propias herramientas de archivos.
⚠️ API no oficial. NotebookLM no tiene API pública para cuentas personales. Este proyecto usa
notebooklm-py, que emplea endpoints internos de Google y puede romperse sin aviso (por eso la versión está fijada a>=0.8.5,<0.9). Úsalo con tu propia cuenta y bajo tu responsabilidad; revisa los términos de servicio de Google.🔐 El
storage_state.jsonque creanotebooklm logines tu sesión de Google. Trátalo como una contraseña: no lo subas a Git ni lo compartas.
¿En qué se diferencia del MCP que ya trae notebooklm-py?
notebooklm-py incluye su propio servidor (notebooklm-mcp), amplio en administración: compartir
notebooks, investigación web/Drive, generación de audio/vídeo, OAuth para alojarlo en remoto, etc.
Este proyecto no lo reemplaza; se centra en otra cosa:
Este proyecto |
| |
Enfoque | Acceso al conocimiento para agentes de código | Automatización integral de NotebookLM |
Lectura económica en contexto |
| — |
Búsqueda local sin cuota |
| — |
Exportar fuentes a |
| — |
Seguridad | Solo lectura por defecto; las herramientas de escritura ni se registran si no se habilitan; borrado exige repetir el título exacto; auditoría | Confirmaciones vía anotaciones MCP |
No cubre | Compartir, investigación web/Drive, audio/vídeo/cuestionarios, OAuth remoto | — |
Si necesitas lo que aquí no está, puedes ejecutar ambos servidores a la vez.
Related MCP server: RAGDown
Instalación
Requiere Python ≥ 3.10.
cd notebooklm-mcp-pro
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e ".[browser]" # incluye Playwright, necesario solo para el login
playwright install chromium # si el login pide el navegador de Playwright
notebooklm login # abre el navegador y guarda la sesión (storage_state.json)
notebooklm-mcp-pro --check # verifica configuración y sesión--check imprime un JSON de estado y devuelve código 0 si la sesión es válida (auth: ok).
Conectarlo a opencode
Añade esto a ~/.config/opencode/opencode.json (o al opencode.json del proyecto), con la ruta real
(examples/opencode.json tiene el archivo listo para copiar):
{
"mcp": {
"servers": {
"notebooklm": {
"type": "local",
"command": ["/RUTA/ABSOLUTA/notebooklm-mcp-pro/.venv/bin/notebooklm-mcp-pro"],
"environment": { "NLM_MCP_MODE": "readonly" }
}
}
}
}En Windows el ejecutable está en .venv\Scripts\notebooklm-mcp-pro.exe. Para Claude Desktop y otros
clientes con la clave mcpServers, usa examples/claude_desktop_config.json.
Esta es la forma nativa de OpenCode 2: los servidores van bajo mcp.servers y para dejar uno
configurado sin conectar se usa disabled: true. En OpenCode 1 el nombre va directamente bajo mcp y
el campo equivalente es enabled (su inverso); V2 sigue aceptando esa forma, pero conviene migrarla.
Herramientas
Siempre disponibles (modo readonly) — 23
Herramienta | Para qué sirve |
| Modo, caché, versiones, antigüedad de la sesión (avisa cuando toca reloguear) y |
| Notebooks, resumen generado y temas sugeridos |
| Fuentes con tipo, estado, URL y nº de palabras (filtrable; |
| Fuente en Markdown, paginada ( |
| Índice de encabezados (ignora |
| Solo una sección, hasta el siguiente encabezado del mismo nivel |
| Resumen y palabras clave que NotebookLM genera por fuente |
| Búsqueda semántica de NotebookLM (fragmentos por relevancia) |
| Búsqueda léxica BM25 local (sin acentos/mayúsculas) |
| Texto o regex con líneas de contexto, sobre la caché |
| Radiografía local sin cuota: por fuente (caracteres, palabras, encabezados, términos dominantes) o, sin |
| Pregunta con respuesta y citas a las fuentes (ver nota); si NotebookLM cierra con una oferta de Studio, va en |
| Notas del notebook |
| Informes y su estado: |
| Cuota de la cuenta (ventanas y acciones con capacidad restante). Si la cuenta no la expone, responde |
| Historial de chat del notebook (turnos pregunta/respuesta) |
| Descarga todas las fuentes a la caché local |
| Deja un |
| Borra caché y exportaciones locales de un notebook — o de TODOS con |
Convenciones de las respuestas: count es lo que devuelve la llamada y total lo que coincide antes del
recorte; los listados con limit añaden truncated y las lecturas paginadas next_offset. Lo que sale
del contenido de las fuentes va marcado con untrusted_content: true (texto de terceros: nunca
instrucciones). Las herramientas de barrido añaden notebooks_requested, notebooks_scanned (y
notebooks_scanned_ids: con max_notebooks conviene comprobar que tu notebook entró en el tope),
sources_not_ready, download_errors (por fuente) y notebook_errors (por notebook). Las subidas
(add_source_file, add_source_base64) añaden text_density_warning solo cuando el archivo trae
muy poco texto para su tamaño — típicamente un deck de imágenes que NotebookLM no podrá cubrir del todo.
Tres detalles del contrato que son deliberados: en un barrido, notebook_title solo se rellena cuando se
recorren varias notebooks (en una sola ya sabes cuál es y se ahorra una llamada); las búsquedas no
devuelven total porque el escaneo se corta al agotar el presupuesto y un total sería un dato falso
(truncated avisa de que había más); y grep/keyword_search son locales, así que no consumen cuota.
También expone el recurso notebooklm://notebooks, la plantilla
notebooklm://notebooks/{notebook_id}/sources/{source_id} y tres prompts
(research_topic, summarize_source, compare_sources).
Nota sobre
ask_notebook: no modifica fuentes, por eso está en modo lectura, pero consume la cuota de chat de tu cuenta y deja la pregunta en el historial del notebook.
Con NLM_MCP_MODE=readwrite — +10
create_notebook, rename_notebook, add_source_url (solo http/https), add_source_text,
add_source_file (solo desde carpetas de NLM_UPLOAD_DIRS), add_source_base64 (bytes ya en
memoria, p. ej. un adjunto de correo: pasan por un temporal efímero dentro de NLM_UPLOAD_DIRS y no
viajan por el contexto del agente), rename_source, create_note, update_note, generate_report
(asíncrona: luego get_generation_status y read_report).
Con readwrite + NLM_MCP_ALLOW_DESTRUCTIVE=1 — +4
delete_source, delete_note, delete_artifact y delete_notebook: exigen confirm_title con el
título exacto actual. Si no coincide, no se borra nada y el error no revela el título correcto,
así el agente tiene que consultarlo (y tú confirmarlo) en lugar de reintentar a ciegas.
Flujo recomendado para el agente
list_notebooks→list_sourcespara ubicar el material.Localizar:
search_sources(semántica) okeyword_search/grep(local). Si no sabes en qué notebook está algo, omitenotebook_id(notebook_idspara limitar el barrido): ambas recorren todas las notebooks y etiquetan cada resultado con su origen.Leer:
get_source_outline→read_source_section.read_sourcesolo si hace falta el documento entero.source_statsresume tamaño, encabezados y términos dominantes sin gastar cuota (sinnotebook_id, toda la caché: útil para decidirsync_notebookoclear_cache).ask_notebookcuando se quiere una síntesis con citas ya hecha por NotebookLM.export_markdownsi el agente va a trabajar con sus herramientas de archivos (directorypara dejar los.mddonde te interese).
La primera keyword_search/grep de un notebook descarga sus fuentes (campo downloaded_now);
después usan la caché. Con auto_sync=false buscan solo en lo ya descargado.
Configuración (variables de entorno o .env)
Variable | Defecto | Descripción |
|
|
|
|
| Habilita borrado (solo con |
| (vacío) | Carpetas permitidas para |
| (de la librería) | Ruta a |
| (activo) | Perfil de |
|
| Caché, exportaciones y auditoría |
|
| Vigencia de la caché ( |
|
| Tamaño máximo de página devuelta al agente (mín. 1000) |
|
| Llamadas simultáneas a NotebookLM |
|
| Timeout por llamada (algunas operaciones lo multiplican) |
|
| Idioma por defecto de |
|
| Registro de escrituras/borrados |
|
| Rotación del registro de auditoría por tamaño (se guarda una generación en |
|
| Reintentos (0-5) ante errores de red/servidor/cuota en lecturas; las operaciones no idempotentes nunca se reintentan |
|
|
|
|
| Recorta imágenes incrustadas (base64) del Markdown de las fuentes: los PDFs con screenshots vienen con MB de blobs; por defecto se reemplazan por marcadores de texto |
|
| Los logs van a stderr (stdout es del protocolo) |
Hay una plantilla en .env.example. El servidor lee ./.env si existe (sin pisar variables ya definidas).
Modelo de seguridad
Mínimo privilegio: en
readonlylas herramientas de escritura no existen para el agente.Borrado deliberado: doble habilitación (
readwrite+ flag) y título exacto como confirmación.Contenido no confiable: el texto de las fuentes se marca con
untrusted_content: truey las instrucciones del servidor piden tratarlo como datos, no como órdenes (mitiga prompt injection).IDs validados (
[A-Za-z0-9_-]): imposible escapar de la carpeta de caché con../.Subidas solo desde carpetas permitidas; se resuelven symlinks y
..antes de comprobar.Sin filtración de errores: al agente solo llegan mensajes controlados (nunca cookies, rutas ni trazas). Cada fallo lleva un
ref(p. ej.... (ref 3a9c1f2b)) que aparece en los logs de stderr para que el operador pueda encontrar la traza exacta.Caché privada: directorios
0700, archivos0600, escritura atómica. Nota: los permisos POSIX se aplican en Linux/Mac; en Windows se ignora silenciosamente (protege la ruta con tu perfil).Auditoría JSONL de toda escritura/borrado; nunca guarda contenido, solo longitud y huella SHA-256.
Transporte:
stdiopor defecto.--transport streamable-httpsolo enlaza a loopback;--allow-remoteexiste pero no hay autenticación: expondría tu sesión de Google. No lo uses sin un proxy con autenticación.grepes literal por defecto; conliteral=falseusa regex de Python (limitada a 300 caracteres y con un presupuesto de ~5 s de escaneo: si la regex es patológica, se corta y devuelvetimed_out: true, aunque una única línea con backtracking catastrófico puede seguir demorando).export_markdowncondirectoryescribe donde le pidas (absoluto, o relativo a la carpeta de exportaciones del servidor): es una escritura local a cargo del agente, como el resto dereadonly.
Arquitectura
src/nlm_mcp/
server.py herramientas, recursos y prompts (registro condicionado por modo)
backend.py Protocol `Backend` + adaptador sobre notebooklm-py (único archivo que toca la librería;
lecturas idempotentes con reintento y backoff ante red/5xx/cuota)
state.py concurrencia, timeouts, descarga única por fuente, sincronización
cache.py caché Markdown en disco (TTL, atómica, privada)
mdtools.py outline, secciones, paginación, grep, troceado
bm25.py búsqueda léxica local
validators.py IDs, rutas de subida, regex
errors.py excepciones de la librería -> mensajes accionables
config.py configuración validada (inmutable)
audit.py auditoría JSONLTodo el servidor depende de la interfaz Backend, no de notebooklm-py. Si Google rompe algo o quieres
otro origen de datos, solo se toca backend.py.
Pruebas
uv sync --extra dev # o: pip install -e ".[dev]"
uv run --extra dev pytest
uv run --extra dev ruff check .
uv run --extra dev ruff format --check .
uv run --extra dev mypy111 pruebas: unitarias (config, validadores, Markdown, BM25, caché), de servidor completo con un cliente MCP
en memoria (modos, gating de seguridad, paginación, búsqueda local en una o varias notebooks, grep con
contexto, exportación incremental y a una carpeta elegida, errores, escritura, borrado, recursos, prompts,
CLI, generaciones con y sin espera, cuota e historial) y del adaptador
contra los modelos reales de notebooklm-py (incluidos los reintentos ante errores transitorios).
ruff check, ruff format --check y mypy (configuración laxa, solo src/) y las pruebas corren en CI en cada push
(GitHub Actions, .github/workflows/ci.yml).
Estado de verificación: las pruebas no se ejecutan contra Google (requieren una cuenta real).
El adaptador se validó con instancias reales de las clases de la librería y un cliente simulado; la
primera ejecución real con tu cuenta puede revelar diferencias. Empieza con notebooklm-mcp-pro --check
y una lectura sobre un notebook de prueba.
Solución de problemas
Síntoma | Causa y solución |
| Ejecuta |
Sesión caducada | Repite |
«Google aplicó un límite» | Baja |
| Es una página: sigue con |
Una fuente no aparece en búsquedas locales | Solo se descargan fuentes en estado |
| Es un archivo, audio o presentación: solo los de tipo |
| La API interna de cuota no está habilitada para esa cuenta; el resto de herramientas funciona igual |
| Define |
| Pocas palabras para el tamaño: el material es de imágenes/escaneado y puede quedar sin cubrir. Añade una fuente de texto complementaria |
Falla tras actualizar | API no oficial: mantén la versión fijada o ajusta |
Available Tools
23 toolsask_notebookA
Pregunta al notebook y devuelve respuesta con citas a fuentes. Consume cuota de chat y queda en el historial del notebook.
| Name | Required | Description | Default |
|---|---|---|---|
| question | Yes | Pregunta; NotebookLM responde solo con base en las fuentes. | |
| source_ids | No | Restringe la respuesta a estas fuentes. | |
| notebook_id | Yes | ID del notebook (obtenlo con list_notebooks). | |
| conversation_id | No | ID devuelto antes, para repreguntar con contexto. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag readOnlyHint=false, openWorld=true, idempotent=false. The description adds genuinely useful side-effect context beyond those: it consumes chat quota and persists in the notebook history — exactly the non-obvious costs an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler, front-loading the primary action and return, then appending the cost/side-effect note. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 needn't be explained, and the schema fully covers parameters. The description adds the quota/history cost, making it complete for correct invocation, only lacking when-to-use guidance versus siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (question, source_ids, notebook_id, conversation_id) are already documented in the schema, including usage hints like obtaining notebook_id via list_notebooks. The description adds nothing beyond it, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (pregunta/ask) and resource (notebook) plus the return format (respuesta con citas a fuentes). This distinguishes it from retrieval siblings like read_source or search_sources, though it doesn't name siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied — you ask the notebook when you want a synthesized, cited answer. But it doesn't state when to prefer this over search_sources, keyword_search, or get_chat_history, and gives no prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_cacheAIdempotent
Borra la caché local y las exportaciones (no toca nada en NotebookLM).
purge_all=True vacía por completo el estado local (útil antes de un refresco
masivo); en ese caso no se requiere notebook_id.
| Name | Required | Description | Default |
|---|---|---|---|
| purge_all | No | Vacía la caché y exportaciones de TODOS los notebooks. | |
| notebook_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark this as non-read-only but non-destructive, and the description usefully clarifies that only local cache and exports are deleted, not remote notebooks. It does not state whether deleted exports are irreversible or how the operation reports partial failures, which matters given destructiveHint=false while exports are being removed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the scope boundary comes first, then the mode-specific rule. No filler, and the most decision-relevant conditional is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description covers scope and the purge_all branch adequately. The main gap is the default path — what gets cleared when purge_all is false and no notebook_id is given — which an agent could plausibly hit given zero required parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, but the description compensates by explaining purge_all's semantics (full wipe of all local state) and the resulting parameter interaction — notebook_id becomes unnecessary. The default no-flag behavior (presumably per-notebook clearing) is only implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('Borra la caché local y las exportaciones') plus a crucial scope boundary: it does not affect NotebookLM itself. The resource is unambiguous, though it never contrasts itself with the related sibling sync_notebook, which also deals with local state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear usage context ('útil antes de un refresco masivo') and the conditional precondition that notebook_id is unnecessary when purge_all=True. It stops short of naming alternatives or stating what happens when neither parameter is supplied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_markdownAIdempotent
Exporta a .md (con front matter) un notebook completo o una sola fuente.
Notebook completo (incremental): solo reescribe las fuentes cuyo Markdown cambió —el resto
conserva su exported_at—, deja INDEX.md + .manifest.json y borra los .md de fuentes
que ya no existen (force reescribe todo). Una sola fuente: escribe ese documento y, con
refresh, lo vuelve a descargar antes. directory elige el destino; los archivos quedan
listos para las herramientas de archivos del agente.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Notebook completo: reescribe todo aunque no haya cambiado. | |
| refresh | No | Una fuente: vuelve a descargarla de NotebookLM antes de escribir. | |
| directory | No | Carpeta destino (por defecto, la de exportaciones del servidor; si es relativa, cuelga de ella). | |
| source_id | No | Exporta solo esta fuente. Omitir = exporta el notebook completo. | |
| notebook_id | Yes | ID del notebook (obtenlo con list_notebooks). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already declaring idempotency and non-destructiveness, the description adds substantive behavior beyond them: it preserves `exported_at` on unchanged sources, emits `INDEX.md` + `.manifest.json`, and deletes `.md` files for sources that no longer exist. Surfacing that stale-file cleanup is exactly the kind of side effect an agent needs but would not infer from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the export target, then structured by mode with parenthetical modifiers, so no sentence is filler. It is dense and somewhat long, but the density is earned by the amount of mode-specific behavior being conveyed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 needn't cover return values, and it still accounts for both modes, incremental vs. forced behavior, destination selection, and the stale-file cleanup that would otherwise be a surprise. 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.
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 goes further by framing `force` and `refresh` in terms of which mode they apply to ('Notebook completo' vs. 'Una fuente'), which the schema's per-property text does not make as clear cross-parameter-wise. `directory` destination semantics are covered by both schema and prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Exporta a `.md` (con front matter)') and immediately splits the two operating modes: full notebook vs. single source. That distinction, plus the mention of front matter and produced artifacts, lets an agent tell exactly what the tool 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains both invocation modes and the conditions that select each modifier ('incremental', '`force` reescribe todo', 'con `refresh`, lo vuelve a descargar antes'). It stops short of naming when an agent should prefer this over other retrieval siblings, but no sibling competes for the same output, so the guidance is clear in context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_chat_historyARead-onlyIdempotent
Historial de chat del notebook: turnos (pregunta, respuesta) más recientes.
Los turnos vienen recortados y sin conversation_id: para repreguntar con contexto, usa el que devolvió ask_notebook.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Máximo de turnos a recuperar (1-50). | |
| notebook_id | Yes | ID del notebook (obtenlo con list_notebooks). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish it is a read-only, idempotent, non-destructive operation, so the bar is lower. The description adds non-obvious behavioral facts beyond that: returned turns are truncated, the newest turns are returned, and conversation_id is stripped from the payload — all of which affect how an agent should interpret results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences: purpose and scope first, then the caveat and the alternative. Every sentence carries information the agent cannot get from schema or annotations, with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 structure need not be explained, but the description correctly flags the two things the schema will not show the agent: truncation and the missing conversation_id. Only remaining gap is that neither ordering nor what happens when fewer turns exist is stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with limit (1-50, default 20) and notebook_id (obtain via list_notebooks) documented in the schema itself. The description only loosely implies recency ordering via 'más recientes' and adds no syntax or semantics 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.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource (chat history of a notebook) and specifies the shape of what is returned: recent turns of (question, answer). It is clearly distinct from ask_notebook, though it names that sibling only as a source for conversation_id rather than contrasting the tools' purposes directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly redirects the agent: the turns come without conversation_id, so to re-ask with context the agent must use the conversation_id returned by ask_notebook. This is genuine routing guidance. There is no explicit statement of when NOT to call this tool (e.g., for full-text history before a given turn), keeping it below 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_generation_statusARead-onlyIdempotent
Estado de una generación iniciada con generate_report (pending / in_progress / completed / failed).
Con wait_seconds > 0 espera activamente hasta el estado terminal (o agotar la espera) y
devuelve final, para que el agente no tenga que consultar en bucle. Con 0 responde ya.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ID de la tarea devuelto por generate_report. | |
| notebook_id | Yes | ID del notebook (obtenlo con list_notebooks). | |
| wait_seconds | No | 0 = consulta única; hasta 600 s esperando el estado terminal. | |
| poll_interval_seconds | No | Intervalo entre consultas mientras espera (1-10 s). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so safety needs no restating. The description adds genuinely new behavior: it blocks actively up to the wait budget and returns a `final` flag, which is the key runtime trait an agent needs. It could have mentioned that a non-terminal timeout still returns the current state, but the core trait is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the resource and states, then the critical non-obvious behavior (active waiting). No filler and no repetition of schema or annotation content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 not be detailed, and the description still highlights the `final` field and state enumeration. Complete enough to call correctly; minor gap on what happens when the wait budget expires without reaching a terminal state.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description nevertheless adds meaning by explaining the semantics of wait_seconds (blocking until terminal or exhausting the wait) and the resulting `final` field, which the schema alone does not convey. poll_interval_seconds and notebook_id are left to the schema, which is acceptable at full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Estado de una generación') and anchors it to the tool that creates the task ('iniciada con generate_report'), then enumerates the possible states. An agent immediately knows this is the polling companion to report generation and cannot confuse it with read_report or list_notebooks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains the two usage modes: wait_seconds > 0 blocks until terminal state so the agent avoids polling loops, while 0 returns immediately. That is clear when-to-use guidance for the main decision. It does not name any sibling alternative (there is none for status), but it also lacks guidance on failure/retry behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_notebookCRead-onlyIdempotent
Metadatos de un notebook, su resumen generado y temas sugeridos.
| Name | Required | Description | Default |
|---|---|---|---|
| notebook_id | Yes | ID del notebook (obtenlo con list_notebooks). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, so the safety profile is fully covered. The description contributes by noting the returned payload includes a generated summary and suggested topics, which is behavioral context not in the annotations. It says nothing about failure modes (unknown notebook_id) or whether summary/topics can be absent, so it adds only modest value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short clause with no filler; the return contents are listed up front. It is perhaps overly terse for its scope, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 values needn't be explained, and annotations cover safety, so the remaining burden is small. Still, for a lookup tool across a 22-tool sibling set, the description gives no scoping or routing context beyond the resource list, leaving the agent to infer its place in the workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter notebook_id carries a description that even points at list_notebooks for discovery, so the schema does the heavy lifting. The description adds nothing about the parameter. Baseline 3 applies for full schema coverage with no extra meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource surface (metadata, generated summary, suggested topics) which goes beyond the bare name 'get_notebook', but the verb is only implied and there is no differentiation from siblings such as list_notebooks or get_source_outline. An agent can infer it fetches one notebook's details, but only through the resource listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no guidance on when to call this versus list_notebooks or ask_notebook, and states no preconditions. The only routing hint ('obtenlo con list_notebooks') lives in the schema, not the description, and it is about acquiring the ID rather than when to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_source_guideCRead-onlyIdempotent
Resumen y palabras clave que NotebookLM genera para una fuente.
| Name | Required | Description | Default |
|---|---|---|---|
| source_id | Yes | ID de la fuente (obtenlo con list_sources). | |
| notebook_id | Yes | ID del notebook (obtenlo con list_notebooks). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered structurally. The description adds nothing beyond them – no note on whether a guide must be pre-generated, whether it can be absent, or what triggers generation, which is exactly the kind of context a read tool like this needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is efficient, though its brevity borders on under-specification for a tool with an output schema and pre-generation semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 explained, and annotations cover safety. However, for a tool whose availability may depend on whether NotebookLM has generated a guide for the source, the description leaves an important operational question unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters carry their own guidance on where to obtain the IDs, so the schema does the heavy lifting. The description contributes no additional meaning about the IDs or their relationship.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource (a source) and the specific content returned (summary and keywords generated by NotebookLM), which distinguishes it from siblings like read_source (full text) and get_source_outline (structure). It lacks an explicit verb such as 'retrieves', but the resource+content pairing is specific enough to select on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus alternatives such as read_source, get_source_outline, or source_stats. The only routing hints live in the parameter schema (pointers to list_sources/list_notebooks), not in the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_source_outlineBRead-onlyIdempotent
Índice de encabezados (nivel, título, línea, posición) de una fuente en Markdown.
| Name | Required | Description | Default |
|---|---|---|---|
| source_id | Yes | ID de la fuente (obtenlo con list_sources). | |
| notebook_id | Yes | ID del notebook (obtenlo con list_notebooks). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds that the result is a heading index with position/line metadata, which is useful beyond the annotations, but it is silent on behavior for non-Markdown sources or sources without headings — a real gap given the 'en Markdown' qualifier.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single well-formed sentence with the returned fields front-loaded and no filler. It is arguably slightly too terse for a tool whose scope constraints are unstated, but nothing in it is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value explanation is unnecessary, and the description covers the shape of the result. However, it leaves open the important edge case of non-Markdown sources and offers no routing guidance among several overlapping read tools, so it is only minimally sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters document how to obtain their values (list_notebooks, list_sources), so the schema does the heavy lifting. The description adds nothing about the parameters, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource (a source's heading index) and enumerates the returned fields (level, title, line, position), so the operation is unambiguous. It does not distinguish itself from neighbors like read_source, get_source_guide, or source_stats, which an agent could easily confuse with a structural view of a source.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to prefer this over read_source, read_source_section, or get_source_guide, and no note about prerequisites (e.g. that the source must be Markdown). The only usage hint lives in the schema (how to obtain the IDs), not in the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usageARead-onlyIdempotent
Cuota de la cuenta (ventanas de uso y acciones con capacidad restante).
Útil antes de lotes de ask_notebook/generate_report para no chocar con límites.
No todas las cuentas exponen la cuota: si no, devuelve status: disabled y
enabled: false — en ese caso confía en los límites por defecto y no reintentes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, so the bar is lower. The description adds genuinely new context: some accounts don't expose quota, in which case it returns `status: disabled` and `enabled: false` and the agent should fall back to defaults rather than retry. That degraded-state disclosure is exactly the kind of behavior the schema 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short lines, front-loaded with the resource definition followed by the usage condition and the edge case. The parenthetical is slightly dense but every sentence carries actionable content; nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 needn't enumerate return fields, and the one return shape that matters (the disabled case) is called out explicitly. Coverage is solid for a zero-argument read; only minor details (e.g. which windows are reported) are left implicit and are available in the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. The description does not introduce any spurious argument expectations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource precisely: account quota, with the two facets (usage windows and actions with remaining capacity). The name-plus-description pairing makes it clearly distinct from health_check or source_stats, though the description itself doesn't explicitly contrast with those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('útil antes de lotes de ask_notebook/generate_report para no chocar con límites'), names the concrete sibling operations it protects, and adds an exclusion/fallback rule: if quota isn't exposed, trust defaults and do not retry. When-to-use, when-not-to-worry, and the anti-pattern are all covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grepAIdempotent
Busca un texto o regex (como grep) en la caché: en un notebook o en todas a la vez.
Devuelve línea + contexto. Sin notebook_id recorre todas las notebooks de la cuenta y
etiqueta cada coincidencia con su origen (notebooks_scanned_ids dice cuáles se recorrieron);
una notebook con problemas no aborta el barrido (notebook_errors con ref). Es literal salvo
que uses literal=false.
| Name | Required | Description | Default |
|---|---|---|---|
| literal | No | true = texto literal; false = expresión regular de Python. | |
| pattern | Yes | Texto a buscar (literal por defecto). | |
| auto_sync | No | Descarga a la caché las fuentes que falten (la primera vez puede tardar). | |
| source_ids | No | Limita la búsqueda a estas fuentes (requiere notebook_id). | |
| max_matches | No | Máximo total de coincidencias (1-200). | |
| notebook_id | No | Notebook concreto. Omitir = busca en todas las de la cuenta. | |
| notebook_ids | No | Limita el barrido a estas notebooks (solo si omites notebook_id). | |
| context_lines | No | Líneas de contexto antes/después (0-10). | |
| max_notebooks | No | Tope de notebooks a recorrer (1-50). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond the annotations: each match is tagged with its origin, notebooks_scanned_ids reports which notebooks were scanned, and notebook_errors (with ref) shows that a failing notebook does not abort the sweep — important partial-failure semantics. Annotations declare readOnlyHint=false, consistent with the cache-downloading auto_sync behavior rather than contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action and scope, then the return shape, then the fallback/error semantics. Nearly every sentence earns its place; the only slight redundancy is restating the literal default already in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter search tool with an output schema and annotations present, the description covers scope, return shape (line + context), origin tagging, and partial-failure handling. The remaining details (limits, context line counts) live in the schema and output schema, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all nine parameters are already documented in the schema; the description only echoes the notebook_id-omission behavior and the literal flag. It adds no syntax or interaction details (e.g. source_ids requiring notebook_id) beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (search text or regex in the cache, like grep) and defines scope precisely: one notebook or all of them at once. It clearly differentiates itself from a listing/read tool, though it never names the closest sibling (keyword_search / search_sources), so the agent must infer the split.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains that omitting notebook_id sweeps all notebooks and that matching is literal unless literal=false, which implicitly guides usage. However, it never says when to prefer this over keyword_search or search_sources, nor any prerequisite or exclusion — the caller has to infer the choice from the sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_checkBRead-onlyIdempotent
Estado del servidor y de la sesión con NotebookLM (modo, caché, autenticación).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so safety is covered. The description contributes useful scope detail by naming the three state areas reported (mode, cache, authentication), but says nothing about side effects, latency, or what a failure state looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler, and the resource scope is front-loaded before the reported facets. Nothing in it is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter diagnostic call with an output schema documenting return values, the description need only convey scope, which it does. The only shortfall is the absent routing guidance relative to sibling status/cache tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (server and NotebookLM session) and enumerates the facets reported (mode, cache, authentication), which distinguishes it from siblings such as get_usage or clear_cache. It lacks an explicit verb ("get/report"), but the intent is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no indication of when to call this versus alternatives like get_usage, clear_cache, or sync_notebook, nor any stated prerequisites or follow-up actions. The agent must infer that this is a diagnostic entry point.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keyword_searchAIdempotent
Búsqueda léxica BM25 local (sin cuota) en un notebook o en todas a la vez.
Sin notebook_id barre todas las notebooks (o notebook_ids) y etiqueta cada resultado con
su notebook de origen: sirve para saber en cuál documentaste algo sin recorrerlas una por una.
notebooks_scanned_ids dice cuáles se recorrieron de verdad (con max_notebooks puede que la
que te interesa se quedara fuera). Una notebook con problemas no aborta el barrido
(notebook_errors con ref).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Máximo total de fragmentos devueltos (1-50). | |
| query | Yes | Palabras clave (se ignoran tildes, mayúsculas y palabras vacías). | |
| auto_sync | No | Descarga a la caché las fuentes que falten (la primera vez puede tardar). | |
| source_ids | No | Limita la búsqueda a estas fuentes (requiere notebook_id). | |
| notebook_id | No | Notebook concreto. Omitir = barre todas las de la cuenta. | |
| notebook_ids | No | Limita el barrido a estas notebooks (solo si omites notebook_id). | |
| max_notebooks | No | Tope de notebooks a escanear (1-50). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing truncation risk (`max_notebooks` may exclude the notebook you care about), that `notebooks_scanned_ids` reflects actual coverage, and that a failing notebook does not abort the sweep (`notebook_errors` with `ref`). Given readOnlyHint=false while the tool is a search, the mention of cache download via `auto_sync` in the schema helps explain the write-ish profile, but the description itself does not restate that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Scope and mode are front-loaded in the first sentence, constraints follow. Two short blocks, though the `notebooks_scanned_ids`/`notebook_errors` sentence partly duplicates what the output schema already returns.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the multi-notebook sweep semantics, partial-failure tolerance, and coverage limits — the non-obvious parts for a 7-parameter tool. With an output schema and annotations present, return formats need not be spelled out, so the remaining gap is only the missing comparison to sibling search tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds cross-parameter semantics beyond the schema — that `notebook_ids` narrows the sweep only when `notebook_id` is absent, and that `max_notebooks` silently bounds what gets scanned. Useful relational meaning rather than restatement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: local BM25 lexical search over one notebook or all of them, explicitly noting it is quota-free. It is distinguishable from semantic/chat siblings by the 'búsqueda léxica BM25 local' phrasing, though it never names alternatives like grep or search_sources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the key selection rule: omitting `notebook_id` sweeps all notebooks and tags each hit with its origin, which is framed as the way to find where something was documented without opening notebooks one by one. No explicit when-not or sibling comparison, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_artifactsARead-onlyIdempotent
Lista los artefactos generados (informes, audio, cuestionarios, mapas mentales...) y su estado.
| Name | Required | Description | Default |
|---|---|---|---|
| notebook_id | Yes | ID del notebook (obtenlo con list_notebooks). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds genuine value by disclosing the artifact taxonomy (reports, audio, quizzes, mind maps) and that each item carries a status field, which the annotations don't convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the verb and resource and spends no words on filler. Nothing is redundant or buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, annotations covering behavior, and full parameter documentation, the description gives enough to invoke correctly. Only the missing tie-breaker against sibling listing/status tools keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter already documents itself, including the pointer to list_notebooks. The description adds no further parameter semantics, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Lista los artefactos generados... y su estado') and enumerates artifact types (informes, audio, cuestionarios, mapas mentales), which cleanly separates it from list_notes, list_sources and list_notebooks. It doesn't explicitly name those siblings, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: it's a listing tool scoped by notebook_id, so an agent can infer when to call it. There is no explicit when-to-use guidance and no routing between this and nearby tools like get_generation_status or read_report.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_notebooksBRead-onlyIdempotent
Lista los notebooks de la cuenta (id, título, nº de fuentes, fechas).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Máximo de resultados (1-200). | |
| query | No | Filtra por texto en el título (sin mayúsculas). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered. The description adds only a restatement of returned fields, which the existing output schema already provides, and says nothing about pagination behavior, ordering, or truncation beyond the default limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with the scope and the returned fields front-loaded; nothing is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Return values need not be explained given the output schema, and the safety profile is carried by annotations. However, the description never signals that listing can be filtered or capped, so an agent reading only the description could miss the search/limit capability entirely; adequate but with a clear gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both `limit` (1-200) and `query` (title text filter) are already documented in the schema; baseline 3 applies. The description notably omits any mention that filtering by title text is possible, which would have been a useful pointer beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Lista los notebooks de la cuenta") and names the fields returned (id, title, source count, dates). It is clearly distinguishable from get_notebook in intent, but it never explicitly contrasts with siblings such as list_sources or list_artifacts, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus get_notebook (single notebook), list_sources, or search_sources, and no prerequisites or exclusions. The only usage signal is implicit in the verb "Lista".
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_notesBRead-onlyIdempotent
Lista las notas del notebook con una vista previa.
| Name | Required | Description | Default |
|---|---|---|---|
| notebook_id | Yes | ID del notebook (obtenlo con list_notebooks). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile needs no restating. The description adds one genuinely useful behavioral fact beyond that: results are previews rather than full note bodies. It does not disclose ordering, pagination, or truncation limits on those previews.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler, front-loading the verb and the returned view. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple, read-only, single-parameter list operation, annotations cover safety, and an output schema exists so return values need not be described. Only the preview/truncation behavior and result ordering are left implicit, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema description coverage, the schema already explains notebook_id and where to obtain it. The description adds no further meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lista las notas del notebook') plus a distinguishing output trait ('con una vista previa'), so an agent can tell it returns abbreviated note content. It does not explicitly contrast with the sibling read_note, but the verb 'list' vs 'read' makes the split largely inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance, and no sibling is named (read_note, list_notebooks). The only navigational hint ('obtenlo con list_notebooks') lives in the JSON schema property description, not in this tool's description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sourcesBRead-onlyIdempotent
Lista las fuentes de un notebook con tipo, estado, URL y nº de palabras.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Máximo de fuentes a devolver (1-100). Por defecto, todas. | |
| status | No | Filtra por estado: ready, processing, error. | |
| notebook_id | Yes | ID del notebook (obtenlo con list_notebooks). | |
| source_type | No | Filtra por tipo: pdf, markdown, web_page, youtube, pasted_text, docx, google_docs... |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered elsewhere. The description adds only the shape of the returned record (type, status, URL, word count), which is partly duplicative of the output schema and says nothing about ordering, pagination, or behavior on an empty notebook.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the verb first and zero filler; the returned fields are packed efficiently. It is perhaps too terse for the tool's role, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a fully documented schema and an output schema present, the description need not restate parameters or return values, and it correctly avoids doing so. What remains missing is only the relational context to siblings and any hint about preferred use over search_sources.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: limit, status, notebook_id (with a pointer to list_notebooks) and source_type are all documented in the schema, including enum-like values and the 1-100 range. The description's mention of "tipo" and "estado" merely echoes two of those parameters without adding format or interaction detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Lista las fuentes de un notebook") plus the fields returned (tipo, estado, URL, nº de palabras), so an agent knows exactly what it gets back. It does not name or differentiate itself from close siblings such as search_sources or keyword_search, which keeps it out of the 5 band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use, when-not-to-use, or alternative routing. An agent must infer from the name alone that this is the enumeration path versus search_sources (filtered search) or read_source (content retrieval). No prerequisites or pagination guidance appear in the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_noteBRead-onlyIdempotent
Lee una nota completa (paginada).
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Posición (caracteres) desde la que leer. | |
| note_id | Yes | ID de la nota (obtenla con list_notes). | |
| max_chars | No | Tamaño de página. Por defecto y máximo: NLM_MAX_CHARS. | |
| notebook_id | Yes | ID del notebook (obtenlo con list_notebooks). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/destructive=false, so the safety profile is covered. The word 'paginada' adds a genuinely useful behavioral signal (content may be truncated and require offset/max_chars looping), but the description doesn't explain default/maximum page size, truncation semantics, or what a partial read returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no waste and the core action front-loaded; the terseness is efficient but leaves little room for the pagination nuance to be explained.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 4-parameter read tool with full schema coverage, annotations, and an output schema, the description is adequate but thin: it omits when-to-use routing and how pagination should be driven, which are the only things structured fields don't carry.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema, including offset semantics and the NLM_MAX_CHARS default. The description adds only the implicit notion of pagination, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb+resource: reads a full note, with the qualifier that it is paginated. It does not differentiate itself from siblings like read_source, read_report, or get_notebook, which read other content types, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus alternatives (read_source, read_report, list_notes), no preconditions, and no note about needing the IDs first — that hint lives only in the schema parameter descriptions, not the tool description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_reportARead-onlyIdempotent
Lee en Markdown un informe (briefing, guía de estudio...), paginado.
Solo los informes (tipo report, los que crea generate_report): un archivo subido, un
audio o una presentación no tienen texto que leer y la llamada lo dirá con el tipo que tiene
en lugar del «no está listo» interno de NotebookLM.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Posición (caracteres) desde la que leer. | |
| max_chars | No | Tamaño de página. Por defecto y máximo: NLM_MAX_CHARS. | |
| artifact_id | Yes | ID del artefacto (obtenlo con list_artifacts); debe ser de tipo report. | |
| notebook_id | Yes | ID del notebook (obtenlo con list_notebooks). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower; the description still adds real behavior: output is Markdown, it is paginated, and non-report artifacts return the artifact's actual type rather than the misleading internal 'not ready' message. That error-shape detail is genuinely useful for an agent interpreting results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs, front-loaded with what the tool does, followed by the scope restriction. The explanation of NotebookLM's internal error behavior is slightly discursive but earns its place by preventing misinterpretation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With four fully documented parameters, an output schema, and read-only/idempotent annotations, the definition covers purpose, scope and failure mode adequately. Missing only an explicit pointer to the tool to use for non-report artifacts.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% — offset, max_chars, artifact_id and notebook_id are all documented in the schema, including the 'must be of type report' constraint. The description only echoes the pagination idea already conveyed by offset/max_chars, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (reads a report in Markdown, paginated) and scopes it to artifacts of type `report`, contrasting that with uploaded files, audio and presentations. It does not name the sibling that handles the other cases (read_source / export_markdown), so an agent must infer that routing itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when it applies ('Solo los informes') and pre-empts a common mistake by describing what happens when the artifact is not a report. It stops short of naming the alternative tool to call for sources or files, and references `generate_report`, which is not in the sibling list shown.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_sourceARead-onlyIdempotent
Lee una fuente en Markdown, paginada. Para documentos largos prefiere get_source_outline + read_source_section.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Posición (caracteres) desde la que leer; usa next_offset de la página anterior. | |
| refresh | No | Ignora la caché y vuelve a descargar la fuente. | |
| max_chars | No | Tamaño de página. Por defecto y máximo: NLM_MAX_CHARS. | |
| source_id | Yes | ID de la fuente (obtenlo con list_sources). | |
| notebook_id | Yes | ID del notebook (obtenlo con list_notebooks). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the description only needs to add pagination and format context, which it does. It does not mention cache behavior (covered only by the refresh param) or that responses expose next_offset, leaving a small gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, with the core capability first and the alternative workflow second.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich schema, full annotations and an output schema, the description covers what is needed to call it correctly. Only minor gaps remain around cache/refresh behavior and offset chaining, which the schema partly covers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so offset/max_chars/refresh/source_id/notebook_id are already documented with usage hints. The description adds only the implicit notion of pagination, no syntax or default details beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lee una fuente') plus output format ('en Markdown') and behavior ('paginada'), which separates it from read_source_section and get_source_outline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative workflow and the condition that selects it: for long documents use get_source_outline + read_source_section instead. This is exactly the routing an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_source_sectionBRead-onlyIdempotent
Lee solo una sección (hasta el siguiente encabezado del mismo nivel o superior).
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Posición (caracteres) desde la que leer dentro de la sección. | |
| heading | Yes | Título del encabezado (exacto o fragmento único). Ver get_source_outline. | |
| max_chars | No | Tamaño de página. Por defecto y máximo: NLM_MAX_CHARS. | |
| source_id | Yes | ID de la fuente (obtenlo con list_sources). | |
| occurrence | No | Si el título se repite, cuál de ellos (1 = primero). | |
| notebook_id | Yes | ID del notebook (obtenlo con list_notebooks). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 real behavioral value by defining exactly what content is returned (the section ending at the next same-or-higher heading), but it says nothing about pagination semantics even though offset/max_chars exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler. It is efficient, though its extreme brevity leaves the usage question unaddressed rather than wasting space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 explanation, and annotations plus full parameter coverage handle safety and inputs. The one meaningful gap is that the description never clarifies when to prefer this over read_source or how pagination behaves in practice.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (offset, heading, max_chars, source_id, occurrence, notebook_id) is already documented in the schema. The description's section-boundary concept loosely supports heading/occurrence but adds 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (a single section), and even defines the scope boundary as 'up to the next heading of the same or higher level', which cleanly distinguishes it from a whole-source read. It stops short of naming the sibling read_source explicitly, so the differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no exclusions, and does not name an alternative such as read_source. The heading-related schema description points to get_source_outline, but that pointer lives in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_sourcesBRead-onlyIdempotent
Búsqueda semántica de NotebookLM: fragmentos más relevantes ordenados por relevancia.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Máximo de fragmentos (1-30). | |
| query | Yes | Consulta en lenguaje natural. | |
| source_ids | No | Limita la búsqueda a estas fuentes. | |
| notebook_id | Yes | ID del notebook (obtenlo con list_notebooks). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive behavior, so the safety profile is fully covered without the description. The description adds that results are fragments ordered by relevance, which is useful ranking context, but says nothing about scoring thresholds, empty-result behavior, or latency/cost of an open-world semantic search.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with the key concept (semantic search, relevance-ranked fragments) front-loaded and no filler. It is efficient, though it spends its only clause on ranking rather than on the routing information an agent most needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full input schema and an output schema present, return values and parameters are covered elsewhere, so the description's remaining obligation is disambiguation from the other search/read tools, which it does not provide. Adequate but with an obvious gap for a tool sitting among four overlapping retrieval siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including the note that notebook_id comes from list_notebooks, so the schema carries the parameter burden. The description contributes no additional semantics about query phrasing, the source_ids scoping, or the 1-30 limit, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: semantic search over NotebookLM sources returning the most relevant fragments ranked by relevance. It is clear what the tool does, but it never mentions how it differs from siblings like keyword_search, grep, or ask_notebook, leaving the agent to infer the distinction from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus keyword_search, grep, ask_notebook, or read_source, all of which could plausibly satisfy a lookup need. The only implicit cue is the word 'semántica', which an agent must interpret on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
source_statsAIdempotent
Radiografía local de las fuentes: tamaño, palabras, encabezados y términos dominantes.
Sin notebook_id resume la caché entera por notebook (fuentes, caracteres y antigüedad),
sin red ni cuota: es la vista para decidir sync_notebook o clear_cache. Con
notebook_id mide fuente a fuente; con auto_sync=False mide solo lo ya cacheado y
lista el resto en not_cached.
| Name | Required | Description | Default |
|---|---|---|---|
| terms | No | Cuántos términos dominantes devolver por fuente (1-30). | |
| auto_sync | No | Descarga a la caché las fuentes que falten. | |
| source_ids | No | Limita las métricas a estas fuentes (requiere notebook_id). | |
| notebook_id | No | Notebook a medir. Omitir = resumen de toda la caché local. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations present (readOnlyHint=false, openWorldHint=true, idempotent=true), the description adds real context: the no-notebook_id summary runs 'sin red ni cuota', while auto_sync can populate the cache and uncached sources are listed under not_cached. That reconciles the openWorld/write hints with the read-style summary. It stops short of describing cost or side effects of the auto-sync download path.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the resource and its metrics, then immediately covers the notebook_id-less case before the per-source case. Dense but every clause carries a mode distinction; slightly heavy in one paragraph but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All four modes are accounted for and an output schema exists, so return values need not be spelled out. Given a read-mostly, four-optional-parameter tool with cache semantics, this is enough for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 nonetheless adds semantics beyond the schema — the meaning of an omitted notebook_id (whole-cache summary) and the behavioral consequence of auto_sync=False (cached-only plus not_cached list). Source_ids and terms are left to the schema, which is acceptable at full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Radiografía local de las fuentes') and enumerates exactly what is measured: tamaño, palabras, encabezados y términos dominantes. It also distinguishes the two operating modes (cache-wide vs per-source) and names the downstream siblings it feeds (sync_notebook, clear_cache), so an agent can tell it apart from search_sources or list_sources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing is given for every mode: omit notebook_id to get the cache-wide summary used to decide sync_notebook or clear_cache; pass notebook_id to measure source by source; set auto_sync=False to measure only cached sources. The when-to-use condition is stated rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_notebookAIdempotent
Descarga todas las fuentes del notebook en Markdown a la caché local (habilita keyword_search/grep sin esperas).
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Vuelve a descargar todo aunque la caché esté vigente. | |
| notebook_id | Yes | ID del notebook (obtenlo con list_notebooks). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely new context: it writes Markdown copies into a local cache and is a prerequisite for latency-free keyword_search/grep. It omits cache staleness/disk-usage implications, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the core action front-loaded and the payoff (fast search) attached. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 explanation is not needed, and annotations cover idempotency and safety. The only gap is that the description does not touch cache freshness/force behavior, which the schema handles, leaving little missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (notebook_id and force) are already documented in the schema, establishing the baseline of 3. The description says nothing about the force/re-download behavior, adding no meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (descarga) and resource (todas las fuentes del notebook) plus the output form (Markdown a la caché local). It also names the siblings it enables (keyword_search/grep), so an agent can distinguish it from read_source or search_sources 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(habilita keyword_search/grep sin esperas)' makes the when-to-use condition explicit: call this before relying on fast local search. It does not state when NOT to use it (e.g., cache already warm, or pairing with clear_cache), which keeps it below 5.
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.
23 tool updates
v0.1.0- First observed
ask_notebook - First observed
clear_cache - First observed
export_markdown - First observed
get_chat_history - First observed
get_generation_status - First observed
get_notebook - First observed
get_source_guide - First observed
get_source_outline - First observed
get_usage - First observed
grep - First observed
health_check - First observed
keyword_search - First observed
list_artifacts - First observed
list_notebooks - First observed
list_notes - First observed
list_sources - First observed
read_note - First observed
read_report - First observed
read_source - First observed
read_source_section - First observed
search_sources - First observed
source_stats - First observed
sync_notebook
TDQS
Scored across 23 tools
Most tools target a clearly distinct resource/action (notebooks, sources, notes, reports, cache, quota). The main risk is the search trio—search_sources (semantic), keyword_search (BM25) and grep (regex)—which overlap conceptually, though descriptions explain when to use each. read_source vs read_source_section vs get_source_outline are also related but well differentiated.
Predominantly consistent snake_case verb_noun pattern (list_notebooks, get_notebook, read_source, sync_notebook, clear_cache). A few deviations—grep (bare verb), keyword_search and source_stats (noun/adjective-noun), health_check—but they remain readable and predictable overall.
23 tools is on the heavy side of the 16-25 band for a single server. Most tools earn their place (notebook/source/note/artifact lifecycle plus a cache and quota subsystem), but the search suite and cache utilities could be consolidated to reduce surface area.
The surface is strong on reading, searching and caching, but lacks creation/management operations: no create_notebook, add_source, create_note or delete tools. Notably, generate_report is referenced by read_report and get_generation_status but is absent from the tool list, creating a dead end for artifact generation.
Maintenance
Related MCP Connectors
Markdown workspace for AI agents: read, write, organize, and share markdown documents.
Search and reason over your Obsidian-style Markdown vault, right from ChatGPT.
Cited, versioned knowledge for agents: retrieve sourced passages and propose owner-approved fixes.
Markdown notes and whiteboards your AI agent can read and write.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to search, read, create, and maintain a local-first knowledge base using hybrid retrieval and Markdown note management through the Model Context Protocol.01MIT
- FlicenseAqualityAmaintenanceEnables agents to run hybrid dense and BM25 search over a local folder of Markdown files, read and write notes, and trigger reindexing as the folder changes. It also injects the most relevant sections into each prompt automatically and runs entirely locally with a bundled embedding model.12-
- AlicenseNot gradedqualityBmaintenanceEnables AI coding agents to search and read local Markdown knowledge bases generated by Agent Docs for Markdown, across single or multiple workspaces, including link/backlink discovery and index status checks.1MIT
- AlicenseBqualityBmaintenanceEnables AI agents to capture, search, relate, review, and safely update a local-first Markdown knowledge vault through typed operations such as inventory, retrieve, run_view, update, add_attachment, trash, and restore. Agents get validated access to personal notes and attachments without a generic shell or arbitrary filesystem access.2836 PyPIApache 2.0