Skip to main content
Glama

mcp-notion

An MCP server exposing eight narrow Notion tools. Reads pages and databases, writes additively. Nothing is deleted, archived, or overwritten.

Setup

  1. Create an internal integration at https://www.notion.com/my-integrations and copy its token.

  2. cp .env.example .env and set NOTION_API_KEY.

  3. Share each page or database with the integration. In Notion, open it, then ••• > Connections > your integration. Without this, every call returns a 404 — the token alone grants no access.

  4. Install: python3 -m venv .venv && .venv/bin/pip install -e ".[dev]"

Optional aliases, so a database can be named rather than pasted:

NOTION_ALIAS_TASKS=https://www.notion.so/workspace/0123456789abcdef0123456789abcdef

list_databases reports configured aliases.

Related MCP server: Notion MCP Server

Registering with Claude Code

claude mcp add notion -- /absolute/path/to/mcp-notion/.venv/bin/mcp-notion

Refs

Every tool takes a ref, resolved in this order: configured alias, notion.so URL, page or database id, exact title. An ambiguous title is an error listing candidate URLs — the server never guesses.

Tools

Tool

Purpose

list_databases

Databases visible to the integration, with aliases

get_database_schema

Property names, types, and select options

query_database

Rows, filtered and sorted by property name

get_page

Page properties plus the body as markdown

search

Title search across shared pages and databases

create_page

New database row or subpage, with an optional markdown body

append_to_page

Append markdown to the end of a page

update_row

Set properties on a database row

Markdown subset

Both directions: headings 1-3, paragraphs, bulleted and numbered lists, to-dos, fenced code, quotes, dividers. Reading an unsupported block yields <!-- unsupported: TYPE -->. Writing an unsupported construct — tables, images, raw HTML — fails the whole call, naming the construct and the line.

Inline markup is one-way. Bold, italic, code, and links are rendered as markdown when reading, but written back as literal characters: appending **bold** writes those eight characters, not bold text. A half-correct inline parser would silently corrupt text, which is worse than a visible asterisk.

Tests

.venv/bin/pytest

No network, no API key required.

Available Tools

8 tools
append_to_pageA

Append markdown to the end of a page, as {appended, url}. Existing content is never modified or removed. ref: an alias, a notion.so URL, an id, or an exact page title. markdown: same supported subset as create_page. Empty or whitespace-only markdown is rejected without contacting Notion.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYes
markdownYes

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 and does well: it discloses that existing content is never modified/removed, that content is appended to the end, and that empty/whitespace-only markdown is rejected before contacting Notion. This goes well beyond the bare schema, though it does not cover permissions, failure modes, or rate limits.

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 and return shape are front-loaded, followed by compact parameter definitions and a validation note. No repetition or filler.

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 tool with no output schema and no annotations, the description covers the essential context: what the tool does, what it returns, what each parameter means, and a key edge-case behavior. Nothing critical is missing for an agent to invoke it correctly.

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

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 compensate. It does: ref is defined as an alias, notion.so URL, id, or exact page title, and markdown is defined as the same supported subset as create_page with explicit validation behavior. This is exactly the semantic detail the schema lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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

The description names a specific action (append) and resource (page), states the return shape {appended, url}, and explicitly distinguishes its non-destructive nature from other page operations. This is unambiguous and differentiates it from siblings like create_page and update_row.

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 behavior clearly implies this is for adding content to an existing page rather than creating or updating, and references create_page for markdown semantics. However, it does not explicitly state when to choose this tool over a sibling or mention exclusion conditions.

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

create_pageA

Create a page, either as a row in a database or as a subpage of another page, as {title, url, properties}. parent_ref: an alias, a notion.so URL, an id, or an exact title. title: the new page's title. For a database parent, set the title this way, not through properties. markdown: optional page body. Headings 1-3, paragraphs, bulleted and numbered lists, to-dos, fenced code, quotes, and dividers are supported; anything else fails the call before Notion is touched. properties: for a database parent only, property name -> value, excluding the title property. Call get_database_schema first for the valid names.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
markdownNo
parent_refYes
propertiesNo

