Skip to main content
Glama

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

npm license node Discord Glama

npx easy-notion-mcp

Verlo en acción → Página de Notion en vivo creada y gestionada íntegramente mediante easy-notion-mcp.

Raw JSON chaos vs clean markdown


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

file:///path en markdown

Solicitud de función abierta

✅ 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 {"Status": "Done"}

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-mcp

Esto 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_token

Esta 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_id

Los 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_ID

Los 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-http

Requiere 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/mcp

OpenClaw:

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-http

En 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. localhost dentro de un contenedor se refiere al propio contenedor, no a tu máquina anfitriona. host.docker.internal salva esa distancia.

Host HTTP y bearer: El servidor HTTP se vincula a 127.0.0.1 de forma predeterminada y el modo de token estático requiere NOTION_MCP_BEARER. host.docker.internal alcanza la IP de puente del host, así que establece NOTION_MCP_BIND_HOST=0.0.0.0 en 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

NOTION_TOKEN

Token de integración de la API de Notion

NOTION_ROOT_PAGE_ID

No

ID de página principal predeterminado

NOTION_TRUST_CONTENT

No

false

Omitir el aviso de contenido en las respuestas de lectura de markdown (read_page, read_section, read_block, read_toggle)

Acerca de los archivos .env (solo para colaboradores): easy-notion-mcp carga un archivo .env desde el directorio de trabajo actual mediante dotenv. En la práctica, esto significa que .env solo "funciona" cuando ejecutas el servidor desde un clon del repositorio (node dist/index.js después de npm install && npm run build), porque la raíz del repositorio es tu directorio de trabajo. No se carga cuando el paquete se invoca mediante npx easy-notion-mcp o una instalación global desde un directorio arbitrario; ese es el comportamiento estándar de la CLI de npm. Para la ruta de npx, pasa NOTION_TOKEN mediante la bandera -e en la configuración de Claude Code anterior, o mediante el bloque env de 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

NOTION_OAUTH_CLIENT_ID

Sí (modo OAuth)

ID de cliente OAuth de la integración pública de Notion

NOTION_OAUTH_CLIENT_SECRET

Sí (modo OAuth)

Secreto de cliente OAuth de la integración pública de Notion

PORT

No

3333

Puerto del servidor HTTP

OAUTH_REDIRECT_URI

No

http://localhost:{PORT}/callback

URL de devolución de llamada OAuth

NOTION_MCP_BIND_HOST

No

127.0.0.1

Dirección de enlace. El valor predeterminado es loopback; establece 0.0.0.0 para que sea accesible desde la red, o una interfaz específica como 192.168.1.5.

NOTION_MCP_BEARER

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-http

El 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

create_page

Crea una página a partir de markdown

create_page_from_file

Crea una página a partir de un archivo markdown local (solo stdio)

read_page

Lee una página como markdown

read_section

Lee una sección por nombre de encabezado

read_block

Lee un bloque por ID, incluidos los hijos anidados de los contenedores

read_toggle

Lee un toggle o un encabezado conmutable por título

search_in_page

Busca texto de bloque sin procesar en una página o en un toggle

append_content

Añade markdown a una página

replace_content

Reemplaza todo el contenido de la página de forma atómica (conserva los IDs de bloque de los bloques coincidentes)

update_section

Actualiza una sección por nombre de encabezado; reemplazo opcional del cuerpo que conserva el encabezado (destructivo; usa duplicate_page primero para contenido irremplazable)

update_toggle

Actualiza el cuerpo de un toggle por título (destructivo; conserva el ID del contenedor del toggle)

archive_toggle

Archiva un toggle o un encabezado conmutable por título

restore_toggle

Restaura un toggle o un encabezado conmutable archivado por ID de bloque archivado

find_replace

Busca y reemplaza texto, conservando archivos

update_block

Actualiza un solo bloque por ID (conserva la identidad del bloque para enlaces profundos y comentarios)

update_page

Actualiza el título, el icono o la portada

duplicate_page

Copia una página y su contenido

archive_page

Mueve una página a la papelera

move_page

Mueve una página a un nuevo padre

restore_page

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

list_pages

Lista las páginas hijas bajo un padre, con created_time y last_edited_time por fila

search

Busca páginas y bases de datos

share_page

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

create_database

Crea una base de datos con esquema tipado

update_data_source

Actualiza el esquema de la base de datos (añadir, renombrar o eliminar propiedades; cambiar el título; mover a la papelera o restaurar)

get_database

Obtiene el esquema de la base de datos, los nombres de propiedades y las opciones

