Easy Notion MCP
Easy Notion MCP
Servidor MCP centrado en Markdown que conecta agentes de IA a Notion. Los agentes escriben markdown — easy-notion-mcp lo convierte a la API de bloques de Notion y viceversa.
43 herramientas · 24 tipos de bloque · ~6–7× menos tokens de respuesta que el MCP oficial de Notion · Compatibilidad de ida y vuelta documentada
npx easy-notion-mcpVerlo en acción → Página de Notion en vivo creada y gestionada íntegramente mediante easy-notion-mcp.

Contenido: Comparación · Configuración inicial · Perfiles de CLI · Configuración · Por qué Markdown · Cómo funciona · Herramientas · Recursos de MCP · Tipos de bloque · Ida y vuelta · Bases de datos · Recetario · Seguridad · Estabilidad · Preguntas frecuentes · Comunidad
¿Cómo se compara easy-notion-mcp con otros servidores MCP de Notion?
Feature | easy-notion-mcp | Official Notion MCP (npm) | better-notion-mcp |
Formato de contenido | ✅ Markdown GFM estándar | ❌ JSON sin procesar de la API de Notion | ⚠️ Markdown (tipos de bloque limitados) |
Tipos de bloque | ✅ 24 (desplegables, columnas, destacados, ecuaciones, incrustaciones, tablas, subidas de archivos, listas de tareas) | ⚠️ Todos (como JSON sin procesar) | ⚠️ ~7 (encabezados, párrafos, listas, código, citas, divisores) |
Compatibilidad de ida y vuelta | ✅ 24 tipos de bloque, salvedades documentadas | ❌ El JSON sin procesar requiere reconstrucción de bloques | ⚠️ Los bloques no compatibles se descartan silenciosamente |
Herramientas | 43 herramientas con nombre individual | 18 autogeneradas a partir de OpenAPI | 9 herramientas compuestas (39 acciones) |
Subida de archivos | ✅ | ✅ Ciclo de vida de 5 pasos | |
Defensa contra inyección de prompts | ✅ Prefijo de aviso de contenido + saneamiento de URL | ❌ | ❌ |
Formato de entrada de base de datos | Pares clave-valor simples | Pares clave-valor simplificados | Pares clave-valor simplificados |
Opciones de autenticación | Token de API u OAuth | Token de API u OAuth | Token de API u OAuth |
¿Cuántos tokens ahorra easy-notion-mcp?
Leer el contenido de una página cuesta aproximadamente 6–7× menos tokens de respuesta que el servidor MCP oficial de Notion, porque el JSON sin procesar de bloques de Notion incluye metadatos por bloque (IDs de bloque, marcas de tiempo, objetos de autor) que un agente que lee para obtener contenido nunca necesita. Normalmente ~5–7×, desde ~3× en páginas con mucho código hasta ~15× en páginas ricas, con ≥94% del contenido de la página conservado. Medido frente al servidor oficial de JSON sin procesar; aproximadamente a la par con otros servidores basados en Markdown.
La ventaja es la omisión de metadatos, no la eficiencia de codificación. Con la misma información, los dos formatos cuestan aproximadamente lo mismo (la proporción común de representación intermedia es de ~1.0–1.06× en formas de página totalmente representadas, y 1.32× en prosa típica), por lo que el ahorro son los metadatos por bloque (UUIDs de bloque, marcas de tiempo, objetos de autor, envoltorios de anotaciones) que el JSON sin procesar incluye y una lectura de contenido nunca utiliza. Las consultas a bases de datos muestran una ventaja similar de ~7× con completitud total del contenido.
Metodología, resultados por clase y todas las salvedades: .meta/research/token-bench-results-2026-06-13.md (re-ejecutado mediante scripts/bench/lib/recompute-tiers.ts).
Related MCP server: MCP Notion Server (@suncreation)
¿Cómo configuro easy-notion-mcp?
Con token de API
Crea una integración de Notion, copia el token y comparte tus páginas con ella.
Claude Code:
claude mcp add notion -s user \
-e NOTION_TOKEN=ntn_your_integration_token \
-- npx -y easy-notion-mcpEsto registra el servidor en la configuración a nivel de usuario de tu Claude Code (-s user) y pasa NOTION_TOKEN directamente al proceso hijo de MCP mediante -e. Tu entorno de shell y tus rcfiles no se modifican: el token vive en el archivo de configuración de Claude Code, limitado a este servidor, y no es visible para otros procesos. Para establecer una página principal predeterminada para create_page, añade -e NOTION_ROOT_PAGE_ID=<page-id> al mismo comando.
OpenClaw:
openclaw config set mcpServers.notion.command "npx"
openclaw config set mcpServers.notion.args '["-y","easy-notion-mcp"]'Luego proporciona el token a través del entorno de shell padre antes de iniciar OpenClaw:
export NOTION_TOKEN=ntn_your_integration_tokenEsta forma de export es el recurso genérico para cualquier cliente MCP que herede el entorno de shell padre. Advertencia: solo persiste durante la sesión de shell actual, a menos que lo añadas a tu rcfile de shell, lo cual tiene sus propias implicaciones de seguridad: prefiere la forma -e anterior cuando uses Claude Code específicamente.
Claude Desktop / Cursor / Windsurf — añádelo a tu archivo de configuración de MCP:
{
"mcpServers": {
"notion": {
"command": "npx",
"args": ["-y", "easy-notion-mcp"],
"env": {
"NOTION_TOKEN": "ntn_your_integration_token"
}
}
}
}Ubicaciones de los archivos de configuración: Claude Desktop → claude_desktop_config.json · Cursor → .cursor/mcp.json · Windsurf → ~/.windsurf/mcp.json
{
"servers": {
"notion": {
"command": "npx",
"args": ["-y", "easy-notion-mcp"],
"env": {
"NOTION_TOKEN": "ntn_your_integration_token"
}
}
}
}Perfiles de CLI para acceso a Notion de bajo contexto
Usa la CLI easy-notion cuando un agente necesite acceso a Notion sin cargar toda la superficie de herramientas de MCP, o cuando quieras integraciones de Notion separadas para distintos modos de permiso. Los perfiles viven en ~/.config/easy-notion-mcp/profiles.json de forma predeterminada y hacen referencia a nombres de variables de entorno, no a tokens sin procesar.
export NOTION_WORK_READONLY=ntn_readonly_token
export NOTION_WORK_WRITE=ntn_readwrite_token
npx -y --package easy-notion-mcp easy-notion profile add work-ro \
--token-env NOTION_WORK_READONLY \
--mode readonly \
--default
npx -y --package easy-notion-mcp easy-notion profile add work-rw \
--token-env NOTION_WORK_WRITE \
--mode readwrite \
--root-page-id your_root_page_idLos comandos de lectura funcionan con perfiles de solo lectura:
npx -y --package easy-notion-mcp easy-notion --profile work-ro search "roadmap" --filter pages
npx -y --package easy-notion-mcp easy-notion --profile work-ro page read PAGE_ID --include-metadata
npx -y --package easy-notion-mcp easy-notion --profile work-ro content search-in-page PAGE_ID --query "launch" --within-toggle "Script"Los comandos de mutación requieren un perfil de lectura/escritura:
npx -y --package easy-notion-mcp easy-notion --profile work-rw content append PAGE_ID --markdown "## Update"
npx -y --package easy-notion-mcp easy-notion --profile work-rw content update-toggle PAGE_ID --title "Script" --markdown-file ./script.md
npx -y --package easy-notion-mcp easy-notion --profile work-rw content archive-toggle PAGE_ID --title "Done"
npx -y --package easy-notion-mcp easy-notion --profile work-rw content restore-toggle ARCHIVED_BLOCK_IDLos comandos destructivos de la CLI admiten --dry-run como una verificación previa de solo lectura. Ejecuta
la misma búsqueda y validación de markdown cuando es posible, devuelve los campos planificados
como would_delete_block_ids, would_update, would_archive o
would_restore, y no muta Notion.
La skill ligera para el enrutamiento de agentes se publica en este repositorio en skills/easy-notion-cli/. Enseña a los agentes a preferir la CLI para el acceso a Notion basado en perfiles en lugar de registrar múltiples servidores MCP.
Con OAuth
Token de API + stdio es la opción predeterminada de menor fricción. Si estás ejecutando un despliegue compartido o quieres acceso por usuario, OAuth gestiona la autenticación sin necesidad de copiar y pegar ningún token.
Inicia el servidor:
npx -p easy-notion-mcp easy-notion-mcp-httpRequiere las variables de entorno NOTION_OAUTH_CLIENT_ID y NOTION_OAUTH_CLIENT_SECRET. Consulta Configuración de OAuth a continuación.
Claude Code:
claude mcp add notion --transport http http://localhost:3333/mcpOpenClaw:
openclaw config set mcpServers.notion.transport "http"
openclaw config set mcpServers.notion.url "http://localhost:3333/mcp"Claude Desktop:
Ve a Configuración → Conectores → Añadir conector personalizado e introduce http://localhost:3333/mcp.
Tu navegador se abrirá en la página de autorización de Notion. Elige las páginas que quieras compartir, haz clic en Permitir y listo.
Si quieres registrar easy-notion-mcp por proyecto en lugar de para todo el usuario, pega lo siguiente en un archivo .mcp.json en la raíz de tu proyecto:
{
"mcpServers": {
"easy-notion-mcp": {
"command": "npx",
"args": ["-y", "easy-notion-mcp"],
"env": {
"NOTION_TOKEN": "ntn_your_integration_token",
"NOTION_ROOT_PAGE_ID": "your_root_page_id"
}
}
}
}Sustituye los valores de marcador de posición por tu token real de integración de Notion y el ID de página raíz (opcional). Ten en cuenta que este archivo debe vivir en tu proyecto, no en este repositorio: Claude Code registrará automáticamente cualquier servidor que encuentre en un .mcp.json de ámbito de proyecto e intentará iniciarlo, por lo que hacer commit de uno con credenciales de marcador de posición provocará "Failed to connect" al abrir el repositorio.
Dify / n8n / FlowiseAI (plataformas basadas en Docker):
Ejecuta el servidor HTTP en tu máquina anfitriona:
export NOTION_MCP_BEARER=$(openssl rand -hex 32)
NOTION_TOKEN=ntn_your_integration_token \
NOTION_MCP_BIND_HOST=0.0.0.0 \
NOTION_MCP_BEARER=$NOTION_MCP_BEARER \
npx -p easy-notion-mcp easy-notion-mcp-httpEn la configuración del servidor MCP de tu plataforma, usa host.docker.internal en lugar de localhost, y añade el bearer a las cabeceras de las solicitudes:
http://host.docker.internal:3333/mcp
Authorization: Bearer <your NOTION_MCP_BEARER value>¿Por qué no localhost? Estas plataformas normalmente se ejecutan en Docker.
localhostdentro de un contenedor se refiere al propio contenedor, no a tu máquina anfitriona.host.docker.internalsalva esa distancia.Host HTTP y bearer: El servidor HTTP se vincula a
127.0.0.1de forma predeterminada y el modo de token estático requiereNOTION_MCP_BEARER.host.docker.internalalcanza la IP de puente del host, así que estableceNOTION_MCP_BIND_HOST=0.0.0.0en el host y envía la cabecera bearer en cada solicitud del cliente. El modo OAuth, que emite bearers por usuario, es la alternativa para despliegues Docker compartidos.
easy-notion-mcp funciona con cualquier cliente compatible con MCP. El servidor se ejecuta mediante stdio (modo token de API) o HTTP (modo OAuth o token de API).
Si tienes preguntas durante la configuración, la comunidad de Discord es un buen lugar para preguntar. El canal #easy-notion-mcp cubre la configuración y el debate de diseño. Los errores van a GitHub issues.
Configuración
Modo stdio (token de API)
Variable | Required | Default | Description |
| Sí | — | Token de integración de la API de Notion |
| No | — | ID de página principal predeterminado |
| No |
| Omitir el aviso de contenido en las respuestas de lectura de markdown ( |
Acerca de los archivos
.env(solo para colaboradores): easy-notion-mcp carga un archivo.envdesde el directorio de trabajo actual mediantedotenv. En la práctica, esto significa que.envsolo "funciona" cuando ejecutas el servidor desde un clon del repositorio (node dist/index.jsdespués denpm install && npm run build), porque la raíz del repositorio es tu directorio de trabajo. No se carga cuando el paquete se invoca mediantenpx easy-notion-mcpo una instalación global desde un directorio arbitrario; ese es el comportamiento estándar de la CLI de npm. Para la ruta denpx, pasaNOTION_TOKENmediante la bandera-een la configuración de Claude Code anterior, o mediante el bloqueenvde la configuración de tu cliente MCP.
Transporte OAuth / HTTP
Ejecuta npx -p easy-notion-mcp easy-notion-mcp-http para iniciar el servidor HTTP con soporte OAuth.
Variable | Requerido | Predeterminado | Descripción |
| Sí (modo OAuth) | — | ID de cliente OAuth de la integración pública de Notion |
| Sí (modo OAuth) | — | Secreto de cliente OAuth de la integración pública de Notion |
| No |
| Puerto del servidor HTTP |
| No |
| URL de devolución de llamada OAuth |
| No |
| Dirección de enlace. El valor predeterminado es loopback; establece |
| Sí (modo de token estático) | — | Bearer de secreto compartido requerido por los clientes en el modo HTTP de token estático. El servidor se niega a iniciarse sin él. No es necesario en el modo OAuth. |
Para obtener credenciales OAuth, crea una integración pública en notion.so/profile/integrations y configura http://localhost:3333/callback como URI de redirección.
En el modo OAuth, create_page funciona sin NOTION_ROOT_PAGE_ID — las páginas se crean en la sección privada del espacio de trabajo del usuario de forma predeterminada.
Postura de seguridad del modo HTTP
El transporte HTTP está diseñado para redes de confianza: autoalojamiento de un solo operador con un secreto bearer, u OAuth para implementaciones compartidas. No está endurecido para la exposición directa a Internet; coloca un proxy inverso con TLS delante si necesitas acceso remoto.
El modo de token estático requiere un bearer. Iniciar npx -p easy-notion-mcp easy-notion-mcp-http con solo NOTION_TOKEN configurado hará que se niegue a iniciarse. Establece un bearer de secreto compartido en el entorno del servidor y luego configura tu cliente MCP para que lo envíe como Authorization: Bearer <secret> en cada solicitud /mcp:
export NOTION_MCP_BEARER=$(openssl rand -hex 32)
NOTION_TOKEN=ntn_your_integration_token npx -p easy-notion-mcp easy-notion-mcp-httpEl bearer se compara con crypto.timingSafeEqual. Los bearers ausentes o incorrectos reciben 401 { "error": "invalid_token" }. Rota el secreto reiniciando el servidor con un valor nuevo.
El enlace predeterminado es loopback. El servidor se enlaza a 127.0.0.1 de forma predeterminada: solo procesos locales. Establece NOTION_MCP_BIND_HOST=0.0.0.0 para exponer todas las interfaces, o una IP específica como 192.168.1.5 para exponer una. El bearer es obligatorio independientemente del enlace.
Bearer-siempre es el límite de confianza. La protección contra el reenlace de DNS no está implementada en el endpoint /mcp, y el CORS en los endpoints de registro/token de OAuth (/register, /token, /revoke) es permisivo. Trata el bearer, o el bearer por usuario de OAuth, como lo único que se interpone entre la red y tu espacio de trabajo de Notion. Mantenlo configurado incluso para implementaciones solo de loopback. Si necesitas exponer este servidor más allá de una red de confianza, colócalo detrás de un proxy inverso que gestione TLS y las comprobaciones de origen.
Modo OAuth para multiusuario / remoto. OAuth tiene su propia aplicación del bearer por usuario; NOTION_MCP_BEARER no es necesario en el modo OAuth. Para implementaciones compartidas, el modelo de identidad por usuario de OAuth es la forma adecuada: token estático + bearer está pensado para el autoalojamiento de un solo operador.
Las subidas file:// son solo stdio. El markdown pasado a create_page, append_content, replace_content, update_section o update_page.cover con URLs file:// se rechaza a través de HTTP. Usa el modo stdio para flujos de trabajo con archivos locales (create_page_from_file también es solo stdio), o aloja el archivo en una URL HTTPS y usa esa URL en el markdown.

¿Por qué markdown primero?
El paquete npm oficial de Notion MCP devuelve JSON crudo de la API: objetos de bloque profundamente anidados con ~120 tokens de metadatos por bloque. Otros servidores convierten a markdown, pero solo admiten un puñado de tipos de bloque, descartando silenciosamente callouts, toggles, tablas, ecuaciones y más.
easy-notion-mcp utiliza markdown GFM estándar que los agentes ya conocen. No hay nada nuevo que aprender, ni sintaxis de etiquetas personalizadas, ni objetos de bloque que construir. El agente escribe markdown, easy-notion-mcp se encarga de la conversión a la API de bloques de Notion — y de vuelta, con 24 tipos de bloque preservados.
Esto significa que los agentes pueden editar contenido existente. Lee una página, obtén markdown de vuelta, modifica la cadena, escríbela de nuevo. El formato y la estructura admitidos se conservan para los tipos de bloque que este servidor representa, y las omisiones y degradaciones conocidas se documentan a continuación. Los agentes editan páginas de Notion de la misma manera que editan código, como texto.
¿Cómo funciona easy-notion-mcp?
Páginas — escribe y lee markdown:
create_page({
title: "Sprint Review",
markdown: "## Decisions\n\n- Ship v2 by Friday\n- [ ] Update deploy scripts\n\n> [!WARNING]\n> Deploy window is Saturday 2–4am only"
})Léelo de vuelta — sale el mismo markdown:
read_page({ page_id: "..." }){ "markdown": "## Decisions\n\n- Ship v2 by Friday\n- [ ] Update deploy scripts\n\n> [!WARNING]\n> Deploy window is Saturday 2–4am only" }Modifica la cadena, llama a replace_content, listo. O apunta a una sola sección por nombre de encabezado con update_section. O haz un find_replace quirúrgico sin tocar el resto de la página. Las páginas también pueden tener iconos emoji e imágenes de portada configurados mediante create_page o update_page.
Bases de datos — escribe pares clave-valor simples:
add_database_entry({
database_id: "...",
properties: { "Status": "Done", "Priority": "High", "Due": "2026-05-15", "Tags": ["v2", "launch"] }
})Sin objetos de tipo de propiedad, sin envoltorios anidados { select: { name: "Done" } }. easy-notion-mcp obtiene el esquema de la base de datos en tiempo de ejecución y convierte automáticamente. Los agentes pasan { "Status": "Done" }, easy-notion-mcp hace el resto.
Los errores te dicen cómo solucionarlos. Un nombre de encabezado incorrecto devuelve los encabezados disponibles. Una página faltante sugiere compartirla con la integración. Un filtro incorrecto te dice que llames a get_database primero. Los agentes pueden autocorregirse sin pedir ayuda al usuario.
El contenido complejo funciona. Los toggles anidados dentro de toggles, las columnas con tipos de contenido mixtos (listas + bloques de código + blockquotes), el anidamiento profundo de listas y el unicode completo (japonés, chino, árabe, emoji) están cubiertos por pruebas de ida y vuelta. La búsqueda de encabezados de update_section no distingue entre mayúsculas y minúsculas y devuelve los encabezados disponibles si no encuentra. add_database_entries maneja fallos parciales, y las entradas exitosas y fallidas se devuelven por separado para que los agentes puedan reintentar solo las fallidas.

¿Qué herramientas proporciona easy-notion-mcp?
easy-notion-mcp incluye 43 herramientas con nombre individual en 7 categorías (42 a través de HTTP, lo que excluye create_page_from_file, que es solo stdio). Las descripciones de las herramientas mantienen el comportamiento crítico para la seguridad en línea y apuntan a recursos MCP para material de referencia más extenso, como la sintaxis de markdown, las formas de advertencia, la paginación de propiedades y ejemplos de update_data_source.
Páginas (20 herramientas)
Herramienta | Descripción |
| Crea una página a partir de markdown |
| Crea una página a partir de un archivo markdown local (solo stdio) |
| Lee una página como markdown |
| Lee una sección por nombre de encabezado |
| Lee un bloque por ID, incluidos los hijos anidados de los contenedores |
| Lee un toggle o un encabezado conmutable por título |
| Busca texto de bloque sin procesar en una página o en un toggle |
| Añade markdown a una página |
| Reemplaza todo el contenido de la página de forma atómica (conserva los IDs de bloque de los bloques coincidentes) |
| Actualiza una sección por nombre de encabezado; reemplazo opcional del cuerpo que conserva el encabezado (destructivo; usa duplicate_page primero para contenido irremplazable) |
| Actualiza el cuerpo de un toggle por título (destructivo; conserva el ID del contenedor del toggle) |
| Archiva un toggle o un encabezado conmutable por título |
| Restaura un toggle o un encabezado conmutable archivado por ID de bloque archivado |
| Busca y reemplaza texto, conservando archivos |
| Actualiza un solo bloque por ID (conserva la identidad del bloque para enlaces profundos y comentarios) |
| Actualiza el título, el icono o la portada |
| Copia una página y su contenido |
| Mueve una página a la papelera |
| Mueve una página a un nuevo padre |
| Restaura una página archivada |
Las herramientas destructivas admiten dry_run: true como comprobación previa. El modo dry-run no sube ni valida las subidas de markdown locales file:// porque eso crearía subidas en Notion; usa URLs HTTPS o ejecuta sin dry-run para archivos locales. El dry-run de replace_content traduce el markdown y devuelve advertencias del traductor, pero no puede mostrar los campos unmatched_blocks o truncated del lado de Notion porque no llama al endpoint de actualización de Notion.
restore_toggle está basado intencionadamente en ID: pasa el ID del bloque archivado devuelto por archive_toggle. Notion no expone la enumeración de hijos archivados para la búsqueda por título ni un flujo de trabajo read_page include_archived, por lo que restaurar por título no está disponible.
Navegación (3 herramientas)
Herramienta | Descripción |
| Lista las páginas hijas bajo un padre, con |
| Busca páginas y bases de datos |
| Obtiene la URL compartible |
Cada fila de list_pages devuelve id, title, created_time y last_edited_time, de modo que un agente puede distinguir las páginas activas de las obsoletas sin una ida y vuelta por página. Las marcas de tiempo provienen directamente de Notion, redondeadas al minuto, y last_edited_time avanza con las ediciones de contenido y propiedades de la página. Ten en cuenta la diferencia deliberada con search, que devuelve last_edited solo como fecha, mientras que list_pages devuelve last_edited_time como una marca de tiempo ISO-8601 completa.
Bases de datos (9 herramientas)
Herramienta | Descripción |
| Crea una base de datos con esquema tipado |
| Actualiza el esquema de la base de datos (añadir, renombrar o eliminar propiedades; cambiar el título; mover a la papelera o restaurar) |
| Obtiene el esquema de la base de datos, los nombres de propiedades y las opciones |
| Lista todas las bases de datos a las que la integración puede acceder |
| Consulta con filtros, ordenaciones o búsqueda de texto |
| Añade una fila usando pares clave-valor simples |
| Añade varias filas en una sola llamada |
| Actualiza una fila usando pares clave-valor simples |
| Elimina (archiva) una entrada de base de datos |
Las herramientas de escritura en bases de datos rechazan nombres de propiedades desconocidos y tipos de propiedades no admitidos con un error claro en lugar de descartarlos silenciosamente. Llama primero a
get_databasepara confirmar los nombres y tipos de propiedades. Tipos de propiedad admitidos para escrituras:title,rich_text,number,select,multi_select,date,checkbox,url,phone,status,relation,people. Parapeople, pasa una cadena de ID de usuario única o un array de IDs de usuario. Los tipos calculados (formula,rollup,unique_id,created_time,last_edited_time,created_by,last_edited_by) los rellena Notion y no se pueden establecer mediante la API. Las escrituras de valores también se rechazan parafiles,verification,place,locationybutton. Para escrituras de relaciones, pasa una cadena de ID de página única ("Projects": "page-id") o un array ("Projects": ["id-a", "id-b"]); un array vacío limpia la relación.
easy-notion-mcp obtiene el esquema de la base de datos, asigna los valores al formato de propiedades de Notion y gestiona la conversión de tipos automáticamente cuando los agentes pasan pares clave-valor simples como { "Status": "Done" }. El esquema se almacena en caché durante 5 minutos para evitar llamadas redundantes a la API durante operaciones por lotes.
Vistas (6 herramientas)
Herramienta | Descripción |
| Lista las vistas guardadas de una base de datos o fuente de datos |
| Obtiene la configuración sin procesar de una vista guardada |
| Consulta entradas a través de una vista guardada |
| Crea una vista de tabla, lista, tablero, calendario, galería o línea de tiempo |
| Renombra o actualiza los campos sin procesar de filtro/ordenación/configuración de una vista guardada |
| Elimina una vista guardada con confirmación explícita |
Comentarios (2 herramientas)
Herramienta | Descripción |
| Lista los comentarios de una página |
| Añade un comentario a una página |
Usuarios (2 herramientas)
Herramienta | Descripción |
| Lista los usuarios del espacio de trabajo |
| Obtiene el usuario bot actual |
Servidor (1 herramienta)
Herramienta | Descripción |
| Informa de la configuración del propio servidor: versión, transporte, raíz del espacio de trabajo y número de herramientas visibles |
get_config es la herramienta a la que recurrir cuando un error de ruta de archivo o de configuración te deja sin pistas. create_page_from_file solo acepta rutas dentro de la raíz del espacio de trabajo y, cuando una ruta queda fuera de ella, el rechazo ahora indica la raíz resuelta. get_config te permite leer esa raíz directamente en lugar de deducirla. En modo HTTP, la raíz del espacio de trabajo no aplica, por lo que los campos de ruta son null y el estado es not_applicable; el servidor nunca informa de rutas del host a los llamadores HTTP.
¿Qué recursos MCP están disponibles?
Los clientes que admiten Recursos MCP pueden leer estos documentos bajo demanda sin cargar todo el material de referencia en cada descripción de herramienta:
URI del recurso | Contenido |
| Sintaxis de markdown admitida para escrituras y lecturas de páginas |
| Códigos de advertencia y formas de respuesta |
| Comportamiento de |
| Modos de payload de |
¿Qué tipos de bloques admite easy-notion-mcp?
easy-notion-mcp admite 24 tipos de bloques de Notion utilizando sintaxis de markdown estándar ampliada con convenciones para bloques específicos de Notion como toggles, columnas y callouts. Los agentes escriben markdown familiar — easy-notion-mcp gestiona la conversión hacia y desde el formato de bloques de Notion.
Markdown estándar
Sintaxis | Markdown |
Encabezados |
|
Negrita, cursiva, tachado |
|
Código en línea |
|
Enlaces |
|
Imágenes |
|
Lista con viñetas |
|
Lista numerada |
|
Lista de tareas |
|
Cita en bloque |
|
Bloque de código |
|
Tabla | Sintaxis estándar de tabla con tuberías |
Divisor |
|
Sintaxis específica de Notion
Bloque | Sintaxis |
Alternancia |
|
Columnas |
|
Llamada (nota) |
|
Llamada (consejo) |
|
Llamada (advertencia) |
|
Llamada (importante) |
|
Llamada (información) |
|
Llamada (éxito) |
|
Llamada (error) |
|
Ecuación |
|
Tabla de contenido |
|
Incrustar |
|
Marcador | URL desnuda en su propia línea |
Subida de archivo (imagen) |
|
Subida de archivo (archivo) |
|
Saltos de línea y collapse_soft_wraps
Por defecto, un solo salto de línea dentro de un párrafo se escribe tal cual. Por lo tanto, el markdown con saltos de línea forzados a una columna fija (la convención en la mayoría de los repositorios) llega a Notion con esos saltos de línea. Ese comportamiento predeterminado no ha cambiado.
Toda herramienta de escritura de markdown acepta un collapse_soft_wraps: true opcional, que aplica en su lugar la semántica de soft-wrap de CommonMark: un solo salto de línea dentro de un párrafo se convierte en un espacio, de modo que un archivo con saltos de línea forzados llega como párrafos fluidos. Las líneas en blanco siguen separando bloques y los bloques de código delimitados no se modifican en ninguno de los dos modos.
easy-notion page create-from-file --title "Design notes" --file ./NOTES.md --collapse-soft-wrapsNo lo uses al volver a subir contenido que hayas leído desde Notion, o se perderán los saltos de línea intencionados.
Los saltos de línea forzados explícitos (una barra invertida final o dos espacios finales) se comportan de forma idéntica se establezca o no la opción, pero difieren según la ruta de escritura:
Ruta de escritura | Comportamiento del salto de línea forzado |
| Se mantiene dentro del bloque |
| La importación de Markdown mejorado de Notion representa un salto de línea dentro de un párrafo como un párrafo separado, por lo que un salto forzado llega como una división de párrafo |
Esa diferencia es una propiedad de la ruta de importación, no de collapse_soft_wraps.
Duplicación del título y del H1 inicial
create_page y create_page_from_file aceptan un strip_leading_h1: true opcional, que elimina el H1 inicial del documento para que un archivo que comienza con el mismo encabezado que pasas como title no ponga ese encabezado dos veces en la página. Solo se aplica cuando el primer bloque de nivel superior convertido es un heading_1 simple (no alternable), y su valor predeterminado es false.
easy-notion page create-from-file --title "Design notes" --file ./NOTES.md --strip-leading-h1create_page, create_page_from_file, append_content, replace_content, update_section y update_toggle aceptan return_block_map: false para omitir block_map cuando no se necesita; el valor predeterminado sigue siendo true y no cambia.
¿Puedo leer y reescribir páginas conservando el formato?
Sí, para las convenciones de markdown que este servidor representa. El soporte de ida y vuelta cubre 24 tipos de bloques. Las omisiones y degradaciones conocidas están documentadas, y muchas se notifican con advertencias explícitas.
read_page devuelve las convenciones de markdown que create_page acepta: encabezados, listas, tablas, destacados, conmutadores, columnas, ecuaciones y menciones de página.
Cuando una página contiene tipos de bloques de Notion que este servidor aún no representa, como synced_block, child_database, child_page o link_to_page, read_page incluye un campo warnings con el código omitted_block_types que enumera los IDs y tipos de bloques omitidos. Escribir ese markdown de vuelta mediante replace_content eliminaría esos bloques, por lo que la advertencia permite a los agentes evitar reescrituras inseguras. Para una mención de página en línea, use @[Title](notion-url), que es una construcción separada del tipo de bloque link_to_page.
Los bloques de notas de reuniones de Notion AI (y la obsoleta transcription) se representan como un conmutador sintético que contiene el título, una marca de tiempo de grabación opcional y secciones ## Summary / ## Notes; las transcripciones se incluyen solo con read_page include_transcript: true. Estas lecturas renderizadas emiten una advertencia read_only_block_rendered para señalar que escribir el markdown de vuelta reemplaza el bloque de reunión nativo con bloques ordinarios.
Algunas degradaciones no se notifican con una advertencia. En la ruta de replace_content, los marcadores y las incrustaciones se escriben como URL simples (estas sí advierten), mientras que los bloques file, audio y video se reducen a sus URL silenciosamente. Las anotaciones de subrayado y texto de color no se representan en markdown y se eliminan silenciosamente al leer y al escribir.
easy-notion-mcp permite a los agentes leer una página, modificar la cadena de markdown y escribirla de nuevo conservando el formato, la estructura y el contenido admitidos. Sin traducción de formato. Sin reconstrucción de bloques. Los agentes editan páginas de Notion de la misma manera que editan código, como texto.
¿Cuál es la diferencia entre find_replace y replace_content?
easy-notion-mcp ofrece tres estrategias de edición para diferentes casos de uso:
replace_content— Reemplaza todo el contenido de una página con nuevo markdown. Ideal para reescrituras completas.update_section— Reemplaza una sola sección identificada por el nombre del encabezado. Por defecto, el markdown de reemplazo incluye el encabezado y reemplaza la sección completa. Pasepreserve_heading: true(o CLI--preserve-heading) para mantener el ID del bloque de encabezado existente, el texto, el tipo, los comentarios y el estado conmutable, mientras reemplaza destructivamente solo el cuerpo de la sección.find_replace— Busca y reemplaza texto específico en cualquier parte de la página, conservando todo el demás contenido y los archivos adjuntos. Ideal para ediciones quirúrgicas.
Pase dry_run: true en las herramientas MCP, o --dry-run en la CLI, antes de ediciones destructivas cuando desee una respuesta de verificación previa en lugar de una mutación.
¿Cómo maneja easy-notion-mcp las bases de datos?
easy-notion-mcp proporciona 9 herramientas de base de datos que abstraen el complejo formato de propiedades de Notion. Los agentes pasan pares clave-valor simples como { "Status": "Done", "Priority": "High" }; easy-notion-mcp obtiene el esquema de la base de datos en tiempo de ejecución, lo almacena en caché durante 5 minutos y lo convierte automáticamente al formato de propiedades de Notion.
easy-notion-mcp admite crear y actualizar bases de datos con esquemas tipados, consultar con filtros y ordenamientos, y operaciones masivas mediante add_database_entries (múltiples filas en una sola llamada).
Recetario: recetas para tu propio agente
Estas recetas apuntan a tu propio agente hacia Notion. El agente posee la inteligencia; easy-notion-mcp proporciona tejido conectivo determinista a través de las herramientas MCP existentes, por lo que las recetas se ejecutan bajo demanda sin una segunda instalación. Son gratuitas y soberanas: tu propio agente, tu propio token, configuración de token de API sin OAuth y consultas de base de datos en el plan gratuito.
Estos pasos funcionan a través de las herramientas MCP o del conector claude.ai cuando las herramientas equivalentes están habilitadas. La Receta 2 también funciona a través de la habilidad CLI easy-notion en skills/easy-notion-cli/; la Receta 1 necesita create_database, búsqueda de bloques fuente con search_in_page y un filtro estructurado de deduplicación, y la superficie CLI actual no expone ese flujo completo. Los agentes de Claude Code pueden usar la habilidad operativa en skills/notion-recipes/.
Receta 1: notas de reunión a elementos de acción
Esta receta convierte una página de notas de reunión o notas pegadas en filas deduplicadas en una base de datos de Elementos de Acción. La secuencia de herramientas es create_database una vez, luego por ejecución read_page cuando la fuente es una página, search_in_page para resolver el ID de bloque fuente de cada elemento, query_database con un filtro exacto de Item Key para cada elemento candidato, add_database_entry o add_database_entries para nuevas filas, y una verificación final con query_database.
El resultado real probado fue de 5 filas de una reunión de planificación. Los propietarios y fechas de vencimiento faltantes se almacenaron en la selección múltiple Flags, no en Source, y un filtro de query_database de {"property":"Item Key","rich_text":{"equals":"38bbe876-242f-81f1-97b7-df935d050a24:38bbe876-242f-81c9-86c6-d9a792fc70b7"}} devolvió exactamente 1 fila. Ejecutar dos veces sobre las mismas notas dejó el recuento en 5 con cero duplicados. Una búsqueda de texto libre para el nombre de reunión compartido devolvió todas las filas porque también escaneó Source, por lo que esta receta usa el filtro exacto de Item Key para la deduplicación.
Límite de seguridad: la Receta 1 es segura de re-ejecutar e idempotente porque Item Key almacena la identidad estable de Notion de la línea fuente (<pageId>:<blockId>), no el texto de la acción.
Copiar y pegar para usuarios del conector claude.ai, Receta 1
Use the enabled easy-notion or Notion connector tools to turn my meeting notes into an Action Items database.
Note: the simple {"Property":"Value"} write format below assumes the easy-notion tools. If only the official Notion connector is enabled, wrap each value in its Notion property-type object instead.
Inputs I will provide:
- Meeting notes page or pasted meeting notes: <MEETING_NOTES_PAGE_OR_TEXT>
- Parent page for the database, if a new database is needed: <PARENT_PAGE>
- Existing Action Items database, if one already exists: <DATABASE_NAME_OR_ID>
If an Action Items database does not already exist, create one with these properties:
- Name: title
- Item Key: rich_text
- Owner: rich_text
- Due: date
- Status: status
- Flags: multi_select
- Source: rich_text
Read the meeting notes or use the pasted notes. Extract only discrete action items. For each item, derive:
- Name: the action text
- Owner: the named assignee, or blank
- Due: the stated date as ISO YYYY-MM-DD, or blank
- Item Key: the source line's stable identity, formatted as <sourcePageId>:<sourceBlockId>
- Source: the meeting title plus date, with no flags stashed here
- Status: Not started
- Flags: add needs-owner if no owner, and needs-due if no due date
Resolve sourceBlockId with search_in_page. read_page returns markdown without block IDs. For a Notion-page source, call read_page to extract items, then for each item call search_in_page with a verbatim, distinctive substring of that item's original source line. Use the matches[].block_id whose text is that source line. If several blocks match, use a longer verbatim substring to isolate one block. For pasted notes, first save them as a Notion page with create_page, then proceed through search_in_page. Do not rely on block IDs from create_page, which returns only {id,title,url}. If one source line contains multiple distinct actions, append a stable ordinal suffix in source order, such as :1 or :2, to keep keys unique.
Before inserting each item, dedupe with an exact Item Key filter:
{"property":"Item Key","rich_text":{"equals":"<that item's key>"}}
If the query returns no results, insert the row with simple key-value properties. If it returns a result, skip that item. Do not dedupe with free-text database search, because text search also scans Source and can false-match every row from the same meeting.
After inserting, query the database and summarize the rows created and skipped.
Re-running is safe and idempotent because the exact Item Key filter uses the source line's stable Notion identity, not the action wording.Receta 2: edición masiva, buscar y reemplazar, y reparación
Esta receta cubre dos superficies donde un agente puede iterar más allá de los límites nativos de Notion: reparación de propiedades de base de datos y buscar y reemplazar en el cuerpo de la página. Para la reparación de base de datos, la secuencia es get_database, query_database a través de todas las filas, construir un mapa de normalización, update_database_entry para las filas que necesitan correcciones, y luego volver a consultar. Para el texto de la página, la secuencia es find_replace con dry_run: true, find_replace con replace_all: true, y luego read_page para verificar.
La reparación real probada de base de datos normalizó 4 filas con valores mixtos Eng y engineering a una opción consistente, dejando las filas no relacionadas sin cambios. La edición real probada de página reemplazó 4 ocurrencias en párrafos y un cuerpo de encabezado. Advertencia: la coincidencia de opciones de selección y estado no distingue entre mayúsculas y minúsculas, y las escrituras se ajustan a la capitalización de la opción existente más antigua. Si ya existe una variante en minúsculas, escribir una versión capitalizada reutiliza la opción en minúsculas existente. Para forzar una capitalización específica, renombre la opción en la interfaz de Notion en lugar de escribir la nueva capitalización.
Copiar y pegar para usuarios del conector claude.ai, Receta 2
Use the enabled easy-notion or Notion connector tools to repair Notion database rows or replace repeated text in a Notion page.
Note: the simple {"Property":"Value"} write format below assumes the easy-notion tools. If only the official Notion connector is enabled, wrap each value in its Notion property-type object instead.
Inputs I will provide:
- Target database for property repair: <DATABASE_NAME_OR_ID>
- Property to normalize: <PROPERTY_NAME>
- Normalization map, for example {"Eng":"Engineering","engineering":"Engineering"}
- Target page for find-replace, if needed: <PAGE_NAME_OR_ID>
- Find text and replacement text, if needed: <FIND_TEXT> -> <REPLACE_TEXT>
For database property repair:
1. Get the database schema so you know the exact property names. If select or status options are missing from the schema, query live rows and read the current values from the results.
2. Query the database rows. If the database is large, page through all results in a loop.
3. Build or use the normalization map I provide.
4. For each row whose property value needs fixing, update that row with a simple key-value map such as {"<PROPERTY_NAME>":"<CANONICAL_VALUE>"}.
5. Re-query the database and summarize how many rows changed and which values remain.
Important caveat: select and status option matching is case-insensitive, and writes snap to the earliest-existing option's casing. If a lowercase variant already exists, writing a capitalized version may reuse the lowercase option. To force specific casing, I need to rename the option in Notion's UI.
For page-body find-replace:
1. Run a dry-run find-replace with replace_all enabled and report the match count before changing anything.
2. If the match count is expected, run find-replace with replace_all enabled.
3. Read the page afterward and verify the replacement.¿Qué pasa con la seguridad y la inyección de prompts?
easy-notion-mcp incluye dos capas de seguridad para implementaciones en producción:
Endurecimiento contra inyección de prompts: Las respuestas de lectura en markdown (read_page, read_section, read_block y read_toggle) incluyen un prefijo de aviso de contenido que instruye al agente a tratar los datos de Notion como contenido, no como instrucciones. search_in_page devuelve fragmentos/texto sin procesar que deben tratarse de la misma manera. Esto reduce el riesgo de que el contenido de la página dirija el comportamiento del agente; el comportamiento final depende del modelo y del cliente. Establezca NOTION_TRUST_CONTENT=true para deshabilitar el aviso de markdown si usted controla el espacio de trabajo.
Saneamiento de URL: javascript:, data: y otros protocolos de URL inseguros se eliminan y se representan como texto plano. Solo se permiten http:, https: y mailto:.

Estabilidad y versionado
easy-notion-mcp sigue Versionado Semántico. A partir de 1.0.0, el contrato público está congelado solo aditivo: los nombres de herramientas, los esquemas de entrada de herramientas, las formas de retorno de herramientas, las convenciones de markdown personalizadas y el vocabulario de códigos de advertencia no cambiarán de manera incompatible hasta una futura versión 2.0. Los cambios aditivos (nuevas herramientas, nuevos parámetros opcionales, nuevos campos de respuesta opcionales, nuevos códigos de advertencia) no son incompatibles y pueden incluirse en versiones menores.
Dos superficies están fuera de esta congelación: el contrato de autenticación OAuth / HTTP es experimental y puede cambiar mientras su postura de seguridad madura, y la CLI easy-notion es pre-1.0 y aún no está cubierta. Consulte el CHANGELOG para la declaración completa del contrato y el historial por versión.
Preguntas frecuentes
¿En qué se diferencia easy-notion-mcp del servidor MCP oficial de Notion?
El paquete npm oficial de Notion MCP (@notionhq/notion-mcp-server) es un proxy de API sin procesar que devuelve JSON de Notion sin modificar, por lo que leer una página cuesta aproximadamente 6–7× más tokens de respuesta que el markdown de easy-notion-mcp. easy-notion-mcp convierte todo a markdown GFM estándar que los agentes ya conocen, admite 24 tipos de bloques con advertencias documentadas de ida y vuelta, e incluye endurecimiento contra inyección de prompts. Notion también ofrece un servidor MCP remoto alojado separado (basado en OAuth) que utiliza un formato de markdown personalizado basado en etiquetas HTML, mientras que easy-notion-mcp utiliza sintaxis de markdown estándar.
¿Con qué clientes MCP funciona easy-notion-mcp?
easy-notion-mcp funciona con cualquier cliente compatible con MCP, incluidos Claude Desktop, Claude Code, Cursor, VS Code Copilot, Windsurf y OpenClaw. Admite tanto transporte stdio (token de API) como transporte HTTP (OAuth). Consulte las instrucciones de configuración para obtener configuraciones copiables para cada cliente.
¿Admite easy-notion-mcp la carga de archivos?
Sí. easy-notion-mcp admite la carga de archivos usando el protocolo file:/// en sintaxis de markdown. Suba imágenes con  y archivos con [name](file:///path/to/file.pdf).
¿Maneja easy-notion-mcp contenido anidado y complejo?
Sí. Los conmutadores anidados dentro de conmutadores, columnas con tipos de contenido mixtos (listas, citas en bloque y bloques de código en diferentes columnas), listas anidadas con viñetas y numeradas, y soporte completo de unicode, incluidos japonés, chino, ruso, árabe y emoji, están cubiertos por pruebas de ida y vuelta para estas formas admitidas.
¿Maneja easy-notion-mcp fallos parciales en operaciones por lotes?
Sí. add_database_entries devuelve matrices separadas succeeded y failed. Si una entrada falla la validación, las demás aún se crean. Los agentes pueden reintentar solo los fallos sin reenviar todo el lote.
Comunidad
Hay un Discord comunitario en discord.gg/S8cghJSVBU. El canal #easy-notion-mcp cubre preguntas de configuración y discusión de diseño, y el resto del servidor está abierto para mostrar y contar o conversación general. Para errores y solicitudes de funciones concretas, GitHub issues sigue siendo el canal canónico.
Contribuciones
Se aceptan issues y PRs en GitHub.
Licencia
MIT
Available Tools
43 toolsadd_commentA
Add a comment to a page. Supports inline markdown and page mentions with @Title. Unlike append_content, a mention the integration cannot resolve is not downgraded to a plain link and returns no warning, so the call can fail. Returns { id, content }.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Comment text (supports markdown inline formatting) | |
| page_id | Yes | Page ID | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when posting hard-wrapped prose. Do not use when re-posting content read from Notion, or intentional line breaks will be lost. Blank lines are unaffected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses that unresolved mentions cause the call to fail, that no warning is returned, and that the response shape is { id, content }. This is meaningful transparency beyond the schema, though it does not address permissions or other side effects.
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?
Three sentences, no filler. The primary action comes first, the important failure caveat is second, and the return shape is last. Every sentence earns its place and the description remains compact.
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 comment-creation tool with no output schema and no annotations, the description covers the essential operational details: what the tool does, the expected return shape, and a critical failure mode. It is not exhaustive, but it is complete enough for an agent to invoke the tool correctly in most cases.
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 adds value beyond the schema by spelling out the mention syntax @[Title](notion-url) and clarifying that this syntax is supported in inline comment text. This supplements the schema's simpler 'supports markdown inline formatting.'
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 clear verb and resource: 'Add a comment to a page.' It also differentiates itself from append_content by explaining a key mention-resolution difference, so an agent can distinguish this tool from a closely related sibling without inspecting schemas.
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 makes the primary use case clear—add a comment to a page—and provides a meaningful comparison to append_content regarding unresolved mentions. It does not enumerate all alternatives or edge cases, but the context is sufficient for an agent to choose this tool over sibling comment-related operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_database_entriesA
Create multiple entries in a database in one call. Each entry uses the same simple key-value format as add_database_entry. Returns per-entry results — partial failures don't block the batch.
| Name | Required | Description | Default |
|---|---|---|---|
| entries | Yes | Array of property objects, same format as add_database_entry | |
| page_id | No | Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error. | |
| database_id | No | Database ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It meaningfully reveals per-entry results and that partial failures don't block the batch, which is important batch behavior. It doesn't address permissions or failure details of the whole call, but for a create operation this is reasonable coverage.
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?
Three short sentences with no filler. The core purpose is front-loaded, and each sentence adds useful information: batch creation, format reference, and failure behavior.
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 description is adequate for a moderately simple batch-create tool. It covers the operation, the entry format, and the key behavioral nuance of partial failures. Minor gaps such as response shape details and any batch size limits are acceptable given the succinctness.
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 three parameters are documented. The description mostly restates what the entries parameter already says about using the same format as add_database_entry, adding little new parameter-level 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 states a specific verb and resource: 'Create multiple entries in a database in one call.' It also clearly differentiates this from the singular sibling add_database_entry by emphasizing the batch nature.
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 batch context is clear: use this when creating multiple database entries at once. It does not explicitly state exclusions or name alternatives as a routing rule, but the intent is obvious enough for an agent to choose between this and the singular sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_database_entryA
Create one database entry using simple key-value property inputs. Call get_database first to see available property names and valid select/status options.
Writable property values use simple inputs:
title, rich_text: string
number: number
select, status: option name string
multi_select: array of option name strings
date: ISO date string (start only)
checkbox: boolean
url, email, phone: string
relation: string or array of page IDs
people: string or array of user IDs
Not writable from this tool:
formula, rollup, unique_id, created_time, last_edited_time, created_by, last_edited_by: computed by Notion
files, verification, place, location, button: not supported for value writes here
Example: { "Name": "Buy groceries", "Status": "Todo", "Priority": "High", "Due": "2025-03-20", "Tags": ["Personal"] }.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | No | Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error. | |
| properties | Yes | Key-value property map to convert using the database schema | |
| database_id | No | Database ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses writable property types, notes date is start-only, and lists computed or unsupported properties that cannot be written. It doesn't discuss response format, failures, or permissions, but still provides substantial behavioral clarity.
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?
The description is structured well: purpose, prerequisite, type mappings, exclusions, and example. It is longer than average, but the density of actionable information justifies the length and it remains scannable.
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 create operation with no output schema or annotations, the description provides preconditions, accepted value shapes, and unsupported properties needed to invoke it correctly. It doesn't describe response format or error behavior, but those are less critical for a straightforward creation call.
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?
Even though schema coverage is 100%, the description adds significant meaning beyond the schema by mapping each Notion property type to concrete JSON input shapes and giving an example object. It also clarifies unsupported property categories, greatly enriching the vague 'properties' parameter description.
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 'Create one database entry using simple key-value property inputs,' naming a specific verb and resource. The singular 'one' differentiates it from siblings like add_database_entries and update_database_entry.
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 explicitly directs agents to 'Call get_database first' to discover valid property names and select/status options, giving a clear prerequisite. It doesn't explicitly name alternative tools or when-not-to-use conditions, but the single-entry scope and property guidance make intended usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
append_contentA
Append markdown content to an existing page. The server converts markdown into native Notion blocks, not flat/plain text. The server automatically handles Notion API limits: batches more than 100 child blocks, splits rich text over 2000 characters, and writes deeply nested blocks in additional passes, so callers can append large documents in one call with no need to pre-chunk or pre-split. Supports the same syntax as create_page; read resource easy-notion://docs/markdown for the full syntax guide. Page mentions: @Title; a mention the integration cannot resolve is downgraded to a plain link and reported with a mention_target_unresolved warning. Returns: { success: true, blocks_added: }, plus block_map for top-level appended blocks when present and warnings when present.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | Page ID | |
| markdown | Yes | Markdown to append | |
| return_block_map | No | Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for disclosing behavior, and it does so thoroughly: it explains server-side batching, rich text splitting, nested block handling, mention resolution fallback with a warning, and the exact return shape. This far exceeds typical MCP descriptions and leaves little hidden behavior.
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?
The description is long but every sentence earns its place: purpose, conversion semantics, rate-limit handling, syntax compatibility, mention behavior, and return payload. It is front-loaded with the core purpose and contains no filler or redundant restatement of the tool name.
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?
Given there is no output schema and no annotations, the description is remarkably complete—it covers behavior, limitations, error/warning conditions, return values, and even references a syntax guide for advanced usage. The only minor omission is explicitly stating insertion position, but 'append' already conveys that clearly.
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 the baseline is 3. The description adds meaningful context beyond the schema by explaining the markdown conversion behavior, pointing to the full markdown syntax guide, and detailing mention fallback behavior for the markdown parameter. This materially improves parameter understanding.
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 states a specific verb ('append'), a specific resource ('markdown content to an existing page'), and the semantics ('converts markdown into native Notion blocks'). It differentiates from sibling tools like create_page and replace_content by framing the action as additive to an existing page.
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 clearly indicates this tool is for appending to existing pages and explicitly notes that large documents can be sent in one call without pre-chunking, which guides when it is appropriate. It does not explicitly contrast with replace_content or create_page in a when-to-use/when-not-to-use list, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_pageC
Archive a page in Notion.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Preview the archive target without mutating Notion. Default false. | |
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description does not disclose behavioral traits beyond the minimal verb. No annotations are present, so the description must cover behaviors like reversibility or side effects, but it fails to do so. The presence of the 'dry_run' parameter implies mutability, but this is not explained.
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?
The description is a single sentence, concise and to the point. It could be improved by adding structured details, but it wastes no words.
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 description is minimal and does not address the tool's behavior in context. With sibling tools like 'archive_toggle', 'restore_page', and 'delete_*' operations, more context is needed to differentiate. The 'dry_run' parameter and return values are not described.
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 input schema has 100% coverage with descriptions for both parameters. The tool description adds no additional meaning beyond the schema, so it meets the baseline of 3 without adding value.
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 clearly states the action (archive) and resource (page) within Notion. It is specific enough to distinguish from sibling tools like 'archive_toggle' by resource variation, but lacks further detail on what archiving entails.
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 is provided on when to use this tool versus alternatives. There is no mention of prerequisites, non-archiving cases, or references to related tools like 'restore_page' or 'delete_database_entry'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_toggleA
Archive one toggle by title from a page. Searches recursively and matches plain toggle blocks plus toggleable heading_1, heading_2, and heading_3 blocks using case-insensitive trimmed text. Archives the matched container block; children are not deleted individually. Missing titles return the available toggle titles.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Toggle title to find (case-insensitive) | |
| dry_run | No | Preview the archive target without mutating Notion. Default false. | |
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description bears full burden. Discloses recursive search, case-insensitive matching, archiving of container only (children not deleted), and behavior on missing title (returns available titles). Covers key behaviors but could mention if action is reversible.
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 sentences, no fluff, front-loaded with main purpose. Each sentence adds distinct value: verb, search specifics, archiving behavior, edge case.
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 matching logic, archival behavior, and missing title edge case. No output schema, so return value on success is not specified, but overall complete for a simple tool. Could mention permissions or reversibility.
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% with descriptions for all params. Description adds minimal extra meaning (e.g., 'case-insensitive trimmed text' reinforces title param, but overall adds little beyond schema). 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?
Description clearly states verb 'archive', resource 'one toggle by title from a page', and specifies matching logic including toggle blocks and headings. Distinguishes from siblings like restore_toggle and read_toggle.
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?
Implied usage for archiving a single toggle by title, but no explicit when-to-use vs alternatives (e.g., archive_page) or when-not-to-use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_databaseA
Create a database under a parent page.
Supported property types and extras:
title
rich_text (alias: text)
number (optional: format, for example "dollar", "percent", "number_with_commas")
select, multi_select, status (optional: options array of strings or {name, color, description})
date, checkbox, url, email, phone
formula (required: expression, for example "prop("Count") * 2")
rollup (required: function, relation_property, rollup_property)
relation (required: data_source_id; optional: relation_type "single_property" or "dual_property", synced_property_name)
unique_id (optional: prefix, for example "ENG")
people, files
created_time, last_edited_time, created_by, last_edited_by
verification, place, location, button
Unknown property types fail with an explicit error. No silent drops.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Database title | |
| schema | Yes | Array of {name, type} property definitions | |
| is_inline | No | Create the database inline within the parent page | |
| parent_page_id | Yes | Parent page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral burden. It explicitly states that unknown property types 'fail with an explicit error. No silent drops,' which is critical for safe tool invocation. It also lists supported types and optional extras, ensuring the agent knows exactly what will happen.
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?
The description is well-structured with a clear opening sentence followed by a bulleted list of property types. It is informative without being verbose, though it could be slightly more concise by omitting redundant wording (e.g., 'optional' repeated). Still, it earns its length.
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?
Given no output schema and no annotations, the description is remarkably complete. It covers the core action, property type options, error handling, and even provides usage examples for extras. The agent has sufficient context to use the tool 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?
The input schema has 100% coverage for parameters, so the baseline is 3. The description adds significant value to the 'schema' parameter by detailing supported property types, aliases, and extras (e.g., format for number, options for select). This exceeds the schema's basic array definition.
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 clearly states the exact action: 'Create a database under a parent page.' It lists supported property types, which distinguishes it from sibling tools like create_page or add_database_entry. The verb+resource is specific and 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?
The description provides clear context for when to use this tool (to create a database with specific property types). It does not explicitly mention when not to use it or provide alternatives, but the extensive type list implies applicability. A brief note about alternatives (e.g., use add_database_entry for adding entries) would improve it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_pageA
Create a Notion page from markdown as native Notion blocks. Server handles 100-block batching, 2000-char splitting, and deep nesting, so no pre-chunking. Supports stdio-only file:// uploads. Syntax: easy-notion://docs/markdown. Mentions: @Title. Returns { id, title, url, success: true }, note for workspace-parent pages, plus block_map for top-level created blocks when present.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | Optional emoji icon | |
| cover | No | Optional cover image URL | |
| title | Yes | Page title | |
| markdown | Yes | Markdown content for the page body | |
| parent_page_id | No | Parent page ID. Resolution order when omitted: NOTION_ROOT_PAGE_ID env var → last used parent in this session → workspace-level private page (OAuth mode). In stdio mode without NOTION_ROOT_PAGE_ID, this is required on first use. | |
| return_block_map | No | Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks. | |
| strip_leading_h1 | No | Remove the document's leading H1 heading. Applies only when the first converted top-level block is a plain (non-toggleable) heading_1. Useful when title is also passed and the file begins with the same heading. Default false. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does it well: it discloses server-side batching/splitting/nesting behavior, the stdio-only file:// upload constraint, and the return shape including block_map. It could add failure modes or permission requirements, but the major behavioral traits are transparent.
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?
The description is dense but free of filler. Every sentence adds operational value: purpose, server-side handling, upload constraints, syntax, and return format are all covered without 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?
For a write tool with no output schema, the description adequately covers the return object, batching behavior, and syntax rules, with parameter resolution delegated to the rich input schema. The main gaps are error/failure semantics and explicit routing guidance relative to sibling 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 the baseline is 3, but the description adds meaningful parameter-level context by defining the markdown syntax extensions (easy-notion://docs/markdown and @[Title](notion-url)) and clarifying when block_map is relevant. This goes beyond the schema's generic 'Markdown content' description.
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 is highly specific: 'Create a Notion page from markdown as native Notion blocks' names the verb, resource, input format, and conversion behavior. It also semantically separates itself from the sibling create_page_from_file by emphasizing in-memory markdown rather than file input.
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 clear operational context: the server handles batching, splitting, and nesting, so the agent should not pre-chunk input. It also documents supported syntax for uploads and mentions. It stops short of explicitly naming alternative tools or saying when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_page_from_fileA
Create a Notion page from a local markdown file. The server reads and validates the file, then creates the same result as create_page without sending file contents through the agent context. The server converts the markdown to native Notion blocks (not flat text) and automatically handles Notion's limits (100-block batching, 2000-char splitting, deep nesting), so large files need no pre-chunking.
STDIO MODE ONLY. This tool is not available when the server runs over HTTP, because in HTTP mode the server's filesystem belongs to the server host, not the caller.
Restrictions:
file_path must be an ABSOLUTE path (no relative paths, no ~ expansion)
File must be inside the configured workspace root (defaults to the server's process.cwd(); override via the NOTION_MCP_WORKSPACE_ROOT env var)
File extension must be .md or .markdown
File size must be ≤ 1 MB (1,048,576 bytes)
File must be valid UTF-8
Symlinks are resolved and the resolved path must still be inside the workspace root
For supported markdown syntax, read resource easy-notion://docs/markdown. Page mentions: @Title. Returns: { id, title, url, success: true }, plus note only when created as a private workspace page, plus block_map for top-level created blocks when present.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Page title | |
| file_path | Yes | Absolute path to a local .md or .markdown file (≤ 1 MB, UTF-8, inside the configured workspace root) | |
| parent_page_id | No | Parent page ID. Same resolution rules as create_page. | |
| return_block_map | No | Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks. | |
| strip_leading_h1 | No | Remove the document's leading H1 heading. Applies only when the first converted top-level block is a plain (non-toggleable) heading_1. Useful when title is also passed and the file begins with the same heading. Default false. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral burden. It discloses file validation, automatic 100-block batching, 2000-char splitting, deep-nesting handling, symlink resolution, workspace-root enforcement, and the exact return shape. This is unusually transparent for a tool definition.
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?
The description is long but every sentence earns its place. It front-loads the core purpose, then logically groups mode restrictions, file constraints, markdown reference, and return value. The bulleted restriction list improves scannability without wordiness.
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 complex tool with no output schema and no annotations, this description is remarkably complete: it covers prerequisites, environmental constraints, file validation rules, conversion behavior, return values, and edge-case options. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds significant meaning beyond the schema: absolute-path requirements, workspace-root default and override, symlink resolution, file-size and encoding limits, and detailed behavior for collapse_soft_wraps with usage recommendations. The parameter descriptions are materially enhanced.
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 states a specific verb-resource pair ('Create a Notion page from a local markdown file') and explicitly distinguishes itself from create_page by noting it produces the same result without sending file contents through the agent context. This makes its purpose unmistakable even among many sibling tools.
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 context is explicit: it is STDIO mode only, unavailable over HTTP, and appropriate when file contents should not pass through agent context. It also names create_page as the equivalent alternative and provides concrete do/don't guidance for collapse_soft_wraps, plus a resource for supported markdown syntax.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_viewA
Create a Notion database view. Pass database_id. Dashboard views and dashboard widget placement are not supported.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | View name | |
| type | Yes | View type. Dashboard is intentionally unsupported. | |
| sorts | No | Raw Notion view sorts payload | |
| filter | No | Raw Notion view filter payload | |
| position | No | Raw Notion view tab position payload | |
| database_id | Yes | Database ID | |
| configuration | No | Raw Notion view configuration payload. Dashboard configuration is rejected. | |
| quick_filters | No | Raw Notion quick filters payload |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It notes unsupported types but fails to mention side effects, return values, or error scenarios. The minimal detail is adequate for a simple create operation but lacks depth for complex configurations.
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 concise sentences deliver all necessary purpose and usage notes without extraneous content. The front-loading of the core function is effective.
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?
Given 8 parameters, no output schema, and no annotations, the description is incomplete for a fully autonomous agent. While it covers the basic requirement and a key limitation, it lacks details on success behavior, error handling, and nested object structures.
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 the schema already documents all parameters. The description adds only a brief instruction to pass database_id and reiterates the dashboard exclusion seen in the schema, providing marginal added value.
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 clearly states 'Create a Notion database view,' specifying the verb and resource. It also distinguishes itself from sibling tools like delete_view and update_view by mentioning unsupported dashboard views, which helps avoid misuse.
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 instructs to 'Pass database_id,' indicating a prerequisite, and explicitly states 'Dashboard views and dashboard widget placement are not supported,' providing clear exclusion criteria. However, it does not compare with alternatives like update_view or query_view.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_database_entryB
Delete (archive) a database entry.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Preview the entry archive/delete target without mutating Notion. Default false. | |
| page_id | Yes | Database entry page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description only states the action with no behavioral details like reversibility, side effects, or permissions; the dry_run parameter is not referenced, leaving the agent uninformed about preview capability.
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?
Single sentence is concise and front-loaded with verb and object, but it could be more structured to include behavior or guidelines; still effective.
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 description is insufficient for a deletion/archival tool; it lacks disclosure of destructive nature, reversibility, or the dry_run parameter's purpose; sibling tools like archive_page may overlap but are not differentiated.
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 provides full descriptions for both parameters (page_id string, dry_run boolean for preview), so description adds no additional value but also doesn't detract; baseline of 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?
The description uses specific verb 'delete' with parenthetical 'archive' to clarify the action on a 'database entry', which distinguishes it from sibling tools like archive_page or update_database_entry.
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 usage context is provided; the description does not differentiate when to use delete vs archive vs other database entry modifications.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_viewA
Delete a Notion database view. Destructive: confirm must be exactly true.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be exactly true to delete the view unless dry_run is true | |
| dry_run | No | Preview the delete target without mutating Notion. Default false. | |
| view_id | Yes | View ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It notes the tool is destructive and requires confirmation, but does not elaborate on side effects, permissions, or reversibility. The schema adds some transparency via confirm and dry_run, but the description itself is minimal.
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?
The description is very concise with two sentences, front-loading the purpose. No unnecessary words, making it easy for an agent to quickly grasp the tool.
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?
Given the three-parameter schema with thorough descriptions and no output schema, the description is adequate but lacks broader context such as when to prefer this tool over siblings, required permissions, or typical use cases. It meets minimum completeness but has gaps.
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%, providing clear purpose for each parameter. The description adds no additional meaning beyond the schema, so baseline score of 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?
The description clearly states the verb 'Delete' and the resource 'Notion database view', making the purpose unambiguous. It distinguishes from siblings like delete_database_entry by specifying the resource type.
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 mentions that the tool is destructive and requires confirm to be true, providing a condition for safe use. However, it does not explicitly state when to use this tool over alternatives or provide exclusions, leaving some ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicate_pageA
Duplicate a page. Reads all blocks from the source and creates a new page with the same content that this server can represent. If the source contains block types this server does not yet support (e.g. child_page subpages, synced_block, child_database, link_to_page), those are omitted from the duplicate AND listed in a warnings field with code omitted_block_types. Notion AI meeting notes are duplicated as ordinary toggle/heading/paragraph blocks (summary and notes only — transcripts are not duplicated); a read_only_block_rendered warning is emitted to identify meeting-notes blocks whose native identity was not preserved across the duplicate. Deep-duplication of subpages is not yet supported.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Title for the new page. Defaults to source title + ' (Copy)' | |
| page_id | Yes | Source page ID to duplicate | |
| parent_page_id | No | Parent page ID for the new page. Falls back to source page's parent, then follows the same resolution as create_page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behaviors: reads all blocks, omits unsupported types with warnings, handles AI meeting notes (converts to ordinary blocks), and notes that deep-duplication is not supported. This provides comprehensive transparency.
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?
The description is detailed but not overly verbose; it front-loads the main purpose and uses examples for clarity. It could be slightly more concise, but the structure is logical and informative.
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?
Given no output schema or annotations, the description fully addresses the tool's complexity: it covers behavior, warnings, limitations, and edge cases (AI meeting notes, subpages). The agent has sufficient information to invoke the tool 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% with parameter descriptions. The description adds value beyond the schema by explaining the title default behavior and parent_page_id fallback resolution, which are not fully covered in the schema alone.
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 clearly states 'Duplicate a page' and specifies the action: reads all blocks and creates a new page with same content. It distinguishes from siblings like move_page (moving) and create_page (creating from scratch) by detailing the duplication behavior and limitations.
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 implicitly guides usage by listing limitations (e.g., unsupported block types omitted, deep-duplication not supported), but does not explicitly state when to avoid the tool or name alternative tools. However, no other duplication tool exists among siblings, making the guidance adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_replaceA
Find and replace text on a page. Preserves uploaded files and blocks that aren't touched. More efficient than replace_content for targeted text changes like fixing typos, updating URLs, or renaming terms.
| Name | Required | Description | Default |
|---|---|---|---|
| find | Yes | Text to find (exact match) | |
| dry_run | No | Preview match counts without mutating Notion. Default false. | |
| page_id | Yes | Page ID | |
| replace | Yes | Replacement text | |
| replace_all | No | Replace all occurrences. Default: first only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that find_replace preserves uploaded files and untounched blocks, indicating non-destructive behavior. It could additionally mention irreversibility, but the provided info is strong.
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 with no wasted words. The purpose is stated first, followed by valuable usage context. Perfectly front-loaded and efficient.
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?
Given the tool's complexity, full schema coverage, and lack of output schema, the description covers purpose, usage guidelines, and behavioral transparency adequately. No gaps remain.
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 all parameters are well-described in the schema. The description adds value by giving usage examples (typos, URLs, terms) but does not significantly extend parameter 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?
The description clearly states 'Find and replace text on a page.' and explicitly differentiates from sibling tool replace_content by highlighting efficiency for targeted changes like fixing typos, updating URLs, or renaming terms.
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 provides explicit when-to-use guidance ('targeted text changes') and when-not-to-use ('more efficient than replace_content'), along with behavioral notes like preserving untouched blocks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_configA
Report this server's own settings: version, transport, the workspace root that bounds create_page_from_file file paths, and how many tools are visible. Call this when a file-path or configuration error occurs and you need the server's actual settings rather than a guess. Read-only, makes no Notion API call, and never returns credentials. Returns { version, transport, workspace_root_configured, workspace_root_resolved, workspace_root_status, workspace_root_source, markdown_docs, visible_tools_count }.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and it excels: it declares 'Read-only, makes no Notion API call, and never returns credentials.' This discloses safety and scope explicitly. It also states the exact return fields, adding transparency beyond typical descriptions.
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?
The description is two well-structured sentences. The first fronts the purpose and key outputs; the second gives usage context and safety guarantees. Every sentence earns its place, and there is no fluff.
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?
This is a simple diagnostic tool with no parameters, no annotations, and no output schema, but the description supplies everything needed: what it does, when to call it, its read-only nature, and the exact return structure. Nothing is missing for an agent to use 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?
The tool has zero parameters, so the schema (empty) already covers them 100%. The description doesn't need to add parameter details, and the baseline for no parameters is 4. It adds no unnecessary parameter information, which 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?
The description clearly states the tool 'Reports this server's own settings' and names specific elements: version, transport, workspace root, and visible tools count. It is a diagnostic tool distinct from the many content-focused siblings, so an agent can tell it apart without confusion.
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 explicitly says 'Call this when a file-path or configuration error occurs and you need the server's actual settings rather than a guess.' This provides a concrete trigger condition. It doesn't mention when not to use it or alternatives, but the tool is unique enough that no alternative is obvious; still, some negative guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_databaseA
Get a database's schema — property names, types, and select/status options. Call this before query_database or add_database_entry to know the exact property names and valid values.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | No | Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error. | |
| database_id | No | Database ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden. It communicates that this is a retrieval operation and specifies what the response contains, though it does not explicitly discuss errors, side effects, or permission expectations.
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?
The description is two sentences with the purpose front-loaded and a concrete usage directive following immediately. Every sentence earns its place, and there is no redundant phrasing.
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 schema-lookup tool, the description plus the complete schema gives the agent the accepted identifiers, the output scope, and the follow-up tools. The absence of an output schema is mitigated by the explicit summary of return content.
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 are fully described in the input schema, including the page_id alias rule. The description adds no parameter-specific meaning beyond what the schema already provides, so the baseline score of 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?
The description names an explicit action and object: 'Get a database's schema' and specifies the returned content (property names, types, and select/status options). This clearly distinguishes it from query_database and other tools in the sibling list.
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 explicitly tells the agent to call this before query_database or add_database_entry to discover valid property names and values. It does not describe negative cases or alternatives exhaustively, 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.
get_meA
Get the current bot user.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description lacks any behavioral details (e.g., read-only, permissions, or side effects). For a simple get operation, a statement like 'Read-only, returns user object' would help.
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?
The description is one concise sentence with no wasted words. It could be improved by adding return info without sacrificing conciseness.
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 parameterless tool with no output schema, the description is minimally adequate but fails to mention what the tool returns (e.g., user object). Adding a brief return description would improve completeness.
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 has zero parameters, and schema description coverage is 100%. According to rules, 0 parameters earns a baseline score of 4, as no additional parameter documentation is needed.
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 'Get the current bot user' uses a specific verb ('Get') and a clear resource ('current bot user'), which distinguishes it from sibling tools that operate on pages, comments, databases, etc.
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?
While no explicit when-to-use or alternative guidance is provided, the tool's purpose is unique among siblings (only tool for bot user info), so implicit context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_viewA
Retrieve one Notion database view by ID. Returns a curated summary (id, name, type, url, data_source_id); set include_config: true for the full raw Notion view object.
| Name | Required | Description | Default |
|---|---|---|---|
| view_id | Yes | View ID | |
| include_config | No | Return the full raw Notion view objects (filter, sorts, configuration, parent) instead of the curated summary. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the default output as a curated summary with specific fields (id, name, type, url, data_source_id) and the alternative full raw object. No annotations provided, so description carries the burden well.
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, no wasted words. Front-loaded with core action, followed by parameter tip.
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?
Given no output schema and 2 parameters with full schema coverage, the description sufficiently explains what the tool returns and the key parameter behavior. Could mention prerequisite that the view ID must exist, but not critical.
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%, but description adds value by explaining the distinction between the default curated summary and the full object when include_config=true, beyond the schema's 'Return the full raw' statement.
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?
Description uses specific verb 'Retrieve' and resource 'Notion database view by ID', clearly distinguishing from sibling tools like create_view, delete_view, update_view, list_views.
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?
Provides a usage hint for the include_config parameter but does not explicitly state when to use this tool versus alternatives (e.g., list_views, query_view). The context is adequate but lacks exclusions or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_commentsB
List comments on a page.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose behavioral traits such as whether it returns all comments or paginated data, ordering, or required permissions. The description carries the full burden but fails to provide this context.
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 succinct sentence that directly states the tool's purpose with no extraneous 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 description is minimal but sufficient for a simple list tool with one parameter. However, it lacks details on pagination, sorting, or comment threading, which could be relevant.
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% with a single parameter 'page_id' described as 'Page ID'. The description adds no extra meaning beyond the schema, 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?
The description 'List comments on a page.' clearly identifies the action (list) and resource (comments on a page), distinguishing it from sibling tools like add_comment or list_pages.
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 tool versus alternatives (e.g., search_in_page for filtered comments) or when not to use it. The description does not provide usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_databasesA
List all databases the integration can access. Returns database names and IDs — use get_database on any result to see its schema.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so description must cover behavior. It discloses that the tool lists accessible databases, implying read-only and access control, but omits details like error handling, rate limits, or whether results are ordered.
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, front-loaded with purpose, no extraneous words. Efficient and well-structured.
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 list tool with no output schema, the description adequately explains what it returns and suggests a next action. Could mention empty results or errors, but is sufficient for typical use.
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?
Input schema has 0 parameters with 100% coverage; baseline is 4. Description adds no parameter info, but none is needed.
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?
Description clearly states verb "List" and resource "databases", specifies scope "all databases the integration can access", and distinguishes from sibling list tools (e.g., list_pages). Offers a concrete next step: use get_database on results.
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?
Provides clear context by stating the action and return values, and implicitly guides to use get_database for schema. However, no explicit when-not or alternative specifications.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pagesA
List child pages under a parent page. Each row returns id, title, created_time, and last_edited_time. Timestamps are full ISO-8601 values from Notion, rounded to the minute, and last_edited_time advances on page content and property edits.
| Name | Required | Description | Default |
|---|---|---|---|
| parent_page_id | Yes | Parent page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It usefully discloses timestamp formatting (ISO-8601, rounded to the minute), the fact that last_edited_time updates on content and property edits, and the returned row structure. It does not mention pagination or ordering, but the disclosed details are meaningful and not redundant.
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?
The description is compact and front-loaded: the primary action appears first, followed by the returned fields and a useful timestamp caveat. Every sentence adds value, and there is no padding.
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 one-parameter read tool with no output schema, the description adequately covers what the result contains and important timestamp nuances. It could also mention pagination, sorting, or whether archived pages are included, but the core invocation and return semantics are sufficiently specified.
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 parameter's schema description ('Parent page ID') already explains its role. The tool description adds no further parameter-level detail such as ID format or validity rules, so the baseline score 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?
The description clearly states the action ('List child pages under a parent page'), identifies the target resource, and lists the returned fields. This makes the tool's purpose concrete and easily distinguishable from siblings like list_databases or list_views.
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 makes clear this tool is for listing child pages directly under a given parent page. It does not explicitly name alternatives or state when not to use it, but the parent-page scoping and single required parameter imply the correct usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_usersB
List workspace users.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description does not disclose any behavioral traits such as read-only nature, permission requirements, or output characteristics. It provides no additional behavioral context beyond the implied listing operation.
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?
The description is extremely concise with a single sentence, containing no unnecessary words. Every word is purposeful, efficiently conveying the tool's function.
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?
Given the simplicity of the tool (no parameters, no output schema), the description is adequate but minimal. It lacks details about pagination, sorting, or potential filtering, which could be useful context for the agent.
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?
There are no parameters, so schema coverage is effectively 100%. The description adds no parameter details, but none are needed. The baseline for zero parameters is 4, as the description adequately covers the schema's emptiness.
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 clearly states the action (list) and the resource (workspace users), making the purpose unambiguous. However, it does not differentiate from sibling list tools like list_pages or list_databases, which share similar verb-noun construction.
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 is provided on when to use this tool versus alternatives. With many list tools available, the description lacks any context about prerequisites, scope, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_viewsA
List Notion database views. Pass exactly one of database_id or data_source_id. Returns a curated summary of each view (id, name, type, url, data_source_id) plus pagination cursors; set include_config: true for the full raw Notion view objects.
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Maximum number of views to return | |
| database_id | No | Database ID | |
| start_cursor | No | Pagination cursor from a previous response | |
| data_source_id | No | Data source ID | |
| include_config | No | Return the full raw Notion view objects (filter, sorts, configuration, parent) instead of the curated summary. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses return format (curated summary with fields, pagination cursors) and the effect of include_config, but does not explicitly state that the tool is read-only, which is important given no 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?
Two sentences, each with essential information: purpose, parameter constraint, return format, and configuration option. No wasted words.
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 main return structure and pagination, but lacks default page_size, error handling, or explicit mention of optional parameters. With no output schema, a bit more detail could be beneficial.
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?
Adds meaning beyond schema by clarifying the exclusivity of database_id/data_source_id and the behavior of include_config. Schema coverage is 100%, so a 3 is baseline; the description provides added value.
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 clearly states it lists Notion database views and specifies the mutually exclusive parameters (database_id or data_source_id). However, it does not differentiate from sibling tools like get_view, query_view, or create_view.
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?
Provides specific guidance on parameter exclusivity and the include_config option, but no explicit guidance on when to use list_views versus alternatives like query_view or get_view.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_pageB
Move a page to a new parent page.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | Page ID to move | |
| new_parent_id | Yes | New parent page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description fails to disclose side effects (e.g., child pages, permissions) or behavioral constraints.
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?
Single sentence, front-loaded, no extraneous 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?
Adequate for a simple two-parameter tool, but lacks detail on expected behavior or return values.
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% with clear descriptions; tool description adds no extra meaning beyond 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?
Description clearly states action (move), resource (page), and target (new parent page), distinguishing it from sibling tools like duplicate_page or archive_page.
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 tool vs alternatives (e.g., duplicate or archive), nor any prerequisites or limitations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_databaseA
Query a database with optional filters, sorts, or text search. Use text for simple keyword search across title, rich_text, url, email, and phone fields. For advanced filters, pass Notion filter syntax and call get_database first to see property names and valid options.
Response shape: { results: Array, warnings?: Array }. Multi-value properties are capped by max_property_items and can emit truncated_properties; read resources easy-notion://docs/property-pagination and easy-notion://docs/warnings for details.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Search text — matches across all text fields (title, rich_text, url, email, phone) | |
| sorts | No | Optional Notion sorts array | |
| filter | No | Optional Notion filter object | |
| page_id | No | Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error. | |
| database_id | No | Database ID | |
| max_property_items | No | Max items returned per multi-value property (title, rich_text, relation, people). Default 75. Set to 0 for unlimited. Negative values rejected. When the cap is hit, the response includes a truncated_properties warning with a how_to_fetch_all hint. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses the response shape, warning behavior, max_property_items cap, truncated_properties emission, and links to relevant docs. It stops short of explicitly stating read-only behavior or error handling, but overall it is transparent for a query tool.
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?
The description is front-loaded with a concise purpose, followed by usage guidance and a compact response-shape explanation. Each sentence earns its place, including the links to edge-case documentation.
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 6-parameter query tool with no output schema, the description covers the response format, parameter usage, and important edge-case behavior. It could optionally explain top-level result pagination, but the linked docs and warning details make it sufficiently complete for an agent to invoke 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 covers 100% of parameters, so baseline is 3. The description adds value by explaining text search fields, advising get_database for advanced filter options, and detailing max_property_items behavior 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?
The description clearly states the tool queries a database and lists the available operations: filters, sorts, and text search. It differentiates from siblings like query_view by specifying the resource as a database, though it does not explicitly name the sibling alternative.
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?
Provides practical guidance on when to use text search versus advanced filters, and instructs the agent to call get_database first for valid property names. It does not explicitly contrast with query_view or state exclusion criteria, but the in-tool routing is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_viewB
Query a Notion database view. Creates a temporary view query, fetches database row results, then deletes the query.
| Name | Required | Description | Default |
|---|---|---|---|
| view_id | Yes | View ID | |
| page_size | No | Maximum number of results to return | |
| start_cursor | No | Pagination cursor from a previous view query results response |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so description carries burden. It discloses the create-fetch-delete lifecycle, which is important behavioral context. However, it doesn't mention error states, permissions, or side effects beyond deletion of the temporary query.
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?
Single sentence front-loading the core action. Every word is necessary and no filler. Highly efficient.
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?
Adequate for a 3-parameter tool with no output schema. The lifecycle is explained, but lacks detail on return format or error handling. Given the absence of output schema, some expectation for return structure description is unmet.
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% with basic descriptions. The tool description adds no additional meaning beyond the schema. At baseline, no value added.
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?
Description clearly states verb+resource: 'Query a Notion database view.' It adds lifecycle detail (creates, fetches, deletes) which distinguishes it from a simple read. However, it doesn't explicitly differentiate from sibling tool 'query_database'.
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 tool versus alternatives like 'query_database' or 'get_view'. No exclusive or prerequisite conditions mentioned. The description only states what it does, not when to choose it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_blockA
Read one block by ID as markdown. Container blocks are fetched recursively with children. Unsupported root block types return a clear error; unsupported nested blocks are omitted and listed in warnings. Notion AI meeting-notes blocks encountered in the result are rendered as a synthetic toggle and produce a read_only_block_rendered warning. Transcripts are not included from these tools.
| Name | Required | Description | Default |
|---|---|---|---|
| block_id | Yes | Block ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description fully bears the burden of disclosure. It comprehensively covers behaviors: recursive children for containers, error for unsupported root blocks, omission with warnings for nested unsupported types, rendering of AI meeting-notes as synthetic toggles with warnings, and exclusion of transcripts. No missing critical traits.
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?
The description is concise with four sentences, each adding value. The main purpose is front-loaded. Minor redundancy could be trimmed, but overall it is efficient and well-structured.
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?
Given the complexity of block reading (multiple block types, recursive containers, unsupported types), the description covers key behaviors. No output schema exists, but the description partially compensates by mentioning markdown and warnings. Lacks structural details about the markdown output format.
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 input schema has 100% description coverage for the sole parameter (block_id). The description adds no additional semantic meaning beyond restating 'by ID'. Baseline of 3 is appropriate as schema already documents the parameter adequately.
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 clearly states the tool reads one block by ID as markdown and includes details about container blocks and error handling. However, it does not explicitly differentiate from sibling tools like read_page or read_toggle, which reduces clarity for selection.
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 implies when to use the tool (to read a block by ID) but does not provide explicit guidance on when not to use it or when alternatives like read_page are more appropriate. No exclusions or contextual triggers are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_pageA
Read a page and return metadata plus markdown. Recursively fetches nested blocks and uses the same markdown conventions accepted by create_page. If unsupported block types are omitted from the markdown, they are listed in warnings. Do NOT round-trip markdown through replace_content when omitted_block_types warnings are present; omitted blocks would be deleted.
Notion AI meeting notes are rendered as a synthetic toggle containing the title, an optional recording timestamp callout, and ## Summary / ## Notes heading sections. Transcript sections are included only with include_transcript: true. A read_only_block_rendered warning is emitted whenever such a block is rendered, indicating that round-tripping the markdown through replace_content will replace the native meeting-notes block with ordinary blocks.
Note on max_blocks: the cap counts top-level page blocks only; section descendants of meeting-notes blocks are fetched in full regardless of the cap, consistent with how nested children of normal blocks are fetched.
Long titles are paginated with max_property_items. For markdown conventions, warning shapes, and pagination details, read resources easy-notion://docs/markdown, easy-notion://docs/warnings, and easy-notion://docs/property-pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | Page ID | |
| max_blocks | No | Maximum top-level blocks to return. Omit to return all. | |
| include_metadata | No | Include created_time, last_edited_time, created_by, last_edited_by in response. Default false. | |
| include_transcript | No | Include Notion AI meeting-notes transcript sections. Default false. Summary and Notes sections are always included when present. | |
| max_property_items | No | Max rich_text segments returned when a page title exceeds 25 segments (uncommon in practice). Default 75. Set to 0 for unlimited. Negative values rejected. When the cap is hit, the response includes a truncated_properties warning with a how_to_fetch_all hint. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but the description fully discloses key behavioral traits: recursive fetching, handling of unsupported block types with warnings, synthetic rendering of Notion AI meeting notes, and max_blocks counting rules. This compensates for missing 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?
The description is well-organized with paragraphs and bullet points, front-loading the core purpose. Slightly verbose in places, but each sentence adds value. Could be compacted slightly 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?
Despite lacking output schema, the description covers the response structure (metadata, markdown, warnings) and directs to external resources for conventions. Given the tool's complexity and 5 parameters, the description is remarkably complete and self-contained.
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% but the description adds significant nuance beyond the schema: max_blocks boundary behavior for meeting-notes descendants, max_property_items default and truncation handling, and include_transcript inclusion scope. Each parameter is enriched with practical context.
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 explicitly states 'Read a page and return metadata plus markdown' and specifies recursive fetching, making the purpose clear. It distinguishes from sibling tools like read_block by focusing on entire page content with markdown conversion.
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?
Provides actionable guidance: warns against round-tripping markdown when omitted_block_types warnings are present, and clarifies when to use include_transcript. Does not explicitly list alternatives but the context is clear enough for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_sectionA
Read a single page section by heading name. Uses the same heading matching and boundary rules as update_section: headings are matched case-insensitively, H1 sections end at the next heading of any level, and H2/H3 sections end at the next heading of the same or higher level. Includes the heading block itself and recursively renders nested children only for blocks inside the selected section. If unsupported nested block types are omitted, the response includes warnings. Notion AI meeting-notes blocks encountered in the result are rendered as a synthetic toggle and produce a read_only_block_rendered warning. Transcripts are not included from these tools.
| Name | Required | Description | Default |
|---|---|---|---|
| heading | Yes | Heading text to find (case-insensitive) | |
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the burden of behavioral disclosure. It explicitly states case-insensitive heading matching, hierarchical boundary rules, handling of nested children, omission warnings for unsupported blocks, and synthetic rendering of Notion AI meeting-notes blocks with warnings.
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?
The description is a single, focused paragraph that front-loads the purpose. It is concise but includes necessary behavioral details without being verbose.
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 description covers key aspects of behavior (heading matching, boundary rules, children rendering, warnings) but lacks explicit details about the return format and error cases (e.g., heading not found). Given no output schema, it is moderately complete but has gaps.
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 schema already documents both parameters. The description adds minimal additional meaning beyond confirming the case-insensitive matching behavior for the heading parameter. Per guidelines, a score of 3 is appropriate when schema coverage is high and description adds limited value.
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 clearly states the tool's purpose: to read a single page section by heading name. It uses a specific verb ('Read') and resource ('page section'), and distinguishes itself from siblings like update_section and read_page by referencing its unique behavior.
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 the tool's behavior in detail but does not provide guidance on when to use this tool over alternatives (e.g., read_page, read_block). There are no explicit 'when to use' or 'when not to use' statements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_toggleA
Read one toggle by title from a page. Searches recursively and matches plain toggle blocks plus toggleable heading_1, heading_2, and heading_3 blocks using case-insensitive trimmed text. Missing titles return the available toggle titles. Notion AI meeting-notes blocks encountered in the result are rendered as a synthetic toggle and produce a read_only_block_rendered warning. Transcripts are not included from these tools.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Toggle title to find (case-insensitive) | |
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description fully covers behavior: recursive search, case-insensitive trimmed matching, missing titles returning available toggle titles, synthetic toggle rendering for Notion AI meeting-notes blocks with a warning, and exclusion of transcripts.
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?
The description is concise, front-loaded with the main purpose, and every sentence adds value. It uses clear language without unnecessary repetition, making it efficient for an AI agent to parse.
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?
Given no output schema, the description adequately covers input usage, special behaviors, and limitations (transcripts not included). It is complete for the tool's scope and complexity.
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 describes page_id and title briefly. The description adds meaning by explaining how 'title' is matched (case-insensitive, trimmed text) and the recursive search behavior. This goes beyond the schema, though no per-parameter details are added for page_id.
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 clearly states the tool reads a single toggle by title from a page, specifying it searches recursively and matches plain toggle blocks plus toggleable headings. It distinguishes itself from siblings like read_block or search by focusing on toggles by title.
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 implies usage for reading a specific toggle by title but lacks explicit when-to-use or when-not-to-use guidance. It does not reference alternative tools like search or read_block for other scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replace_contentA
Replaces all page content with the provided markdown atomically (one Notion API call). Notion's atomic markdown endpoint converts the markdown to native Notion blocks in that one API call. On matched blocks Notion preserves the original block IDs, so deep-link anchors (#block-id) and inline-comment threads attached to those blocks survive the edit. Unmatched blocks (returned in warnings with code unmatched_blocks) are replaced with new IDs.
NOT preserved across replace_content: child_page subpages, synced_block instances, child_database views, and link_to_page references on the source page. Enhanced Markdown has no input form for these, so they are dropped from the new page content. If the source contains them, use duplicate_page first or edit those types via the Notion UI. For an inline page mention, use @Title; that is a separate construct from the link_to_page block type.
Bookmarks and embeds are written as bare URLs (Notion auto-links) and surface a bookmark_lost_on_atomic_replace or embed_lost_on_atomic_replace warning so callers know the rich preview is lost. For supported markdown syntax and warning details, read resources easy-notion://docs/markdown and easy-notion://docs/warnings. Returns: { success: true }, optionally truncated: true, optionally warnings with entries such as { code: "unmatched_blocks", block_ids: [...] }, plus block_map for the resulting top-level blocks when present. A dry run returns { success: true, dry_run: true, operation, page_id, would_update: true } and optionally warnings.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Preview validation and planned effect without mutating Notion. Default false. | |
| page_id | Yes | Page ID | |
| markdown | Yes | Replacement markdown content | |
| return_block_map | No | Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it delivers extensively. It discloses atomicity, block-ID preservation, unmatched block replacement, dropped page types, bookmark/embed preview loss, and warning codes. It also describes the dry-run behavior and response shape, so the agent knows exactly what to expect.
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?
The description is long but every sentence earns its place, covering core behavior, preservation caveats, alternatives, parameter effects, docs references, and return values. The most important facts are front-loaded, with the atomic replacement behavior stated first and supporting details organized in a logical progression.
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?
This is a complex tool with five parameters, no annotations, and no output schema, yet the description is nearly self-contained. It covers the return value with success/truncated/warnings/block_map details, documents the dry-run response, names warning codes, and points to docs for further detail. The only minor gap is that not every warning code is enumerated, but the description references docs and gives representative examples, which is 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%, so the baseline is 3, but the description adds meaningful semantic value beyond the schema. It explains the effect of collapse_soft_wraps on single line breaks, mentions that replace_content renders in-paragraph line breaks as separate paragraphs regardless of the option, and clarifies that bookmarks/embeds are written as bare URLs. These details help the agent choose parameter values correctly.
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: 'Replaces all page content with the provided markdown atomically (one Notion API call).' This makes the tool's core action unmistakable and distinguishes it from sibling tools like append_content, which adds rather than replaces content. It also clarifies that this is an all-page replacement, not a targeted edit.
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 explicit when-to-use and when-not-to-use guidance, including 'use duplicate_page first or edit those types via the Notion UI' when the source contains child_page subpages or other unsupported constructs. It also provides concrete parameter-level guidance, such as recommending collapse_soft_wraps for hard-wrapped prose files and warning not to use it when re-uploading content read from Notion. This routes the agent to alternatives and away from misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_pageA
Restore an archived page.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden. It only states the action without disclosing permissions, failure conditions, or return behavior, which is insufficient for a mutation tool.
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?
The description is a single sentence that gets straight to the point with no unnecessary words, fulfilling the requirement of being concise and 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?
For a simple one-parameter tool, the description is minimally adequate but does not explain return values or edge cases, which would be helpful given the absence of an 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 input schema has 100% description coverage for 'page_id', and the description adds no additional meaning beyond what the schema provides. Baseline score 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?
The description clearly states the tool restores an archived page, using a specific verb and resource. It distinguishes itself from the sibling tool 'archive_page' which performs the opposite action.
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 implies usage for unarchiving pages, but lacks explicit guidance on when to use this tool versus alternatives. However, the context of sibling tools makes it clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_toggleA
Restore an archived toggle or toggleable heading by archived block ID. Use the block ID returned by archive_toggle; Notion does not expose archived child enumeration for title search or read_page include_archived.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Preview the restore target without mutating Notion. Default false. | |
| block_id | Yes | Archived toggle or toggleable heading block ID returned by archive_toggle |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description lacks details on side effects, permissions, or consequences (e.g., what happens if block is not archived).
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 concise sentences with no filler, efficiently conveying key 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?
Covers prerequisite and limitation, but lacks details on restore behavior (e.g., children, return value) given no 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?
Schema coverage is 100% with descriptions; description adds context for block_id but not significantly beyond schema. Baseline 3.
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 clearly states it restores an archived toggle or toggleable heading by block ID, distinguishing it from siblings like archive_toggle.
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?
Specifies to use the block ID from archive_toggle and notes that Notion does not expose archived child enumeration, guiding when and how 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.
searchA
Search Notion pages or databases. Use filter: 'databases' to find databases by name, then get_database for schema details.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| filter | No | Optional object filter |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and description lacks disclosure of behavioral traits such as read-only nature, authentication needs, rate limits, pagination, or results format. For a search tool without annotations, more transparency expected.
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?
Extremely concise: two sentences with no filler. Front-loads the verb and resource, and includes a practical tip for using the filter. Every sentence 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?
Given the number of siblings and lack of output schema, the description is adequate but incomplete. It does not explain return values, pagination, or sorting. The workflow hint is helpful but not comprehensive for an agent to fully anticipate behavior.
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%, but description adds value by explaining the 'databases' filter usage and linking to a workflow. The query parameter is minimally described; however, the description compensates by providing context 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?
Description clearly states 'Search Notion pages or databases' with specific verb and resource, and distinguishes from sibling tools like search_in_page. It provides actionable workflow (use filter 'databases' then get_database).
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 to use the filter for databases and directs to get_database for schema details. Does not explicitly mention when not to use, but the sibling list implies alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_in_pageA
Search raw Notion block plain text inside a page, optionally scoped to one toggle or toggleable heading by title. Matching is case-insensitive plain substring search.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Plain substring to search for (case-insensitive, non-empty) | |
| page_id | Yes | Page ID | |
| within_toggle | No | Optional toggle title to restrict search scope (case-insensitive) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of revealing behavioral traits. It discloses that matching is case-insensitive and substring-based, but does not describe what is returned (e.g., block IDs, context, count), whether pagination exists, or any side effects. For a read-only tool, this is insufficient.
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?
The description is two sentences, no redundant words, and front-loads the core purpose. Every phrase earns its place without being verbose.
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?
Given no output schema, the description should cover what the tool returns, but it does not. It explains the search behavior and optional scope adequately, but leaves the return format and coverage (e.g., which block types) unstated. It is functional but not fully complete.
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 baseline is 3. The description adds minimal detail: it only reemphasizes that the search is case-insensitive and that the optional scope is a toggle title. This does not add significant meaning beyond what the schema already provides.
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 clearly states it searches raw Notion block plain text inside a page, with optional scoping to a toggle. This distinguishes it from sibling tools like 'search' (global search) and 'find_replace' (find and replace). The verb 'search' and resource 'page' are specific and directly convey the function.
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 implies when to use this tool: for searching within a page's raw block text, optionally restricted to a toggle. However, it does not explicitly state when not to use it or contrast with alternatives like the global 'search' tool. The guidance is clear but lacks exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_blockA
Update a single block in place by ID. Preserves the block's identity (deep-link anchors and inline-comment threads attached to the block survive the edit). Use this for surgical edits: fixing a heading, toggling a checkbox, rewriting one paragraph. For multi-block edits, use append_content, replace_content, or update_section.
Type lock-in: the markdown must parse to the same block type as the existing block. update_block cannot change a block's type, because Notion's API forbids it. To change a block's type, use replace_content or delete + append.
Updatable types: paragraph, heading_1, heading_2, heading_3, toggle, bulleted_list_item, numbered_list_item, quote, callout, to_do, code, equation. Container blocks (toggle, callout) update first-level content only, and children stay untouched. Non-updatable types (divider, table, image, bookmark, etc.) accept only archived: true to delete the block. Page mentions: @Title.
To delete a block, pass archived: true instead of markdown. Exactly one of markdown or archived is required.
| Name | Required | Description | Default |
|---|---|---|---|
| checked | No | to_do only: explicit check-state override (otherwise inferred from `- [x]` / `- [ ]`). | |
| dry_run | No | Preview validation and planned effect without mutating Notion. Default false. | |
| archived | No | Set true to delete the block (sends in_trash: true). | |
| block_id | Yes | Block ID to update | |
| markdown | No | New content for the block. Must parse to a single block of the same type as the existing block. For to_do blocks, `- [x]` / `- [ ]` syntax sets the checked state. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden and does so extensively: it reveals type lock-in, identity preservation, container-block depth limits, non-updatable type behavior, and deletion via archived. These are non-obvious behavioral traits an agent could not infer from the schema or tool name.
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?
The paragraphs are dense but each sentence adds a distinct constraint or usage rule; there is no filler. The core purpose is front-loaded, followed by when to use it, type restrictions, edge cases for containers and non-updatable types, and finally deletion 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?
For a complex tool with six parameters and no output schema, the description covers the full decision space: valid types, invalid types, deletion, container behavior, and alternatives. No necessary calling condition or constraint appears to be missing, so an agent has enough information to invoke it correctly and predict side effects.
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?
Although schema coverage is 100%, the description adds critical relational semantics: exactly one of markdown or archived is required, markdown must parse to a single block of the same type, and archived true means deletion. It also clarifies the checked parameter's relationship to to_do markdown syntax, going beyond individual field descriptions.
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: 'Update a single block in place by ID,' and differentiates itself from multi-block tools by labeling these as surgical edits. It also clarifies what identity preservation means with concrete examples (deep-link anchors and inline-comment threads), leaving no ambiguity about scope.
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 explicitly states when to use the tool ('fixing a heading, toggling a checkbox, rewriting one paragraph') and names alternatives for multi-block edits (append_content, replace_content, update_section). It also gives exclusion criteria for type changes, directing to replace_content or delete + append, so an agent can route accurately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_database_entryA
Update an existing database entry using simple key-value property inputs. Pass only properties to change; omitted properties are left unchanged. Call get_database first to see available property names and valid select/status options.
Writable property values use the same simple inputs as add_database_entry:
title, rich_text: string
number: number
select, status: option name string
multi_select: array of option name strings
date: ISO date string (start only)
checkbox: boolean
url, email, phone: string
relation: string or array of page IDs
people: string or array of user IDs
Not writable from this tool:
formula, rollup, unique_id, created_time, last_edited_time, created_by, last_edited_by: computed by Notion
files, verification, place, location, button: not supported for value writes here
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | Page ID for the database entry | |
| properties | Yes | Key-value property map to convert using the parent database schema |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description fully discloses behavior: omitted properties unchanged, writable types enumerated, non-writable types listed. No contradictions.
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?
Well-structured with bullet points and clear sections. Front-loads purpose. Slightly verbose but every sentence is informative. Could be tightened slightly without losing clarity.
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?
Given the complexity of updating various property types, the description is complete. Covers all writable types, non-writable types, and a prerequisite step. No output schema, but behavior is fully explained.
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%, but description adds significant value by explaining the properties object format and listing all writable property types with examples, going beyond the schema's brief descriptions.
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 clearly states the tool updates an existing database entry with key-value properties. It distinguishes from siblings like add_database_entry and delete_database_entry by specifying that only properties to change are passed, and omitted properties remain unchanged.
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?
Provides explicit guidance: call get_database first to see property names and valid options, pass only properties to change, and lists which properties are not writable. This answers when to use and what to avoid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_data_sourceA
CRITICAL: full-list semantics. When you update a select or status property's options array, you MUST send the full desired list. Any existing option you omit will be permanently removed from the database, along with any relationship to rows currently using it. Rows that currently reference a removed option are silently reassigned to the default group's first option (for example "Not started" for status properties). No signal is raised. If you want to preserve the meaning of existing rows when removing an option, reclassify those rows to another explicit option before removing the option from the schema. To add one option, first call get_database, then resend the full current list with your addition appended.
Cannot toggle is_inline on existing databases. is_inline is a database-level field, not a data-source field. A separate update_database tool may be added later.
Updates a database's schema: rename properties, add or update property definitions, remove properties, change the title, or move it to/from trash. Use after get_database. Supports raw Notion payloads and schema helper payloads; read resource easy-notion://docs/update-data-source for modes, examples, status notes, and limitations. At least one of title, properties, or in_trash must be provided.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | New database title | |
| page_id | No | Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error. | |
| in_trash | No | True to trash, false to restore | |
| properties | No | Raw Notion property update map | |
| database_id | No | Database ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does this exceptionally well, disclosing that omitted options are permanently removed, affected rows are silently reassigned with no signal, and that is_inline changes are unsupported. This is precisely the kind of destructive and surprising behavior an agent must know 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?
The description is lengthy but each sentence carries substantive guidance. It is front-loaded with the critical destructive warning, followed by the inline exception and a clear summary of what the tool does. The structure is slightly unconventional—the core purpose statement appears near the end—but the density and organization are strong enough that nothing feels 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 complex mutation tool with zero annotations and no output schema, this description is exceptionally complete. It covers destructive edge cases, prerequisite calls, unsupported operations, accepted payload modes, documentation references, and required arguments. An agent has everything needed to invoke the tool correctly and avoid irreversible mistakes.
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 the baseline is 3. The description adds meaningful semantics beyond the schema, especially for the properties parameter: it explains full-list semantics for select/status options, the silent reassignment behavior, and the safe procedure for adding an option by first calling get_database. This extra guidance justifies a score above baseline.
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 explicitly states that this tool updates a database's schema: renaming properties, adding/updating/removing property definitions, changing the title, and moving to/from trash. This is a specific verb+resource and clearly distinguishes it from sibling tools like update_database_entry or update_view.
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 explicit usage context: 'Use after get_database', mandates reading the docs resource for modes and limitations, and warns that is_inline cannot be toggled on existing databases. It also explains the required parameters ('At least one of title, properties, or in_trash must be provided'), leaving little ambiguity about when and how to invoke the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_pageA
Update page title, icon, or cover. Cover accepts an image URL, or a file:// path (stdio transport only) which will be uploaded to Notion. In HTTP transport, the file:// form is rejected — use an HTTPS URL instead.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | Updated emoji icon | |
| cover | No | Updated cover image URL | |
| title | No | Updated page title | |
| page_id | Yes | Page ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries burden. It discloses that file:// URLs are rejected in HTTP transport, which is important behavioral detail. Does not cover auth or side effects, but acceptable for a simple update.
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?
Three sentences, front-loaded purpose, each sentence adds necessary detail without fluff.
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?
No output schema, but update operations often have simple responses. Description covers key behavioral nuances (URL types, transport). Missing potential partial update info, but adequate.
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%, yet description adds value: clarifies icon is emoji, and cover has transport-specific handling. This goes beyond schema descriptions.
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 clearly states the tool updates page title, icon, or cover, with specific detail on cover URL types. This verb+resource combination is distinct from sibling tools like archive_page or duplicate_page.
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?
Provides specific guidance on when to use file:// vs https:// cover URLs and notes transport-specific rejection. However, it does not explicitly compare to siblings like update_block for content updates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_sectionA
DESTRUCTIVE, no rollback: this tool deletes blocks in the section, then writes new blocks. If the write fails mid-call, the section is left partially or fully emptied; for most sections the heading anchor is deleted, so a retry can fail with "heading not found." For irreplaceable sections, duplicate_page the target first so you have a restore point.
Update a section of a page by heading name. Finds the heading, replaces everything from that heading to the next section boundary. For H1 headings, the section extends to the next heading of any level. For H2/H3 headings, it extends to the next heading of the same or higher level. Include the heading itself in the markdown. If the section starts at the first block, the replacement markdown must start with the same heading type so following sections stay in place. With preserve_heading:true, the existing heading block ID, text, type, comments, and toggleable state are preserved, but the section body blocks and existing toggleable-heading children are still destructively replaced; replacement markdown is treated as body-only, and a leading matching heading is stripped for compatibility. More efficient than replace_content for editing one section of a large page. Page mentions: @Title. Returns { deleted, appended }, plus deleted_blocks for the deleted top-level blocks when present and block_map for the top-level appended blocks when present. A dry run instead returns { success: true, dry_run: true, operation, page_id, heading, target_block_id, target_block_type, preserve_heading, deleted, appended, would_delete_block_ids, append_parent_id }, plus append_after_block_id when the append is anchored to a preceding block, and would_update with would_update_block_id when the heading block itself is rewritten.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Preview validation and planned effect without mutating Notion. Default false. | |
| heading | Yes | Heading text to find (case-insensitive) | |
| page_id | Yes | Page ID | |
| markdown | Yes | Replacement markdown including the heading | |
| preserve_heading | No | Preserve the existing heading block and replace only the section body. Default false. | |
| return_block_map | No | Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full disclosure burden and succeeds impressively. It opens with 'DESTRUCTIVE, no rollback,' details the mid-call failure mode (section partially or fully emptied, retry can fail with 'heading not found'), and specifies exact preserve_heading semantics: which attributes survive and which blocks are still destructively replaced.
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?
The description is long, but every sentence earns its place and the most critical safety warning is front-loaded. The return-value enumerations for both normal and dry-run paths are dense run-on prose rather than structured lists, which is a minor readability cost for an otherwise information-dense definition.
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?
Given high complexity (7 params, destructive semantics, two operational modes), zero annotations, and no output schema, this description is remarkably complete: it covers safety, failure modes, recovery, boundary semantics, preserve_heading nuances, efficiency trade-offs, mention syntax, and exact return shapes for both normal and dry-run invocations. Nothing an agent needs to call it safely 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?
Although schema coverage is 100%, the description adds substantial meaning beyond the schema: heading boundary rules for H1 vs H2/H3, the requirement to include the heading in the markdown, the first-block edge case requiring matching heading type, the leading-heading-stripping behavior under preserve_heading, and the full dry_run return shape including would_delete_block_ids.
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 states a specific verb and resource: 'Update a section of a page by heading name.' It precisely defines the operation — finds the heading and replaces everything from that heading to the next section boundary — which unambiguously differentiates it from siblings like replace_content, append_content, and update_block.
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 names the closest alternative and the deciding condition: 'More efficient than replace_content for editing one section of a large page.' It also gives active safety guidance — 'For irreplaceable sections, duplicate_page the target first so you have a restore point' — and explains when preserve_heading is the right mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_toggleA
DESTRUCTIVE, no rollback: this tool preserves the matched toggle container block ID, then deletes its body children and appends replacement body blocks. Child block IDs inside the body change, and if the write fails mid-call the toggle can be left partially or fully emptied. For irreplaceable content, duplicate_page the target first so you have a restore point.
Update the body of one toggle by title from a page. Searches recursively and matches plain toggle blocks plus toggleable heading_1, heading_2, and heading_3 blocks using case-insensitive trimmed text. The markdown is replacement body content, not a wrapper that renames the toggle, and the server converts it into native Notion blocks, not flat/plain text. The server automatically handles Notion API limits: batches more than 100 child blocks, splits rich text over 2000 characters, and writes deeply nested blocks in additional passes, so callers can send a full multi-section toggle tree in one call with no need to pre-chunk or pre-split. If the markdown parses as one matching top-level toggle or toggleable heading wrapper, that wrapper is ignored and only its children are used as the replacement body. For supported markdown syntax, read resource easy-notion://docs/markdown. Page mentions: @Title. Returns: { success: true, block_id, type, deleted, appended }, where deleted and appended are counts, plus deleted_blocks for the deleted top-level body blocks when present and block_map for the top-level appended body blocks when present. A dry run instead returns { success: true, dry_run: true, operation, page_id, title, block_id, type, deleted, appended, would_delete_block_ids, append_parent_id }.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Toggle title to find (case-insensitive) | |
| dry_run | No | Preview validation and planned effect without mutating Notion. Default false. | |
| page_id | Yes | Page ID | |
| markdown | Yes | Replacement markdown for the toggle body | |
| return_block_map | No | Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks. | |
| collapse_soft_wraps | No | Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, and it excels. It openly states the destructive nature, no rollback, that child block IDs change, and the risk of partial emptying on mid-call failure. It explains server-side handling of API limits (batching, splitting, nested passes) and clarifies that markdown becomes native blocks, not plain text. It also details the dry-run behavior and return structure. This is far beyond minimal transparency.
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?
The description is lengthy but every sentence earns its place given the tool's complexity. It opens with the critical destructive warning, then states the core purpose, then details behavior, limits, and response. It is well-organized, flows logically, and avoids redundancy. The density of information is appropriate for a tool with this many nuances, and there is no fluff.
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?
Given the tool's destructive nature, API limit handling, markdown-to-native-block conversion, and multiple return scenarios (including dry run), the description covers all essential aspects. It explains what changes, how failures affect state, how to create a restore point, what the server does automatically, and the exact response shape. No output schema exists, so the description's detailed return documentation is crucial, and it provides it comprehensively.
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 input schema provides complete descriptions for all six parameters (coverage 100%), so the baseline is 3. The description adds extra meaning primarily for the 'markdown' parameter—clarifying it is replacement body content, not a wrapper, and that the server converts it to native Notion blocks. It also clarifies the effect of 'collapse_soft_wraps' under specific scenarios. This goes beyond the schema's short descriptions and justifies a 4.
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 states a specific verb and resource: 'Update the body of one toggle by title from a page.' It clearly delineates scope by specifying it matches plain toggle blocks and toggleable heading_1/2/3 blocks, and distinguishes itself from siblings like replace_content by clarifying it updates a toggle's body, not renaming it or acting as a wrapper. The wording is unambiguous and directly relatable to the tool's name.
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?
While the description does not explicitly name alternative tools like replace_content or update_section, it provides rich context on when to use it: it targets a specific toggle by title, handles nested structures, and automates API limit batching. The warning about destructiveness and the recommendation to duplicate_page for irreplaceable content implicitly conveys when caution is needed. It lacks explicit 'when not to use' exclusions, but the context is strong enough for an agent to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_viewA
Update a Notion database view. Pass at least one update field. Null filter, sorts, or quick_filters values are forwarded to clear those fields.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Updated view name | |
| sorts | No | Raw Notion view sorts payload, or null to clear | |
| filter | No | Raw Notion view filter payload, or null to clear | |
| view_id | Yes | View ID | |
| configuration | No | Raw Notion view configuration payload. Dashboard configuration is rejected. | |
| quick_filters | No | Raw Notion quick filters payload, or null to clear |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses that null values are forwarded to clear fields and that dashboard configuration is rejected, adding behavioral context beyond a simple 'update'.
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 efficient sentences front-load purpose and convey key behavioral details without 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?
Covers null clearing and configuration rejection, but lacks mention of return value (no output schema) or error conditions. With 6 parameters and nested objects, more detail would be useful.
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%, baseline 3. Description adds value by stating 'Pass at least one update field' (required but not in schema) and clarifying null behavior for filter, sorts, and quick_filters.
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?
Clearly states 'Update a Notion database view' with specific verb and resource. Additional info about passing update fields and clearing with null distinguishes it from create_view, delete_view, and other 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?
Provides clear context on how to use null values to clear filter, sorts, or quick_filters. However, does not explicitly mention when not to use (e.g., vs. query_view) or list alternatives.
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.
14 tool updates
v1.1.0- Changed
add_comment1 field changed- added
Input schema / properties / collapse_soft_wrapsAdded value: +{ + "description": "Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when posting hard-wrapped prose. Do not use when re-posting content read from Notion, or intentional line breaks will be lost. Blank lines are unaffected.", + "type": "boolean" +}
- Changed
add_database_entries3 fields changed- added
Input schema / anyOfAdded value: +[ + { + "required": [ + "database_id" + ] + }, + { + "required": [ + "page_id" + ] + } +] - added
Input schema / properties / page_idAdded value: +{ + "description": "Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "database_id", - "entries" -]New value: +[ + "entries" +]
- Changed
add_database_entry3 fields changed- added
Input schema / anyOfAdded value: +[ + { + "required": [ + "database_id" + ] + }, + { + "required": [ + "page_id" + ] + } +] - added
Input schema / properties / page_idAdded value: +{ + "description": "Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "database_id", - "properties" -]New value: +[ + "properties" +]
- Changed
append_content2 fields changed- added
Input schema / properties / collapse_soft_wrapsAdded value: +{ + "description": "Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option.", + "type": "boolean" +} - added
Input schema / properties / return_block_mapAdded value: +{ + "description": "Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks.", + "type": "boolean" +}
- Changed
create_page3 fields changed- added
Input schema / properties / collapse_soft_wrapsAdded value: +{ + "description": "Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option.", + "type": "boolean" +} - added
Input schema / properties / return_block_mapAdded value: +{ + "description": "Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks.", + "type": "boolean" +} - added
Input schema / properties / strip_leading_h1Added value: +{ + "description": "Remove the document's leading H1 heading. Applies only when the first converted top-level block is a plain (non-toggleable) heading_1. Useful when title is also passed and the file begins with the same heading. Default false.", + "type": "boolean" +}
- Changed
create_page_from_file3 fields changed- added
Input schema / properties / collapse_soft_wrapsAdded value: +{ + "description": "Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option.", + "type": "boolean" +} - added
Input schema / properties / return_block_mapAdded value: +{ + "description": "Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks.", + "type": "boolean" +} - added
Input schema / properties / strip_leading_h1Added value: +{ + "description": "Remove the document's leading H1 heading. Applies only when the first converted top-level block is a plain (non-toggleable) heading_1. Useful when title is also passed and the file begins with the same heading. Default false.", + "type": "boolean" +}
- Added
get_config - Changed
get_database3 fields changed- added
Input schema / anyOfAdded value: +[ + { + "required": [ + "database_id" + ] + }, + { + "required": [ + "page_id" + ] + } +] - added
Input schema / properties / page_idAdded value: +{ + "description": "Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error.", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "database_id" -]
- Changed
query_database3 fields changed- added
Input schema / anyOfAdded value: +[ + { + "required": [ + "database_id" + ] + }, + { + "required": [ + "page_id" + ] + } +] - added
Input schema / properties / page_idAdded value: +{ + "description": "Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error.", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "database_id" -]
- Changed
replace_content2 fields changed- added
Input schema / properties / collapse_soft_wrapsAdded value: +{ + "description": "Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option.", + "type": "boolean" +} - added
Input schema / properties / return_block_mapAdded value: +{ + "description": "Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks.", + "type": "boolean" +}
- Changed
update_block1 field changed- added
Input schema / properties / collapse_soft_wrapsAdded value: +{ + "description": "Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option.", + "type": "boolean" +}
- Changed
update_data_source3 fields changed- added
Input schema / anyOfAdded value: +[ + { + "required": [ + "database_id" + ] + }, + { + "required": [ + "page_id" + ] + } +] - added
Input schema / properties / page_idAdded value: +{ + "description": "Alias accepted when database_id is absent. If the ID is a page containing exactly one inline database, it resolves to that database. Providing both database_id and page_id with different values is an error.", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "database_id" -]
- Changed
update_section2 fields changed- added
Input schema / properties / collapse_soft_wrapsAdded value: +{ + "description": "Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option.", + "type": "boolean" +} - added
Input schema / properties / return_block_mapAdded value: +{ + "description": "Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks.", + "type": "boolean" +}
- Changed
update_toggle2 fields changed- added
Input schema / properties / collapse_soft_wrapsAdded value: +{ + "description": "Collapse single line breaks to spaces per CommonMark before writing. Default false (single line breaks are kept as they are today). Recommended when uploading hard-wrapped prose files (e.g. repo markdown wrapped at 78 columns). Do not use when re-uploading content read from Notion, or intentional line breaks will be lost. Blank lines and code blocks are unaffected. Note: replace_content renders an in-paragraph line break as a separate paragraph regardless of this option.", + "type": "boolean" +} - added
Input schema / properties / return_block_mapAdded value: +{ + "description": "Include block_map in the response. Default true. Set false to skip the per-block id list when you do not plan to edit individual blocks.", + "type": "boolean" +}
2 tool updates
v1.0.1- Changed
get_view1 field changed- added
Input schema / properties / include_configAdded value: +{ + "description": "Return the full raw Notion view objects (filter, sorts, configuration, parent) instead of the curated summary. Default false.", + "type": "boolean" +}
- Changed
list_views1 field changed- added
Input schema / properties / include_configAdded value: +{ + "description": "Return the full raw Notion view objects (filter, sorts, configuration, parent) instead of the curated summary. Default false.", + "type": "boolean" +}
1 tool update
v0.9.1- Changed
read_page1 field changed- added
Input schema / properties / include_transcriptAdded value: +{ + "description": "Include Notion AI meeting-notes transcript sections. Default false. Summary and Notes sections are always included when present.", + "type": "boolean" +}
19 tool updates
v0.9.0- Changed
archive_page1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "Preview the archive target without mutating Notion. Default false.", + "type": "boolean" +}
- Added
archive_toggle - Added
create_view - Changed
delete_database_entry1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "Preview the entry archive/delete target without mutating Notion. Default false.", + "type": "boolean" +}
- Added
delete_view - Changed
find_replace1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "Preview match counts without mutating Notion. Default false.", + "type": "boolean" +}
- Added
get_view - Added
list_views - Added
query_view - Added
read_block - Added
read_section - Added
read_toggle - Changed
replace_content1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "Preview validation and planned effect without mutating Notion. Default false.", + "type": "boolean" +}
- Added
restore_toggle - Added
search_in_page - Changed
update_block1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "Preview validation and planned effect without mutating Notion. Default false.", + "type": "boolean" +}
- Changed
update_section2 fields changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "Preview validation and planned effect without mutating Notion. Default false.", + "type": "boolean" +} - added
Input schema / properties / preserve_headingAdded value: +{ + "description": "Preserve the existing heading block and replace only the section body. Default false.", + "type": "boolean" +}
- Added
update_toggle - Added
update_view
6 tool updates
v0.6.0- Changed
create_database1 field changed- added
Input schema / properties / is_inlineAdded value: +{ + "description": "Create the database inline within the parent page", + "type": "boolean" +}
- Added
create_page_from_file - Changed
query_database1 field changed- added
Input schema / properties / max_property_itemsAdded value: +{ + "description": "Max items returned per multi-value property (title, rich_text, relation, people). Default 75. Set to 0 for unlimited. Negative values rejected. When the cap is hit, the response includes a truncated_properties warning with a how_to_fetch_all hint.", + "type": "number" +}
- Changed
read_page1 field changed- added
Input schema / properties / max_property_itemsAdded value: +{ + "description": "Max rich_text segments returned when a page title exceeds 25 segments (uncommon in practice). Default 75. Set to 0 for unlimited. Negative values rejected. When the cap is hit, the response includes a truncated_properties warning with a how_to_fetch_all hint.", + "type": "number" +}
- Added
update_block - Added
update_data_source
26 tool updates
v0.2.4- First observed
add_comment - First observed
add_database_entries - First observed
add_database_entry - First observed
append_content - First observed
archive_page - First observed
create_database - First observed
create_page - First observed
delete_database_entry - First observed
duplicate_page - First observed
find_replace - First observed
get_database - First observed
get_me - First observed
list_comments - First observed
list_databases - First observed
list_pages - First observed
list_users - First observed
move_page - First observed
query_database - First observed
read_page - First observed
replace_content - First observed
restore_page - First observed
search - First observed
share_page - First observed
update_database_entry - First observed
update_page - First observed
update_section
TDQS
Scored across 43 tools
Most tools are clearly distinct by resource (page, block, toggle, database, view, comment, user). Some potential confusion exists between update_section/update_toggle/update_block and read_section/read_block/read_toggle, but descriptions clarify the target granularity. The pair add_database_entry/add_database_entries is intentionally similar but the plural is self-explanatory.
The set predominantly uses verb_noun naming (create_page, read_page, update_page, archive_page, restore_page, query_database, add_database_entry, delete_database_entry). Minor deviations exist: get_view vs list_views, get_database vs list_databases, and get_me/get_config don't follow the verb_noun pattern, but the overall convention is consistent and predictable.
43 tools is on the heavy side for a single MCP server, but the breadth roughly matches Notion's feature surface (pages, blocks, toggles, databases, views, comments, users). The count is justified by the domain, though it approaches the upper bound where navigation becomes burdensome.
The tool surface covers the full lifecycle for pages (create, read, update, archive, restore, duplicate, move), blocks (read, update, delete, append, replace), toggles (read, update, archive, restore), databases (create, get, list, query, update schema, add/update/delete entries), views (list, create, update, delete), comments, and users. Notable gaps like subpage deep-duplication and database inline toggling are explicitly documented as limitations rather than missing coverage.
Maintenance
Related MCP Connectors
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
MCP-native open-source Notion alternative: read & write pages, databases and kanban boards.
One memory, every AI. A shared, user-owned markdown memory your AI clients read and write over MCP.
MCP-native collaborative markdown editor with real-time AI document editing
Related MCP Servers
- AlicenseAqualityFmaintenanceMarkdown-first MCP server for Notion that provides 7 composite action-based tools consolidating 28+ REST API endpoints, enabling AI agents to efficiently manage pages, databases, blocks, and content with automatic pagination and bulk operations.11146 npm36Apache 2.0
- AlicenseAqualityDmaintenanceAn MCP server that enables LLMs to interact with Notion workspaces via the Notion API, supporting page creation, database management, and content retrieval. It features markdown conversion to optimize token usage and enhanced error handling for more reliable workspace interactions.195 npm1MIT
- AlicenseBqualityCmaintenance🚀 Token-efficient MCP server for Confluence. Reduces LLM costs by 76% via Markdown conversion. Supports listing, searching, and fetching pages.33MIT
- AlicenseAqualityCmaintenanceA lightweight Notion MCP server that minimizes token usage by returning Markdown instead of raw JSON, enabling efficient read/write operations on Notion pages.9MIT