TDQS

A4.5/5.0
Behavior4/5

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

Without annotations, the description carries the behavioral burden, and it does disclose non-obvious behavior: unsupported markdown fails before Notion is touched, and properties are only accepted for database parents. It still omits return-shape and permission/rate-limit context, but the key side-effect and failure semantics are not hidden.

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

Conciseness5/5

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

The description is compact and front-loaded, with each clause adding a distinct fact needed for correct invocation. There is no filler or repetition of schema boilerplate.

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

Completeness4/5

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

For a write tool with no annotations and no output schema, it covers all four parameters, the markdown failure mode, and the get_database_schema prerequisite. Missing return/response detail and permissions are minor gaps, but an agent can invoke it correctly from this text alone.

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?

With 0% schema description coverage, this is the description's strongest contribution. It enumerates accepted parent_ref formats (alias, notion.so URL, id, or exact title), explains the title-with-database-parent rule, lists supported markdown constructs, and scopes properties to database parents with a prerequisite call. This fully compensates for 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 and resource—'Create a page'—and defines the two contexts: as a row in a database or as a subpage of another page. This makes it clearly distinct from sibling tools like append_to_page and update_row.

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 concrete when-to-use guidance by telling the agent to call get_database_schema first for a database parent and restricting properties to that case. It also instructs the agent to set the title directly rather than through properties. It doesn't explicitly name exclusions against append_to_page, but the creation-vs-modification context is clear.

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

get_database_schemaA

Property names and types for a database, as {title, url, properties}. Call this before filtering with query_database or writing with update_row. ref: an alias, a notion.so URL, an id, or an exact database title.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYes

TDQS

A4.8/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 burden of behavioral disclosure. It reveals the return structure and positions the tool as a read-only prerequisite for query/write operations, strongly implying no side effects. It does not explicitly state error behavior or auth needs, but for a simple getter this is a minor gap.

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

Conciseness5/5

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

Three sentences with no redundant words. The purpose and return format are front-loaded, followed by clear usage guidance and parameter semantics. Every sentence 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?

The tool is simple (one required parameter, no output schema), and the description covers purpose, usage order, return shape, and parameter values. It also places the tool among siblings via the usage instruction, leaving no critical information missing for an agent to invoke it correctly.

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

Parameters5/5

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

The input schema only names the parameter 'ref' with no description, and schema coverage is 0%. The description fully compensates by defining all accepted forms: 'an alias, a notion.so URL, an id, or an exact database title'. This gives the agent complete semantic grounding for the parameter.

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 the tool returns 'Property names and types for a database' with a specific output shape '{title, url, properties}'. It distinguishes itself from siblings by instructing to call it before query_database or update_row, making its role as a schema-fetching step clear.

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

Usage Guidelines5/5

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

It explicitly says 'Call this before filtering with query_database or writing with update_row', giving a direct when-to-use instruction that routes the agent away from alternatives. It also specifies the accepted ref formats, which implicitly clarifies when the tool is applicable.

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

get_pageA

A Notion page, as {title, url, properties, markdown}. The body is markdown; block types outside the supported subset appear as <!-- unsupported: TYPE -->. ref: an alias, a notion.so URL, an id, or an exact page title.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYes

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description caries the full disclosure burden. It meaningfully discloses the return envelope and a conversion behavior: unsupported block types appear as '<!-- unsupported: TYPE -->' comments. It doesn't cover not-found errors or permissions, but the getter nature is apparent and the output behavior is usefully detailed.

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, front-loaded with the response shape, and each clause earns its place: return fields, markdown/unsupported-block behavior, and ref formats. There is no filler or repetition of schema information.

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 one-parameter retrieval tool with no output schema, the description covers the return object, the markdown conversion caveat, and valid ref forms. It is slightly incomplete in not pointing to sibling tools for discovery workflows or describing not-found behavior, but those are secondary given the simple 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?