list_databases

Lista todas las bases de datos a las que la integración puede acceder

query_database

Consulta con filtros, ordenaciones o búsqueda de texto

add_database_entry

Añade una fila usando pares clave-valor simples

add_database_entries

Añade varias filas en una sola llamada

update_database_entry

Actualiza una fila usando pares clave-valor simples

delete_database_entry

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_database para confirmar los nombres y tipos de propiedades. Tipos de propiedad admitidos para escrituras: title, rich_text, number, select, multi_select, date, checkbox, url, email, phone, status, relation, people. Para people, 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 para files, verification, place, location y button. 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

list_views

Lista las vistas guardadas de una base de datos o fuente de datos

get_view

Obtiene la configuración sin procesar de una vista guardada

query_view

Consulta entradas a través de una vista guardada

create_view

Crea una vista de tabla, lista, tablero, calendario, galería o línea de tiempo

update_view

Renombra o actualiza los campos sin procesar de filtro/ordenación/configuración de una vista guardada

delete_view

Elimina una vista guardada con confirmación explícita

Comentarios (2 herramientas)

Herramienta

Descripción

list_comments

Lista los comentarios de una página

add_comment

Añade un comentario a una página

Usuarios (2 herramientas)

Herramienta

Descripción

list_users

Lista los usuarios del espacio de trabajo

get_me

Obtiene el usuario bot actual

Servidor (1 herramienta)

Herramienta

Descripción

get_config

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

easy-notion://docs/markdown

Sintaxis de markdown admitida para escrituras y lecturas de páginas

easy-notion://docs/warnings

Códigos de advertencia y formas de respuesta

easy-notion://docs/property-pagination

Comportamiento de max_property_items para propiedades largas

easy-notion://docs/update-data-source

Modos de payload de update_data_source, ejemplos y notas de seguridad del esquema

¿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

# H1 ## H2 ### H3

Negrita, cursiva, tachado

**bold** *italic* ~~strike~~

Código en línea

`code`

Enlaces

[text](url)

Imágenes

![alt](url)

Lista con viñetas

- item

Lista numerada

1. item

Lista de tareas

- [ ] todo / - [x] done

Cita en bloque

> text

Bloque de código

