Skip to main content
Glama

notion-mcp

An MCP server for the Notion API: pages, databases (2025-09+ data-source model handled transparently), native markdown read/write, comments, users, and a full file pipeline — upload/replace/import/download with positional inserts, page icons/covers, multi-part upload for large files, and in-place PDF reading with optional OCR. Built on the Python MCP SDK (FastMCP); runs as a local stdio server or a containerized Streamable HTTP service with bearer auth. 55 tools.

Unofficial project, not affiliated with or endorsed by Notion.

Table of Contents

Related MCP server: Markdown-To-Notion

Quick Start

# Prerequisites: Python 3.12+, uv
uv sync

# Set your Notion integration token
export NOTION_TOKEN=ntn_...

# Run the server
uv run notion-mcp
# Server starts on http://0.0.0.0:8322/mcp

Create a Notion internal integration and share the pages/databases you want to access with it.


Tool Reference

Search & Discovery

notion_search_pages

Search for pages the integration can access.

Parameter

Type

Required

Default

Description

query

string

yes

Text to search for

limit

int

no

10

Max results (1-100)

in_trash

bool

no

false

Search trashed pages instead of active ones (2026-07 API addition; restore hits with notion_restore_page)

Returns page titles, IDs, and URLs. Use the page ID with any tool that accepts page_id.

Notion API: POST /search with filter.value = "page"

notion_search_databases

Search for databases the integration can access. Returns schema summaries.

Parameter

Type

Required

Default

Description

query

string

yes

Text to search for

limit

int

no

10

Max results

Returns database_id, data_source_id, property names and types. Use the database_id with database tools.

Notion API: POST /search with filter.value = "data_source" (changed from "database" in API 2025-09-03)

notion_list_files_on_page

List all file/image/pdf/video/audio blocks on a page.

Parameter

Type

Required

Description

page_id

string

yes

The page to scan

Returns block IDs, filenames, block types, and source types. Use the block_id with notion_download_file.

Notion API: GET /blocks/{id}/children, filtered to file-type blocks

notion_list_local_files

List files in either the server's local file store (/data/files inside the container) or the cross-MCP shared mount (/shared).

Parameter

Type

Required

Default

Description

filter

string

no

""

Substring filter on filename

location

string

no

"files"

"files" (the notion-mcp private store, FILES_DIR) or "shared" (the cross-MCP mount, SHARED_DIR, populated by google-accounts-mcp download_attachment(destination='shared'))

notion_purge_shared_files

Delete files from the cross-MCP shared mount (SHARED_DIR, /shared in the container) whose modification time is older than max_age_hours. Pair with a host-side cron/timer TTL sweep if you want automatic cleanup; this tool is mainly for agents that want to clean up proactively at the end of a workflow.

Parameter

Type

Required

Default

Description

max_age_hours

float

no

24.0

Minimum file age before deletion. Must be ≥ 0.

dry_run

bool

no

False

List victims without deleting

Regular files only — subdirectories are left alone on principle.


Reading Pages

There are two ways to read page content, optimized for different use cases.

notion_read_page

Read page content by fetching blocks and rendering them as markdown. Best for structured reading with optional block-level targeting.

Parameter

Type

Required

Default

Description

page_id

string

yes

The page to read

max_depth

int

no

3

Recursion depth for nested blocks (1-5)

include_block_ids

bool

no

false

Suffix each line with <!-- block:UUID -->

When include_block_ids is true, each rendered line includes the block's UUID in an HTML comment. Use these IDs with notion_update_block or notion_delete_block for surgical edits.

Notion API: GET /blocks/{id}/children (recursive). Blocks are converted to markdown by blocks.py.

notion_read_page_markdown

Read page content using Notion's native markdown API. Faster (single API call) and returns Notion-flavored markdown including special tags for embedded databases, files, and page links.

Parameter

Type

Required

Description

page_id

string

yes

The page to read

The output includes Notion-specific tags like <database url="...">, <file src="...">, and <page url="..."> that aren't standard markdown but are useful for understanding page structure.

Notion API: GET /pages/{id}/markdown (API 2025-09-03+)

When to use which:

  • notion_read_page — when you need block IDs for editing, or want clean standard markdown

  • notion_read_page_markdown — when you need speed, or want to see Notion-native structure (databases, synced blocks, etc.)


Creating & Writing Pages

notion_create_page

Create a new page with optional markdown body content.

Parameter

Type

Required

Default

Description

title

string

yes

Page title

content

string

no

""

Markdown body content

parent_page_id

string

no

""

Create as child of this page

database_id

string

no

""

Create as row in this database

properties_json

string

no

""

JSON object of Notion property values

icon

string

no

""

Page icon — see icon values

template

string

no

""

Database rows: "default" or a template ID from notion_list_templates. The template supplies the body, so leave content empty

position

string

no

""

Where the page lands among a parent page's children: "start", "end", or a block ID to insert after

silent

bool

no

false

Skip the update, @mention and Person-property notifications this write would send

native_markdown

bool

no

false

Send content to Notion's own markdown parser instead of converting it to blocks locally (Notion-specific markup; very large pages run as a background task)

markdown_version

string

no

""

With native_markdown: "v2" opts into Notion-flavored Markdown (preview)

Provide either parent_page_id (standalone page) or database_id (database row). The title property name is auto-detected from the database schema.

Icon values (notion_create_page, notion_update_page): an emoji ("🚀"), "custom_emoji:<name-or-id>" (names are resolved through notion_list_custom_emojis), "icon:<name>[:<color>]" for a native Notion icon (e.g. "icon:pizza:blue"), or an image URL. notion_update_page also takes "remove".

Wiki page verification is an ordinary property: {"Verification": {"verification": {"state": "verified"}}} in properties_json.

With native_markdown, the request is sent with allow_async; the server waits for Notion's background task (up to ~150 s). If it is still running, the reply carries a task ID for notion_get_async_task — do not retry, or the page is created twice.

For database rows, pass additional properties via properties_json using Notion property value format:

{
  "Status": {"select": {"name": "In Progress"}},
  "Priority": {"number": 5},
  "Due": {"date": {"start": "2026-03-15"}}
}

The content parameter accepts markdown which is parsed into Notion blocks (see Markdown Format).

Notion API: POST /pages with children blocks, or markdown + allow_async; template, position, notifications

notion_append_content

Add markdown content to an existing page.

Parameter

Type

Required

Default

Description

page_id

string

yes

The page (or any block that supports children) to add to

content

string

yes

Markdown text to add

position

string

no

"end"

"end", "start", or a block ID to insert directly after

silent

bool

no

false

Skip the notifications this write would send

Content is parsed into blocks locally. Automatically batches in groups of 100 if the content produces more than 100 blocks (Notion API limit); later batches follow the first, so a positioned insert stays in order.

Notion API: PATCH /blocks/{id}/children

notion_insert_page_content

Insert markdown using Notion's own parser — at the start, the end, or after a piece of existing text. Understands Notion-specific markup that notion_append_content does not.

Parameter

Type

Required

Default

Description

page_id

string

yes

The page to insert into

markdown

string

yes

Content to insert

position

string

no

"end"

"end" or "start"; ignored when after is given

after

string

no

""

Insert after this passage, given as "start text...end text"

Notion API: PATCH /pages/{id}/markdown with type: "insert_content"

notion_add_tabs

Add a tab block: a row of tabs, each with its own content.

Parameter

Type

Required

Default

Description

page_id

string

yes

The page (or child-bearing block) to add to

tabs_json

string

yes

JSON array of {"label", "icon"?, "content"?} — icon is an emoji, content is markdown

position

string

no

"end"

"end", "start", or a block ID to insert after

Tabs are created first and their content appended in a second pass, so tab content may itself be nested.

Notion API: Tab block


Editing Page Content

notion_update_page

Update a page's title, icon, or database properties. Does not modify page body content.

Parameter

Type

Required

Default

Description

page_id

string

yes

The page to update

title

string

no

""

New title

properties_json

string

no

""

JSON of properties to update

icon

string

no

""

"remove" to clear, or any of the icon values

silent

bool

no

false

Skip the notifications this write would send

For database row pages, properties follow the Notion property value format. Omitted properties are left unchanged.

Notion API: PATCH /pages/{id}

notion_update_page_content

Edit page body content using search-and-replace on the page's markdown. Use notion_read_page_markdown first to see the exact content, then provide the text to find and replace.

Parameter

Type

Required

Description

page_id

string

yes

The page to edit

old_text

string

yes

Exact text to find

new_text

string

yes

Replacement text (empty string to delete)

replace_all

bool

no

If old_text occurs more than once the edit is rejected unless this is true

allow_deleting_content

bool

no

Must be true for an edit that would delete a child page or database

Notion API: PATCH /pages/{id}/markdown with type: "update_content" (the deprecated replace_content_range was used before 2026-10)

notion_replace_page_content

Replace a page's entire body content with new markdown. Destructive — all existing content is overwritten.

Parameter

Type

Required

Description

page_id

string

yes

The page to overwrite

markdown

string

yes

New page content

allow_deleting_content

bool

no

Must be true when the replacement would delete a child page or database

markdown_version

string

no

"v2" treats markdown as Notion-flavored Markdown (preview)

Sent with allow_async: a very large page is processed as a background task, which the server waits for (up to ~150 s). If it is still running the reply carries a task ID.

Notion API: PATCH /pages/{id}/markdown with type: "replace_content" (API 2025-09-03+)

notion_get_async_task

Check a background write that had not finished when the tool that started it returned.

Parameter

Type

Required

Description

task_id

string

yes

Task ID from that tool's reply

Notion API: GET /async_tasks/{id}


Page Lifecycle

notion_archive_page

Archive (soft-delete) a page. It moves to the Notion trash and can be restored within 30 days.

Parameter

Type

Required

Description

page_id

string

yes

The page to archive

Notion API: PATCH /pages/{id} with {"archived": true}

notion_restore_page

Restore an archived page from the Notion trash.

Parameter

Type

Required

Description

page_id

string

yes

The archived page to restore

Notion API: PATCH /pages/{id} with {"archived": false}

notion_move_page

Move a page to a new parent page or into a database.

Parameter

Type

Required

Default

Description

page_id

string

yes

The page to move

new_parent_page_id

string

no

""

Move under this page

new_parent_database_id

string

no

""

Move into this database

Provide exactly one of the parent parameters. When moving into a database, the server automatically resolves the data_source_id.

Notion API: POST /pages/{id}/move (API 2025-09-03+)


Block Operations

Use notion_read_page with include_block_ids=true to get block IDs for these tools.

notion_update_block

Edit an existing block's text content in place.

Parameter

Type

Required

Default

Description

block_id

string

yes

The block to edit

content

string

yes

New text (supports inline markdown)

block_type

string

no

auto-detect

Block type hint

If block_type is omitted, the server fetches the block to detect its type. Supported types: paragraph, heading_1, heading_2, heading_3, bulleted_list_item, numbered_list_item, to_do, quote, callout, toggle, code.

Notion API: PATCH /blocks/{id}

notion_delete_block

Permanently delete a block and all its children.

Parameter

Type

Required

Description

block_id

string

yes

The block to delete

Notion API: DELETE /blocks/{id}


Database Schema

notion_describe_database

Get a database's full property schema (column names and types).

Parameter

Type

Required

Description

database_id

string

yes

The database to describe

Returns the database_id, data_source_id, and all properties with their types. Use this to discover exact property names (case-sensitive) before querying or creating rows.

Notion API: GET /databases/{id} + GET /data_sources/{id}

notion_create_database

Create a new database under a page — with your own schema, or one of Notion's typed databases.

Parameter

Type

Required

Default

Description

parent_page_id

string

yes

Page to create the database under

title

string

no

""

Database title (a typed database is otherwise named after its type)

schema_json

string

no

""

JSON property schema

database_type

string

no

""

"tasks", "projects" or "skills": Notion's built-in schema instead of schema_json

inline

bool

no

false

Show the database inline on the parent page

Provide exactly one of schema_json and database_type.

The schema_json maps property names to Notion property schema objects. A title property is required:

{
  "Name": {"title": {}},
  "Status": {"select": {"options": [
    {"name": "To Do", "color": "red"},
    {"name": "In Progress", "color": "yellow"},
    {"name": "Done", "color": "green"}
  ]}},
  "Due Date": {"date": {}},
  "Priority": {"number": {"format": "number"}},
  "Tags": {"multi_select": {"options": [
    {"name": "bug", "color": "red"},
    {"name": "feature", "color": "blue"}
  ]}},
  "Assignee": {"people": {}},
  "Done": {"checkbox": {}},
  "Notes": {"rich_text": {}},
  "Link": {"url": {}}
}

Notion API: POST /databases

notion_update_database

Modify a database's title, description, or property schema.

Parameter

Type

Required

Default

Description

database_id

string

yes

The database to update

title

string

no

""

New title

description

string

no

""

New description

properties_json

string

no

""

JSON of property changes

Property changes use Notion's property schema format:

// Add a column
{"New Column": {"rich_text": {}}}

// Remove a column
{"Old Column": null}

// Rename a column
{"Old Column": {"name": "New Name"}}

// Add select options
{"Status": {"select": {"options": [{"name": "Blocked", "color": "red"}]}}}

Multiple changes can be combined in one call.

Notion API: PATCH /data_sources/{id} (routed through data source in API 2025-09-03)


notion_add_data_source

Add another data source (a second table with its own schema) to an existing database. The other database tools operate on a database's first data source.

Parameter

Type

Required

Description

database_id

string

yes

The database to add to

title

string

yes

Name of the new data source

schema_json

string

yes

Property schema (same format as notion_create_database)

Notion API: POST /data_sources

notion_list_templates

List the page templates defined on a database. Pass a template ID (or "default") as notion_create_page's template.

Parameter

Type

Required

Description

database_id

string

yes

The database to inspect

name

string

no

Case-insensitive substring filter

Notion API: GET /data_sources/{id}/templates


Database Queries

notion_query_database

Query database rows with optional filter and sort.

Parameter

Type

Required

Default

Description

database_id

string

yes

The database to query

filter_json

string

no

""

Notion filter object as JSON

sorts_json

string

no

""

Notion sort array as JSON

limit

int

no

50

Page size (1-100 — Notion's hard cap)

start_cursor

string

no

""

Opaque cursor from a previous call. Pass it back to fetch the next page.

archived

bool

no

false

Return the database's archived rows instead of the active ones

properties

string

no

""

Comma-separated property names to include in the output (e.g. "Gmail Message ID, Invoice, Status"). The title column is always shown. Unknown names are ignored silently. Dramatically slims output when you only need a few columns.

Filter examples:

// Simple property filter
{"property": "Status", "select": {"equals": "Done"}}

// Number comparison
{"property": "Priority", "number": {"greater_than": 3}}

// Date filter
{"property": "Due", "date": {"before": "2026-04-01"}}

// Checkbox
{"property": "Done", "checkbox": {"equals": true}}

// Text contains
{"property": "Name", "title": {"contains": "meeting"}}

// Compound filter (AND)
{"and": [
  {"property": "Status", "select": {"equals": "Active"}},
  {"property": "Priority", "number": {"greater_than": 3}}
]}

// Compound filter (OR)
{"or": [
  {"property": "Status", "select": {"equals": "To Do"}},
  {"property": "Status", "select": {"equals": "In Progress"}}
]}

Sort examples:

// Single sort
[{"property": "Due", "direction": "ascending"}]

// Multiple sorts
[
  {"property": "Priority", "direction": "descending"},
  {"property": "Name", "direction": "ascending"}
]

// Sort by timestamp
[{"timestamp": "last_edited_time", "direction": "descending"}]

Results are returned one page at a time. Each response ends with a has_more: <bool> next_cursor: <token-or-(end)> line; when has_more is true, pass the next_cursor value back as start_cursor on the next call to walk the next page. This gives the LLM bounded- context pagination — walk a 10 000-row database 100 rows at a time without ever materialising the whole thing in the tool output.

When properties is set, only the listed columns are included in the per-row output (the title column is always shown). This is the fix for "the query returns the full schema for every row and blows the context budget" — set properties="Gmail Message ID,Invoice" and the response shrinks to just those columns per row.

Notion API: POST /data_sources/{id}/query (API 2025-09-03+; the server resolves database_id to data_source_id automatically)

notion_get_property

Retrieve a single property value with full pagination. Useful for large relation, rollup, or rich_text properties that get truncated in normal page responses.

Parameter

Type

Required

Default

Description

page_id

string

yes

The page (row) to read from

property_name

string

no

""

Human-readable property name

property_id

string

no

""

Notion property ID (takes precedence)

Notion API: GET /pages/{id}/properties/{property_id}


Database Rows & Files

notion_upload_file

Upload a file and attach it to a page as a new block.

Parameter

Type

Required

Default

Description

source

string

yes

File source (see below)

parent_page_id

string

yes

Page — or any block that supports children (toggle, column, callout, ...) — to attach the file to

filename

string

no

""

Override the source filename

caption

string

no

""

Caption shown below the file in Notion

position

string

no

"end"

Where the new block lands: "end", "start", or a block ID to insert directly after that block

embed_html

bool

no

false

Attach an .html/.htm file as an embed block that Notion renders in the page, instead of a downloadable file block

The source parameter accepts four schemes:

  • local:<path> — file from the server's local store (/data/files)

  • shared:<filename> — file from the cross-MCP shared mount (/shared). Populated by google-accounts-mcp download_attachment(destination='shared'). Preferred path for gmail → notion attachment handoffs; no base64, no size limit.

  • drive:<name-or-id> — file from the shared Google Drive folder

  • base64:<data> — raw base64-encoded content (requires filename). Subject to MCP parameter size limits; prefer shared: or drive: for anything over ~20 KB.

The block type (image, pdf, video, audio, file) is auto-detected from the MIME type. Files over 20 MB are uploaded via Notion's multi-part protocol automatically (10 MiB parts + complete). The response includes the new block's ID and the sha256 of the uploaded bytes.

Notion API: POST /file_uploads (single-part or multi-part) + PATCH /blocks/{id}/children (with position)

notion_replace_file

Replace the file inside an existing file/image/pdf/video/audio block, in place — the block keeps its position on the page. Use this to update a document without re-arranging anything.

Parameter

Type

Required

Default

Description

block_id

string

yes

The file block to update (from notion_list_files_on_page)

source

string

yes

Same schemes as notion_upload_file

filename

string

no

""

Override the source filename

caption

string

no

""

Non-empty replaces the caption; empty leaves it untouched

The new file must map to the same block type as the existing block (you cannot replace an image block's content with a PDF — delete and re-upload instead).

Notion API: PATCH /blocks/{id} with a file_upload reference

notion_import_file_from_url

Import a file into Notion directly from a public HTTPS URL — the bytes go Notion-side, never through this server or MCP parameters. The import is asynchronous; the tool polls until done or wait_seconds elapses.

Parameter

Type

Required

Default

Description

url

string

yes

Public HTTPS URL

parent_page_id

string

yes

Page (or child-bearing block) to attach to

filename

string

yes

Must carry an extension Notion accepts; determines block type

caption

string

no

""

Caption

position

string

no

"end"

As in notion_upload_file

wait_seconds

int

no

60

Max time to poll for the async import

Size limits are plan-dependent (5 MiB free / 5 GiB paid workspaces).

Notion API: POST /file_uploads with mode=external_url + GET /file_uploads/{id} polling

notion_set_page_visual

Set or remove a page's icon or cover image.

Parameter

Type

Required

Default

Description

page_id

string

yes

Target page

target

string

yes

"icon" or "cover"

source

string

no

""

An image via the usual schemes

emoji

string

no

""

Single emoji character (icon only)

filename

string

no

""

Override for source

remove

bool

no

false

Clear the icon/cover entirely

Provide exactly one of source, emoji, or remove=True. Covers/icons from source must be images.

Notion API: PATCH /pages/{id} with icon / cover

notion_upload_file_to_database

Create a new database row with a file attached.

Parameter

Type

Required

Default

Description

database_id

string

yes

Target database

source

string

yes

File source (same schemes as above)

files_property

string

yes

Exact name of the files column (case-sensitive)

title

string

yes

Title for the new row

title_property

string

no

auto-detect

Override the title column name

filename

string

no

""

Override the source filename

Use notion_describe_database first to find the exact files_property name.

Notion API: POST /file_uploads + POST /pages

notion_add_file_to_row

Add a file to an existing database row's files column.

Parameter

Type

Required

Default

Description

page_id

string

yes

The row (page) ID

source

string

yes

File source

files_property

string

yes

Exact name of the files column

mode

string

no

"append"

"append" or "replace"

filename

string

no

""

Override the source filename

Notion API: POST /file_uploads + PATCH /pages/{id}

notion_batch_add_file_to_row

Attach files to many existing rows in one call.

Parameter

Type

Required

Default

Description

items_json

string

yes

JSON array of item objects (see below)

default_files_property

string

no

""

Default files_property for items that omit it

default_mode

string

no

"append"

Default mode for items that omit it

Each item in items_json takes the same fields as the single-shot tool: page_id, source, optional filename, optional files_property, optional mode. Defaults fill in any field left off at the item level.

[
  {"page_id": "p1", "source": "shared:m1_invoice.pdf"},
  {"page_id": "p2", "source": "shared:m2_invoice.pdf", "filename": "Renamed.pdf"},
  {"page_id": "p3", "source": "drive:<file_id>",
   "files_property": "Contracts", "mode": "replace"}
]

Items are processed with bounded concurrency — Notion's file upload API is not pipelined and rejects rapid parallel stage-2 calls. Per-item failures are reported in the output summary ([i] FAIL page=... : ...) but do not abort the batch, so you can retry individual failing items without re-running the whole set.

Typical pattern: stage N attachments via google-accounts-mcp/download_attachment(destination='shared', prefix=f"{msg}_"), call this tool once, then call notion_purge_file or notion_purge_shared_files to free the shared slots.

Notion API: same as notion_add_file_to_row, called N times under the hood.

notion_purge_file

Delete a single file from the cross-MCP shared mount by bare filename.

Parameter

Type

Required

Description

filename

string

yes

Bare filename (no path components)

Use after a successful upload to free the shared slot instead of waiting for the daily TTL sweep (or calling notion_purge_shared_files with max_age_hours=0, which would wipe any unrelated in-flight handoffs). Rejects any filename containing path separators.

File Downloads

notion_download_file

Download a file from a Notion file/image/pdf/video/audio block.

Parameter

Type

Required

Default

Description

block_id

string

yes

File block ID (from notion_list_files_on_page)

destination

string

no

"local"

"local", "shared", "drive", or "base64"

filename

string

no

""

Override the inferred filename (bare filename only for shared)

Destinations:

  • local — saves to the server's local file store

  • shared — saves to the cross-MCP mount (/shared), immediately attachable by google-accounts-mcp as attachments=['shared:<name>'] on draft_email/send_email. Collisions auto-rename atomically; 24h TTL.

  • drive — uploads to the shared Google Drive folder

  • base64 — returns the file content as base64 in the response

Every destination reports the sha256 of the downloaded bytes for end-to-end integrity verification.

Notion API: GET /blocks/{id} to get the signed S3 URL, then direct download


PDF Reading & OCR

Read PDFs in place — no download hop needed. Both tools accept any file source: notion:<block_id> (a file/pdf block on a page), shared:<name>, local:<path>, or drive:<name-or-id>. Semantics are identical to google-accounts-mcp's PDF tools (the pdf_read module is duplicated verbatim across the two repos — edit both copies together).

notion_extract_file_text

Extract text from a PDF, with OCR for scanned/image-only pages.

Parameter

Type

Required

Default

Description

source

string

yes

notion:<block_id>, shared:<name>, local:<path>, or drive:<name-or-id>

pages

string

no

all

pdftotext-style spec: "3", "1-5", "1,3,5", "1-3,7"

mode

string

no

"text"

text (flowing), layout (preserve columns), tables (markdown tables). Native extraction only

ocr

string

no

"auto"

auto — OCR pages with < 20 chars of native text; off; force — OCR every page; llm — vision model. OCR is delegated to an xberg server (XBERG_BASE_URL, default http://xberg:8000; classical backend tesseract; llm = xberg vlm backend → an OpenAI-compatible vision endpoint, needs XBERG_VLM_API_KEY)

Returns JSON {text, page_count, pages_returned, mode, truncated, filename, source} plus ocr_used/ocr_pages/ocr_engine when OCR ran (and ocr_error if auto-mode OCR was needed but the local stack failed — native text still returns). Response ceiling 200 KB, truncated on a page boundary with a marker naming the pages to fetch next.

notion_render_file_page

Render one PDF page as a viewable MCP image content block — the calling model sees the page directly (scans, charts, stamps — often no OCR needed).

Parameter

Type

Required

Default

Description

source

string

yes

Same schemes as notion_extract_file_text

page

int

no

1

1-indexed page number

max_width

int

no

1200

Target pixel width, 200..4000

format

string

no

"jpeg"

jpeg or png

quality

int

no

75

JPEG quality 1..100

return_base64

bool

no

false

true returns JSON {image_base64, mime_type, width, height, page, page_count, filename} instead of an image block

OCR is delegated to an xberg server — no OCR wheels or OS libs needed here. See google-accounts-mcp's README § PDF OCR for the full tier/env table (shared pdf_read module).


Comments

notion_get_comments

List all comments on a page.

Parameter

Type

Required

Description

page_id

string

yes

The page to read comments from

Returns comment text, author name, timestamp, and discussion_id for threading.

Notion API: GET /comments with block_id parameter

notion_get_comment

Get a single comment by ID (text, author, timestamps, discussion thread).

Parameter

Type

Required

Description

comment_id

string

yes

From notion_get_comments or notion_add_comment

Notion API: GET /comments/{id}

notion_add_comment

Add a comment to a page, or reply to an existing discussion thread.

Parameter

Type

Required

Default

Description

page_id

string

yes

The page to comment on

text

string

yes

Comment text (supports inline markdown)

discussion_id

string

no

""

Reply to this thread (from notion_get_comments)

text is sent as native API markdown (2026-04 addition): inline formatting, inline equations, and @mentions all work.

Notion API: POST /comments

notion_update_comment

Edit a comment this integration created (the API returns 404 for comments created by anyone else).

Parameter

Type

Required

Description

comment_id

string

yes

From notion_get_comments / notion_add_comment

text

string

yes

Replacement text (native API markdown)

Notion API: PATCH /comments/{id}

notion_delete_comment

Delete a comment this integration created (404 for anyone else's).

Parameter

Type

Required

Description

comment_id

string

yes

From notion_get_comments / notion_add_comment

Notion API: DELETE /comments/{id}


Views

The Views API (2026-03) exposes the saved views you see as tabs on a database — each carries its own filter, sorts, and layout.

notion_list_views

List a database's views: name, type, id, and whether each carries a saved filter/sorts. (The API's list endpoint returns identity-only objects, so each view is hydrated with an extra retrieve.)

Parameter

Type

Required

Description

database_id

string

yes

The database whose views to list

notion_query_view

Run a view's saved filter and sorts — no filter JSON needed. Use this instead of notion_query_database when a view already encodes the question ("Open bugs", "This week").

Parameter

Type

Required

Default

Description

view_id

string

yes

From notion_list_views

limit

int

no

20

Max rows (≤ 100)

Implementation note: the API's view queries are cached objects with a ~15-minute TTL; the client creates one, reads a page, and best-effort deletes it.

notion_create_view / notion_update_view / notion_delete_view

Parameter

Type

Required

Default

Description

database_id

string

create

Parent database

view_id

string

update/delete

Target view

name

string

create

"" (update)

Display name

view_type

string

no

"table"

table / board / list / calendar / timeline / gallery / chart

filter_json

string

no

""

Notion filter object (same shape as notion_query_database)

sorts_json

string

no

""

JSON array of sort objects

Gotcha (verified live): view creation requires both database_id and data_source_id — the client resolves the data source through the same cache the query path uses. Deleting a view never touches rows.


Users

notion_list_users

List all workspace users (people and bots).

Parameter

Type

Required

Description

name_contains

string

no

Case-insensitive filter on the user's name

Returns names, IDs, emails, and types. User IDs are needed for people properties and @mentions in comments.

Notion API: GET /users (paginated)

notion_get_user

Get details for a specific user.

Parameter

Type

Required

Description

user_id

string

yes

Notion user UUID, or "me" for this integration's own bot user

Returns name, email, avatar URL, type (person/bot), and owner info for bots. "me" also shows the connected workspace and its file-upload size limit.

Notion API: GET /users/{id}, GET /users/me


Meeting Notes

Notion AI meeting notes. They need AI meeting notes on the integration's workspace; without it the API returns 400.

notion_query_meeting_notes

Parameter

Type

Required

Default

Description

title_contains

string

no

""

Simple title filter

filter_json

string

no

""

Full meeting-notes filter; overrides title_contains

sort_json

string

no

""

Sort array (default: newest first)

limit

int

no

10

1-50; the API has no paging here

Notion API: POST /blocks/meeting_notes/query

notion_read_meeting_notes

Parameter

Type

Required

Default

Description

block_id

string

yes

Meeting notes block ID

section

string

no

"summary"

"summary", "notes" or "transcript"

notion_create_meeting_notes

Create a transcript and summary from a recording. Not idempotent — a second call creates a second set of notes, so the server never retries it. Processing continues after the call returns.

Parameter

Type

Required

Default

Description

source

string

yes

An audio/video file (shared:, local:, drive:) or notion:<block_id> for an audio block already on a page

parent_page_id

string

for files

""

Page the notes are added to

title

string

no

""

Meeting title

language

string

no

""

Transcription hint, e.g. "en"

summarize

bool

no

true

false transcribes without a summary

Notion API: POST /blocks/meeting_notes


Custom Emojis & Upload Listing

notion_list_custom_emojis

List workspace custom emojis; optional exact name filter. Use one as an icon with "custom_emoji:<name>".

Notion API: GET /custom_emojis

notion_list_file_uploads

List files this integration has uploaded, with status. status filters to pending, uploaded, expired or failed; limit 1-100.

Notion API: GET /file_uploads


Markdown Format

Writing (markdown to blocks)

When you pass content to notion_create_page or notion_append_content, the markdown is parsed into Notion blocks. Supported syntax:

Markdown

Notion Block

# Heading

heading_1

## Heading

heading_2

### Heading

heading_3

#### Heading

heading_4 (2026-03 API addition; deeper levels clamp to it)

Plain text

paragraph

- Item or * Item

bulleted_list_item

1. Item

numbered_list_item

- [x] Done

to_do (checked)

- [ ] Open

to_do (unchecked)

> Quote

quote (consecutive > lines merge)

```python ... ```

code (with language)

--- or *** or ___

divider

Inline formatting within any block:

Markdown

Rendering

**bold**

Bold

*italic*

Italic

***both***

Bold + Italic

`code`

Inline code

~~strike~~

Strikethrough

[text](url)

Link

Reading (blocks to markdown)

notion_read_page renders all common Notion block types:

  • Paragraphs, headings (1-3), bullet/numbered lists, to-do items

  • Quotes, callouts (with emoji icons), toggles

  • Code blocks (with language), dividers, equations

  • Images (![caption](url)), files, bookmarks, embeds

  • Tables (rendered as markdown tables)

  • Child pages and databases (shown as [Page: Title] / [Database: Title])

  • Tab blocks (each tab as **[Tab: label]** followed by its content)

  • Meeting notes (shown as [Meeting notes: Title] (status) with the block ID for notion_read_meeting_notes)

  • Nested blocks (indented, recursive up to max_depth)


Working with Databases

API 2025-09-03 Data Source Model

In the 2025-09-03 API, database properties and queries operate through data sources rather than directly on databases. This server handles the mapping transparently:

  1. You pass a database_id (from search results or a Notion URL)

  2. The server calls GET /databases/{id} to find the data_source_id

  3. Schema/query/update operations go through /data_sources/{data_source_id}

  4. The mapping is cached per session for performance

You never need to know or pass data source IDs directly.

Typical Database Workflow

1. notion_search_databases("project")     → find the database ID
2. notion_describe_database(db_id)        → see property names and types
3. notion_query_database(db_id, filter)   → read rows
4. notion_create_page(database_id=db_id)  → add a row
5. notion_update_page(row_id, props)      → update a row's properties

Property Types Reference

The Notion property value format for common types:

// Title (every database has exactly one)
{"Title Column": {"title": [{"text": {"content": "My Title"}}]}}

// Select
{"Status": {"select": {"name": "Done"}}}

// Multi-select
{"Tags": {"multi_select": [{"name": "bug"}, {"name": "urgent"}]}}

// Number
{"Priority": {"number": 5}}

// Date (single)
{"Due": {"date": {"start": "2026-03-15"}}}

// Date (range)
{"Sprint": {"date": {"start": "2026-03-01", "end": "2026-03-15"}}}

// Checkbox
{"Done": {"checkbox": true}}

// URL
{"Link": {"url": "https://example.com"}}

// Email
{"Contact": {"email": "user@example.com"}}

// Rich text
{"Notes": {"rich_text": [{"text": {"content": "Some notes"}}]}}

// People (requires user IDs from notion_list_users)
{"Assignee": {"people": [{"id": "user-uuid-here"}]}}

// Relation (requires page IDs)
{"Related": {"relation": [{"id": "page-uuid-here"}]}}

Working with Files

File Source Schemes

All upload tools accept a source parameter with one of five schemes:

Scheme

Format

Example

Notes

notion

notion:<block_id>

notion:21f8a834-…

A file/image/pdf/video/audio block already in the workspace (block IDs from notion_list_files_on_page). Lets the PDF tools read workspace files in place, and upload tools copy a file between pages.

local

local:<path>

local:reports/q3.pdf

Relative to /data/files in the container (FILES_DIR). List with notion_list_local_files().

shared

shared:<filename>

shared:invoice.pdf

Relative to /shared in the container (SHARED_DIR), the cross-MCP mount shared with the companion google-accounts-mcp server. Populated by google-accounts-mcp/download_attachment(destination='shared'). List with notion_list_local_files(location='shared'). Preferred path for gmail → notion handoffs — no base64, no size limit.

drive

drive:<name-or-id>

drive:budget.xlsx

From the shared Google Drive folder

base64

base64:<data>

base64:SGVsbG8=

Requires filename parameter. Subject to MCP parameter size limits; prefer shared: or drive: for anything larger than ~20 KB.

File Upload Protocol

Notion uses a 3-stage upload protocol:

  1. Create — POST /file_uploads returns an upload_id

  2. Send — POST /file_uploads/{id}/send with multipart file data

  3. Reference — attach the upload_id in a block or page property (must be used within 1 hour)

This is handled automatically by all upload tools.

Cross-MCP File Handoff (shared: scheme)

Shared-store invariants: the mount is read/write from both MCP servers. Filename clashes during google-accounts-mcp download_attachment are resolved by auto-renaming (invoice.pdf → invoice-2.pdf), and the return value always reports the actual saved name to reference. Files are swept 24 hours after last modification by the host-side TTL sweep (if you run one) — stage to Notion within that window. For immediate cleanup after a workflow, call the notion_purge_shared_files tool (see the "Files" tool table).

notion-mcp and google-accounts-mcp share a host volume (~/.local/share/containers/data/mcp-shared/) mounted into both containers at /shared. Files dropped there by google-accounts-mcp download_attachment(destination='shared') are immediately readable via the shared: source scheme:

# From google-accounts-mcp:
download_attachment(message_id="...", filename="invoice.pdf",
                    destination="shared")
# From notion-mcp:
notion_add_file_to_row(page_id="...", source="shared:invoice.pdf",
                       files_property="Attachments")

The pipeline is bidirectional — the reverse direction stages a Notion file for google-accounts-mcp to attach:

# From notion-mcp:
notion_download_file(block_id="...", destination="shared")
# From google-accounts-mcp:
draft_email(to=["..."], subject="...", body="...",
            attachments=["shared:contract.pdf"])

The file bytes never traverse MCP tool parameters, so there is no size limit and the 2026-04 "Energy Locals 1.57 MB invoice" pipeline failure no longer applies. Use this path by default for file transfers between the two servers in either direction. All transfer tools report sha256 so the agent can verify integrity at each hop ( notion_list_local_files and gmail's list_shared_files include it per file too).

Google Drive Integration

The Drive integration is optional. Without it, skip the Drive env vars — every other file source keeps working, and drive: sources return a clear setup error. Use drive: when you want the file to persist in Drive; use shared: when you just need a one-shot handoff between the two MCP servers.

Access tokens for DRIVE_ACCOUNT come from one of two places:

  • Broker mode (GOOGLE_AUTH_URL set): a google-auth token broker hands out short-lived access tokens over HTTP (GET /token?account=, authenticated with GOOGLE_AUTH_BEARER). notion-mcp then holds no OAuth client secret and no refresh token, and a re-authorised account is picked up without a restart. Broker failures surface as actionable tool errors (re-authorise the account, account not shared with this service, missing scope, broker unreachable). The client is a single vendored stdlib file, broker_client.py — no extra dependency.

  • Local mode (GOOGLE_AUTH_URL unset): reuse OAuth refresh tokens from google-accounts-mcp's SQLite token DB (mounted read-only at /google-data/tokens.db) with the same Google client ID and secret. The refresh token is read once per process, so restart notion-mcp after re-authorising.

Either way the token must come from the same OAuth client google-accounts-mcp uses: the drive.file scope only sees files that client created.


Common Workflows

Read a page and make a targeted edit

1. notion_read_page_markdown(page_id)           → see current content
2. notion_update_page_content(page_id,
     old_text="Draft version",
     new_text="**Final** version")               → search-replace edit

Create a meeting notes page

1. notion_create_page(
     title="Sprint Planning 2026-03-15",
     parent_page_id="meetings-page-id",
     icon="📋",
     content="# Agenda\n\n- [ ] Review backlog\n- [ ] Assign tasks\n\n# Notes\n\n")

Query a database and update a row

1. notion_query_database(db_id,
     filter_json='{"property": "Status", "select": {"equals": "In Progress"}}')
2. notion_update_page(row_id,
     properties_json='{"Status": {"select": {"name": "Done"}}}')

Move a page into a database

1. notion_move_page(page_id, new_parent_database_id=db_id)

Download a file from Notion to Drive

1. notion_list_files_on_page(page_id)            → get block_id
2. notion_download_file(block_id, destination="drive")

Email a file stored in Notion

1. notion_list_files_on_page(page_id)            → get block_id
2. notion_download_file(block_id, destination="shared")
3. google-accounts-mcp/draft_email(..., attachments=["shared:<filename>"])

Edit a specific block on a page

1. notion_read_page(page_id, include_block_ids=true)  → find block UUID
2. notion_update_block(block_id, "New **content**")    → edit in place

Configuration

All config is via environment variables. For container deployment, put secrets in .secrets.env:

Variable

Required

Default

Description

NOTION_TOKEN

Yes

Internal integration token (starts with ntn_)

MCP_BEARER_TOKEN

Yes

Bearer token for authenticating MCP clients

NOTION_API_VERSION

No

2026-03-11

Notion API version header

PORT

No

8322

Server listen port

FILES_DIR

No

/data/files

Local file store path

DRIVE_ACCOUNT

For Drive

Google account email for Drive access

GOOGLE_AUTH_URL

Drive, broker mode

Base URL of a google-auth token broker (e.g. http://google-auth:8335). Setting it selects broker mode

GOOGLE_AUTH_BEARER

Drive, broker mode

This service's bearer token for the broker

GOOGLE_CLIENT_ID

Drive, local mode

OAuth client ID (same as google-accounts-mcp)

GOOGLE_CLIENT_SECRET

Drive, local mode

OAuth client secret

GOOGLE_TOKEN_DB_PATH

Drive, local mode

/google-data/tokens.db

Path to google-accounts-mcp's SQLite token DB (read-only; the legacy GMAIL_TOKEN_DB_PATH name is still honored)

DRIVE_FOLDER_NAME

For Drive

mcp-google-accounts

Shared Drive folder name

Architecture

src/notion_mcp/
  server.py          # FastMCP tool definitions, HTTP server, bearer auth middleware
  notion_client.py   # Notion REST client — all API calls, pagination, caching
  blocks.py          # Bidirectional Notion blocks <-> markdown conversion
  drive_client.py    # Google Drive client (token broker, or google-accounts-mcp's token DB)
  broker_client.py   # google-auth token broker client (vendored verbatim, stdlib only)
  config.py          # Environment variable configuration

Key design decisions:

  • notion_client.py handles all HTTP, pagination, and the database → data_source mapping. Tools in server.py never call the Notion API directly.

  • blocks.py is a pure-function module with zero side effects — easy to test and reuse.

  • Data source IDs are cached in memory per NotionClient instance to avoid redundant lookups.

  • Block appends are auto-batched at 100 (Notion API limit).

  • The bearer auth middleware is pure ASGI, compatible with streamed responses.

  • Threadpool tool offload (server.py): the MCP SDK runs synchronous @mcp.tool() handlers inline on the event loop, so one blocking httpx call would freeze every other request (the cause of the "server unresponsive after a burst" stalls). mcp.tool is wrapped so each sync tool runs its body in a worker thread (anyio.to_thread.run_sync); the loop stays free. The wrapper preserves the tool signature (client schemas unchanged — no restart) and returns the original sync function as the module name (tool-to-tool calls and tests still work). Each call logs tool=… outcome=… duration_ms=… for Loki.

  • Rate-limit backoff (notion_client._request): retries 429/502/503/504 up to 4 attempts honouring Retry-After (capped 30s/attempt). The backoff sleep runs in the offload thread, never blocking the loop. send_file_upload timeout is capped at 180s — below the MCP client's 240s ceiling — so the server fails before the client does.

  • Container healthcheck: python -m notion_mcp.healthcheck does a full HTTP round-trip to /mcp; a wedged loop fails the probe and HealthOnFailure=kill + Restart=always restart the container.

Development

Requires Python 3.12+ and uv.

# Install all dependencies including test extras
uv sync --extra test

# Run the server locally
NOTION_TOKEN=ntn_... uv run notion-mcp

# Run unit tests (fast, no API calls needed)
uv run --extra test pytest tests/ --ignore=tests/test_integration.py -v

# Run all tests including live API
NOTION_TEST_TOKEN=ntn_... uv run --extra test pytest -v

Testing

Unit Tests (294 tests, ~2s)

No API access required. Seven test files (the PDF-tool tests mock the xberg HTTP calls — no network):

test_blocks.py (83 tests) — markdown conversion:

  • rich_text_to_md / md_to_rich_text: all inline formatting variants

  • blocks_to_markdown: every block type, nesting, include_block_ids, tables

  • markdown_to_blocks: headings, lists, quotes, code, dividers, mixed content

  • format_property_value: all 20+ Notion property types

  • format_page_properties: multi-property formatting

test_notion_client.py (95 tests) — client logic with mocked HTTP:

  • Async-task polling, silent notifications, templates, typed databases, positioned appends, status-group beta header, body retry_after

  • Pagination for list_children, query_data_source, list_comments, list_users

  • resolve_data_source_id caching and error handling

  • create_page child batching (>100 blocks)

  • Request body construction for markdown, move, comment endpoints

  • pick_block_type MIME mapping

  • find_title_property / get_page_title edge cases

test_server_tools.py (69 tests) — tool-layer logic with a mocked client (file source resolution, positional inserts, replace flows, purge tools, icon values, tabs, meeting notes, HTML embeds).

test_sources.py (13 tests) — _read_source scheme parsing for local:/shared:/base64: (the drive: scheme lives in test_drive_client.py).

test_purge.py (6 tests) — notion_purge_shared_files filters.

test_pdf_tools.py (16 tests) — notion_extract_file_text / notion_render_file_page wiring, the notion: source scheme, image vs base64 return modes, OCR plumbing (xberg calls mocked; full OCR-tier semantics are covered in google-accounts-mcp's test_pdf_read.py, since pdf_read.py is duplicated verbatim across the two repos).

test_drive_client.py (13 tests) — Drive client; guards the read-only tokens-DB regression (sqlite must open with immutable=1) and covers broker mode (credential refresh, cache bypass after a 401, error mapping).

uv run --extra test pytest tests/ --ignore=tests/test_integration.py -v

Integration Tests (26 tests, ~70s)

Hit the live Notion API against a sandbox page you provide. Require:

  • NOTION_TEST_TOKEN — an integration token with access to the sandbox

  • NOTION_TEST_PAGE_ID — a scratch page the tests may write to

  • NOTION_TEST_DB_ID — an inline database on that page

Tests create pages, exercise all endpoints, and clean up after themselves:

  • Connectivity (search, list users, retrieve page)

  • Page CRUD (create, read, archive, restore)

  • Blocks (append, read, update, delete)

  • Markdown API (read, replace, search-replace, insert)

  • Data sources (resolve, get schema, query, search)

  • Move page (create parent A/B, move child, verify)

  • Comments (create, list)

  • Views (lifecycle, query)

  • 2026-10 additions: native-markdown create, markdown insert/update/replace, positioned and silent writes, tabs, HTML embeds, typed databases, second data sources, templates, archived and status-group queries, the small read endpoints

Not exercised live: notion_create_meeting_notes (it needs a real recording and spends Notion AI) and template-based page creation (the sandbox database has no templates).

NOTION_TEST_TOKEN=ntn_... uv run --extra test pytest tests/test_integration.py -v

Run integration tests after:

  • Upgrading NOTION_API_VERSION in config.py

  • Changing endpoint paths or request body formats

  • Modifying pagination or error handling

Local stdio Mode

--stdio starts FastMCP's stdio transport: no uvicorn, no bearer token (the client owns the spawned process; there is no network surface). This is what most interactive MCP clients should use:

// e.g. Claude Desktop claude_desktop_config.json / Claude Code .mcp.json
{
  "mcpServers": {
    "notion": {
      "command": "uv",
      "args": ["run", "--project", "/path/to/notion-mcp",
               "notion-mcp", "--stdio"],
      "env": {
        "NOTION_TOKEN": "ntn_...",
        "FILES_DIR": "/home/you/.local/share/notion-mcp/files"
      }
    }
  }
}

Prefer an env file over inline values where your client supports it (uv run --env-file ...).

Container Deployment (HTTP)

podman build -t notion-mcp .   # or: docker build -t notion-mcp .
podman run -d --name notion-mcp -p 8322:8322 -v notion-data:/data \
  -e NOTION_TOKEN=ntn_... \
  -e MCP_BEARER_TOKEN=some-long-random-token \
  notion-mcp

HTTP mode refuses to start without MCP_BEARER_TOKEN; clients register with:

{
  "mcpServers": {
    "notion": {
      "url": "https://your-host:8322/mcp",
      "headers": {"Authorization": "Bearer <MCP_BEARER_TOKEN>"}
    }
  }
}

notion_mcp.healthcheck does a full HTTP round-trip to /mcp (the 401 counts as alive); wire it to your container healthcheck. Terminate TLS at a reverse proxy — the server itself speaks plain HTTP. For the optional shared-mount feature, add the /shared mount shared with a google-accounts-mcp container; for Drive in local mode, also mount its token DB read-only at /google-data (broker mode needs no mount).

Notion API Version Notes

This server uses Notion API 2026-03-11. Version history:

2025-09-03 (from 2022-06-28)

Feature

Old (2022-06-28)

New (2025-09-03)

Database properties

On /databases/{id} response

Moved to /data_sources/{id}

Database query

POST /databases/{id}/query

POST /data_sources/{id}/query

Database search

filter.value = "database"

filter.value = "data_source"

Markdown read

Not available

GET /pages/{id}/markdown

Markdown write

Not available

PATCH /pages/{id}/markdown

Move pages

Not available

POST /pages/{id}/move

2026-03-11 (from 2025-09-03)

Feature

Old (2025-09-03)

New (2026-03-11)

Trash status field

"archived": true/false

"in_trash": true/false

Block append positioning

"after": "block-id"

"position": {"type": "after_block", "after_block": {"id": "..."}}

Transcription block type

"transcription"

"meeting_notes"

The position object also supports {"type": "start"} and {"type": "end"} for inserting at the beginning or end of a parent block.

Additions within 2026-03-11

Notion keeps adding to this version without a new version string. Adopted so far:

Added

Feature

Where

2026-03

Views API, heading_4, tab blocks, custom emoji list, native icons

view tools, notion_add_tabs, notion_list_custom_emojis, icon values

2026-04

Comment update/delete, markdown comments

comment tools

2026-05

Markdown insert_content.position, meeting-notes query

notion_insert_page_content, notion_query_meeting_notes

2026-06

allow_async + async tasks, 529 retry

native_markdown, notion_replace_page_content, notion_get_async_task

2026-07

filter.in_trash, is_archived, HTML embeds

notion_search_pages, notion_query_database(archived), notion_upload_file(embed_html)

2026-08

Create meeting notes

notion_create_meeting_notes

2026-09

database_type, body retry_after, markdown_version (preview)

notion_create_database, retries, markdown tools

2026-10

notifications.mode: silent, option recolouring, status-group filters (beta header sent automatically)

silent, notion_update_database, notion_query_database

Not implemented by design: webhooks, OAuth token endpoints, the Admin API and the Notion Agent APIs (this server uses one internal integration token and has no event receiver), and filter_properties on page writes (it only trims a response the tools do not return).

The server handles the data source migration transparently — you always pass database_id and the server resolves the data_source_id internally (with caching).

If upgrading from an older version, run the integration test suite to verify nothing breaks:

NOTION_TEST_TOKEN=ntn_... uv run --extra test pytest tests/test_integration.py -v

License

MIT

Available Tools

55 tools
notion_add_commentA

Add a comment to a Notion page or reply to a discussion thread.

page_id: the page to comment on. text: comment text. Sent as native API markdown — inline formatting, inline equations, and @mentions all work. discussion_id: if provided, the comment is a reply to this existing discussion thread. Get discussion IDs from notion_get_comments.

NameRequiredDescriptionDefault
textYes
page_idYes
discussion_idNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the transparency burden. It discloses that text is sent as native API markdown, supporting inline formatting, equations, and @mentions, and explains the behavior of discussion_id (turns the comment into a reply). It doesn't mention permissions or errors, but given the output schema exists, return values are covered.

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 and well-structured, with the purpose front-loaded in the first sentence. The parameter list is clear and each line earns its place, including the practical pointer to notion_get_comments. No unnecessary words.

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 simplicity, the description is complete: purpose, all parameter semantics, and a helpful cross-reference to a sibling tool. The presence of an output schema covers return values. No critical information is missing for an agent to select and invoke this tool 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?

Schema description coverage is 0%, so the description fully compensates by explaining each parameter explicitly: page_id (the page to comment on), text (with markdown details), and discussion_id (reply semantics). This adds significant meaning beyond the schema's bare names and types.

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 action: 'Add a comment to a Notion page or reply to a discussion thread.' It specifies the verb (add) and resource (page or discussion thread), and distinguishes it from sibling tools like notion_update_comment and notion_delete_comment by focusing on creation.

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 the tool: to add a new comment or reply to an existing discussion thread. It also points to a sibling tool (notion_get_comments) for obtaining discussion IDs, which is useful. It doesn't explicitly exclude alternatives, but the context is clear enough for a simple create operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_add_data_sourceA

Add another data source (a second table with its own schema) to an existing database. Most databases have one; the other database tools here operate on a database's FIRST data source.

database_id: the database to add to. title: name of the new data source. schema_json: property schema, same format as notion_create_database (a title property is required).

NameRequiredDescriptionDefault
titleYes
database_idYes
schema_jsonYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are present, so the description carries the burden. It discloses that this mutates an existing database and that a title property is mandatory in the schema, but says nothing about required permissions, whether the added data source can be removed later, or rate limits. An output schema exists, so return values need not be explained.

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?

Opens with the action and the disambiguating fact, then presents parameters in an aligned block. Every line carries information an agent needs; nothing is repeated from the schema.

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 3-parameter mutation with no annotations and a declared output schema, the description covers purpose, sibling routing, and all parameter meanings. Only the operational envelope (permissions, reversibility) is absent, which is a minor gap given the additive, low-risk nature of the operation.

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 0%, and the description compensates by documenting all three parameters, including the non-obvious constraint that schema_json must contain a title property and the format pointer to notion_create_database. The schema_json format itself is only described by analogy, leaving some inference.

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?

States a specific verb and resource ('Add another data source ... to an existing database') and immediately defines the concept as 'a second table with its own schema'. It also distinguishes itself from every sibling database tool by noting they operate on a database's FIRST data source.

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 line 'Most databases have one; the other database tools here operate on a database's FIRST data source' gives a clear condition that selects this tool over notion_update_database or notion_describe_database. It stops short of an explicit 'do not use this if...' exclusion, but the routing signal is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_add_file_to_rowA

Upload a file and attach it to an EXISTING database row's files & media column.

page_id: the row (page) ID — paste from the row's "Copy link" or obtain via notion_search_pages. source: same schemes as notion_upload_file: local:<path>, shared:<filename>, drive:<name-or-id>, or base64:<bytes>. files_property: exact name of the files & media column. mode: append (default) keeps existing files and adds the new one. replace overwrites the column with just the new file. filename: override the source filename.

Cross-MCP file transfer

To attach a Gmail attachment to an existing Notion row:

  1. google-accounts-mcp download_attachment(msg_id, name, destination='shared')

  2. notion_add_file_to_row(page_id, source='shared:', files_property='')

Files never traverse MCP parameters — no size limits. Alternative via Drive: download_attachment → drive_upload(local_filename=...) → notion_add_file_to_row(source='drive:<file_id>', ...).

NameRequiredDescriptionDefault
modeNoappend
sourceYes
page_idYes
filenameNo
files_propertyYes

Output Schema

NameRequiredDescription
resultYes

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 fully discloses key behavioral traits: the append/replace mode semantics (what happens to existing files), the fact that files never traverse MCP parameters (implying side-channel transfer and no size limits), and the exact source schemes. This goes far beyond typical descriptions and informs the agent of important operational details.

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 the main purpose, followed by a cleanly formatted parameter list and a practical workflow example. Every sentence contributes valuable information—no fluff. The structure makes it easy to scan and understand.

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 (5 params, 3 required) and lack of annotations, the description is remarkably complete: it covers all parameters, provides usage workflows, and even explains cross-MCP file transfer mechanics. It also references sibling tools for context. No critical information 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?

Schema description coverage is 0%, but the description compensates excellently by defining every parameter: page_id with how to obtain it, source with all supported schemes, files_property as exact column name, mode with concrete append/replace behavior, and filename as override. This provides complete semantics beyond the bare 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 opens with a specific verb+resource+target: 'Upload a file and attach it to an EXISTING database row's files & media column.' The emphasis on 'EXISTING' distinguishes it from sibling tools like notion_upload_file_to_database and notion_batch_add_file_to_row. It clearly states what the tool does.

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 'Cross-MCP file transfer' section provides a concrete step-by-step workflow for using this tool with a Gmail attachment, including prerequisites (download_attachment) and an alternative route via Drive. This gives explicit context for when to use this tool and how it fits into a larger process, effectively covering usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_add_tabsA

Add a tab block (a row of tabs, each with its own content) to a page.

page_id: the page (or any block that supports children) to add to. tabs_json: JSON array, one object per tab: [{"label": "Overview", "icon": "📋", "content": "markdown…"}, {"label": "Details", "content": "…"}] label is required; icon (an emoji) and content are optional. position: 'end' (default), 'start', or a block ID to insert after.

NameRequiredDescriptionDefault
page_idYes
positionNoend
tabs_jsonYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/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. It usefully discloses that page_id may be any block supporting children, that position defaults to 'end', and the exact tab object shape, but says nothing about permission requirements, what happens with an invalid block ID or malformed JSON, or whether existing page content is affected.

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?

Front-loaded one-line purpose followed by a tight param list with a compact example; no sentence is filler and the example JSON substitutes for paragraphs of prose.

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?

With an output schema present, return values need not be described, and the parameter contract is complete. However, for an unannotated write tool the description should say something about permissions, failure modes, or interaction with existing page content; those gaps leave it adequate but not complete.

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 description coverage is 0%, yet the description fully compensates: it explains the page_id semantics (page or any child-supporting block), gives a concrete JSON example for tabs_json with required/optional fields spelled out, and enumerates position's three accepted forms including the default.

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?

States a specific verb ('Add') plus a precisely defined resource ('a tab block (a row of tabs, each with its own content)'), so an agent knows exactly what will be created. It does not differentiate itself from content-insertion siblings such as notion_append_content or notion_insert_page_content, which is the only thing keeping it from a 5.

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 never says when to use this tool versus alternatives, nor any prerequisites or exclusions. Given siblings like notion_append_content, notion_insert_page_content, and notion_replace_page_content, an agent is left to infer that 'add tabs' is the choice when tabbed layout (not plain content) is needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_append_contentA

Add markdown content to an existing Notion page.

Parses the markdown into blocks and adds them to the page. Supports: headings (# ## ###), bullet/numbered/to-do lists, quotes, fenced code blocks, dividers (---), paragraphs with inline formatting (bold, italic, code, strike, links).

page_id: the page (or any block that supports children) to add to. content: markdown text to add. position: 'end' (default), 'start', or a block ID to insert directly AFTER that block (IDs from notion_read_page(include_block_ids=True)). silent: True skips the notifications this write would send.

NameRequiredDescriptionDefault
silentNo
contentYes
page_idYes
positionNoend

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the burden well: it discloses that markdown is parsed into blocks, enumerates the supported markdown constructs, and notes that 'silent' suppresses the notifications this write would otherwise send. It does not cover permission requirements or size limits, but the core behavior of this mutation is well surfaced.

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?

Front-loaded with a one-line purpose, followed by a compact parsing note, a supported-syntax list, and per-parameter notes. The markdown feature list is slightly long but each item prevents a real ambiguity, so little is wasted.

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?

An output schema exists, so return values need not be described, and all four parameters are explained. What remains missing is permission/auth requirements and any content-size or error behavior for this write tool with zero annotation coverage.

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 0%, so the description must compensate and it does: page_id explains it can be any block supporting children, content is markdown text, position enumerates 'end'/'start'/block ID plus how to obtain block IDs via notion_read_page(include_block_ids=True), and silent is explained. Every parameter gains meaning beyond the bare 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?

States a specific verb and resource ('Add markdown content to an existing Notion page') and clarifies scope ('existing'). However, it does nothing to distinguish itself from near-identical siblings such as notion_insert_page_content, notion_replace_page_content, and notion_update_page_content, which an agent must choose between.

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 is clear from 'existing page' (not for creating pages) and the position parameter describes insertion modes, but there is no explicit when-to-use guidance and no mention of when to prefer insert/replace/update siblings instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_archive_pageA

Archive (soft-delete) a Notion page. The page can be restored from the Notion trash within 30 days using notion_restore_page.

page_id: the page to archive.

NameRequiredDescriptionDefault
page_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Despite no annotations, the description discloses that the operation is a soft-delete and the page remains in trash for 30 days. This is valuable behavioral context beyond the basic 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 compact: one sentence for the operation, one for restoration, and one for the parameter. It is front-loaded with the core purpose and contains no redundant text.

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 tool is simple with one required parameter, and the description covers purpose, soft-delete behavior, restore path, and parameter semantics. The presence of an output schema means return values don't need explanation. Slight gap: no mention of permissions or side effects, but not essential.

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 schema has 0% description coverage for page_id, but the description adds 'the page to archive,' providing clear meaning for the sole parameter. This compensates for the schema gap.

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 archives (soft-deletes) a Notion page, distinguishing it from delete_block or update_page. It also mentions restoration, further clarifying the specific operation.

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 references notion_restore_page as the path for undoing the archival, giving context on when to use this tool vs. that alternative. However, it does not explicitly state when not to use it (e.g., for permanent deletion).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_batch_add_file_to_rowA

Attach files to many existing Notion rows in one call.

items_json is a JSON array of objects. Each item takes the same shape as the single-shot tool's parameters::

[
  {"page_id": "...", "source": "shared:invoice1.pdf"},
  {"page_id": "...", "source": "shared:invoice2.pdf",
   "filename": "Renamed.pdf"},
  {"page_id": "...", "source": "drive:<id>",
   "files_property": "Attachments", "mode": "replace"}
]

default_files_property and default_mode fill in any item that omits those fields — pass them once at the batch level instead of repeating per item.

Items are uploaded with bounded concurrency (NOTION_BATCH_CONCURRENCY, default 3) so a batch of N finishes in roughly ceil(N/concurrency) waves rather than serially — a batch of ~8 used to exceed the client's 4-minute timeout when serial. Concurrent items targeting the SAME row are still serialised (the 'append' path is a read-modify-write). The 429/5xx backoff in the client absorbs any rate-limit bursts. Per-item failures are reported in the output (in input order) but do NOT abort the batch — use the per-item status to retry individual items.

Files are staged in the shared mount; the typical pattern is to stage N files via google-accounts-mcp download_attachment, call this tool once, then call notion_purge_file to remove each staged file.

NameRequiredDescriptionDefault
items_jsonYes
default_modeNoappend
default_files_propertyNo

Output Schema

NameRequiredDescription
resultYes

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 discloses key behaviors: bounded concurrency with default 3, serialization for same-row items, 429/5xx backoff, per-item failures reported but not aborting the batch, and the read-modify-write nature of the append path. This is rich, non-obvious context that goes far beyond what annotations or schema provide.

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 genuinely information-dense: each paragraph covers a distinct aspect (usage example, defaults, concurrency, error handling, staging workflow) and the first sentence states the purpose. No filler or repetition.

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 (batch concurrency, per-item errors, default inheritance), the description covers all critical operational aspects, including a recommended workflow involving sibling tools. An output schema exists, so return-value details are not required, but the description still covers per-item status reporting.

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 0%, so the description must compensate. It does so by giving a full JSON example for items_json, explaining default_mode and default_files_property as batch-level fill-ins, and showing mode values like 'append' and 'replace'. This makes the parameters meaningful beyond their bare schema definitions.

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 'Attach files to many existing Notion rows in one call,' which is a specific verb+resource+scope. It clearly contrasts with the singular notion_add_file_to_row sibling and the batch nature is explicit.

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 a concrete usage pattern ('stage N files via google-accounts-mcp download_attachment, call this tool once, then call notion_purge_file') and explains why batch is preferable to serial ('a batch of ~8 used to exceed the client's 4-minute timeout when serial'). This gives clear when-to-use context and implies the singular tool for one-off operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_create_databaseA

Create a new Notion database under a page.

parent_page_id: page to create the database under. title: database title (optional for a typed database, which is otherwise named after its type). schema_json: JSON object mapping property names to their type config in Notion API format. A title property is required. Example: { "Name": {"title": {}}, "Status": {"select": {"options": [ {"name": "To Do", "color": "red"}, {"name": "Done", "color": "green"} ]}}, "Due Date": {"date": {}}, "Priority": {"number": {"format": "number"}}, "Tags": {"multi_select": {"options": [ {"name": "bug"}, {"name": "feature"} ]}}, "Assignee": {"people": {}}, "Done": {"checkbox": {}}, "Notes": {"rich_text": {}}, "Link": {"url": {}} } database_type: "tasks", "projects" or "skills" creates one of Notion's typed databases with its built-in schema INSTEAD of schema_json (they cannot be combined). Run notion_describe_database afterwards for the exact property names. inline: True shows the database inline on the parent page; default is a full-page database.

NameRequiredDescriptionDefault
titleNo
inlineNo
schema_jsonNo
database_typeNo
parent_page_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It does disclose meaningful defaults (inline=False means a full-page database; title is optional for typed databases since they are named after their type) and that a title property is required. It is silent on permissions/integration access to the parent page, failure modes (name collisions, invalid schema), and whether the operation is reversible — significant gaps for a mutation tool with zero annotation coverage.

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 one-line summary is front-loaded and each parameter block is clearly labeled. The 9-property schema_json example is long for a description, but it substitutes for absent schema documentation and illustrates several property types, so most of it earns its place; some pruning (e.g., Notes/Link/Assignee) would tighten it.

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?

An output schema exists, so return values need no explanation, and the description fully covers the non-trivial input surface including the typed-vs-custom fork and the required follow-up call. What's missing is authority/error context — whether the integration must already have access to the target page and what happens if schema_json is malformed.

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 description coverage is 0%, so the description must carry all five parameters — and it does. It explains parent_page_id, title's conditional optionality, inline's True/False effect, database_type's three values and exclusivity with schema_json, and shows the full Notion API schema_json shape with a worked example plus the 'title property is required' constraint.

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?

Opens with a specific verb + resource + placement: 'Create a new Notion database under a page.' That distinguishes it from notion_update_database and notion_query_database by scope. It stops short of naming a sibling or stating when to prefer notion_create_page with a database, so it isn't a full 5.

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?

Gives concrete routing rules: database_type ('tasks', 'projects', 'skills') creates a typed database INSTEAD of schema_json, and the two 'cannot be combined'; plus a follow-up instruction to run notion_describe_database for exact property names. That is real when/when-not guidance, though it never addresses the create_database vs create_page/add_data_source boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_create_meeting_notesA

Create AI meeting notes (transcript + summary) from a recording. Uses Notion AI; processing continues after this returns — poll with notion_read_meeting_notes until its status is notes_ready.

NOT idempotent: calling it twice creates two sets of notes.

source: an audio/video file as shared:<name>, local:<path>, drive:<name-or-id> — uploaded, then transcribed onto parent_page_id — or notion:<block_id> to transcribe an audio block that is already on a page (no parent_page_id then). parent_page_id: page the notes are added to (file sources only). title: meeting title (Notion may refine it when summarising). language: transcription hint such as "en" or "ja" (default: auto). summarize: False transcribes without generating a summary.

NameRequiredDescriptionDefault
titleNo
sourceYes
languageNo
summarizeNo
parent_page_idNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/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 does so well: it discloses async processing ('processing continues after this returns'), the required polling loop and terminal status, and the non-idempotency consequence ('calling it twice creates two sets of notes'). It also notes that Notion may rewrite the title during summarisation — exactly the surprises an agent needs warned about.

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?

Front-loaded with purpose and the polling contract, then a labelled parameter block. Every line carries information an agent would otherwise have to guess; nothing is padding.

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?

An output schema exists so return values needn't be explained, and the description still supplies the async lifecycle state to poll for, the source/parent-page coupling, and the non-idempotency caveat. Nothing essential for a correct call 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?

Schema description coverage is 0%, so the description must compensate, and it documents all five parameters: the four source prefixes with their semantics, parent_page_id's file-sources-only constraint, the language hint format and auto default, and summarize=False behaviour. This is meaning well beyond the bare types in 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?

Opens with a specific verb+resource+output: 'Create AI meeting notes (transcript + summary) from a recording.' That cleanly separates it from the read/query meeting-notes siblings, which merely retrieve notes.

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?

Explicitly routes the agent to notion_read_meeting_notes for polling and warns it is NOT idempotent, plus spells out which source form goes with or without parent_page_id. It stops short of contrasting with adjacent tools like notion_upload_file or notion_extract_file_text, so no explicit '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.

notion_create_pageA

Create a new Notion page with optional markdown content.

For a standalone page under another page, provide parent_page_id. For a database row, provide database_id and properties_json.

title: the page title. content: markdown text that becomes the page body. Supports headings, lists, quotes, code blocks, inline formatting. parent_page_id: ID of the parent page. database_id: ID of a database to add the row to. properties_json: JSON object of extra Notion properties (for database rows). Keys are property names, values are Notion API property value objects. A wiki page's verification is set here too: {"Verification": {"verification": {"state": "verified"}}}. icon: an emoji ("🚀"), "custom_emoji:" (see notion_list_custom_emojis), "icon:[:]" for a native Notion icon (e.g. "icon:pizza:blue"), or an image URL. template: for database rows: "default" applies the database's default template, or pass a template ID from notion_list_templates. The template supplies the body, so leave content empty. position: where the page lands among a parent PAGE's children: "start", "end", or a block ID to insert after. silent: True skips the update, @mention and Person-property notifications this write would send. native_markdown: True sends content to Notion's own markdown parser instead of converting it to blocks here. Use it for Notion-specific markup (tables, callouts, columns, toggles, mentions) and for very large pages, which Notion then processes as a background task. markdown_version: with native_markdown, "v2" opts into Notion-flavored Markdown (a preview); default is the stable syntax.

NameRequiredDescriptionDefault
iconNo
titleYes
silentNo
contentNo
positionNo
templateNo
database_idNo
parent_page_idNo
native_markdownNo
properties_jsonNo
markdown_versionNo

Output Schema

NameRequiredDescription
resultYes

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 full burden and does substantial work: 'silent: True skips the update, @mention and Person-property notifications this write would send' discloses the side effect of a mutation, and 'The template supplies the body, so leave content empty' flags a destructive interaction between two parameters. 'notion then processes as a background task' for very large native pages and the '(a preview)' warning on markdown_version v2 add further behavioral context. Missing: any statement of permission/access requirements or what happens on a failed write.

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?

Front-loads purpose and the parent_page_id vs database_id fork before the parameter glossary, so an agent can decide fast and read detail only for the branch it picked. The glossary form is dense but purposeful; the only marginal line is the content-format enumeration ('headings, lists, quotes, code blocks'), which is low-value relative to the rest.

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 an 11-parameter, no-annotation mutation tool this covers what an agent needs: which parameters are mutually exclusive, how template and content interact, what silent suppresses, and when to escalate to native_markdown. The presence of an output schema removes any need to describe return values.

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 description coverage is 0%, so the description must compensate entirely — and it does, defining all eleven parameters with format examples: emoji literal, 'custom_emoji:<name-or-id>', 'icon:<name>[:<color>]', and 'start'/'end'/block-ID for position. It even spells out the exact properties_json shape for wiki verification, which the schema cannot convey.

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?

Opens with a specific verb+resource: 'Create a new Notion page with optional markdown content.' The two-branch routing (standalone page via parent_page_id vs database row via database_id) makes the tool's scope unambiguous. It stops short of naming the closest sibling alternatives (notion_append_content, notion_insert_page_content), so it is differentiated by implication rather than explicitly.

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?

Explicitly states the selection condition between the two creation modes: 'For a standalone page under another page, provide parent_page_id' and 'For a database row, provide database_id and properties_json.' It also routes to siblings for sub-tasks (notion_list_custom_emojis for icon names, notion_list_templates for template IDs) and tells the agent when to pick native_markdown. It never says when NOT to use this tool (e.g. adding content to an existing page).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_create_viewA

Create a view on a Notion database.

database_id: the database to add the view to. name: display name for the view. view_type: table | board | list | calendar | timeline | gallery | chart (default table). filter_json: optional Notion filter object as JSON (same shape as notion_query_database's filter_json). sorts_json: optional JSON array of sort objects.

NameRequiredDescriptionDefault
nameYes
view_typeNotable
sorts_jsonNo
database_idYes
filter_jsonNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/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. It adds useful behavioral context by documenting parameters, including the default view_type and the cross-reference to notion_query_database's filter_json, but it does not disclose side effects, permissions, or failure modes. It only implies mutation through the verb 'create'.

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 front-loads the purpose in a single sentence, then uses a clear list format for parameter documentation. Every line provides necessary information with no filler, making it both concise 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 5-parameter complexity and the existence of an output schema, the description covers all parameters effectively and provides a helpful cross-reference for filter_json. It does not mention prerequisites like the database existing, but this is relatively minor for a create operation.

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 description coverage is 0%, and the description fully compensates by documenting every parameter: database_id, name, view_type with allowed values, filter_json with a reference to another tool's format, and sorts_json as an optional JSON array. This adds significant meaning beyond the raw 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 states 'Create a view on a Notion database' with a specific verb and resource. It clearly distinguishes from sibling tools like notion_list_views, notion_update_view, and notion_delete_view by the action 'create'.

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 context is clear that this tool is used to create a view on a database, but there is no explicit guidance on when to use it versus alternatives. No exclusions or alternative tool mentions are provided, so the usage is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_delete_blockA

Delete a block from a Notion page. This removes the block and all its children. The deletion is permanent (blocks cannot be restored).

block_id: ID of the block to delete.

NameRequiredDescriptionDefault
block_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/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. It explicitly discloses that the deletion removes the block and all children, and that deletion is permanent and cannot be restored. This fully informs the agent of destructive 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?

The description is only two sentences plus a parameter line, with the main action and critical caveats front-loaded. Every sentence adds value with no redundancy.

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 deletion tool with one parameter and an output schema, the description covers the essential behavioral context: what is deleted, cascading effect, and irreversibility. No further explanation of return values is necessary given the output schema.

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 only provides a title ('Block Id') with no description. The description adds 'ID of the block to delete,' clarifying that this is the target block. For a single-parameter tool with 0% schema coverage, this is adequate compensation.

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'), the resource ('a block from a Notion page'), and adds key scope ('all its children') and irreversibility. This distinguishes it from sibling tools like update_block 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 Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The first sentence provides clear context: use this tool to delete a block from a Notion page. It does not explicitly name alternatives or exclusions, but the purpose is unambiguous and distinct from related block/page operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_delete_commentA

Delete a comment previously created by this integration (Notion returns 404 for comments created by anyone else).

comment_id: from notion_get_comments or notion_add_comment.

NameRequiredDescriptionDefault
comment_idYes

Output Schema

NameRequiredDescription
resultYes

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 burden of behavioral disclosure. It reveals the ownership constraint and the 404 error for non-owned comments, which is useful behavioral context. However, it does not explicitly mention permanence or reversibility of the deletion, though this is a typical implication of a delete 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 two clearly separated sentences: one for the purpose/behavior and one for parameter sourcing. No redundant information or filler text exists, making it easy to parse and act on.

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 tool is simple with one parameter, an output schema (though not shown), and no annotations. The description covers the core purpose, a key behavioral constraint, and parameter sourcing. It could mention what the response looks like or explicitly note that deletion is permanent, but given the simplicity and presence of an output schema, the description is sufficiently complete.

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 schema has no description for the single parameter, and coverage is 0%. The description compensates by telling the agent where to source the comment_id (from notion_get_comments or notion_add_comment). This adds practical meaning beyond the raw schema type, but it does not elaborate on the expected format or validation of the 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 deletes a comment, with the specific constraint that it must have been created by this integration. This distinguishes it from sibling comment tools like notion_add_comment and notion_update_comment. The mention of Notion returning 404 for others further clarifies the exact scope.

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 the tool (only for comments created by this integration) and when not to (for comments created by anyone else, as they will 404). It also guides the agent on where to obtain a valid comment_id (from notion_get_comments or notion_add_comment). Explicit alternatives are not listed, but no other delete-comment tool exists among the siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_delete_viewA

Delete a view from its database. The database and its rows are untouched — only the saved view configuration is removed.

NameRequiredDescriptionDefault
view_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/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 burden. It discloses a key behavioral trait: deletion only affects the view configuration, not the database or its rows. This helps set expectations about the tool's impact, though it does not mention permanence or permissions.

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, focused sentence that front-loads the action and includes a valuable clarification about what is not affected. No unnecessary words or repetition.

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 param, no annotations) and the presence of an output schema, the description is largely complete. It explains both the action and the non-destructive scope, leaving little ambiguity for an agent invoking the tool.

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

Parameters2/5

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

The input schema has 0% description coverage for its single parameter, and the description does not explicitly explain 'view_id'. While the parameter name and context imply it is the ID of the view to delete, the description does not add meaningful detail (e.g., how to obtain it or whether it must be a view ID rather than a database 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 'Delete a view from its database', which identifies the specific action (delete) and resource (view). It distinguishes from sibling tools like notion_create_view and notion_update_view by indicating the destructive action, and from notion_delete_block by clarifying the scope is limited to a view configuration.

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 provides implicit context by noting 'The database and its rows are untouched', implying this tool is for removing only a saved view without affecting data. However, it does not explicitly state when to use this tool versus alternatives or mention any exclusions, so the guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_describe_databaseA

Retrieve a Notion database's schema. Returns each property name and type — use this to find the exact files & media column name to pass to notion_upload_file_to_database / notion_add_file_to_row.

database_id can be found by calling notion_list_files_on_page on the page that holds the inline database (child_database blocks will show), or pasted from the database URL.

NameRequiredDescriptionDefault
database_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior3/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It states the core behavior (retrieves schema, returns property names/types) and adds context about how to find database_id. However, it does not disclose potential error conditions, rate limits, or any prerequisites beyond knowing the database_id. For a simple read-only operation this is adequate but not deeply 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 concise and well-structured. The first sentence states the purpose and return value, while the second provides crucial parameter guidance. No unnecessary words or redundant information are present.

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?

The tool is simple (one parameter, no nested objects), and an output schema is present. The description explains what the tool does, what it returns, and how to get the input parameter. It also ties the tool into a broader workflow with related tools. This is sufficient for an agent to select and 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?

The input schema provides only the parameter name 'database_id' with no description. The tool description compensates fully by explaining what database_id is and exactly how to obtain it: 'calling notion_list_files_on_page on the page that holds the inline database (child_database blocks will show), or pasted from the database URL.' This adds significant 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 uses the specific verb 'Retrieve' and clearly identifies the resource ('Notion database's schema'). It states what is returned ('each property name and type') and distinguishes this from siblings by focusing on schema retrieval rather than querying or modifying data. The additional note about finding exact column names for upload tools clarifies its intended niche.

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 an explicit use case: 'use this to find the exact files & media column name to pass to notion_upload_file_to_database / notion_add_file_to_row.' It also explains how to obtain the database_id via a sibling tool or URL. However, it does not explicitly mention when not to use this tool or compare it to alternatives like notion_query_database, so it lacks full exclusionary guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_download_fileA

Download a file from a Notion file/image/pdf/video/audio block.

destination is one of: local, shared, drive, base64. • local — the notion-mcp private store (FILES_DIR). • shared — the cross-MCP shared mount, immediately attachable by google-accounts-mcp as attachments=['shared:'] on draft_email / send_email. 24h TTL applies. • drive — upload to the shared Drive folder (DRIVE_FOLDER_NAME). • base64 — inline; subject to MCP response size limits.

filename overrides the inferred name. When destination=local, filename may include subdirectories (e.g. reports/q3.pdf); they are created under the local store. Use notion_list_files_on_page to find block IDs.

Cross-MCP file transfer (Notion → Gmail)

To email a file stored in Notion:

  1. notion_download_file(block_id, destination='shared')

  2. google-accounts-mcp draft_email(..., attachments=['shared:']) Bytes never traverse MCP parameters — no size limits.

NameRequiredDescriptionDefault
block_idYes
filenameNo
destinationNolocal

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/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 burden of behavioral disclosure. It does so effectively by explaining storage locations (FILES_DIR, shared mount), the 24h TTL for shared, Drive upload behavior, and MCP response size limits for base64. It also notes that bytes never traverse MCP parameters in the shared flow, which is valuable operational context. It omits specifics like authentication or error semantics, but given the richness of what is disclosed, this is above average.

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 longer than average but well-structured with a bulleted list and a clearly separated cross-MCP workflow. Each sentence adds necessary information, and the most important purpose is front-loaded. It could be slightly tighter by moving the cross-MCP example into a 'Use cases' subsection, but it remains efficient and scannable.

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 having no annotations and minimal schema, the description covers all essential operational aspects: destinations, filename handling, storage paths, TTL, size constraints, and an end-to-end email attachment flow. It also gives a pointer to the sibling tool needed to locate block IDs. With an output schema present, return-value details are not needed from the description, and nothing critical 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?

Schema description coverage is 0%, so the description must fully document parameters. It explains destination as an enum with per-value behavior, filename as an override, and that local filenames may include subdirectories that are auto-created. block_id is implied by the opening sentence and the pointer to notion_list_files_on_page. This fully compensates for the sparse 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 opens with a specific verb+resource+scope: 'Download a file from a Notion file/image/pdf/video/audio block.' This clearly distinguishes the tool from siblings like notion_extract_file_text or notion_render_file_page, and the destination options are enumerated. It also cross-references notion_list_files_on_page for finding block IDs, reinforcing its unique role.

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 detailed guidance on when to use each destination option (local, shared, drive, base64), including TTL and size constraints. It also includes a step-by-step cross-MCP transfer example to Gmail. However, it does not explicitly contrast this tool with sibling tools that might also retrieve file content (e.g., notion_extract_file_text or notion_render_file_page), so exclusionary guidance is implicit rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_extract_file_textA

Extract text from a PDF anywhere notion-mcp can reach — a file stored in Notion, the shared cross-MCP mount, the private store, or the Drive folder — without moving the bytes over MCP.

source schemes: 'notion:<block_id>' (file/pdf block on a page — get block IDs from notion_list_files_on_page), 'shared:', 'local:', 'drive:'.

Returns JSON: {"text", "page_count", "pages_returned", "mode", "truncated", "filename"} (+ "ocr_used"/"ocr_pages"/"ocr_engine" when OCR ran). Response ceiling 200 KB — truncation happens on a page boundary with a trailing marker naming the pages to fetch next.

pages: pdftotext-style spec — None/"" (all), "3", "1-5", "1,3,5", "1-3,7". Out-of-range pages are silently dropped. mode: 'text' (flowing), 'layout' (preserve columns), 'tables' (extract_tables → markdown). Applies to native extraction only.

OCR (scanned / image-only PDFs) — delegated to the fleet xberg service (XBERG_BASE_URL env; pages rasterised locally, sent as PNGs): ocr='auto' (default) — pages whose native text is < 20 chars are OCR'd (tesseract backend, seconds/page). "ocr_error" in the response means OCR was needed but xberg was unreachable/failed. ocr='off' — native extraction only. ocr='force' — OCR every requested page (garbled font encodings). ocr='llm' — transcribe pages with a vision model (xberg vlm backend → LiteLLM; env: XBERG_VLM_API_KEY, optional XBERG_VLM_MODEL / XBERG_VLM_BASE_URL). Best for handwriting and messy tables; slower and metered.

NameRequiredDescriptionDefault
ocrNoauto
modeNotext
pagesNo
sourceYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/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 behavioral disclosure. It excels by detailing response truncation (200 KB ceiling, page-boundary truncation, trailing marker), silent dropping of out-of-range pages, OCR auto behavior with a 20-char threshold, error conditions ('ocr_error'), and the distinction between native and OCR extraction. These details go far beyond what the schema or annotations reveal.

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 densely informative, with every section providing necessary operational detail. It is front-loaded with the core purpose and then structured into paragraphs and enumerations for source schemes, return format, page specs, mode, and OCR, making it navigable despite 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?

Despite the presence of an output schema, the description goes beyond it by explicitly listing the returned JSON fields and explaining truncation behavior. It covers all four parameters, source access, mode semantics, OCR fallback conditions, and error signaling, leaving no material gap for an agent to invoke the tool 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?

Since schema description coverage is 0%, each parameter is thoroughly explained in prose: source includes scheme-specific examples, pages uses a pdftotext-style grammar with concrete examples, mode enumerates 'text', 'layout', and 'tables' with explanations, and ocr documents 'auto', 'off', 'force', and 'llm' with detailed behavior. This fully compensates for the absent 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's function: "Extract text from a PDF anywhere notion-mcp can reach" and distinguishes it by noting it does so "without moving the bytes over MCP." It also specifies supported source schemes and references companion tool notion_list_files_on_page, making the resource and scope 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 contextual guidance: it explains the acceptable source schemes, how to obtain block IDs (via notion_list_files_on_page), and when to use different modes and OCR settings. However, it does not explicitly contrast with alternative sibling tools (e.g., notion_download_file) or state when not to use this tool, so it falls short of full alternative-based guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_get_async_taskA

Check a background write that Notion had not finished when the tool that started it returned (large notion_create_page / notion_replace_page_content calls report a task ID in that case).

task_id: the task ID from that reply.

NameRequiredDescriptionDefault
task_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/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 usefully explains that the write is asynchronous and that the task ID came from the initiating tool, but it does not describe status semantics, polling expectations, task expiration, or whether the check is strictly read-only.

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 short and front-loads the core purpose and triggering condition. The parenthetical is slightly dense, but no sentence is wasted and the parameter note is directly useful.

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 async-status tool with an output schema, the description covers what it does, when to call it, and where the task ID comes from. Additional details about polling or terminal states would help, but the core call path is sufficiently documented.

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 0%, so the description must compensate for the lone undocumented parameter. It does so by explaining that task_id is 'the task ID from that reply,' which gives the parameter real meaning beyond its type.

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 a specific verb ('Check') and resource ('background write') and explicitly ties the tool to async writes initiated by notion_create_page or notion_replace_page_content. This clearly distinguishes it from sibling read/write tools.

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 states exactly when to use the tool: after a large create/replace call returns a task ID instead of finishing synchronously. It does not explicitly discuss when not to use it or polling behavior, but the triggering condition is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_get_commentA

Get a single comment by ID — text, author, timestamps and the discussion thread it belongs to.

comment_id: from notion_get_comments or notion_add_comment.

NameRequiredDescriptionDefault
comment_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/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. 'Get' implies a non-mutating read, and the description does enumerate the returned fields (text, author, timestamps, thread), but it says nothing about permissions, behavior for deleted/inaccessible comment IDs, or error conditions — gaps that matter for a tool with zero annotation coverage.

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?

Two short sentences, with the purpose front-loaded and the parameter note trailing usefully. The stray colon-prefixed 'comment_id:' line is slightly awkward but costs almost nothing.

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 one-parameter read-only getter with an output schema present, the description covers purpose, targeted entity, returned content, and ID provenance. Nothing an agent needs in order to call it correctly is missing.

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 0% and the single property is labeled only 'Comment Id', so the note that the ID comes from notion_get_comments or notion_add_comment adds genuine sourcing semantics the schema lacks. It doesn't describe ID format or validation, so not a 5.

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?

States a specific verb and resource ('Get a single comment by ID') and enumerates what it returns (text, author, timestamps, thread), which implicitly contrasts with the list-oriented notion_get_comments. It doesn't explicitly name a sibling as the alternative, so it stops short of a 5.

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

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is only implied by 'comment_id: from notion_get_comments or notion_add_comment', which tells the agent where to source the ID but not when to prefer this tool over notion_get_comments or the update/delete comment siblings. That is useful but partial routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_get_commentsA

Get all comments on a Notion page.

Returns comment text, author, and timestamps. Use this to read discussion threads on a page.

page_id: the page to get comments from.

NameRequiredDescriptionDefault
page_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

No annotations are provided, so the description carries the transparency burden. It discloses that the tool returns comment text, author, and timestamps, and implies a read-only operation. However, it doesn't mention pagination, error behavior, or permissions. For a simple read tool this is adequate but not rich.

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 and front-loaded. The first sentence states the main action, followed by a useful detail about returned fields, a usage guideline, and a parameter explanation. Every sentence contributes value without redundancy.

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 tool with one parameter and an output schema, the description is complete. It explains what the tool does, what it returns, when to use it, and what the parameter means. Given the low complexity, no additional details are needed.

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 one parameter (page_id) with no description, and schema coverage is 0%. The description compensates by explicitly explaining 'page_id: the page to get comments from.' This adds clear meaning beyond the bare parameter name, which is valuable for correct invocation.

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 function: 'Get all comments on a Notion page.' It specifies a precise verb (Get), resource (comments on a Notion page), and scope (all comments). The addition 'Use this to read discussion threads' reinforces the purpose and differentiates it from sibling tools that add, update, or delete comments.

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 a clear context for use: 'Use this to read discussion threads on a page.' While it doesn't explicitly name alternatives or exclusions, the read-focused language makes it obvious that this is for reading rather than modifying comments. The context is sufficient for selecting this tool over its mutating siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_get_propertyA

Retrieve a single property from a Notion page with full pagination.

Useful for large properties (relations, rollups, long rich_text) that get truncated in the normal page response. Provide either property_name or property_id.

page_id: the page to read from. property_name: human-readable property name (looked up from page metadata). property_id: Notion property ID (from notion_describe_database schema). Takes precedence over property_name if both given.

NameRequiredDescriptionDefault
page_idYes
property_idNo
property_nameNo

Output Schema

NameRequiredDescription
resultYes

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 burden of behavioral disclosure. It reveals that the tool returns a single property with full pagination, handles large properties gracefully, and gives precedence to property_id over property_name. This goes beyond a simple 'get' but could mention error handling or auth implications.

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 well-structured and front-loaded: a clear one-sentence purpose, followed by a targeted use case, then a neatly formatted parameter list. Every sentence earns its place, with no unnecessary 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?

The description covers purpose, usage, and parameters well. However, it says 'Provide either property_name or property_id' but does not specify what happens if neither is given, especially since both are optional in the schema. This minor ambiguity prevents a perfect score.

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 0%, so the description must compensate. It thoroughly documents all three parameters: page_id (page to read), property_name (looked up from metadata), and property_id (from notion_describe_database schema, with precedence). This adds significant meaning beyond the bare 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 opens with 'Retrieve a single property from a Notion page with full pagination,' clearly stating the verb, resource, and scope. It distinguishes itself from sibling tools like notion_read_page by specifying 'single property' and addressing truncation, making its purpose unmistakable.

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 tool says it is 'Useful for large properties (relations, rollups, long rich_text) that get truncated in the normal page response,' providing clear context on when to use it. However, it does not explicitly name alternative tools or state when not to use it, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_get_userA

Get details for a specific Notion user by ID.

Returns the user's name, email, avatar URL, and type. Use notion_list_users to find user IDs first.

user_id: Notion user UUID, or "me" for this integration's own bot user (also shows the workspace it is connected to).

NameRequiredDescriptionDefault
user_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior3/5

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

No annotations exist, so the description carries the full burden. 'Get details' implies a read, and the 'me' special case is useful behavioral context, but it says nothing about permission requirements for reading other users or what happens for an invalid ID. Return fields are largely covered by the output schema.

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 lines, front-loaded with the core action, then return fields, then the sibling pointer, then the parameter note. No wasted text.

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?

An output schema exists, so the description needn't enumerate return values in depth, and the one required parameter is fully explained. Nothing needed to call this tool correctly 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?

Schema description coverage is 0%, so the description must compensate, and it does: user_id is defined as a Notion user UUID or the literal "me" for the integration's bot user, including the side effect that 'me' also reveals the connected workspace.

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 gives a specific verb and resource ('Get details for a specific Notion user by ID') and explicitly separates this tool from the sibling notion_list_users, which it names.

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 states the prerequisite workflow ('Use notion_list_users to find user IDs first'), which tells the agent when this tool is the right call versus its nearest sibling. It does not cover error or when-not scenarios, but the routing guidance is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_import_file_from_urlA

Import a file into Notion directly from a public HTTPS URL — the bytes go Notion-side, never through this server or MCP parameters.

url must be publicly accessible over HTTPS. filename must carry an extension Notion accepts (it determines the block type). The import is asynchronous: this tool polls until the upload reaches a terminal status or wait_seconds elapses. parent_page_id and position behave as in notion_upload_file.

Size limits are plan-dependent (5 MiB free / 5 GiB paid). No sha256 is reported — the bytes never pass through this server; verify via notion_download_file if integrity matters.

NameRequiredDescriptionDefault
urlYes
captionNo
filenameYes
positionNoend
wait_secondsNo
parent_page_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

No annotations exist, so the description carries full responsibility. It discloses async polling behavior, plan-dependent size limits, the absence of sha256 reporting, and the server-side transfer path without sending bytes through this server. This is exemplary transparency for a tool with 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?

The description is compact—four sentences—with the core purpose front-loaded. Every sentence adds essential context: constraints, async behavior, size limits, and integrity caveat. It is dense but not bloated, and each statement earns its place.

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 (async import, size limits, integrity concerns) and the presence of an output schema, the description covers all necessary operational aspects. It explains the critical behaviors without needing to describe return values, which are already handled by the output schema.

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?

With 0% schema description coverage, the description compensates well by explaining url requirements, filename semantics (determines block type), wait_seconds as polling timeout, and referencing notion_upload_file for parent_page_id and position. However, the caption parameter is not mentioned, leaving a gap for a minor field.

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 action: 'Import a file into Notion directly from a public HTTPS URL' and clearly distinguishes this tool from notion_upload_file by noting the bytes go Notion-side, never through the server. It also references notion_upload_file for parameter behavior, making the scope and differentiation explicit.

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 provides clear usage context: url must be publicly accessible, filename must have an acceptable extension, and the import is asynchronous with wait_seconds timeout. It recommends notion_download_file for integrity checks, offering an alternative for a related need, but does not explicitly state when to prefer this over notion_upload_file for local files.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_insert_page_contentA

Insert markdown into a page using Notion's own markdown parser — at the start, at the end, or after a piece of existing text.

Unlike notion_append_content (which converts markdown to blocks locally), this understands Notion-specific markup (tables, callouts, columns, toggles, mentions) and can target a spot by its text.

page_id: the page to insert into. markdown: content to insert. position: "end" (default) or "start". Ignored when after is given. after: insert directly after this existing content, given as "start text...end text" (the first and last few words of the passage, joined by three dots). Copy them from notion_read_page_markdown.

NameRequiredDescriptionDefault
afterNo
page_idYes
markdownYes
positionNoend

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior3/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. It usefully discloses the parsing engine, the precedence rule ('position ... ignored when after is given'), and the anchor format, but says nothing about permissions/auth requirements, failure behavior when the anchor text is missing or ambiguous, or size limits.

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?

Front-loaded summary sentence, then a differentiation sentence, then a tight per-parameter block that earns its space given zero schema coverage. The parameter names are repeated from the schema, but that repetition carries the missing 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?

An output schema exists, so return values need not be explained, and the invocation path (read markdown, copy anchor, insert) is complete. The remaining gap is error/precondition handling for a malformed or unmatched 'after' anchor on a mutation tool with no annotations.

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 description coverage is 0%, yet the description documents all four parameters with real semantics: position's default and valid values, its override by 'after', and a precise encoding for the 'after' anchor ('start text...end text' joined by three dots, copied from the read tool). This fully compensates for the empty 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?

States a specific verb and resource ('Insert markdown into a page') plus the mechanism ('using Notion's own markdown parser') and the three positioning modes. It explicitly contrasts itself with notion_append_content, so an agent can distinguish the two without reading schemas.

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?

Names the alternative (notion_append_content) and the condition that selects this tool instead: Notion-specific markup support and text-anchored insertion. It also tells the agent where to source the 'after' value (notion_read_page_markdown), closing the retrieval-to-insertion loop.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_list_custom_emojisA

List the workspace's custom emojis. Use one as a page icon with icon="custom_emoji:" on notion_create_page / notion_update_page.

name: optional exact-name filter.

NameRequiredDescriptionDefault
nameNo

Output Schema

NameRequiredDescription
resultYes

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 full behavioral burden. It correctly implies a read-only enumeration and usefully discloses the icon-syntax contract, but says nothing about pagination, result limits, permission requirements, or whether the list is workspace-wide scoped. Adequate but with real gaps for an unannotated 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?

Three short sentences, purpose front-loaded, then the consumption hint, then the param note. Every sentence earns its place and nothing is padded.

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?

An output schema exists, so return shape needn't be explained, and the one optional param is documented in prose. What's missing is scale/behavior on large workspaces (pagination or truncation) — minor but not irrelevant for a listing tool.

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 0% (the schema only declares a string with default ""), so the sentence 'name: optional exact-name filter' is doing real work — it supplies optionality and exact-match semantics that the schema lacks. A single trivial param keeps this from being a 5.

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 opens with a specific verb+resource: 'List the workspace's custom emojis.' No sibling tool covers emoji enumeration, so disambiguation is trivial, but the statement is unambiguous and immediately actionable.

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 goes beyond 'what' to explain downstream use: pass a result as icon="custom_emoji:<name>" to notion_create_page / notion_update_page, naming the exact siblings that consume it. It stops short of stating when not to use it or whether cached/refreshed results matter.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_list_files_on_pageA

List all file/image/pdf/video/audio blocks on a Notion page. Returns block IDs and filenames — use block IDs with notion_download_file.

NameRequiredDescriptionDefault
page_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses that the tool returns block IDs and filenames, and implies it does not download files (by directing to another tool). It does not mention any side effects, permissions, pagination, or failure modes, but for a read-only listing operation, the core behavior is adequately covered. The score reflects that it adds some context but lacks deeper behavioral details.

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 no fluff. The first sentence states the action and scope, the second sentence explains the return value and next step. It is front-loaded with the key information and every sentence earns its place.

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 low complexity (1 parameter, simple listing) and the presence of an output schema, the description is mostly complete. It tells what is listed, what is returned, and how to use the result. The main gap is the lack of parameter format details, but for a tool this simple, the description covers the essential context well.

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

Parameters2/5

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

The schema has zero description coverage, and the description does not compensate by explaining the page_id format (e.g., UUID vs URL). The only param is page_id, and the description merely says 'on a Notion page', which is redundant with the tool's name. The description adds no meaningful semantic information beyond what the schema field name implies.

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 a specific verb 'List' and clearly identifies the resource: all file/image/pdf/video/audio blocks on a Notion page. It distinguishes from siblings by mentioning the return of block IDs and filenames for use with notion_download_file, setting it apart from search or upload tools. This is a precise, unambiguous statement of purpose.

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 identify files on a page for subsequent download. It explicitly directs the user to use the returned block IDs with notion_download_file, which is a concrete usage guideline. However, it does not mention explicit alternatives or exclusions (e.g., when not to use it), but the context is sufficient for a simple listing tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_list_file_uploadsA

List files this integration has uploaded to Notion, with their status — useful for checking an import or finding an upload ID.

status: optional filter: pending | uploaded | expired | failed. limit: max results (1-100).

NameRequiredDescriptionDefault
limitNo
statusNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It discloses the status filter values and the limit range, but omits pagination/ordering behavior, permission requirements, and how results are sorted or truncated. Adequate but with meaningful gaps for a list 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?

Three short lines with zero waste: purpose first, then each parameter explained in one clause. Nothing is repeated or padded.

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?

With an output schema present, return values need not be explained, and both parameters are covered. However, with no annotations and no schema parameter descriptions, the description should say more about operational behavior (pagination, permissions, result ordering). It is complete enough to call but not fully self-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 0%, so the description must compensate for both parameters. It does so well: it enumerates the status values (pending | uploaded | expired | failed) and states the limit range (1-100), which the schema lacks. It omits the default values (limit 20, status empty), leaving a small gap.

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?

States a specific verb and resource ('List files this integration has uploaded to Notion') with a clear scope limited to the integration's own uploads. This distinguishes it from siblings like notion_list_files_on_page and notion_list_local_files, though it does not name those alternatives explicitly.

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 usage context ('useful for checking an import or finding an upload ID'), telling the agent when this tool is appropriate. It does not state exclusions or point to alternatives, which keeps it below a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_list_local_filesA

List files available to notion-mcp by scheme, so the agent can verify a handoff before attaching it to Notion.

location: • 'files' (default) — the notion-mcp private store under FILES_DIR. These are addressable as source='local:'. • 'shared' — the cross-MCP shared mount under SHARED_DIR. Files placed here by google-accounts-mcp (download_attachment with destination='shared') are addressable as source='shared:'.

Optional substring filter on the filename.

NameRequiredDescriptionDefault
filterNo
locationNofiles

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/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 the tool lists files in two specific stores and describes the source addressing forms. It does not mention side effects or edge cases, but as a read-only listing action the core behavior is clear.

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 purpose statement, then uses a bulleted list for the location options, and ends with a short sentence about the filter. It is well-structured and every sentence contributes value.

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?

The tool has only two optional parameters with defaults and an output schema, and the description covers its purpose, both locations, and the filter. The cross-MCP context about google-accounts-mcp adds completeness, making the description sufficient for correct invocation.

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?

The schema has zero descriptions, but the description fully explains the 'location' parameter with its two possible values and their meanings, and the 'filter' parameter as an optional substring filter. This adds significant meaning beyond the raw 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 the tool lists files available to notion-mcp by scheme, and explains the purpose of verifying a handoff before attaching to Notion. It distinguishes between 'files' and 'shared' locations, which sets it apart from sibling tools like notion_list_files_on_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 provides clear context for when to use the tool—verifying a handoff before attaching—and explains the two location schemes including which files are in each. However, it does not explicitly mention alternatives or when not to use this tool versus other listing tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_list_templatesA

List the page templates defined on a database. Pass a template's ID (or "default") as notion_create_page's template argument to create a row from it.

database_id: the database to inspect. name: optional case-insensitive substring filter.

NameRequiredDescriptionDefault
nameNo
database_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/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. 'List' plus 'inspect' imply a read-only operation, and it usefully discloses the 'default' sentinel value, but it says nothing about permissions/plan requirements, pagination, or result count/order.

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?

Front-loaded purpose sentence followed by the workflow hint, then a compact two-line parameter glossary. Every line carries information and nothing is padded.

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?

With an output schema present, return values need no explanation; the description covers purpose, both parameters, and the downstream call. Only access prerequisites and pagination behavior are absent, which is minor for a two-parameter list tool.

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 0%, so the description must compensate, and it does: database_id is identified as 'the database to inspect' and name is documented as an optional case-insensitive substring filter — the case-insensitivity is genuine meaning the schema lacks. The database_id explanation is thinner than the name one, keeping it short of a 5.

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?

States a specific verb and resource ('List the page templates defined on a database') and immediately frames the output's purpose by pointing to notion_create_page's template argument, which separates it from sibling list/search tools like notion_list_views or notion_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 Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete follow-up workflow (pass the returned ID, or the literal 'default', as notion_create_page's template argument), which tells the agent when this tool belongs in a sequence. It does not state when NOT to use it or contrast with notion_describe_database, so no exclusions are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_list_usersA

List all users in the Notion workspace.

Returns user names, IDs, emails, and types (person or bot). User IDs are needed for people properties and @mentions in comments.

name_contains: optional case-insensitive filter on the user's name.

NameRequiredDescriptionDefault
name_containsNo

Output Schema

NameRequiredDescription
resultYes

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 full burden. It discloses return fields and user types (person or bot), but does not mention pagination, permissions, or whether all workspace users are always returned.

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 the core action and return fields, then adds the practical use case and the optional filter. Every sentence contributes useful context without bloat.

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 list tool with an output schema, the description covers purpose, return values, use case, and parameter behavior. Missing pagination and permission details are minor given the tool's simplicity.

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 0%, but the description compensates by explaining the only parameter: name_contains is optional and applies a case-insensitive filter on the user's name. It could clarify substring vs. exact matching, but the core semantics are covered.

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 uses a specific verb and resource ('List all users') and scopes it to the Notion workspace, while also naming returned fields. It does not explicitly distinguish this list operation from the sibling notion_get_user tool, so it falls short of a 5.

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

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear use case: user IDs are needed for people properties and @mentions in comments. However, it does not explicitly say when to use notion_get_user instead, so there is no sibling routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_list_viewsA

List the views defined on a Notion database — name, type, id, and whether each carries a saved filter/sorts. Use the view id with notion_query_view to run a view's saved filter, or with notion_update_view / notion_delete_view to manage it.

NameRequiredDescriptionDefault
database_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/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. It discloses the nature of the operation ('List') and the specific output fields, which is behavioral context. It does not mention side effects or permissions, but for a read-only listing operation, 'List' and the output description give sufficient 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 two sentences with no filler. The first sentence states the purpose and output; the second provides actionable integration with other tools. Every part earns its place, and it is front-loaded with the core action.

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?

With a single required parameter, an output schema present, and a clear description of what the tool returns and how to use it with sibling tools, the description is complete. It covers purpose, usage, and follow-up actions without needing to explain return values (which the output schema handles).

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 schema has a single parameter (database_id) with 0% schema description coverage, so the description must compensate. The description implies that database_id identifies the Notion database whose views are listed, but it does not provide format, validation, or any additional meaning beyond the schema itself. Given the simplicity of the parameter, this is adequate but not exceptional.

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 a specific verb ('List') with a clear resource ('views defined on a Notion database') and enumerates the output fields (name, type, id, saved filter/sorts). It clearly distinguishes this tool from siblings like notion_query_database or notion_describe_database by focusing specifically on views.

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 explicitly states when to use this tool and how to chain it with related tools ('Use the view id with notion_query_view... or with notion_update_view / notion_delete_view'). This provides clear guidance on the tool's role and alternatives, making it easy for an agent to decide when to invoke it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_move_pageA

Move a Notion page to a new parent page or database.

page_id: the page to move. new_parent_page_id: move under this page. new_parent_database_id: move into this database (as a new row). Only one of the two parent args should be set.

NameRequiredDescriptionDefault
page_idYes
new_parent_page_idNo
new_parent_database_idNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior2/5

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

With no annotations provided, the description must carry the full burden. It outlines the mechanics (new row for database) but does not disclose side effects such as whether the page is removed from its original location, permission requirements, or whether the operation is reversible. This is a significant gap for a mutation tool, similar to the update_drive example.

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, using a single-purpose sentence followed by a clean parameter list. Every line earns its place; there is no fluff. The formatting makes the parameter semantics easy to scan.

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 tool's simplicity, the description covers the core action and parameters adequately. However, it omits potential edge cases (e.g., circular moves, self-parenting) and does not describe the output or failure modes, though an output schema exists. More detail on side effects would make it more complete, but it's minimally viable.

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?

The description adds substantial meaning beyond the raw schema by explaining each parameter: page_id identifies the page, new_parent_page_id specifies the target page, and new_parent_database_id specifies the target database. It also clarifies the 'as a new row' behavior and the exclusivity constraint, which are not present in the schema. Schema description coverage is 0%, so this compensation is essential.

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+resource: 'Move a Notion page to a new parent page or database.' This distinguishes it from sibling tools like create/update/archive. It leaves no ambiguity about the tool's core 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 provides specific guidance on how to use the two parent parameters, noting that only one should be set. While it doesn't explicitly mention alternatives, the unique 'move' operation makes alternatives unnecessary. It gives clear context on the condition for using each parent argument.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_purge_fileA

Delete a single file from the cross-MCP shared mount by bare filename. Use this after a successful upload to free the shared slot instead of waiting for the daily TTL sweep (or calling notion_purge_shared_files with max_age_hours=0, which would wipe any unrelated in-flight handoffs). Rejects any filename containing path separators.

NameRequiredDescriptionDefault
filenameYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/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 burden of disclosing behavior. It reveals a key constraint ('Rejects any filename containing path separators') and provides context about the daily TTL sweep and shared-slot semantics. However, it does not explicitly state return values, error handling on missing files, or permanence of deletion, which would be useful for a destructive 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 three sentences, each earning its place: the first states the operation, the second provides usage context and alternatives, the third adds a critical constraint. It is front-loaded with the primary action and avoids any filler.

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 tool's simplicity (one parameter, single file deletion) and the presence of an output schema, the description covers the key behavioral and usage aspects. It explains the shared-mount context, the TTL sweep, and the exclusion of path separators. It is sufficiently complete for an agent to select and invoke the tool correctly, though it could mention side effects or idempotency.

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 schema only defines a 'filename' string with no description (0% coverage). The description compensates by specifying that it must be a 'bare filename' and that path separators are rejected, adding crucial meaning beyond the schema. Still, it could offer examples or clarify what happens if the file doesn't exist, but the essential semantics are covered.

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 ('Delete a single file'), the resource ('from the cross-MCP shared mount'), and the method ('by bare filename'). It also distinguishes itself from sibling tools by explicitly naming the alternative (notion_purge_shared_files) and explaining why this tool is safer.

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 provides explicit when-to-use guidance: 'Use this after a successful upload to free the shared slot' and contrasts with the alternative tool 'notion_purge_shared_files with max_age_hours=0' which could wipe unrelated handoffs. This gives clear usage direction and warns against misuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_purge_shared_filesA

Delete files from the cross-MCP shared mount (SHARED_DIR, /shared inside the container) whose modification time is older than max_age_hours. Use this to clean up attachments handed over from the companion google-accounts-mcp server once they've been uploaded to Notion.

A host-level TTL sweep (if you run one) makes this automatic; the tool is mainly for agents that want to clean up proactively at the end of a workflow without waiting for it.

Set dry_run=True to list victims without deleting. Only regular files are touched — subdirectories are left alone.

NameRequiredDescriptionDefault
dry_runNo
max_age_hoursNo

Output Schema

NameRequiredDescription
resultYes

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 only regular files are touched, subdirectories are left alone, and dry_run can list victims before deletion. This adds meaningful behavioral context beyond the raw schema, though it stops short of explicitly stating that the deletion is permanent and irreversible.

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 organized into three short paragraphs: the core action, the use case/alternative, and operational details. Every sentence adds value, and the most important information is front-loaded. No filler or 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?

Given that an output schema exists, the description covers purpose, usage, behavioral constraints, and parameters well. One minor ambiguity remains about whether the tool recurses into subdirectories (it says 'subdirectories are left alone' but not whether files inside them are candidates), but overall the description is sufficiently complete for correct invocation.

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?

Despite 0% schema description coverage, the description fully explains both parameters: max_age_hours defines the age threshold for deletion, and dry_run switches to listing victims without deleting. This adds clear semantic meaning beyond the bare schema types and defaults.

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 'Delete files from the cross-MCP shared mount' — a specific verb and resource — and adds the age condition 'modification time is older than max_age_hours.' This clearly distinguishes it from sibling tools like notion_purge_file by targeting the shared mount and bulk age-based cleanup.

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 'Use this to clean up attachments handed over from the companion google-accounts-mcp server once they've been uploaded to Notion' and contrasts it with a host-level TTL sweep, noting the tool is for proactive cleanup at workflow end. It provides clear context and intent, though it does not name alternative tools or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_query_databaseA

Query a Notion database with optional filter, sort, and pagination.

Returns matching rows with their properties. Use notion_describe_database first to see the schema and property names.

database_id: the database to query. filter_json: Notion API filter object as JSON. Example: {"property": "Status", "select": {"equals": "Done"}} Compound example: {"and": [ {"property": "Status", "select": {"equals": "Active"}}, {"property": "Priority", "number": {"greater_than": 3}} ]} Status properties can also be filtered by group (To-do / In progress / Complete): {"property": "Status", "status": {"group_equals": "In progress"}} sorts_json: JSON array of sort objects. Example: [{"property": "Due", "direction": "ascending"}] Use "ascending" or "descending". limit: page size (default 50, max 100 — Notion's hard cap). start_cursor: opaque cursor returned by a previous call. Pass it to fetch the next page. When the output shows next_cursor: <token> the result set has more rows; when it shows next_cursor: (end) you have reached the end. properties: optional comma-separated list of property names to include (e.g. "Gmail Message ID, Invoice, Status"). Slims the output dramatically when you only need a few columns. The title column is always shown. Unknown names are ignored silently so a caller can ask for a union across a few databases. archived: True returns the database's archived rows instead of the active ones.

NameRequiredDescriptionDefault
limitNo
archivedNo
propertiesNo
sorts_jsonNo
database_idYes
filter_jsonNo
start_cursorNo

Output Schema

NameRequiredDescription
resultYes

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 burden and discloses key behavior: returned rows, pagination cursor semantics, the 100-row hard cap, archived-row switching, and silent ignoring of unknown property names. It does not explicitly state read-only/no side effects or mention auth or rate limits, leaving some behavioral gaps.

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 purpose and a prerequisite, then uses a clean parameter-by-parameter structure. Its length is justified by the zero schema coverage and the complexity of filter/sort JSON.

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?

An output schema exists, so return-value explanation is not required, but the description still adds useful cursor-end semantics. Given seven parameters with no schema descriptions and no annotations, the description provides enough operational detail to call the tool 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?

Schema description coverage is 0%, so the description must compensate, and it does: every parameter is explained with examples and constraints. filter_json and sorts_json include JSON examples, limit gives default and max, start_cursor explains pagination, properties explains comma-separated slimming, and archived explains the alternate result set.

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?

States a specific verb and resource: query a Notion database, returning matching rows with their properties. It is clear, but it does not explicitly differentiate this from sibling tools like notion_query_view or notion_search_pages.

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?

Gives a clear prerequisite workflow: call notion_describe_database first to learn the schema and property names. It lacks explicit when-not conditions or guidance versus sibling query/search tools, so it is strong but not complete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_query_meeting_notesA

Find AI meeting notes in the workspace (newest first by default). Read one with notion_read_meeting_notes.

title_contains: simple filter on the meeting title. filter_json: full Notion meeting-notes filter instead, e.g. {"property": "created_time", "filter": {"date_is_after": "2026-10-01"}} or {"operator": "and", "filters": [...]}. Properties: title, attendees, created_time, created_by, last_edited_time, last_edited_by. Overrides title_contains. sort_json: JSON array, e.g. [{"property": "created_time", "direction": "descending"}]. limit: max results (1-50). There is no paging — narrow the filter.

NameRequiredDescriptionDefault
limitNo
sort_jsonNo
filter_jsonNo
title_containsNo

Output Schema

NameRequiredDescription
resultYes

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 and does well: it discloses the default ordering, that there is no paging, the hard limit range of 1-50, and that filter_json overrides title_contains. It omits permission/sharing scope (what 'workspace' covers) and rate/volume caveats, so not a 5.

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

Conciseness5/5

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

Purpose and the read-next pointer are front-loaded in two short sentences, then a compact per-parameter block. The JSON examples are the only verbosity and they earn their place by disambiguating a free-form string parameter.

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?

An output schema exists so return values need no explanation, and the description covers query mechanics, override behavior, and the no-pagination constraint. The remaining gap is authorization/scope: nothing says whether results span the whole workspace or only pages shared with the integration.

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 0%, so the description must document all four parameters, and it does: title_contains as a simple title filter, filter_json with two concrete shapes and an enumerated property list, sort_json with an array example, and limit's 1-50 bound. The override precedence between filter_json and title_contains is a detail found nowhere in 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?

States a specific verb and resource ("Find AI meeting notes") plus a default scope ("workspace", "newest first by default"). It also names the read-one counterpart, so an agent can distinguish it from notion_read_meeting_notes and from the generic notion_query_database sibling.

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?

"Read one with notion_read_meeting_notes" explicitly routes the agent to the alternative after a list operation, which is the correct two-step pattern. It does not state exclusions (e.g., when to prefer notion_search_pages), so it stops short of a full when/when-not set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_query_viewA

Run a database view's saved filter and sorts, returning the matching rows (title + id + url). Use this instead of notion_query_database when the view already encodes the filter you want — no filter JSON needed.

view_id: from notion_list_views. limit: max rows to return (max 100).

NameRequiredDescriptionDefault
limitNo
view_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

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

No annotations are provided, so the description carries the burden. It discloses the return shape ('title + id + url') and the limit constraint ('max 100'). However, it does not mention error behavior or permissions, which is a minor gap for a read-only 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?

Three short sentences, front-loaded with purpose, then usage, then parameters. No filler or redundancy.

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?

The tool is simple (2 params, one required), has an output schema, and is well-differentiated from siblings. The description covers purpose, usage, and parameters adequately for an agent to select and 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?

Schema description coverage is 0%, so the description compensates by explaining view_id's provenance ('from notion_list_views') and limit's semantics ('max rows to return (max 100)'). This adds real meaning beyond the schema's type/default.

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 the specific verb 'Run' and identifies the resource as 'a database view's saved filter and sorts'. It explicitly differentiates from sibling notion_query_database by stating 'Use this instead of... when the view already encodes the filter you want'.

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?

Explicitly states when to use: 'Use this instead of notion_query_database when the view already encodes the filter you want'. Also implies when not to use (when custom filter JSON is needed), and directs users to notion_list_views for obtaining view_id.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_read_meeting_notesA

Read one section of an AI meeting notes block.

block_id: the meeting notes block ID (from notion_query_meeting_notes, or a "[Meeting notes: …]" line in notion_read_page output). section: "summary" (default), "notes" or "transcript".

NameRequiredDescriptionDefault
sectionNosummary
block_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It does disclose the key behavioral constraint—only ONE section is returned per call, with 'summary' as the default—which an agent needs for planning. It says nothing about permissions, whether the block must already exist, or behavior for an invalid section value, so gaps remain.

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 purpose sentence is front-loaded and the parameter notes are terse, each earning its place. The layout is a bit ragged (line-broken parameter list) but nothing is wasted.

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 2-parameter read tool with an output schema present, the description covers purpose, the single-section constraint, and both parameters adequately. Only minor residual gaps (invalid-section behavior, whether block_id must be a meeting-notes block specifically) keep it from a 5.

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 0%, so the description must compensate, and it largely does: it enumerates the valid section values ('summary', 'notes', 'transcript'), gives the default, and explains where block_id comes from. Enum values are not declared in the schema, so this is real added meaning.

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?

States a specific verb+resource: reads one section of an AI meeting notes block. This distinguishes it from notion_query_meeting_notes (query) and notion_read_page (full page). It stops short of explicitly contrasting with notion_read_page or notion_read_page_markdown, which an agent could plausibly confuse it with.

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?

Useful routing is implied by the block_id provenance note (from notion_query_meeting_notes or a '[Meeting notes: …]' line in notion_read_page output), which tells the agent when this is the right follow-up call. However, there is no explicit when-not guidance or statement of how this differs from reading the page directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_read_pageA

Read a Notion page's properties and content as markdown.

Returns the page title, properties, and full block content rendered as readable markdown. Nested blocks (toggles, list children, columns) are fetched recursively up to max_depth levels.

page_id: Notion page ID (from notion_search_pages or a URL). max_depth: how many levels of nested blocks to fetch (1-5, default 3). include_block_ids: if True, each block line is suffixed with an HTML comment containing the block UUID, e.g. . Use these IDs with notion_update_block / notion_delete_block.

NameRequiredDescriptionDefault
page_idYes
max_depthNo
include_block_idsNo

Output Schema

NameRequiredDescription
resultYes

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 full burden of behavioral disclosure. It explains recursive fetching of nested blocks, the max_depth limit, and the behavior of include_block_ids, including how to use the resulting block IDs with other tools. This is more than a basic read operation, though it does not mention rate limits or potential large page considerations.

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 uses a clear structure separating the core function from parameter explanations. Every sentence earns its place with no redundancy or filler.

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 covers full functionality, return format, parameter details, and even points to related operations for block IDs. It is complete for a read tool with three parameters and an output schema, though it could optionally mention read-only safety or error scenarios, but these are not critical.

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?

The schema has 0% description coverage, but the description fully compensates by explaining each parameter: what page_id is and where to get it, the range and default for max_depth, and the effect and purpose of include_block_ids. This provides complete semantic meaning beyond raw schema types and defaults.

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 a Notion page's properties and content as markdown, which is a specific verb+resource. It distinguishes from mutation and search siblings, but does not differentiate from the similarly named sibling notion_read_page_markdown, so it falls short of full sibling differentiation.

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 the tool should be used to read page content, such as the title, properties, and blocks, and mentions using block IDs for updates/deletes. However, it does not explicitly state when to use this tool over alternatives like notion_read_page_markdown or when not to use it, leaving usage guidance mostly implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_read_page_markdownA

Read a Notion page's content as native Notion-flavored markdown.

Uses the direct markdown API endpoint — faster than block-by-block fetching and returns Notion's own markdown representation including special tags for databases, files, and embeds.

For block-level editing (update/delete individual blocks), use notion_read_page with include_block_ids=True instead.

page_id: Notion page ID. markdown_version: "v2" returns Notion-flavored Markdown (a preview syntax); default is the stable syntax.

NameRequiredDescriptionDefault
page_idYes
markdown_versionNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

No annotations are provided, so the description carries the burden, and it does disclose the performance trait (direct markdown endpoint vs block-by-block), the content of the return (special tags for databases, files, embeds), and the preview status of v2 syntax. It omits permission/auth requirements and any size or truncation limits for large pages, which keeps it short of a 5.

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

Conciseness5/5

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

Purpose and performance rationale are front-loaded, the sibling routing comes next, parameter notes last. Every sentence adds information; nothing restates the title or the schema.

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?

An output schema exists so return values need not be explained, and the description covers the format, the alternative tool, and versioning. For a read-only two-parameter tool the remaining gap is minor: nothing about access requirements or behavior on very large pages.

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 0%, so the description must compensate; it does for markdown_version by explaining that "v2" yields the preview Notion-flavored syntax and the default is the stable syntax, which is real meaning beyond the bare enum-less string field. page_id gets only a one-line gloss, leaving the accepted ID format (UUID vs URL) unstated.

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?

States a specific verb and resource (read a page), plus the exact output representation (native Notion-flavored markdown). It explicitly positions itself against the sibling notion_read_page, so an agent can separate them without opening either schema.

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?

Gives an explicit alternative with a condition: use notion_read_page with include_block_ids=True for block-level editing. It also states when to prefer this tool (faster than block-by-block fetching), so both the use case and the exclusion are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_render_file_pageA

Render one page of a PDF (from Notion, shared, local, or Drive) as a viewable image. The default return is a real MCP image content block, so you SEE the page directly — for a scanned document this is often all you need. Use when notion_extract_file_text isn't enough: charts, stamps, layouts, visual validation.

source schemes as in notion_extract_file_text ('notion:<block_id>', 'shared:', 'local:', 'drive:').

Set return_base64=True for a JSON envelope {"image_base64", "mime_type", "width", "height", "page", "page_count", "filename"} instead (for relaying bytes programmatically). Errors return a JSON string with an "error" key in both modes.

page: 1-indexed. max_width: 200..4000 px (default 1200). format: 'jpeg' (default) or 'png'. quality: JPEG 1..100 (default 75).

NameRequiredDescriptionDefault
pageNo
formatNojpeg
sourceYes
qualityNo
max_widthNo
return_base64No

TDQS

A4.8/5.0
Behavior4/5

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

With no annotations, the description discloses key behaviors: default return is an MCP image content block, optional base64 JSON envelope, error handling in both modes, page indexing, and parameter ranges. It does not explicitly state read-only behavior, but rendering implies no mutation, and the error description adds 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 well-structured with a clear opening, usage context, and parameter breakdown. Each sentence adds essential information, and the layout is easy to scan. No redundant or filler content.

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 tool with 6 parameters and no output schema, the description covers return values in both modes (image block and JSON envelope), error format, parameter constraints, and source schemes. It provides sufficient context for an agent to invoke the tool correctly without additional lookups.

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 has 0% parameter coverage, so the description fully compensates by explaining each parameter: source schemes, page indexing, max_width range, format options, quality range, and return_base64 envelope structure. Every parameter is given meaningful context beyond its type/default.

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 renders one page of a PDF as a viewable image, specifying the supported sources (Notion, shared, local, Drive). It distinguishes itself from sibling notion_extract_file_text by targeting visual content like charts, stamps, and layouts.

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?

Explicitly provides when-to-use guidance: 'Use when notion_extract_file_text isn't enough' with concrete examples (charts, stamps, layouts, visual validation). It also explains that the default image return is sufficient for scanned documents.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_replace_fileA

Replace the file inside an EXISTING file/image/pdf/video/audio block, in place — the block keeps its position on the page. Use this to update a document without re-arranging anything; use notion_upload_file(position=...) to add a new block instead.

block_id: the file block to update (from notion_list_files_on_page or notion_read_page(include_block_ids=True)). source: same schemes as notion_upload_file (local:, shared:, drive:, base64:). caption: when non-empty, replaces the caption; when empty, the existing caption is left untouched.

The new file must map to the same block type as the existing block (e.g. you cannot replace an image block's content with a PDF — Notion blocks are typed). In that case delete the block and upload anew.

NameRequiredDescriptionDefault
sourceYes
captionNo
block_idYes
filenameNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/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 disclosure burden. It transparently states that the replacement happens in-place, that the block position is preserved, and that the caption is only replaced when non-empty. It does not explicitly state reversibility/permissions, but the core destructive behavior is clearly communicated.

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?

Every sentence earns its place: the main behavior, usage direction, parameter details, and a caveat about type constraints. It is front-loaded with the key action and remains compact without repetition.

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?

The description covers the essential context: what the tool does, when to use it, where to obtain block_id, how to specify the source, caption behavior, and a fallback action for type mismatch. An output schema exists, so not detailing return values is acceptable.

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 0%, so the description must compensate. It explains block_id, source (with scheme examples), and caption semantics thoroughly, but the 'filename' parameter is not mentioned at all. The source reference to notion_upload_file assumes the agent already knows those schemes, which slightly weakens self-containedness.

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 action: 'Replace the file inside an EXISTING file/image/pdf/video/audio block, in place — the block keeps its position on the page.' It clearly distinguishes itself from the sibling notion_upload_file by contrasting updating an existing block versus adding a new one.

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?

Explicit when-to-use guidance is provided: 'Use this to update a document without re-arranging anything; use notion_upload_file(position=...) to add a new block instead.' It also covers the edge case of block type mismatch and instructs to delete and upload anew.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_replace_page_contentA

Replace a page's entire content with new markdown.

Overwrites all existing content. Use notion_read_page_markdown first to see what's there. For targeted edits, use notion_update_page_content instead.

page_id: the page to replace content on. markdown: new page content in markdown format. allow_deleting_content: must be True when the replacement would delete a child page or database that is on the page now. markdown_version: "v2" treats markdown as Notion-flavored Markdown (a preview syntax); default is the stable syntax.

Very large pages are processed by Notion as a background task; if it is still running when this returns, the reply carries a task ID for notion_get_async_task.

NameRequiredDescriptionDefault
page_idYes
markdownYes
markdown_versionNo
allow_deleting_contentNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.9/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 behavioral burden and does: it declares the overwrite/destructive semantics, the guard condition for allow_deleting_content when child pages or databases would be destroyed, and the preview-vs-stable markdown tradeoff. It also discloses that very large pages run as a background task and return a task ID for notion_get_async_task, which is non-obvious operational behavior an agent must plan for.

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?

Front-loaded with the action and the destructive warning, then per-parameter notes, then the async caveat in order of operational importance. No filler sentences; each block conveys distinct 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?

An output schema exists so return values need not be explained, yet the description still flags the async task-ID case that changes what the agent should do next. Given a 4-parameter destructive tool with no annotations, this covers everything needed to invoke it safely.

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 0%, so the description must supply all meaning and it documents all four parameters, including the conditional requirement on allow_deleting_content and the meaning of "v2" for markdown_version. Minor gap: page_id is described only vaguely (no indication of whether an ID, URL, or slug is accepted) and markdown's format expectations are thin.

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?

States a specific verb and resource plus scope: "Replace a page's entire content with new markdown." The word "entire" immediately separates it from partial-edit siblings like notion_update_page_content and notion_insert_page_content.

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?

Gives explicit prerequisites ("Use notion_read_page_markdown first to see what's there") and an explicit alternative ("For targeted edits, use notion_update_page_content instead"). When-to-use, when-not-to-use, and the sibling to route to are all present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_restore_pageA

Restore an archived page from the Notion trash.

page_id: the archived page to restore.

NameRequiredDescriptionDefault
page_idYes

Output Schema

NameRequiredDescription
resultYes

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 full burden of behavioral disclosure. It states the action but does not disclose what happens if the page is not archived, whether permissions are required, what the response contains, or whether the operation is reversible. This is a minimal description 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 two short, direct sentences with the action front-loaded and a single parameter clarification. Every word earns its place; there is no redundancy or wasted text.

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 tool is simple with one parameter and an output schema, so the description covers the basic purpose and parameter adequately. However, the lack of behavioral caveats (e.g., error conditions, prerequisites, or effects on page state) leaves some gaps, especially given there are no annotations to supplement it.

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?

With schema description coverage at 0%, the description compensates by explaining that 'page_id' is 'the archived page to restore,' adding meaning beyond the schema's generic 'Page Id' title. While it does not specify a format or additional constraints, the single parameter is clearly interpreted.

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 a specific verb ('Restore') and a clear resource ('an archived page from the Notion trash'), which directly distinguishes it from sibling tools like notion_archive_page. The purpose is immediately obvious 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 Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context that this tool is for restoring pages that are in the Notion trash, but it does not explicitly mention when not to use it or point to alternatives such as notion_archive_page for the inverse operation. No exclusions or alternative tool references are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_search_databasesA

Search Notion for databases the integration has access to. Returns titles, IDs, and property schemas. Use the database ID with notion_query_database, notion_describe_database, or notion_create_page (with database_id).

The integration only sees databases explicitly shared with it in Notion.

NameRequiredDescriptionDefault
limitNo
queryYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

Discloses the integration's access limitation ('only sees databases explicitly shared with it') and return content. No annotations exist, so the description carries the full burden; it gives useful context but doesn't mention rate limits or pagination.

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 concise sentences with front-loaded purpose; the access-scope note is useful and not redundant.

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 simple tool and presence of an output schema, the description covers the key workflow and access limitation. Missing parameter details prevent a 5, but overall it's adequately complete.

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

Parameters2/5

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

The description never explains the 'limit' parameter and only implies 'query' is a search term. With 0% schema description coverage, this is a significant gap; the agent cannot know how limit behaves or what query matches.

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 'Search Notion for databases the integration has access to' with a specific verb and resource, and distinguishes from notion_search_pages by focusing on databases. It also lists the return content (titles, IDs, property 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?

Explicitly tells the agent to use the returned database ID with notion_query_database, notion_describe_database, or notion_create_page, providing a clear usage workflow. However, it doesn't explicitly contrast with notion_search_pages or state 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.

notion_search_pagesA

Search Notion for pages the integration has access to. Returns titles and page IDs — use these IDs with notion_upload_file / list_files_on_page. The integration only sees pages explicitly shared with it in Notion. in_trash=True searches trashed pages instead of active ones (restore matches with notion_restore_page).

NameRequiredDescriptionDefault
limitNo
queryYes
in_trashNo

Output Schema

NameRequiredDescription
resultYes

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 a key limitation (integration only sees explicitly shared pages) and explains the in_trash behavior. While it does not explicitly state it is read-only, 'search' implies non-mutating and it adds useful context beyond the schema.

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 three sentences, each contributing value: main function and return, access scope limitation, and in_trash behavior with related tool. It is front-loaded and contains no filler.

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 an output schema is present, the description adequately covers access limitations, return type, and trash behavior. It does not mention pagination or rate limits, which are not critical for a search tool. Overall, it provides sufficient context for an agent to select and 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?

Schema description coverage is 0%, so the description must compensate. It explains the non-obvious in_trash parameter in detail, including the restore workflow. Query and limit are self-explanatory by name and default, so the lack of explicit explanations is acceptable.

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 Notion for pages the integration can access, distinguishing it from searching databases (a sibling tool). It also specifies the return type (titles and page IDs) and links to related tools, providing a clear and specific purpose.

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 explicit downstream usage guidance by instructing to use returned IDs with notion_upload_file / list_files_on_page, and notes that in_trash=True can pair with notion_restore_page. However, it does not explicitly mention when to use this tool instead of notion_search_databases, though the 'pages' scope implies it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_set_page_visualA

Set or remove a Notion page's icon or cover image.

target: 'icon' or 'cover'. Provide exactly one of: • emoji — a single emoji character (icon only), e.g. '📊'. • source — an image via the usual schemes (local:, shared:, drive:, base64:); uploaded and attached as the icon/cover. • remove=True — clear the icon/cover entirely.

NameRequiredDescriptionDefault
emojiNo
removeNo
sourceNo
targetYes
page_idYes
filenameNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the transparency burden. It discloses that images are 'uploaded and attached,' that emoji applies to icons only, that remove clears the visual entirely, and lists valid source schemes. This goes beyond the bare schema, though it does not explain failure modes or effects on existing visuals beyond removal.

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 well-structured with a short opening sentence and a clear bulleted list for the exactly-one-of options. Every sentence carries semantic weight; there is no padding or 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 six-parameter tool with no annotations and no schema descriptions, the description covers the core behavior, valid source schemes, target options, and removal semantics. It omits filename and alternative-tool guidance, but an output schema exists, so return values don't need to be spelled out.

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 descriptions are absent (0% coverage), so the description must compensate. It explains target, emoji, source, and remove in detail, but never mentions the filename parameter and leaves page_id implicit. Thus it provides substantial but incomplete parameter coverage.

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 crisp verb-resource statement: 'Set or remove a Notion page's icon or cover image.' It immediately tells the agent both the action and the target resource, and it is distinct from sibling tools that upload/replace files or update page content.

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 intended use is implied by the purpose statement ('set or remove icon/cover') and the operational note that exactly one of emoji, source, or remove must be supplied, but there is no explicit guidance on when to choose this tool over alternatives or any exclusions/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.

notion_update_blockA

Update an existing block's text content.

block_id: ID of the block to update (from notion_read_page output). content: new text for the block (supports inline markdown). block_type: the block type (paragraph, heading_1, heading_2, heading_3, bulleted_list_item, numbered_list_item, to_do, quote, callout, toggle, code). If omitted, the block is fetched to detect it.

NameRequiredDescriptionDefault
contentYes
block_idYes
block_typeNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses that block_type can be omitted and the block is fetched to detect it, and that content supports inline markdown. However, it does not clarify whether content fully replaces existing text, whether other block properties are preserved, or any permission requirements. This is partial transparency but lacks depth for a mutating tool.

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 efficient and front-loaded with the primary action. The parameter list is clearly formatted and avoids unnecessary fluff. It is slightly longer than strictly necessary but every sentence contributes useful information, so it earns a 4 rather than a 5.

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 an output schema exists and no annotations, the description adequately covers the tool's purpose, parameters, and a key behavioral option (auto-detecting block type). It lacks details on error cases or explicit confirmation that content replaces existing text, but overall it is complete enough for an agent to invoke correctly. A 4 is appropriate.

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 description coverage is 0%, so the description must compensate. It does so excellently: block_id is anchored to notion_read_page output, content is explained with 'supports inline markdown', and block_type includes a full list of allowed values plus behavior when omitted. This adds substantial meaning beyond the raw 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 the tool's purpose: 'Update an existing block's text content.' The verb 'update' is specific, the resource is a block, and the scope is text content, which distinguishes it from siblings like notion_append_content and notion_delete_block. The parameter details further elaborate on the operation.

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 context by noting block_id comes from notion_read_page output and listing allowed block types, but it does not explicitly state when to use this tool versus alternatives like notion_append_content or notion_update_page. No exclusions or alternative tool references are provided, so it only meets the 'implied usage' level.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_update_commentA

Edit a comment previously created by this integration (Notion returns 404 for comments created by anyone else).

comment_id: from notion_get_comments or notion_add_comment. text: replacement text (native API markdown — inline formatting, equations, @mentions).

NameRequiredDescriptionDefault
textYes
comment_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description fully carries the transparency burden. It discloses a key behavioral trait: comments created by others are not editable and return a 404. It also specifies that the text parameter supports native API markdown, which is essential for correct formatting. This goes beyond typical descriptions and sufficiently informs the agent of limitations.

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 compact, delivering purpose, a critical caveat, and parameter details in just three sentences. Each element earns its place without redundancy, and the structured parameter explanations are easy 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?

For a two-parameter mutation tool, the description covers purpose, limitation, parameter sources, and text formatting expectations. Since an output schema exists, there is no need to describe return values, making the description contextually complete for selecting and invoking this tool.

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?

The schema has no property descriptions (0% coverage), so the description is the primary source of parameter meaning. It explains comment_id is obtained from specific sibling tools and text is the replacement text with markdown support. This gives the agent the necessary semantic understanding to populate both parameters 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 clearly states the tool edits a comment with the specific action verb 'Edit' and resource 'comment'. It also includes a crucial constraint ('previously created by this integration') that distinguishes it from sibling tools like notion_add_comment, notion_get_comments, and notion_delete_comment.

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 usage context: the tool is for editing comments created by this integration, with a warning that others will cause a 404. It also tells the user where to find the comment_id (from notion_get_comments or notion_add_comment). However, it does not explicitly list exclusions or alternative tools for updating comments, so it stops short of full prescriptive guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_update_databaseA

Update a Notion database's title, description, or property schema.

database_id: the database to update. title: new database title (leave empty to keep current). description: new description (leave empty to keep current). properties_json: JSON object of property changes. Notion API format:

  • Add property: {"New Column": {"rich_text": {}}}

  • Remove property: {"Old Column": null}

  • Rename property: {"Old Column": {"name": "New Column"}}

  • Change type: {"Column": {"number": {"format": "percent"}}}

  • Add select opts: {"Status": {"select": {"options": [ {"name": "New Option", "color": "blue"} ]}}}

  • Recolour an existing select / multi_select / status option: send it by name with the new color (names match case-insensitively).

Multiple changes can be combined in one call. Use notion_describe_database first to see current schema.

NameRequiredDescriptionDefault
titleNo
database_idYes
descriptionNo
properties_jsonNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

No annotations are provided, so the description carries the behavioral disclosure burden. It does a good job explaining mutation semantics, including that empty title/description values preserve current values, that null removes a property, and how type changes and select-option recoloring work. It does not cover permissions, reversibility, or side effects beyond the schema changes.

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 the core operation and then structured as a parameter reference with compact examples. The examples are necessary because the schema provides no parameter descriptions, and every section contributes useful invocation guidance.

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 lack of annotations, zero schema description coverage, and the presence of an output schema, the description is largely complete for invocation. It covers all parameters and key mutation semantics, though it omits permission requirements and explicit reversibility warnings for destructive property removals.

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 description coverage is 0%, so the description must compensate. It documents all four parameters meaningfully: database_id identifies the target, title and description explain empty-string behavior, and properties_json is explained with concrete Notion API format examples for adding, removing, renaming, retyping, and recoloring properties.

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 states a specific verb and resource: update a Notion database's title, description, or property schema. It clearly identifies the fields being changed but does not explicitly distinguish itself from closely related siblings such as notion_create_database or notion_describe_database beyond recommending a pre-check.

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 gives a clear usage prerequisite by advising the agent to use notion_describe_database first to inspect the current schema. It also notes that multiple changes can be combined in one call. It does not state when not to use this tool or contrast it with alternative update tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_update_pageA

Update a Notion page's title, icon, or other properties.

page_id: the page to update. title: new title (leave empty to keep current). properties_json: JSON object of properties to update. Keys are property names, values are Notion API property value objects. Omitted properties are left unchanged. Wiki verification is a property too: {"Verification": {"verification": {"state": "verified"}}}. icon: "remove" to clear it, or an emoji, "custom_emoji:", "icon:[:]" (native Notion icon) or an image URL. silent: True skips the update, @mention and Person-property notifications this write would send.

NameRequiredDescriptionDefault
iconNo
titleNo
silentNo
page_idYes
properties_jsonNo

Output Schema

NameRequiredDescription
resultYes

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 full behavioral burden. It usefully discloses that this is a write operation and that silent=True skips update, @mention, and Person-property notifications. It does not discuss permissions, whether updates are reversible, or error behavior, which are meaningful gaps for an unannotated 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 front-loaded with the primary action and then uses a compact parameter list. Every line contributes specific operational detail, and there is no redundant explanation of fields already clear from the schema. The structure supports quick scanning.

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 five parameters, 0% schema description coverage, and an output schema, the description covers all input semantics well. It is nearly complete for invocation, though it omits auth or permission expectations and basic failure modes that an agent might need in edge cases.

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 description coverage is 0%, and the description compensates by documenting every parameter. It explains the properties_json shape with a concrete Wiki verification example and gives detailed icon syntax including remove, emoji, custom emoji, native icon, and URL forms. This is materially more informative than the bare 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 states a specific verb and resource: "Update a Notion page's title, icon, or other properties." That is clear enough for an agent to know it mutates page metadata rather than page content. It does not explicitly differentiate from nearby siblings like notion_update_page_content or notion_set_page_visual, so it falls short of a 5.

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

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides parameter-level guidance, such as leaving title empty to keep the current title and omitting properties to leave them unchanged. However, it does not explicitly say when to choose this tool over notion_update_page_content, notion_set_page_visual, or notion_update_block. Usage is implied rather than explicitly directed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_update_page_contentA

Edit page content using search-and-replace on the page's markdown.

Finds old_text in the page content and replaces it with new_text. Use notion_read_page_markdown first to see the current content and copy the exact text to replace.

page_id: the page to edit. old_text: exact text to find in the page content. new_text: replacement text (use empty string to delete). replace_all: if old_text occurs more than once the edit is rejected unless this is True (then every occurrence is replaced). allow_deleting_content: must be True for an edit that would delete a child page or database.

NameRequiredDescriptionDefault
page_idYes
new_textYes
old_textYes
replace_allNo
allow_deleting_contentNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations provided, the description carries substantial behavioral detail: exact-match replacement, empty new_text deletes, multiple matches are rejected unless replace_all is true, and child page/database deletion requires allow_deleting_content=true. It does not cover permissions, error behavior when old_text is absent, or reversibility, so it is strong but not fully exhaustive.

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 the core mechanism and then uses a compact parameter list. Every sentence adds useful operational context, with no redundant restatement of the title or name.

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 mutation tool with no annotations, the description provides the essential mechanics, parameter meanings, and destructive-edit safeguards; an output schema exists, so return values need not be explained. It could be more complete by mentioning permission requirements or what happens when old_text is not found, but it is sufficient to call the tool correctly in normal use.

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 description coverage is 0%, so the description must compensate, and it does: it explains page_id, old_text, new_text including empty-string deletion, replace_all duplicate handling, and allow_deleting_content's destructive-edit guard. Every parameter has meaningful semantics beyond its bare name.

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 states a specific verb and resource: edit page content via search-and-replace on the page's markdown. It clearly distinguishes the mechanism from a full-page replacement, but it does not explicitly differentiate itself from nearby siblings such as notion_replace_page_content, notion_append_content, or notion_insert_page_content.

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 gives a clear prerequisite workflow: use notion_read_page_markdown first to see current content and copy exact text. It also explains the conditions for replace_all and allow_deleting_content, though it does not explicitly say when to choose this tool over other page-editing siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_update_viewA

Update a view's name, saved filter, and/or sorts. Only provided fields change (fields left empty are preserved).

NameRequiredDescriptionDefault
nameNo
view_idYes
sorts_jsonNo
filter_jsonNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the transparency burden. It discloses that only provided fields change and empty fields are preserved, preventing accidental overwrites. However, it does not mention permission requirements, behavior on invalid JSON, or any side effects beyond the update itself.

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, immediately stating the purpose and the key behavioral rule. No filler or redundant repetition.

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 the core update behavior and partial preservation but leaves a critical gap: it does not explain how to construct the sorts_json and filter_json strings. Given the output schema exists, the return format is covered, but the parameter formats are not.

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 has no descriptions for its 4 parameters, and the description names three of them (name, filter, sorts) in prose, mapping to name, filter_json, and sorts_json. It also clarifies that empty string values preserve the current setting, which is essential for partial updates. However, the JSON format for sorts_json and filter_json is not explained.

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 (update), the resource (a view), and the specific fields affected (name, saved filter, sorts). This distinguishes it from sibling tools like create_view, delete_view, and query_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?

The description implies the tool is for modifying existing view settings but does not explicitly reference alternatives or provide when/why guidance. Users must infer from the word 'update' that this is for existing views, not creation or deletion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_upload_fileA

Upload a file to Notion and attach it as a new block.

source accepts one of: • local:<relative-path> — a file under the notion-mcp private store (FILES_DIR). List with notion_list_local_files. • shared:<filename> — a file on the shared cross-MCP mount, written there by google-accounts-mcp download_attachment with destination='shared'. List with notion_list_local_files(location='shared'). • drive:<name-or-id> — a file in the shared Drive folder (DRIVE_FOLDER_NAME) Google Drive folder (read from google-accounts-mcp's credentials, read-only). • base64:<bytes> — raw base64 content; requires filename. Subject to MCP parameter size limits — prefer shared: or drive: for anything over ~20KB.

parent_page_id is a Notion page ID (find via notion_search_pages) OR any block ID that supports children (toggle, column, callout, ...) to attach the file inside that block.

position controls where the new block lands among the parent's children: 'end' (default), 'start', or a block ID to insert directly AFTER that block (get block IDs from notion_read_page(include_block_ids=True) or notion_list_files_on_page).

filename overrides the source filename when provided. caption is shown below the file block in Notion. Files larger than 20 MB are uploaded via Notion's multi-part protocol automatically. To swap the file in an existing block without moving it, use notion_replace_file instead.

embed_html=True attaches an .html/.htm file as an embed block that Notion renders in the page, instead of a downloadable file block (caption is not applied to embeds).

Cross-MCP file transfer

To upload a Gmail attachment to a Notion page:

  1. google-accounts-mcp download_attachment(..., destination='shared')

  2. notion_upload_file(source='shared:', parent_page_id=...) Files never traverse MCP parameters — no size limits.

NameRequiredDescriptionDefault
sourceYes
captionNo
filenameNo
positionNoend
embed_htmlNo
parent_page_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations present, the description carries the full burden and does so: it discloses the 20 MB multi-part threshold, base64 payload size limits against MCP parameter caps, that Drive is read through google-accounts-mcp credentials read-only, and that caption is dropped for embeds. It also explains the side effect (a new block is appended to the parent's children) and where it lands.

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?

Front-loaded with purpose, then broken into a bulleted source list, prose for the remaining parameters, and a headed cross-MCP section, so scanning is easy. It is on the long side and the duplicated Drive folder phrasing ('DRIVE_FOLDER_NAME') plus the redundant google-accounts-mcp mentions are minor waste.

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 six-parameter upload tool, everything needed to call it correctly is present: value formats, anchor semantics, size thresholds, and the embed special case. An output schema exists, so the description is not obliged to describe return values.

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 description coverage is 0%, so the description must do all the work, and it defines every one of the six parameters. `source` gets four prefixed formats with constraints, `parent_page_id` broadens to any container block, `position` accepts 'end'/'start'/a block ID with the anchor semantics spelled out, and filename/caption/embed_html each get their override or rendering behavior.

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 first line states a specific verb and resource ('Upload a file to Notion') plus the outcome ('attach it as a new block'), which distinguishes it from page-content tools. The closing line explicitly routes the in-place variant to notion_replace_file, so an agent can separate the two without opening a schema.

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 enumerates all four source forms with the exact helper (notion_list_local_files, location='shared') that surfaces valid values, and points to notion_search_pages for parent_page_id. It names the exclusion case ('to swap the file in an existing block without moving it, use notion_replace_file') and gives a step-by-step cross-MCP recipe.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notion_upload_file_to_databaseA

Upload a file and create a NEW row in a Notion database with the file attached to the given files & media column.

source: local:<path>, shared:<filename>, drive:<name-or-id>, or base64:<bytes> — see notion_upload_file for scheme details and the cross-MCP handoff pattern. files_property: exact name of the files & media column (e.g. "Files & media"). Use notion_describe_database to confirm the name — it is case-sensitive. title: text value for the row's title column. title_property: override the auto-detected title column name. filename: override the source filename.

NameRequiredDescriptionDefault
titleYes
sourceYes
filenameNo
database_idYes
files_propertyYes
title_propertyNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the description is the sole source of behavioral context. It adds useful details about accepted source schemes, case-sensitivity of the files_property, and the need to verify column names with notion_describe_database. However, it does not disclose failure modes, idempotency, permissions, or side effects beyond creating a row, leaving some gaps.

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 starts with a clear one-sentence purpose and then lists parameters in a structured, scannable format. It is concise (about 120 words) with no filler, and each line adds essential information. The only minor issue is that it could be slightly tighter in wording, but it remains effective.

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 six-parameter create-operation tool, the description covers the main workflow, required inputs, and source scheme details, and it references the cross-MCP handoff pattern. It does not discuss return values or edge cases, but an output schema exists to cover return format. The description is sufficiently complete for accurate invocation.

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?

The description provides rich semantic detail for most parameters: source scheme syntax, files_property case-sensitivity and verification, title behavior, and override purposes. This goes well beyond the bare schema and compensates for the 0% schema description coverage. Even database_id is self-evident from the tool name.

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 function: uploading a file and creating a new row in a Notion database with the file attached to a specified files & media column. It uses a specific verb ('upload') and resource ('database row'), and explicitly says 'NEW row' to distinguish from tools like notion_add_file_to_row that add files to existing rows.

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 the tool is for creating a new row with a file attachment, while siblings like notion_add_file_to_row serve existing rows. It references notion_upload_file for source scheme details, which guides the user on prerequisite knowledge, but it does not explicitly say when not to use this tool or name alternatives. The purpose is clear enough for the agent to select correctly in most cases.

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. 21 tool updatesv0.2.2
    • Addednotion_add_data_source
    • Addednotion_add_tabs
    • Changednotion_append_content2 fields changed
      • addedInput schema / properties / position
        Added value: +{
        +  "default": "end",
        +  "title": "Position",
        +  "type": "string"
        +}
      • addedInput schema / properties / silent
        Added value: +{
        +  "default": false,
        +  "title": "Silent",
        +  "type": "boolean"
        +}
    • Changednotion_create_database5 fields changed
      • addedInput schema / properties / database_type
        Added value: +{
        +  "default": "",
        +  "title": "Database Type",
        +  "type": "string"
        +}
      • addedInput schema / properties / inline
        Added value: +{
        +  "default": false,
        +  "title": "Inline",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / schema_json / default
        Added value: +""
      • addedInput schema / properties / title / default
        Added value: +""
      • changedInput schema / required
        Previous value: -[
        -  "parent_page_id",
        -  "title",
        -  "schema_json"
        -]New value: +[
        +  "parent_page_id"
        +]
    • Addednotion_create_meeting_notes
    • Changednotion_create_page5 fields changed
      • addedInput schema / properties / markdown_version
        Added value: +{
        +  "default": "",
        +  "title": "Markdown Version",
        +  "type": "string"
        +}
      • addedInput schema / properties / native_markdown
        Added value: +{
        +  "default": false,
        +  "title": "Native Markdown",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / position
        Added value: +{
        +  "default": "",
        +  "title": "Position",
        +  "type": "string"
        +}
      • addedInput schema / properties / silent
        Added value: +{
        +  "default": false,
        +  "title": "Silent",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / template
        Added value: +{
        +  "default": "",
        +  "title": "Template",
        +  "type": "string"
        +}
    • Addednotion_get_async_task
    • Addednotion_get_comment
    • Addednotion_insert_page_content
    • Addednotion_list_custom_emojis
    • Addednotion_list_file_uploads
    • Addednotion_list_templates
    • Changednotion_list_users1 field changed
      • addedInput schema / properties / name_contains
        Added value: +{
        +  "default": "",
        +  "title": "Name Contains",
        +  "type": "string"
        +}
    • Changednotion_query_database1 field changed
      • addedInput schema / properties / archived
        Added value: +{
        +  "default": false,
        +  "title": "Archived",
        +  "type": "boolean"
        +}
    • Addednotion_query_meeting_notes
    • Addednotion_read_meeting_notes
    • Changednotion_read_page_markdown1 field changed
      • addedInput schema / properties / markdown_version
        Added value: +{
        +  "default": "",
        +  "title": "Markdown Version",
        +  "type": "string"
        +}
    • Changednotion_replace_page_content2 fields changed
      • addedInput schema / properties / allow_deleting_content
        Added value: +{
        +  "default": false,
        +  "title": "Allow Deleting Content",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / markdown_version
        Added value: +{
        +  "default": "",
        +  "title": "Markdown Version",
        +  "type": "string"
        +}
    • Changednotion_update_page1 field changed
      • addedInput schema / properties / silent
        Added value: +{
        +  "default": false,
        +  "title": "Silent",
        +  "type": "boolean"
        +}
    • Changednotion_update_page_content2 fields changed
      • addedInput schema / properties / allow_deleting_content
        Added value: +{
        +  "default": false,
        +  "title": "Allow Deleting Content",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / replace_all
        Added value: +{
        +  "default": false,
        +  "title": "Replace All",
        +  "type": "boolean"
        +}
    • Changednotion_upload_file1 field changed
      • addedInput schema / properties / embed_html
        Added value: +{
        +  "default": false,
        +  "title": "Embed Html",
        +  "type": "boolean"
        +}
  2. 44 tool updatesv0.1.0
    • First observednotion_add_comment
    • First observednotion_add_file_to_row
    • First observednotion_append_content
    • First observednotion_archive_page
    • First observednotion_batch_add_file_to_row
    • First observednotion_create_database
    • First observednotion_create_page
    • First observednotion_create_view
    • First observednotion_delete_block
    • First observednotion_delete_comment
    • First observednotion_delete_view
    • First observednotion_describe_database
    • First observednotion_download_file
    • First observednotion_extract_file_text
    • First observednotion_get_comments
    • First observednotion_get_property
    • First observednotion_get_user
    • First observednotion_import_file_from_url
    • First observednotion_list_files_on_page
    • First observednotion_list_local_files
    • First observednotion_list_users
    • First observednotion_list_views
    • First observednotion_move_page
    • First observednotion_purge_file
    • First observednotion_purge_shared_files
    • First observednotion_query_database
    • First observednotion_query_view
    • First observednotion_read_page
    • First observednotion_read_page_markdown
    • First observednotion_render_file_page
    • First observednotion_replace_file
    • First observednotion_replace_page_content
    • First observednotion_restore_page
    • First observednotion_search_databases
    • First observednotion_search_pages
    • First observednotion_set_page_visual
    • First observednotion_update_block
    • First observednotion_update_comment
    • First observednotion_update_database
    • First observednotion_update_page
    • First observednotion_update_page_content
    • First observednotion_update_view
    • First observednotion_upload_file
    • First observednotion_upload_file_to_database

TDQS

A3.8/5.0

Scored across 55 tools

Disambiguation3/5

Most tools are distinguishable, but the content-editing surface has several overlapping options: read_page vs read_page_markdown, append_content vs insert_page_content, update_page_content vs replace_page_content, and block-level update/delete. The descriptions provide guidance, but an agent must carefully choose among similar-sounding tools.

Naming Consistency4/5

Every tool uses the notion_ prefix and snake_case, with a mostly consistent verb_noun pattern. A few names vary slightly in structure, such as notion_list_files_on_page and notion_batch_add_file_to_row, but the overall convention is predictable.

Tool Count2/5

At 55 tools, the surface is very large for practical agent use, spanning pages, blocks, databases, views, files, comments, users, meeting notes, templates, and emojis. While the breadth reflects Notion's feature set, many niche tools make the set heavy and increase selection burden.

Completeness4/5

Coverage is extensive: page and block lifecycle, database CRUD and querying, views, comments, files, meeting notes, users, templates, and custom emojis are all represented. Minor gaps remain, such as explicit database archiving/deletion and some lower-level block creation operations, but most workflows are supported.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    An MCP server that enables natural language interaction with the Notion API, allowing users to search, comment, create pages, and access content within their Notion workspace.
    166,214 npm
    -
  • A
    license
    A
    quality
    C
    maintenance
    An MCP server for Notion API with optimized token efficiency and full database property filtering, enabling AI assistants to manage pages, databases, and blocks.
    32
    10 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for the Notion API, enabling management of pages, blocks, databases, data sources, comments, and users through natural language.
    4 npm
    3
    MIT