The input schema only says 'ref' is a required string with no description, and schema coverage is 0%, so the description is the only parameter documentation. It adds substantial meaning by enumerating accepted ref formats: alias, notion.so URL, id, or exact page title. It doesn't define 'alias' further, but it is a clear gain over the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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

The description identifies the resource (a Notion page) and the shape of what the caller recieves ({title, url, properties, markdown}), so an agent can tell this returns page content rather than a schema or database list. It doesn't use an explicit verb such as 'retrieve' or 'fetch' and doesn't contrast with siblings like search or query_database, so it stops short of the top tier.

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 is implied by the tool name and by the 'ref' field, which lists accepted inputs (alias, notio.so URL, id, or exact title). However, the description never says when to choose this over query_database, search, or list_databases, and provides no exclusions or alternatives.

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

list_databasesA

List Notion databases visible to this integration, as {title, url, alias}. alias is the name configured via NOTION_ALIAS_*, or null. Aliases that match no visible database are listed with a null title — they are still usable as a ref, but the integration may not have access yet.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON 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 behavioral disclosure burden. It discloses that only databases 'visible to this integration' are returned, and it explains the alias semantics: aliases can resolve to not-yet-visible databases and remain usable as a 'ref'. It also indicates the output shape and the null-title edge case, which is valuable beyond the raw operation name.

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

Conciseness5/5

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

The description is concise and front-loaded: the first sentence states the action and output shape, the second defines 'alias', and the third covers the important edge case. Every sentence contributes information without verbosity.

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 zero-parameter listing tool with an existing output schema, the description is effectively complete. It covers access scope, output fields, alias semantics, and the edge case where an alias does not match a visible database. Nothing critical appears to be missing for an agent to select and invoke the tool correctly.

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

Parameters4/5

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

The tool has zero parameters, so there is little to explain. Schema description coverage is 100% and the schema is empty, meaning no parameter ambiguity exists. The description adds meaningful context about alias resolution that an agent needs when working with database references.

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 a specific action and resource: 'List Notion databases visible to this integration.' It also specifies the output shape '{title, url, alias}', making the tool's purpose unambiguous. This distinguishes it from siblings like query_database or get_page, which operate on a single database or page rather than listing all visible databases.

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 enumerating available databases, but it does not explicitly discuss when to choose it over alternatives such as search or get_database_schema. There is no exclusion guidance or sibling comparison. The usage context is clear enough for a simple listing tool, but not fully specified.

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

query_databaseA

Rows of a Notion database, as {title, url, properties}. ref: an alias, a notion.so URL, an id, or an exact database title. filter: property name -> value, combined with AND. Text properties match by substring, everything else by equality. Names must come from get_database_schema. sort: {"property": name, "direction": "asc" | "desc"}. limit: maximum rows to return.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYes
sortNo
limitNo
filterNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

The description discloses output shape and key query semantics: filters combine with AND, text properties match by substring while others match by equality, and sort expects a specific object shape. This adds meaningful behavioral detail beyond the sparse annotations, though pagination and error behavior are not 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 compact and well-structured, with the output shape stated first and each parameter described on its own line. There is no filler; every sentence adds operational value.

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 read-only query tool with an output schema, this description covers the core contract: target, parameters, and result shape. It only lacks explicit sibling routing and pagination/error details, which are secondary for a filtered query.

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%, but the description fully documents all four parameters with concrete formats: ref alias types, filter object semantics, sort direction enum, and limit meaning. This compensates for the generic additionalProperties schemas and gives an agent enough detail to construct valid arguments.

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 identifies querying rows of a Notion database and specifies the returned shape {title, url, properties}. It distinguishes itself from siblings like list_databases by focusing on row retrieval, though it does not explicitly contrast with related tools like search or get_page.

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?

It gives practical guidance on ref formats and says property names must come from get_database_schema, which is a useful routing hint. However, it does not state when to prefer this tool over alternatives such as search or get_page, nor does it mention when not to use it.

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

update_rowB

Set properties on a database row, as {title, url, properties}. Only the named properties change; the page body is untouched. ref: an alias, a notion.so URL, an id, or an exact row title. properties: property name -> value. Call get_database_schema first for the valid names and, for select and status properties, the valid options.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYes
propertiesYes

TDQS

B3.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 of behavioral disclosure. It reveals a key behavior: only named properties change and the page body is untouched. But for a mutation tool, it does not disclose whether this is a partial update (PATCH-like) or replaces the entire row, what auth/permissions are needed, how invalid property names or values are handled, or whether changes are reversible. These gaps leave the agent with incomplete behavioral context.

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 compact and dense, with every line contributing useful info. The core behavior is front-loaded, followed by concise parameter definitions. The bullet-like formatting for ref and properties is scannable and doesn't waste tokens. It earns a 4 because it is efficiently structured, though the two-line breaks are slightly unnecessary.

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 zero annotations and no output schema, the description provides a usable but incomplete picture. It explains what the tool does, what the two parameters mean, and the recommended prerequisite call. But it lacks details on return value (does it return the updated row?), error pehavior for non-existent refs or invalid properties, and rquirements like write permissions. For a mutation tool, this is enough to start but not fully self-sufficient.

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 is minimal: ref is just a string and properties is an open object. The description compensates significantly by explaining the accepted ref formats (alias, notion.so URL, id, or exact row title) and that properties is a property-name-to-value mapping. However, it doesn't add guidance on how to structure complex values (e.g., select/status options, multi-select, date format), which is a common Notion API pain point.

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 starts with a specific verb and resource: 'Set properties on a database row.' It clearly distinguishes the operation from page-body edits by stating 'the page body is untouched.' It does not explicitly differentiate from create_row or append_to_page, but the combination of 'update' in the name and the explicit scope makes the purpose clear.

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

Usage Guidelines3/5

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

The description implies when to use this tool by stating it only affects named properties and not the page body, which contrasts with sibling operations like append_to_page. It also gives the prerequisite 'Call get_database_schema first' for valid names/options. However, it never explicitly states when to prefer this over create_row, query_database, or other siblings, so the usage guidance is mostly implied.

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. 8 tool updatesv0.1.0
    • First observedappend_to_page
    • First observedcreate_page
    • First observedget_database_schema
    • First observedget_page
    • First observedlist_databases
    • First observedquery_database
    • First observedsearch
    • First observedupdate_row

TDQS

A3.9/5.0

Scored across 8 tools

Disambiguation4/5

The tools cleanly separate database operations (schema, query, row update) from page operations (get, create, append), with search covering discovery. The only mild overlap is between search and list_databases for finding databases, but the descriptions clarify their different scopes.

Naming Consistency4/5

Most names follow a consistent verb_noun snake_case pattern such as get_database_schema, query_database, append_to_page, and update_row. The sole exception is the bare verb 'search', which is a minor deviation rather than a systemic inconsistency.

Tool Count5/5

Eight tools is a well-scoped size for a Notion integration. Each tool covers a distinct core operation—listing, schema inspection, querying, page reading, creation, appending, and row updating—without redundant or unnecessary entries.

Completeness3/5

The set covers core read, create, append, and update workflows for pages and database rows, and includes schema discovery. However, there is no delete/archive operation and no way to edit a page body beyond appending, which are notable lifecycle gaps for the stated domain.

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.
    216,863 npm
    -
  • 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.
    8 npm
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Comprehensive MCP server for the Notion API. Provides 22 tools for full CRUD operations on pages, databases, blocks, users, and comments.
    12 npm
    MIT