```language

Tabla

Sintaxis estándar de tabla con tuberías

Divisor

---

Sintaxis específica de Notion

Bloque

Sintaxis

Alternancia

+++ Title ... +++

Columnas

::: columns / ::: column ... :::

Llamada (nota)

> [!NOTE]

Llamada (consejo)

> [!TIP]

Llamada (advertencia)

> [!WARNING]

Llamada (importante)

> [!IMPORTANT]

Llamada (información)

> [!INFO]

Llamada (éxito)

> [!SUCCESS]

Llamada (error)

> [!ERROR]

Ecuación

$$expression$$

Tabla de contenido

[toc]

Incrustar

[embed](url)

Marcador

URL desnuda en su propia línea

Subida de archivo (imagen)

![alt](file:///path/to/image.png)

Subida de archivo (archivo)

[name](file:///path/to/file.pdf)

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-wraps

No 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

create_page, create_page_from_file, append_content, update_section, update_toggle, update_block

Se mantiene dentro del bloque

replace_content

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-h1

create_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. Pase preserve_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 ![alt](file:///path/to/image.png) 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 tools
add_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 }.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesComment text (supports markdown inline formatting)
page_idYesPage ID
collapse_soft_wrapsNoCollapse 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

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
entriesYesArray of property objects, same format as add_database_entry
page_idNoAlias 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_idNoDatabase ID

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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

The description states a specific verb and resource: '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.

Usage Guidelines4/5

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"] }.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_idNoAlias 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.
propertiesYesKey-value property map to convert using the database schema
database_idNoDatabase ID

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_idYesPage ID
markdownYesMarkdown to append
return_block_mapNoInclude 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_wrapsNoCollapse 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

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNoPreview the archive target without mutating Notion. Default false.
page_idYesPage ID

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesToggle title to find (case-insensitive)
dry_runNoPreview the archive target without mutating Notion. Default false.
page_idYesPage ID

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesDatabase title
schemaYesArray of {name, type} property definitions
is_inlineNoCreate the database inline within the parent page
parent_page_idYesParent page ID

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
iconNoOptional emoji icon
coverNoOptional cover image URL
titleYesPage title
markdownYesMarkdown content for the page body
parent_page_idNoParent 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_mapNoInclude 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_h1NoRemove 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_wrapsNoCollapse 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

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesPage title
file_pathYesAbsolute path to a local .md or .markdown file (≤ 1 MB, UTF-8, inside the configured workspace root)
parent_page_idNoParent page ID. Same resolution rules as create_page.
return_block_mapNoInclude 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_h1NoRemove 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_wrapsNoCollapse 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

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesView name
typeYesView type. Dashboard is intentionally unsupported.
sortsNoRaw Notion view sorts payload
filterNoRaw Notion view filter payload
positionNoRaw Notion view tab position payload
database_idYesDatabase ID
configurationNoRaw Notion view configuration payload. Dashboard configuration is rejected.
quick_filtersNoRaw Notion quick filters payload

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNoPreview the entry archive/delete target without mutating Notion. Default false.
page_idYesDatabase entry page ID

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be exactly true to delete the view unless dry_run is true
dry_runNoPreview the delete target without mutating Notion. Default false.
view_idYesView ID

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoTitle for the new page. Defaults to source title + ' (Copy)'
page_idYesSource page ID to duplicate
parent_page_idNoParent page ID for the new page. Falls back to source page's parent, then follows the same resolution as create_page.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
findYesText to find (exact match)
dry_runNoPreview match counts without mutating Notion. Default false.
page_idYesPage ID
replaceYesReplacement text
replace_allNoReplace all occurrences. Default: first only.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 }.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_idNoAlias 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_idNoDatabase ID

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
view_idYesView ID
include_configNoReturn the full raw Notion view objects (filter, sorts, configuration, parent) instead of the curated summary. Default false.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_idYesPage ID

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
parent_page_idYesParent page ID

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_sizeNoMaximum number of views to return
database_idNoDatabase ID
start_cursorNoPagination cursor from a previous response
data_source_idNoData source ID
include_configNoReturn the full raw Notion view objects (filter, sorts, configuration, parent) instead of the curated summary. Default false.

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_idYesPage ID to move
new_parent_idYesNew parent page ID

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoSearch text — matches across all text fields (title, rich_text, url, email, phone)
sortsNoOptional Notion sorts array
filterNoOptional Notion filter object
page_idNoAlias 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_idNoDatabase ID
max_property_itemsNoMax 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

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
view_idYesView ID
page_sizeNoMaximum number of results to return
start_cursorNoPagination cursor from a previous view query results response

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
block_idYesBlock ID

TDQS

A3.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_idYesPage ID
max_blocksNoMaximum top-level blocks to return. Omit to return all.
include_metadataNoInclude created_time, last_edited_time, created_by, last_edited_by in response. Default false.
include_transcriptNoInclude Notion AI meeting-notes transcript sections. Default false. Summary and Notes sections are always included when present.
max_property_itemsNoMax 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

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
headingYesHeading text to find (case-insensitive)
page_idYesPage ID

TDQS

A3.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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

Schema coverage is 100%, so the schema already documents 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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesToggle title to find (case-insensitive)
page_idYesPage ID

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNoPreview validation and planned effect without mutating Notion. Default false.
page_idYesPage ID
markdownYesReplacement markdown content
return_block_mapNoInclude 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_wrapsNoCollapse 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

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3, 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_idYesPage ID

TDQS

A3.7/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNoPreview the restore target without mutating Notion. Default false.
block_idYesArchived toggle or toggleable heading block ID returned by archive_toggle

TDQS

A3.7/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesPlain substring to search for (case-insensitive, non-empty)
page_idYesPage ID
within_toggleNoOptional toggle title to restrict search scope (case-insensitive)

TDQS

A3.7/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

share_pageA

Return the page URL that can be shared from Notion.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_idYesPage ID

TDQS

A3.6/5.0
Behavior2/5

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

No annotations are provided, and the description lacks details on behavioral traits such as side effects, permissions, or rate limits. It only states what it returns without clarifying if it modifies state.

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

Conciseness5/5

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

The description is a single sentence that is front-loaded and contains no unnecessary words.

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

Completeness4/5

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

Given the simplicity of the tool (one parameter, no output schema), the description is fairly complete. It could mention the return format or error handling, but overall it suffices.

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

Parameters3/5

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

Schema coverage is 100% with one parameter described as 'Page ID'. The description adds no additional 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.

Purpose5/5

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

The description clearly states it returns a shareable URL for a Notion page, using a specific verb and resource. It distinguishes itself from sibling tools like read_page or get_database.

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

Usage Guidelines3/5

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. The purpose is implied, but there are no explicit when-to-use or when-not-to-use conditions.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
checkedNoto_do only: explicit check-state override (otherwise inferred from `- [x]` / `- [ ]`).
dry_runNoPreview validation and planned effect without mutating Notion. Default false.
archivedNoSet true to delete the block (sends in_trash: true).
block_idYesBlock ID to update
markdownNoNew 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_wrapsNoCollapse 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

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
page_idYesPage ID for the database entry
propertiesYesKey-value property map to convert using the parent database schema

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoNew database title
page_idNoAlias 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_trashNoTrue to trash, false to restore
propertiesNoRaw Notion property update map
database_idNoDatabase ID

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
iconNoUpdated emoji icon
coverNoUpdated cover image URL
titleNoUpdated page title
page_idYesPage ID

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNoPreview validation and planned effect without mutating Notion. Default false.
headingYesHeading text to find (case-insensitive)
page_idYesPage ID
markdownYesReplacement markdown including the heading
preserve_headingNoPreserve the existing heading block and replace only the section body. Default false.
return_block_mapNoInclude 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_wrapsNoCollapse 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

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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

The description states a specific verb and resource: '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.

Usage Guidelines5/5

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 }.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesToggle title to find (case-insensitive)
dry_runNoPreview validation and planned effect without mutating Notion. Default false.
page_idYesPage ID
markdownYesReplacement markdown for the toggle body
return_block_mapNoInclude 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_wrapsNoCollapse 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

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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

The description states a specific verb and resource: '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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoUpdated view name
sortsNoRaw Notion view sorts payload, or null to clear
filterNoRaw Notion view filter payload, or null to clear
view_idYesView ID
configurationNoRaw Notion view configuration payload. Dashboard configuration is rejected.
quick_filtersNoRaw Notion quick filters payload, or null to clear

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 14 tool updatesv1.1.0
    • Changedadd_comment1 field changed
      • addedInput schema / properties / collapse_soft_wraps
        Added 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"
        +}
    • Changedadd_database_entries3 fields changed
      • addedInput schema / anyOf
        Added value: +[
        +  {
        +    "required": [
        +      "database_id"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "page_id"
        +    ]
        +  }
        +]
      • addedInput schema / properties / page_id
        Added 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"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "database_id",
        -  "entries"
        -]New value: +[
        +  "entries"
        +]
    • Changedadd_database_entry3 fields changed
      • addedInput schema / anyOf
        Added value: +[
        +  {
        +    "required": [
        +      "database_id"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "page_id"
        +    ]
        +  }
        +]
      • addedInput schema / properties / page_id
        Added 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"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "database_id",
        -  "properties"
        -]New value: +[
        +  "properties"
        +]
    • Changedappend_content2 fields changed
      • addedInput schema / properties / collapse_soft_wraps
        Added 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"
        +}
      • addedInput schema / properties / return_block_map
        Added 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"
        +}
    • Changedcreate_page3 fields changed
      • addedInput schema / properties / collapse_soft_wraps
        Added 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"
        +}
      • addedInput schema / properties / return_block_map
        Added 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"
        +}
      • addedInput schema / properties / strip_leading_h1
        Added 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"
        +}
    • Changedcreate_page_from_file3 fields changed
      • addedInput schema / properties / collapse_soft_wraps
        Added 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"
        +}
      • addedInput schema / properties / return_block_map
        Added 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"
        +}
      • addedInput schema / properties / strip_leading_h1
        Added 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"
        +}
    • Addedget_config
    • Changedget_database3 fields changed
      • addedInput schema / anyOf
        Added value: +[
        +  {
        +    "required": [
        +      "database_id"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "page_id"
        +    ]
        +  }
        +]
      • addedInput schema / properties / page_id
        Added 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"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "database_id"
        -]
    • Changedquery_database3 fields changed
      • addedInput schema / anyOf
        Added value: +[
        +  {
        +    "required": [
        +      "database_id"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "page_id"
        +    ]
        +  }
        +]
      • addedInput schema / properties / page_id
        Added 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"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "database_id"
        -]
    • Changedreplace_content2 fields changed
      • addedInput schema / properties / collapse_soft_wraps
        Added 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"
        +}
      • addedInput schema / properties / return_block_map
        Added 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"
        +}
    • Changedupdate_block1 field changed
      • addedInput schema / properties / collapse_soft_wraps
        Added 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"
        +}
    • Changedupdate_data_source3 fields changed
      • addedInput schema / anyOf
        Added value: +[
        +  {
        +    "required": [
        +      "database_id"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "page_id"
        +    ]
        +  }
        +]
      • addedInput schema / properties / page_id
        Added 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"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "database_id"
        -]
    • Changedupdate_section2 fields changed
      • addedInput schema / properties / collapse_soft_wraps
        Added 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"
        +}
      • addedInput schema / properties / return_block_map
        Added 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"
        +}
    • Changedupdate_toggle2 fields changed
      • addedInput schema / properties / collapse_soft_wraps
        Added 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"
        +}
      • addedInput schema / properties / return_block_map
        Added 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. 2 tool updatesv1.0.1
    • Changedget_view1 field changed
      • addedInput schema / properties / include_config
        Added value: +{
        +  "description": "Return the full raw Notion view objects (filter, sorts, configuration, parent) instead of the curated summary. Default false.",
        +  "type": "boolean"
        +}
    • Changedlist_views1 field changed
      • addedInput schema / properties / include_config
        Added value: +{
        +  "description": "Return the full raw Notion view objects (filter, sorts, configuration, parent) instead of the curated summary. Default false.",
        +  "type": "boolean"
        +}
  3. 1 tool updatev0.9.1
    • Changedread_page1 field changed
      • addedInput schema / properties / include_transcript
        Added value: +{
        +  "description": "Include Notion AI meeting-notes transcript sections. Default false. Summary and Notes sections are always included when present.",
        +  "type": "boolean"
        +}
  4. 19 tool updatesv0.9.0
    • Changedarchive_page1 field changed
      • addedInput schema / properties / dry_run
        Added value: +{
        +  "description": "Preview the archive target without mutating Notion. Default false.",
        +  "type": "boolean"
        +}
    • Addedarchive_toggle
    • Addedcreate_view
    • Changeddelete_database_entry1 field changed
      • addedInput schema / properties / dry_run
        Added value: +{
        +  "description": "Preview the entry archive/delete target without mutating Notion. Default false.",
        +  "type": "boolean"
        +}
    • Addeddelete_view
    • Changedfind_replace1 field changed
      • addedInput schema / properties / dry_run
        Added value: +{
        +  "description": "Preview match counts without mutating Notion. Default false.",
        +  "type": "boolean"
        +}
    • Addedget_view
    • Addedlist_views
    • Addedquery_view
    • Addedread_block
    • Addedread_section
    • Addedread_toggle
    • Changedreplace_content1 field changed
      • addedInput schema / properties / dry_run
        Added value: +{
        +  "description": "Preview validation and planned effect without mutating Notion. Default false.",
        +  "type": "boolean"
        +}
    • Addedrestore_toggle
    • Addedsearch_in_page
    • Changedupdate_block1 field changed
      • addedInput schema / properties / dry_run
        Added value: +{
        +  "description": "Preview validation and planned effect without mutating Notion. Default false.",
        +  "type": "boolean"
        +}
    • Changedupdate_section2 fields changed
      • addedInput schema / properties / dry_run
        Added value: +{
        +  "description": "Preview validation and planned effect without mutating Notion. Default false.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / preserve_heading
        Added value: +{
        +  "description": "Preserve the existing heading block and replace only the section body. Default false.",
        +  "type": "boolean"
        +}
    • Addedupdate_toggle
    • Addedupdate_view
  5. 6 tool updatesv0.6.0
    • Changedcreate_database1 field changed
      • addedInput schema / properties / is_inline
        Added value: +{
        +  "description": "Create the database inline within the parent page",
        +  "type": "boolean"
        +}
    • Addedcreate_page_from_file
    • Changedquery_database1 field changed
      • addedInput schema / properties / max_property_items
        Added 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"
        +}
    • Changedread_page1 field changed
      • addedInput schema / properties / max_property_items
        Added 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"
        +}
    • Addedupdate_block
    • Addedupdate_data_source
  6. 26 tool updatesv0.2.4
    • First observedadd_comment
    • First observedadd_database_entries
    • First observedadd_database_entry
    • First observedappend_content
    • First observedarchive_page
    • First observedcreate_database
    • First observedcreate_page
    • First observeddelete_database_entry
    • First observedduplicate_page
    • First observedfind_replace
    • First observedget_database
    • First observedget_me
    • First observedlist_comments
    • First observedlist_databases
    • First observedlist_pages
    • First observedlist_users
    • First observedmove_page
    • First observedquery_database
    • First observedread_page
    • First observedreplace_content
    • First observedrestore_page
    • First observedsearch
    • First observedshare_page
    • First observedupdate_database_entry
    • First observedupdate_page
    • First observedupdate_section

TDQS

A3.7/5.0

Scored across 43 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count3/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers