← Back to all apps

Notion

Productivityby Notion AI
Launched Jun 6, 2026 on ChatGPT

Notion MCP helps you plug tools into your Notion workspace, allowing you to create, edit, search and organize content directly from Claude. Get contextual and relevant assistance from Claude, while keeping knowledge organized in Notion.

45ChatGPT Tools
13Claude Tools
Notion AIDeveloper
ProductivityCategory

Use Cases

productivity

Available Tools

AI search

ai-search
Full Description

Use this tool for every content search when access discovery reports current_tool_access.ai_search.status="available". This includes exact keywords, page titles, project names, and natural-language questions. Choose by the connection's access, not by query wording. If access is not already known, call get_tool_access first. If access discovery reports that AI search is not available, use search instead.

Search Notion and connected workspace sources available to you, such as Slack, Mail, and Calendar. Keywords are valid; a question is not required. Preserve distinctive names and identifiers. Prefer one topic per call, ideally under 50 words.

Start with {"query":"..."} and omit optional parameters unless needed. For user lookup, set query_type="user" and provide a name or email. Omit content filters and sort for user lookup. Do not send content_search_mode. Exact filters, non-relevance sorting, and filter-only browsing are supported by this tool and return Notion-only workspace results with supported constraints applied. Omit these options to search Notion and connected sources together. Filter and sort access is separate from AI access: check current_tool_access.ai_search.restricted_parameters. Unavailable options are dropped with a notice. If AI access is unavailable, this tool falls back to keyword search in Notion only and reports that connected sources were not searched. User name or email lookup uses this tool with query_type="user".

<example description="AI search available: find a page by title"> {"query":"Q3 roadmap"} </example> <example description="AI search available: find an exact identifier"> {"query":"ACME-123"} </example> <example description="AI search available: answer a question"> {"query":"Why did we delay the launch?"} </example> <example description="AI search available: browse Notion pages created in a date range"> {"query":"","filters":{"created_date_range":{"start_date":"2026-07-01","end_date":"2026-08-01"}}} </example>

Parameters (1 required, 8 optional)
Required
querystring

Exact keywords, a page title, a project name, or a concise natural-language question. Keywords are valid; a question is not required. Preserve distinctive names and identifiers. Prefer one topic per call, ideally under 50 words. Provide a non-empty query unless intentionally browsing Notion with filters or a non-relevance sort.

Optional
data_source_urlstring

Optionally restrict search to a data source URL returned in a <data-source> tag. Omit when searching the whole workspace.

filtersobject

Optional exact filters for Notion pages and databases. Supplying an effective filter selects Notion-only workspace search so the filter is enforced exactly. Omit for unified search across Notion and connected sources. Keep filter fields nested here. Some filters require Business access.

max_highlight_lengthinteger

Maximum result highlight length (default 200). Set to 0 to omit highlights.

page_sizeinteger

Maximum number of results to return (default 10).

page_urlstring

Optionally restrict search to a page and its descendants. Accepts a Notion page URL or ID. Omit when searching the whole workspace.

query_typestring

Omit or use "internal" for content search. Use "user" to look up a workspace user by name or email.

Options:internaluser
sortstring

Omit for the default "relevance" ordering. "last_edited" and "created" select Notion-only workspace search and require Business access.

Options:relevancelast_editedcreated
teamspace_idstring

Optionally restrict search to a teamspace ID.

Fetch Notion entities

fetch
Full Description

Retrieves details about a Notion entity (page, database, data source, or saved database view) by URL or ID.

Provide URL or ID in id parameter. Make multiple calls to fetch multiple entities.

For pages, path, verification, and page_last_edited_at expose native Notion facts that may help assess the source. Verification is explicit when Notion knows it; omission means unavailable or not applicable. Treat recency as a contextual tiebreaker, not proof that a source is authoritative. Check truncated, unknown_block_count, and unknown_block_ids before relying on fetched content. Report material uncertainty when sources conflict.

Pages use enhanced Markdown format. For the complete specification, read the MCP resource notion://docs/enhanced-markdown-spec through your MCP client's resource-reading interface, or call the Notion "fetch" tool with this URI if your client does not support reading MCP resources. Do NOT pass this URI to any other URL-fetching tool.

For pages (including database items), cover uses the REST API file format: null means no cover, {type: "external", external: {url}} identifies an external or gallery image, and {type: "file", file: {url, expiry_time}} provides a temporary signed URL for an uploaded image. Re-fetch the page to refresh an expired URL. An omitted cover means unavailable or not applicable, not that the page has no cover. Cover metadata is separate from database properties.

For pages, icon uses the REST API icon format. It can be an emoji, icon, custom_emoji, external, or temporary signed file object. null means no icon. An omitted icon means unavailable or not applicable. Re-fetch expired file URLs. The page Markdown keeps its existing string icon attribute for editing round trips.

Pass a notion://docs/* URI (e.g. notion://docs/enhanced-markdown-spec or notion://docs/view-dsl-spec) as the id to read that documentation resource through this tool. The content is identical to the MCP resource of the same URI.

Databases return all data sources (collections). Each data source has a unique ID shown in <data-source url="collection://..."> tags. You can pass a data source ID directly to this tool to fetch details about that specific data source, including its schema and properties. Use data source IDs with update_data_source and query_data_sources tools. Multi-source databases (e.g., with linked sources) will show multiple data sources. If fetching a database block ID returns a validation error, use the collection:// data source URL included in that error instead.

Saved database views return their settings, including filters, sorts, and display options. Pass an explicit view:// URL from a database response. To query the rows shown by a view, use query_data_sources with mode: "view" instead.

Set include_discussions to true to see discussion counts and inline discussion markers that correlate with the get_comments tool. The page output will include a <page-discussions> summary tag with discussion count, preview snippets, and discussion:// URLs that match the discussion IDs returned by get_comments.

Pass the special id "self" to get the connected workspace and user identity instead of an entity. The result includes a self object with the workspace id + name and the authenticated user's id, name, and email. Use this to label the connection (e.g. by workspace name) or obtain a stable id for the connected workspace and user.

On MCP and RunTool surfaces, self also includes current_tool_access: a map from tool names to available, available_with_limit (calls can be made up to the limit included with the workspace's plan), plan_required, upgrade_required, full_version_required, or not_enabled. Entries include an upgrade_url when a workspace upgrade can change the status, or a full_version_url when the tool requires the full version of Notion MCP. Use this map to identify whether calls are available, plan-limited, plan- or upgrade-gated, require the full version of Notion MCP, or are disabled. Before the first content search for a connection, fetch self unless its current access result is already in context. When current_tool_access.ai_search.status is available, use ai_search for content searches, including exact keywords and page titles. Otherwise use search when self reports AI search is not available. Use the same access rule for exact filters, sorting, and filter-only browsing. User lookup uses search with query_type: "user" on any plan.

<example>{"id": "https://notion.so/workspace/Page-a1b2c3d4e5f67890"}</example> <example>{"id": "12345678-90ab-cdef-1234-567890abcdef"}</example> <example>{"id": "https://myspace.notion.site/Page-Title-abc123def456"}</example> <example>{"id": "page-uuid", "include_discussions": true}</example> <example>{"id": "collection://12345678-90ab-cdef-1234-567890abcdef"}</example> <example>{"id": "view://12345678-90ab-cdef-1234-567890abcdef"}</example> <example>{"id": "self"}</example> <example>{"id": "notion://docs/enhanced-markdown-spec"}</example>

Parameters (1 required, 2 optional)
Required
idstring

The ID or URL of the Notion page, database, or data source to fetch. Supports notion.so URLs, Notion Sites URLs (*.notion.site), raw UUIDs, and data source URLs (collection://...). Pass "self" to fetch the connected workspace and user identity. Pass a notion://docs/* URI to read that documentation resource.

Optional
include_discussionsboolean

Whether to include discussion/comment indicators in the page output. When true, adds a <page-discussions> summary with discussion count, preview snippets, and discussion:// URLs. Use with the get_comments tool to retrieve full discussion content. Defaults to false.

include_transcriptboolean

Whether to include meeting note transcripts. Defaults to false. When true, full transcripts are included; when false, a placeholder with the meeting note URL is shown instead.

Check Notion MCP next steps

notion-check-mcp-next-steps
Full Description

When to call: Only when a Notion fetch result instructs you to. Finish all Notion tool calls needed for the current request, then call at most once with no arguments. Never call it per fetch or failure, without that instruction, or retry it.

Result handling: If no next step is returned or rendering fails, do not retry or mention it. Otherwise, finish the user's task before the follow-up.

Follow-up: Add one brief sentence grounded in the user's Notion work this session, followed by the returned destination as a compact, labeled Markdown link. You may present it as an optional Business next step for that type of work, but only claim a benefit when the tool result explicitly provides it. Do not introduce other capabilities or estimate performance or time savings. Give this follow-up once. Never mention limits, eligibility, or frequency logic. Do not give a sales pitch, tell the user to upgrade, criticize their workflow, use a bare URL, or create a link preview.

Convert Notion page to skill

notion-convert-page-to-skill
Full Description

Mark an existing Notion page as a skill without changing its content. The page must be in the current workspace, and the authenticated user must have permission to edit it. Use this tool only when the user wants the page's current contents designated as a skill.

If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.

Parameters (1 required)
Required
page_urlstring

The full Notion URL of the page to mark as a skill.

Create a Notion attachment

notion-create-attachment
Full Description

Create an attachment and upload it to Notion.

Provide exactly one source:

  • content for small UTF-8 text artifacts such as HTML, Markdown, plain text, CSV, JSON, XML, CSS, YAML, TSV, calendar, GPX, or SVG files.
  • source_url for a direct, publicly reachable HTTPS file URL.
  • source_file_id for a file this exact integration already uploaded. When create_file_upload is available, use it for local files so the upload has the same owner.

For content and source_url, filename must use a supported extension and content_type must agree with it. Omit content_type to infer it. source_file_id takes neither because the stored upload carries both. For larger files, redirects, or authenticated downloads, upload through the Notion File Upload API with this integration's token and pass source_file_id.

The response includes a markdown_source value. To place the uploaded file on a page, pass that source to create-pages or update-page. To attach it to a comment, include suggested_markdown on a separate line in create-comment markdown. Unattached uploads remain temporary and are deleted once they expire: content and source_url open a fresh one-hour window, while source_file_id keeps the window that opened when the file was first uploaded, so place that source promptly and upload the file again if it has already expired. "HTML", "HTML block", "HTML artifact", and "HTML embed" all mean an HTML file placed with <embed src="file-upload://..."> so Notion renders the sandboxed preview. Never place HTML in a code block or file block. Use <file src="file-upload://..."> for other files.

If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.

Parameters (0 required, 5 optional)
Optional
contentstring

The complete UTF-8 text content of the file. Maximum 200 KiB after UTF-8 encoding. Requires filename. Examples: <example><!doctype html><html><body><h1>Report</h1></body></html></example> or <example># Notes Hello</example>.

content_typestring

Optional MIME type, such as text/html or application/pdf. It must match the filename extension; omit it to infer the type from the filename. Omit it with source_file_id; the stored upload already carries a content type.

filenamestring

The filename to create in Notion, including a supported extension such as .html, .md, .pdf, or .png. Required with content and source_url. Omit it with source_file_id; the stored upload already carries a filename.

source_file_idstring

The ID of a file upload this exact integration already created. Use create_file_upload when available; otherwise run `ntn files create` or use the Notion File Upload API with this integration's token. Its status must be uploaded. An upload created with a different token is not visible. Example: <example>1e2f3a4b-5c6d-7e8f-9a0b-1c2d3e4f5a6b</example>.

source_urlstring

A direct, publicly reachable HTTPS URL from which Notion can download the file within one minute. Notion makes a metadata-only HEAD request when supported, then a GET. Redirects, private network addresses, custom request headers, and cookies are not supported. Downloads are limited to 5 MiB for free workspaces and 50 MiB for paid workspaces. Requires filename. Example: <example>https://storage.example.com/report.pdf?signature=...</example>.

Create a page comment

notion-create-comment
Full Description

Add a comment to a page or specific content.

Creates a new comment. Provide page_id to identify the page, then choose ONE targeting mode:

  • page_id alone: Page-level comment on the entire page
  • page_id + selection_with_ellipsis: Comment on specific block content
  • discussion_id: Reply to an existing discussion thread (page_id is still required)

Provide exactly one content format:

  • markdown: Preferred. Inline Notion-flavored Markdown for comment text. For exact syntax, read the MCP resource notion://docs/enhanced-markdown-spec through your MCP client's resource-reading interface, or call the Notion "fetch" tool with this URI if your client does not support reading MCP resources. Do NOT pass this URI to any other URL-fetching tool. Use only the Rich text types and Mentions syntax that comments support. Comments support inline formatting (bold, italic, strikethrough, underline, code, links), inline math using $Equation$, and user/page/database/date mention tags such as <mention-date start="YYYY-MM-DD"/>. Do not use UI shortcuts like @today, @name, [[page]], or autocomplete-style emoji syntax; those are editor affordances, not markdown syntax. Mention tags must include a real url where required by the spec. Block-level Markdown such as headings, lists, tables, blockquotes, and fenced code blocks is stored as plain comment text rather than rendered as blocks.
  • rich_text: Array of rich text objects.

For content targeting, use selection_with_ellipsis with ~10 chars from start and end: "

Section Ti...tle content"

<example description="Page-level comment"> {"page_id": "uuid", "markdown": "Comment with important context."} </example> <example description="Comment on specific content"> {"page_id": "uuid", "selection_with_ellipsis": "

Meeting No...es heading",

"markdown": "Comment on this section."} </example> <example description="Reply to discussion"> {"page_id": "uuid", "discussion_id": "discussion://pageId/blockId/discussionId", "markdown": "Reply with [context](https://example.com)."} </example>

Parameters (1 required, 4 optional)
Required
page_idstring

The ID of the page to comment on (with or without dashes).

Optional
discussion_idstring

The ID or URL of an existing discussion to reply to (e.g., discussion://pageId/blockId/discussionId).

markdownstring

The content of the comment as a Markdown string. Provide exactly one of markdown or rich_text. For exact syntax, read the MCP resource `notion://docs/enhanced-markdown-spec` through your MCP client's resource-reading interface, or call the Notion "fetch" tool with this URI if your client does not support reading MCP resources. Do NOT pass this URI to any other URL-fetching tool. Use only the Rich text types and Mentions syntax that comments support. Comments support inline formatting (bold, italic, strikethrough, underline, code, links), inline math using $`Equation`$, and user/page/database/date mention tags such as <mention-date start="YYYY-MM-DD"/>. Do not use UI shortcuts like @today, @name, [[page]], or autocomplete-style emoji syntax; those are editor affordances, not markdown syntax. Mention tags must include a real url where required by the spec. Block-level Markdown such as fenced code blocks, headings, lists, tables, and blockquotes is stored as plain comment text rather than rendered as blocks.

rich_textarray

An array of rich text objects that represent the content of the comment. Provide exactly one of rich_text or markdown.

selection_with_ellipsisstring

Unique start and end snippet of the content to comment on. DO NOT provide the entire string. Instead, provide up to the first ~10 characters, an ellipsis, and then up to the last ~10 characters. Make sure you provide enough of the start and end snippet to uniquely identify the content. For example: "# Section heading...last paragraph."

Create Notion database

notion-create-database
Full Description

Creates a new Notion database using SQL DDL syntax, or a canonical typed database for tasks, projects, or skills.

Provide exactly one of:

  • schema: a CREATE TABLE statement. If no title property is provided, "Name" is auto-added.
  • database_type: one of tasks, projects, or skills. The database is created with the canonical required properties and typed metadata used by Notion.

For schema, use CREATE TABLE with double-quoted column names and single-quoted type options. If no title property is provided, "Name" is auto-added.

Property type syntax:

  • Simple: TITLE, RICH_TEXT, DATE, PEOPLE, CHECKBOX, URL, EMAIL, PHONE_NUMBER, STATUS, FILES
  • SELECT('opt':color, ...) / MULTI_SELECT('opt':color, ...)
  • NUMBER [FORMAT 'dollar'] / FORMULA('expression')
  • RELATION('ds') for a one-way relation
  • RELATION('ds', DUAL) for a two-way relation
  • RELATION('ds', DUAL 'Children') with a synced property name
  • RELATION('ds', DUAL 'Children' 'children') with a synced name and synced_id (for self-relations)
  • ROLLUP('rel_prop', 'target_prop', 'function')
  • UNIQUE_ID [PREFIX 'X'] / CREATED_TIME / LAST_EDITED_TIME
  • Any column: COMMENT 'description text' Colors: default, gray, brown, orange, yellow, green, blue, purple, pink, red.

Returns Markdown with schema, SQLite definition, and data source ID in <data-source> tag for use with update_data_source and query_data_sources tools.

Parameters (0 required, 5 optional)
Optional
database_typestring

Create a canonical typed database with Notion's required properties and metadata. Supported types: tasks, projects, skills. Example: <example>tasks</example>. Use title "Tasks" when needed.

Options:tasksprojectsskills
descriptionstring

The description of the new database.

parentobject

The parent under which to create the new database. If omitted, the database will be created as a private page at the workspace level.

schemastring

SQL DDL CREATE TABLE statement defining the database schema. Cannot be combined with database_type. Column names must be double-quoted and type options use single quotes. Property type syntax: - Simple: TITLE, RICH_TEXT, DATE, PEOPLE, CHECKBOX, URL, EMAIL, PHONE_NUMBER, STATUS, FILES - SELECT('opt':color, ...) / MULTI_SELECT('opt':color, ...) - NUMBER [FORMAT 'dollar'] / FORMULA('expression') - RELATION('ds') for a one-way relation - RELATION('ds', DUAL) for a two-way relation - RELATION('ds', DUAL 'Children') with a synced property name - RELATION('ds', DUAL 'Children' 'children') with a synced name and synced_id (for self-relations) - ROLLUP('rel_prop', 'target_prop', 'function') - UNIQUE_ID [PREFIX 'X'] / CREATED_TIME / LAST_EDITED_TIME - Any column: COMMENT 'description text' Colors: default, gray, brown, orange, yellow, green, blue, purple, pink, red. Examples: - Minimal: <example>CREATE TABLE ("Name" TITLE)</example> - With options: <example>CREATE TABLE ("Name" TITLE, "Budget" NUMBER FORMAT 'dollar', "Tags" MULTI_SELECT('eng':blue, 'design':pink), "Task ID" UNIQUE_ID PREFIX 'PRJ')</example> - Self-relations are a two-step flow: create the database, then use its data source ID with update_data_source to add paired properties such as RELATION('ds', DUAL 'Children' 'children').

titlestring

The title of the new database.

Create a file upload URL

notion-create-file-upload
Full Description

Create a short-lived URL for uploading one local file directly to Notion.

After calling this tool, send exactly one multipart/form-data POST request to upload_url. Put the file in the file form field and include every header returned in upload_headers. Files are limited to 20 MiB for this single-part upload flow, and workspace file-size limits still apply.

The upload response includes markdown_source and suggested_markdown, which can be passed directly to create-pages or update-page, or included on a separate line in create-comment markdown to attach the file. The URL is short-lived, can upload only the FileUpload created by this call, and runs as this same integration.

<examples> 1. Prepare an image upload: {"filename":"diagram.png"} 2. Prepare a PDF upload with an explicit MIME type: {"filename":"report.pdf","content_type":"application/pdf"} </examples>

Parameters (1 required, 1 optional)
Required
filenamestring

The filename to create in Notion, including a supported extension such as .pdf, .png, or .zip.

Optional
content_typestring

Optional MIME type, such as application/pdf or image/png. Prefer omitting it so the type is inferred from the filename: a type that disagrees with the extension is stored as given, and the file then renders as the wrong kind.

Create Notion folder

notion-create-folder
Full Description

Creates an empty Notion Folder. Set parent.page_id for a top-level Folder owned by a page, or parent.folder_id to create a nested Folder inside another Folder. A page-owned Folder is not inserted into the page's content. A nested Folder is appended to its parent Folder's content. The Folder inherits access from its parent.

This tool creates only the empty Folder. It is non-idempotent and creates a new Folder on every successful call.

Parameters (2 required)
Required
parentobject

Where to create the Folder.

titlestring

The title of the new Folder.

Create pages in Markdown

notion-create-pages
Full Description

Overview

Creates one or more Notion pages, with the specified properties and content.

Parent

All pages created with a single call to this tool will have the same parent. The parent can be a Notion page ("page_id") or data source ("data_source_id"). If the parent is omitted, the pages are created as standalone, workspace-level private pages, and the person that created them can organize them later as they see fit.

If you have a database URL, ALWAYS pass it to the "fetch" tool first to get the schema and URLs of each data source under the database. You can't use the "database_id" parent type if the database has more than one data source, so you'll need to identify which "data_source_id" to use based on the situation and the results from the fetch tool (data source URLs look like collection://<data_source_id>).

If you know the pages should be created under a data source, do NOT use the database ID or URL under the "page_id" parameter; "page_id" is only for regular, non-database pages.

Content

Notion page content is a string in Notion-flavored Markdown format.

Don't include the page title at the top of the page's content. Only include it under "properties".

IMPORTANT: For the complete Markdown specification, always first read the MCP resource notion://docs/enhanced-markdown-spec through your MCP client's resource-reading interface, or call the Notion "fetch" tool with this URI if your client does not support reading MCP resources. Do NOT pass this URI to any other URL-fetching tool. Do NOT guess or hallucinate Markdown syntax. This spec is also applicable to other tools like update-page and fetch.

Properties

Notion page properties are a JSON map of property names to SQLite values.

When creating pages in a database:

  • Use the correct property names from the data source schema shown in the fetch tool results.
  • Always include a title property. Data sources always have exactly one title property, but it may not be named "title", so, again, rely on the fetched data source schema.

For pages outside of a database:

  • The only allowed property is "title", which is the title of the page in inline markdown format. Always include a "title" property.

IMPORTANT: Some property types require specific formats:

  • Date properties: Split into "date:{property}:start", "date:{property}:end" (optional), and "date:{property}:is_datetime" (0 or 1)
  • Place properties: Split into "place:{property}:name", "place:{property}:address", "place:{property}:latitude", "place:{property}:longitude", and "place:{property}:google_place_id" (optional)
  • Number properties: Use JavaScript numbers (not strings)
  • Checkbox properties: Use "__YES__" for checked, "__NO__" for unchecked
  • Relation properties: Use an array of related page URLs or page IDs, e.g. ["https://www.notion.so/26ab1f9f4c5f80b18d3bd10a6b1d2f4e", "26ab1f9f-4c5f-80b1-8d3b-d10a6b1d2f4e"]

Special property naming: Properties named "id" or "url" (case insensitive) must be prefixed with "userDefined:" (e.g., "userDefined:URL", "userDefined:id")

Templates

When creating a page in a database, you can apply a template to pre-populate it with content and property values. Use the "fetch" tool on a database to see available templates in the <templates> section of each data source.

When using a template:

  • Pass the template's ID as "template_id" in the page object.
  • Do NOT include "content" when using a template, as the template provides it.
  • You can still set "properties" alongside the template to override template defaults.
  • Template application is asynchronous. The page is created immediately but starts blank; the template content will appear shortly after.

Icon and Cover

Each page can optionally have an icon and a cover image.

  • "icon": An emoji character (e.g. "🚀"), a custom emoji by name (e.g. ":rocket_ship:"), or an external image URL. Use "none" to remove. Omit to leave unchanged.
  • "cover": An external image URL. Use "none" to remove. Omit to leave unchanged.

Examples

<example description="Create a page with an icon and cover"> { "pages": [ { "properties": {"title": "My Page"}, "icon": "🚀", "cover": "https://example.com/cover.jpg" } ] } </example>

<example description="Create a page from a database template"> { "parent": {"data_source_id": "f336d0bc-b841-465b-8045-024475c079dd"}, "pages": [ { "template_id": "a5da15f6-b853-455d-8827-f906fb52db2b", "properties": { "Task Name": "New urgent bug" } } ] } </example>

<example description="Create a standalone page with a title and content"> { "pages": [ { "properties": {"title": "Page title"}, "content": "

Section 1 {color="blue"}

Section 1 content <details> <summary>Toggle block</summary> Hidden content inside toggle </details>" } ] } </example>

<example description="Create a page under a database's data source"> { "parent": {"data_source_id": "f336d0bc-b841-465b-8045-024475c079dd"}, "pages": [ { "properties": { "Task Name": "Task 123", "Status": "In Progress", "Priority": 5, "Is Complete": "__YES__", "date:Due Date:start": "2024-12-25", "date:Due Date:is_datetime": 0 } } ] } </example>

<example description="Create a page with an existing page as a parent"> { "parent": {"page_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"}, "pages": [ { "properties": {"title": "Page title"}, "content": "

Section 1

Section 1 content

Section 2

Section 2 content" } ] } </example>

Async support

Set "allow_async" to true to opt into receiving an async task result when this create operation is accepted for background execution. If this field is omitted or false, the tool keeps the existing synchronous result shape.

Parameters (1 required, 2 optional)
Required
pagesarray

The pages to create.

Optional
allow_asyncboolean

Set to true to opt into receiving an async_task result when this create operation is accepted for background execution. If omitted or false, the tool keeps the existing synchronous result shape.

parentobject

The parent under which the new pages will be created. This can be a page (page_id), a database page (database_id), or a data source/collection under a database (data_source_id). If omitted, the new pages will be created as private pages at the workspace level. Use data_source_id when you have a collection:// URL from the fetch tool.

Create a database view

notion-create-view
Full Description

Create a new view on a Notion database.

Use fetch first to get database_id, parent_page_id, and the collection:// data_source_id. The caller needs edit access to the database or parent page and access to the data source.

Provide exactly one placement: database_id adds a view tab to that database; parent_page_id appends an inline linked database view to that page. Always provide data_source_id.

Supported types: table, board, list, calendar, timeline, gallery, form, chart, map, and dashboard.

The optional configure field uses the view DSL for filters, sorts, grouping, and display. Read notion://docs/view-dsl-spec through the MCP resource interface, or pass that URI to the Notion fetch tool. Do not guess the syntax.

Parameters (3 required, 3 optional)
Required
data_source_idstring

The data source (collection) ID. Accepts a collection:// URI from <data-source> tags or a bare UUID.

namestring

The name of the view.

typestring

The type of view to create.

Options:tableboardlistcalendartimelinegalleryformchartmapdashboard
Optional
configurestring

View configuration DSL directives and examples: - FILTER "Property" = "value" — filter rows. Relation values must be a page URL or UUID; person values must be a user URI (user://<user_id>), user UUID, or "me". Names are not supported for either. - QUICK FILTER "Property" — add a quick filter to the view's filter bar with no criteria; add a condition to preselect one (QUICK FILTER "Status" = "Done") - SORT BY "Property" ASC — sort rows - GROUP BY "Property" — group by property (required for board views) - CALENDAR BY "Property" — date property (required for calendar views) - TIMELINE BY "Start" TO "End" — date range (required for timeline views) - MAP BY "Property" — location property (required for map views) - CHART column|bar|line|donut|number — chart type with optional AGGREGATE, COLOR, HEIGHT, SORT, STACK BY, CAPTION - FORM CLOSE|OPEN — close/open form submissions - FORM ANONYMOUS true|false — toggle anonymous submissions - FORM PERMISSIONS none|reader|editor — set submission permissions - SHOW "Prop1", "Prop2" — set visible properties - COVER "Property" — cover image property <example>SHOW "Name", "Status", "Due Date"</example> <example>GROUP BY "Status"</example> <example>FILTER "Status" = "In Progress"; SORT BY "Due Date" ASC</example> <example>CALENDAR BY "Due Date"</example> <example>TIMELINE BY "Start" TO "End"</example> <example>FILTER "Company" = "Acme"</example>

database_idstring

The database to add a view tab to. Accepts a Notion URL or a bare UUID. Mutually exclusive with `parent_page_id`; exactly one must be provided.

parent_page_idstring

A page to create an inline linked database view on, like the UI /linked command. Accepts a Notion URL or a bare UUID. The new linked view block is appended at the end of the page and references `data_source_id`. Mutually exclusive with `database_id`; exactly one must be provided.

Download a Notion text attachment

notion-download-attachment
Full Description

Download the contents of a small UTF-8 text attachment created by the Notion MCP create-attachment tool.

Pass the file_upload_id returned by create-attachment. The attachment must belong to the requesting integration, have completed uploading, and use a supported text format such as HTML, Markdown, plain text, CSV, JSON, XML, CSS, YAML, TSV, calendar, GPX, or SVG.

The response contains the complete text in content so you can save it locally, edit it, and call create-attachment again to upload a new version. Downloads are limited to 200 KiB. This tool does not fetch arbitrary URLs or return binary files. For larger or binary attachments, use the signed file URL returned when reading the containing Notion page.

<examples> 1. Download a text attachment: {"file_upload_id":"12345678-90ab-cdef-1234-567890abcdef"} </examples>

If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.

Parameters (1 required)
Required
file_upload_idstring

The FileUpload ID returned by the create-attachment tool.

Download a Notion Skill

notion-download-skill
Full Description

Download a spec-compliant Notion Skill as a complete tar.gz archive containing SKILL.md and its supporting files and nested folders. Pass the skill page ID. Returns a temporary signed url. Download and extract the archive to read or use the skill.

If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.

Parameters (1 required)
Required
idstring

Identifier for a Notion skill page.

Duplicate Notion page

notion-duplicate-page
Full Description

Duplicate a Notion page. The page must be within the current workspace, and you must have permission to access it. The duplication completes asynchronously, so do not rely on the new page identified by the returned ID or URL to be populated immediately. Let the user know that the duplication is in progress and that they can check back later using the 'fetch' tool or by clicking the returned URL and viewing it in the Notion app.

Parameters (1 required)
Required
page_idstring

The ID of the page to duplicate. This is a v4 UUID, with or without dashes, and can be parsed from a Notion page URL.

Get async task status

notion-get-async-task
Full Description

Retrieves the current status of an async task that was started by another tool (for example, "create_pages" called with "allow_async": true).

The status is one of "queued", "running", "retrying", "succeeded", or "failed". When the task has succeeded, the operation's result is included; when it has failed, an error is included instead.

Poll this tool with the "task_id" from the original tool's "async_task" response. Wait briefly between polls — the original response includes a suggested backoff.

<examples> 1. Check a task's status: {"task_id": "task_abc123"} </examples>

Parameters (1 required)
Required
task_idstring

The ID of the async task to retrieve, as returned in the async_task response of the tool that started it.

Get page comments

notion-get-comments
Full Description

Get comments and discussions from a Notion page.

Returns discussions with full comment content in XML format. By default, returns page-level discussions only. On supported Business connections, pending suggested edits use kind="suggested_edit" and their discussion:// URL can be passed to get_suggested_edit. Resolved suggestions stay retired. Check suggested_edits_status to distinguish an empty result from unavailable suggestion discovery.

Tip: Use the fetch tool with include_discussions: true first to see where discussions are anchored in the page content, then use this tool to retrieve full discussion threads. The discussion:// URLs in the fetch output match the discussion IDs returned here.

Parameters:

  • include_all_blocks: Include discussions on child blocks (default: false)
  • include_resolved: Include resolved discussions (default: false)
  • discussion_id: Fetch a specific discussion by ID or URL

<example>{"page_id": "page-uuid"}</example> <example>{"page_id": "page-uuid", "include_all_blocks": true}</example> <example>{"page_id": "page-uuid", "discussion_id": "discussion://pageId/blockId/discussionId"}</example>

Parameters (1 required, 3 optional)
Required
page_idstring

Identifier for a Notion page.

Optional
discussion_idstring

Fetch a specific discussion by ID or discussion URL (e.g., discussion://pageId/blockId/discussionId).

include_all_blocksboolean

Include discussions on child blocks, not just page-level discussions. Defaults to false.

include_resolvedboolean

Include resolved discussions in the response. Defaults to false.

Get Custom Agent session status

notion-get-session-status
Full Description

Get the latest turn's status for a Custom Agent session without waiting.

If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.

Parameters (1 required)
Required
session_urlstring

Use the complete session_url returned by session tools, unchanged. Format: session://<spaceId>/<sessionId>. Shorthand session://<sessionId> and thread://<sessionId> use the connected workspace. Fully qualified URLs must refer to that workspace.

Get workspace teams

notion-get-teams
Full Description

Retrieves a list of teams (teamspaces) in the current workspace. Shows which teams exist, user membership status, IDs, names, and roles.

Teams are returned split by membership status and limited to a maximum of 10 results.

<examples> 1. List all teams (up to the limit of each type): {}

2. Search for teams by name: {"query": "engineering"}

3. Find a specific team: {"query": "Product Design"} </examples>

Parameters (0 required, 1 optional)
Optional
querystring

Optional search query to filter teams by name (case-insensitive).

Get users and bots in workspace

notion-get-users
Full Description

Retrieves a list of users in the current workspace. Shows workspace members and guests with their IDs, names, emails (if available), and types (person or bot).

Supports cursor-based pagination to iterate through all users in the workspace.

<examples> 1. List all users (first page): {}

2. Search for users by name or email: {"query": "john"}

3. Get next page of results: {"start_cursor": "abc123"}

4. Set custom page size: {"page_size": 20}

5. Fetch a specific user by ID: {"user_id": "00000000-0000-4000-8000-000000000000"}

6. Fetch the current user: {"user_id": "self"} </examples>

Parameters (0 required, 4 optional)
Optional
page_sizeinteger

Number of users to return per page (1–100; default 100).

querystring

Optional search query to filter users by name or email (case-insensitive).

start_cursorstring

Cursor for pagination. Use the next_cursor value from the previous response to get the next page.

user_idstring

Return only the user matching this ID. Pass "self" to fetch the current user.

List favorite pages

notion-list-favorite-pages
Full Description

List the current user's favorite pages and databases in sidebar order. Use this when the user refers to a favorite or pinned workspace item. Follow cursor pagination when the complete list is needed.

Parameters (0 required, 2 optional)
Optional
cursorstring

Opaque pagination cursor from the previous response.

limitnumber

Maximum results to return (1-200).

List private pages

notion-list-private-pages
Full Description

List the current user's top-level pages and databases in their Private sidebar section. Use this to browse private workspace structure. For content searches, including keywords and titles, use ai_search when get_tool_access reports it is available; otherwise use search. Follow cursor pagination when the complete list is needed.

Parameters (0 required, 2 optional)
Optional
cursorstring

Opaque pagination cursor from the previous response.

limitnumber

Maximum results to return (1-200).

List recent pages

notion-list-recent-pages
Full Description

List pages and databases the current user recently viewed, ranked by recency and visit frequency. Use this to recover likely navigation context when the user refers to something they were recently working on. Follow cursor pagination when the complete list is needed.

Parameters (0 required, 2 optional)
Optional
cursorstring

Opaque pagination cursor from the previous response.

limitnumber

Maximum results to return (1-200).

List Custom Agent session events

notion-list-session-events
Full Description

List short summaries of saved events in a Custom Agent session.

If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.

Parameters (2 required, 2 optional)
Required
countinteger

Maximum number of committed events to return.

session_urlstring

Use the complete session_url returned by session tools, unchanged. Format: session://<spaceId>/<sessionId>. Shorthand session://<sessionId> and thread://<sessionId> use the connected workspace. Fully qualified URLs must refer to that workspace.

Optional
after_sequenceinteger

Load the next page of events starting after this sequence number.

before_sequenceinteger

Load the previous page of events ending before this sequence number.

List shared pages

notion-list-shared-pages
Full Description

List pages and databases in the current user's Shared sidebar section. Use this to browse content shared directly with the user. For content searches, including keywords and titles, use ai_search when get_tool_access reports it is available; otherwise use search. Follow cursor pagination when the complete list is needed.

Parameters (0 required, 2 optional)
Optional
cursorstring

Opaque pagination cursor from the previous response.

limitnumber

Maximum results to return (1-200).

Move Notion pages

notion-move-pages
Full Description

Move one or more Notion pages or databases to a new parent.

Parameters (2 required)
Required
new_parentobject

The new parent under which the pages will be moved. This can be a page, the workspace, a database, or a specific data source under a database when there are multiple. Moving pages to the workspace level adds them as private pages and should rarely be used.

page_or_database_idsarray

An array of up to 100 page or database IDs to move. IDs are v4 UUIDs and can be supplied with or without dashes (e.g. extracted from a <page> or <database> URL given by the "search" or "fetch" tool). Data Sources under Databases can't be moved individually.

Query Notion data sources

notion-query-data-sources
Full Description

Query data from Notion databases using SQL or by specifying a view. By default, uses SQL mode to execute SQLite queries across one or more data sources. Alternatively, use view mode to execute a database view's existing filters and sorts. Prerequisites: 1. Use the "fetch" tool first to get database schema and data source URLs 2. Data source URLs are found in <data-source url="..."> tags in fetch results

SQL mode (default): Execute custom SQLite queries across one or more data sources.

  • Use data source URLs as table names in your query
  • Supports parameterized queries for security
  • Checkbox values: use "__YES__" for checked, "__NO__" for unchecked

Examples: 1. Simple query without explicit mode (defaults to SQL): { "data": { "data_source_urls": ["collection://f336d0bc-b841-465b-8045-024475c079dd"], "query": "SELECT * FROM "collection://f336d0bc-b841-465b-8045-024475c079dd" LIMIT 10" } }

2. Query with parameters: { "data": { "mode": "sql", "data_source_urls": ["collection://abc123"], "query": "SELECT * FROM "collection://abc123" WHERE Status = ? AND Priority = ?", "params": ["In Progress", "High"] } }

3. Query checkboxes: { "data": { "data_source_urls": ["collection://def456"], "query": "SELECT * FROM "collection://def456" WHERE Completed = ?", "params": ["__YES__"] } }

View mode: Execute a specific database view's query with its filters and sorts. When the response has "has_more": true, pass its "next_cursor" as "start_cursor" in a follow-up view-mode request. Example: { "data": { "mode": "view", "view_url": "https://www.notion.so/workspace/Tasks-DB-abc123?v=def456" } } Common use cases:

  • Aggregate data across databases
  • Filter records by complex conditions
  • Export data for analysis
  • Validate data quality
  • Generate reports from database content
Parameters (1 required)
Required
dataobject

The data required for querying data sources

Query Notion meeting notes

notion-query-meeting-notes
Full Description

Query the current user's meeting notes data source.

Use search first to resolve people IDs for attendee filters. By default, results already include meetings where the current user is an attendee or creator; do not add a current-user filter.

Treat words such as summaries, notes, todos, action items, and deliverables as requested meeting output, not title terms. Example: "What are my meeting todos?" needs no title filter for "todos". Add a title filter only when the user clearly names a meeting, such as "standup", "sprint planning", or "1:1 with Alice". Generic date phrases like "recent meetings", "latest meetings", "meetings this week", or "yesterday's meetings" should be interpreted as date range filters — never as title filters. Unless the user asks about a meeting whose title contains another person's name, treat that person as an attendee or creator. Use their name as a title fallback only after attendee filtering returns no results.

Title keyword matching is case-insensitive; capitalization does not matter. Matching is lexical, so simplify a filter to one term when it returns no results. The filter parameter contains the complete property, date, Boolean-combination, and example reference.

If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.

Parameters (0 required, 1 optional)
Optional
filterobject

Meeting note filter reference. Title keyword searching uses a filter on property "title" (for example, string_contains). Returns up to 50 rows of matching meeting notes. Filterable properties: - "title" (text) — meeting title - "attendees" (person) — meeting attendees - "created_time" (date) — when the meeting note was created - "created_by" (person) — who created the meeting note - "last_edited_time" (date) — when the meeting note was last edited - "last_edited_by" (person) — who last edited the meeting note Combinator filters use "filters" (not "operands"): { "operator": "and" | "or", "filters": [ ... ] } Date filtering (recommended default: date_is_within): - Prefer "date_is_within" for relative windows like "past N days/weeks/months". - Relative (common): { type: "relative", value: "the_past_week" | "the_past_month" | "this_week" } - Relative (custom): { type: "relative", value: "custom", direction: "past" | "future", unit: "day" | "week" | "month" | "year", count: <number> } - Exact range: { type: "exact", value: { type: "daterange", start_date: "YYYY-MM-DD", end_date: "YYYY-MM-DD" } } - Single-date operators ("date_is", "date_is_before", "date_is_after", "date_is_on_or_before", "date_is_on_or_after"): - Exact: { type: "exact", value: { type: "date", start_date: "YYYY-MM-DD" } } - Relative shortcuts: today | tomorrow | yesterday | one_week_ago | one_week_from_now | one_month_ago | one_month_from_now Title keyword filtering (OR vs AND): - Use OR ("operator": "or") when unsure or for broad discovery. - Use AND ("operator": "and") when the user is specific and you want to narrow results. - Break multi-word phrases into individual terms and filter on each term separately. Examples: - Past week: <example>{"operator":"and","filters":[{"property":"created_time","filter":{"operator":"date_is_within","value":{"type":"relative","value":"the_past_week"}}}]}</example> - Past 3 days: <example>{"operator":"and","filters":[{"property":"created_time","filter":{"operator":"date_is_within","value":{"type":"relative","value":"custom","direction":"past","unit":"day","count":3}}}]}</example> - Exact date range: <example>{"operator":"and","filters":[{"property":"created_time","filter":{"operator":"date_is_within","value":{"type":"exact","value":{"type":"daterange","start_date":"2025-01-01","end_date":"2025-12-31"}}}}]}</example> - Created after a date: <example>{"operator":"and","filters":[{"property":"created_time","filter":{"operator":"date_is_after","value":{"type":"exact","value":{"type":"date","start_date":"2025-06-01"}}}}]}</example> - Specific attendee: <example>{"operator":"and","filters":[{"property":"attendees","filter":{"operator":"person_contains","value":[{"type":"exact","value":{"table":"notion_user","id":"<user-id>"}}]}}]}</example> - Attendee since a date: <example>{"operator":"and","filters":[{"property":"created_time","filter":{"operator":"date_is_on_or_after","value":{"type":"exact","value":{"type":"date","start_date":"2025-01-01"}}}},{"property":"attendees","filter":{"operator":"person_contains","value":[{"type":"exact","value":{"table":"notion_user","id":"<user-id>"}}]}}]}</example> - Title contains both terms: <example>{"operator":"and","filters":[{"property":"title","filter":{"operator":"string_contains","value":{"type":"exact","value":"design"}}},{"property":"title","filter":{"operator":"string_contains","value":{"type":"exact","value":"review"}}}]}</example> - Title contains either term: <example>{"operator":"or","filters":[{"property":"title","filter":{"operator":"string_contains","value":{"type":"exact","value":"standup"}}},{"property":"title","filter":{"operator":"string_contains","value":{"type":"exact","value":"sync"}}}]}</example>

Query accessible agent sessions

notion-query-sessions
Full Description

List agent sessions available to the integration. Filter, sort, or search by title. A bounded page can be empty while has_more is true; follow next_cursor until has_more is false.

If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.

Parameters (0 required, 5 optional)
Optional
filterobject

A session property filter, or an and/or compound filter nested up to two levels deep.

page_sizeinteger

The number of sessions to return. Maximum: 100.

querystring

A case-insensitive substring search over session titles.

sortsarray

Ordered sort precedence. Defaults to updated_at descending.

start_cursorstring

The continuation cursor returned by the previous page.

Read a Custom Agent session event

notion-read-session-event
Full Description

Read the full visible content of one saved Custom Agent session event.

If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.

Parameters (2 required)
Required
sequenceinteger

Committed event sequence number to read.

session_urlstring

Use the complete session_url returned by session tools, unchanged. Format: session://<spaceId>/<sessionId>. Shorthand session://<sessionId> and thread://<sessionId> use the connected workspace. Fully qualified URLs must refer to that workspace.

Search workspace agents

notion-search-agents
Full Description

Search agents by name or description, or browse the current user's favorite agents and the workspace's newest agents. Queries return one page. Without a query, follow nextCursor until it is omitted, even when a bounded workspace page is empty. Use this instead of list_agents when personal favorites or relevance-ranked search are needed.

If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.

Parameters (1 required, 3 optional)
Required
scopestring

Which agents to list: "favorites" for the current user's favorite agents, or "workspace" for agents shared with the workspace.

Options:favoritesworkspace
Optional
cursorstring

Opaque pagination cursor from the previous response.

limitnumber

Maximum results to return (1-200).

querystring

Search text matched against agent names and descriptions. Queries return one page and cannot use a cursor. When omitted, favorites are returned in sidebar order and workspace agents are returned newest first.

Search emails

notion-search-emails
Full Description

Search the user's email inbox (their Notion Mail connected account) using Gmail query syntax, and return matching threads with ids, participants, dates, and snippets.

This searches the user's personal mailbox, not Notion workspace content — use the regular "search" tool for pages and databases. Only Gmail-backed accounts are supported by this tool.

Query guidance: use Gmail-style operators (from:, to:, subject:, is:unread, has:attachment, newer_than:1d, after:/before:). For topic or digest requests, prefer recency (newer_than:1d) and/or sender (from:) filters over subject: keyword filtering: subjects don't reliably contain the topic word, and when filtering by subject/body cover synonyms rather than over-filtering one term. Date bounds after:/before: take a plain date with no time component (before:2026/05/08 or before:2026-05-08); a time component is not valid Gmail syntax and silently returns nothing.

Each result includes a threadId: a single opaque string, possibly with a verification stamp appended after a "." (e.g. 1894c2bd0f58f2b7.a83f92c1). Pass the whole value unchanged to view-thread-content.

Results may include url: a direct provider URL for opening the thread. Use it directly; never construct a provider URL from threadId or message IDs.

If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.

Parameters (1 required, 4 optional)
Required
querystring

Search query string using Gmail-style search operators (e.g. from:, is:unread, newer_than:1d, after:/before:, subject:).

Optional
countinteger

Number of results to return (default: 20, max: 500).

include_spam_trashboolean

Whether to include spam and trash in results. Defaults to false.

page_tokenstring

Pagination token from previous search results.

user_email_addressstring

The email address of the mailbox to search. Omit to use the user's default connected account.

Search accessible agent sessions

notion-search-sessions
Full Description

Search past agent sessions by topic in a periodically refreshed index and return matching session URLs and excerpts. Recently created or updated sessions may not appear; use query_sessions for recent sessions.

If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.

Parameters (1 required, 1 optional)
Required
questionstring

What you want to find in past sessions.

Optional
lookbackstring

How far back to search, such as "30d" or "1y". Leave it out to search the past year.

Send a message to a Custom Agent session

notion-send-message-to-session
Full Description

Send a follow-up message to a Custom Agent session you can access.

If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.

Parameters (2 required)
Required
messagestring

Follow-up message to send.

session_urlstring

Use the complete session_url returned by session tools, unchanged. Format: session://<spaceId>/<sessionId>. Shorthand session://<sessionId> and thread://<sessionId> use the connected workspace. Fully qualified URLs must refer to that workspace.

Show the full version of Notion MCP

notion-show-advanced-analysis-next-steps
Full Description

Use this exactly once at the end of a turn when query_multiple_data_sources requires the full version of Notion MCP. Call with no arguments. Do not call this once per failed query, and do not call it again if it has already been called in this turn. Use the card data to give the user the relevant next-step message and destination link in the final response. Use a compact, labeled Markdown link rather than a bare URL, and do not request or create a separate link preview.

Start a Custom Agent session

notion-spawn-session
Full Description

Start a session with a published Custom Agent. Use get_session_status or wait_session to check its progress.

If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.

Parameters (2 required)
Required
agent_urlstring

Published Custom Agent URL in agent://<spaceId>/<agentId> format, as returned by search_agents.

initial_messagestring

Initial message for the new session.

Stop a Custom Agent session

notion-stop-session
Full Description

Stop a running Custom Agent session you can access.

If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.

Parameters (1 required)
Required
session_urlstring

Use the complete session_url returned by session tools, unchanged. Format: session://<spaceId>/<sessionId>. Shorthand session://<sessionId> and thread://<sessionId> use the connected workspace. Fully qualified URLs must refer to that workspace.

Update Notion data source

notion-update-data-source
Full Description

Update a Notion data source's schema, title, attributes, or page layout. Schema changes use SQL DDL statements. Returns Markdown showing updated structure and schema.

Accepts a data source ID (collection ID from fetch response's <data-source> tag) or a single-source database ID. Multi-source databases require the specific data source ID.

The statements param accepts semicolon-separated DDL statements:

  • ADD COLUMN "Name" <type> - add a new property
  • DROP COLUMN "Name" - remove a property
  • RENAME COLUMN "Old" TO "New" - rename a property
  • ALTER COLUMN "Name" SET <type> - change type/options

The page_layout param replaces the layout every page in the data source uses (pinned properties, sidebar, property sections, and a content tab next to views). Fetch the data source first to get the current layout, then edit it. See notion://docs/database-page-layouts for the format.

Notes: Cannot delete/create title properties. Max one unique_id property. Cannot update synced databases. Use "fetch" first to see current schema and get the data source ID from <data-source url="collection://..."> tags.

Parameters (1 required, 6 optional)
Required
data_source_idstring

The data source to update. Accepts a collection:// URI from <data-source> tags, a bare UUID, or a database ID (only if the database has a single data source).

Optional
descriptionstring

The new description of the data source.

in_trashboolean

Move data source to trash. Cannot be undone without Notion UI.

is_inlineboolean

Whether the database should display inline (true) or as full page (false). Only applicable for single-source databases.

page_layoutobject

Replaces the data source's page layout. Refer to existing properties by name. See notion://docs/database-page-layouts. Example: <example>{"main":[{"type":"title","pinnedProperties":["Status","Owner"]},{"type":"editor"},{"type":"discussions"}],"sidebar":[{"type":"properties"}]}</example>.

statementsstring

Semicolon-separated SQL DDL statements to update the schema. Supports ADD COLUMN, DROP COLUMN, RENAME COLUMN, and ALTER COLUMN SET. Property type syntax: - Simple: TITLE, RICH_TEXT, DATE, PEOPLE, CHECKBOX, URL, EMAIL, PHONE_NUMBER, STATUS, FILES - SELECT('opt':color, ...) / MULTI_SELECT('opt':color, ...) - NUMBER [FORMAT 'dollar'] / FORMULA('expression') - RELATION('ds') for a one-way relation - RELATION('ds', DUAL) for a two-way relation - RELATION('ds', DUAL 'Children') with a synced property name - RELATION('ds', DUAL 'Children' 'children') with a synced name and synced_id (for self-relations) - ROLLUP('rel_prop', 'target_prop', 'function') - UNIQUE_ID [PREFIX 'X'] / CREATED_TIME / LAST_EDITED_TIME - Any column: COMMENT 'description text' Colors: default, gray, brown, orange, yellow, green, blue, purple, pink, red. Examples: - <example>ADD COLUMN "Priority" SELECT('High':red, 'Medium':yellow, 'Low':green); ADD COLUMN "Due Date" DATE</example> - <example>RENAME COLUMN "Status" TO "Project Status"</example> - <example>DROP COLUMN "Old Property"</example> - For a self-relation, add both relation properties in one call with matching DUAL names and IDs, such as <example>ADD COLUMN "Parent" RELATION('ds', DUAL 'Children' 'children')</example>.

titlestring

The new title of the data source.

Update Notion folder

notion-update-folder
Full Description

Update an existing Notion Folder with an explicit Folder operation.

  • Use add_files with file upload IDs returned by the upload tools.
  • Fetch the Folder first, then use remove_files with the exact file URLs from that fetch result.
  • Use add_subfolder to create and insert a new nested Folder.

Use exactly one command shape; do not mix their arguments:

  • {"command":"add_files","file_upload_ids":["..."]}
  • {"command":"remove_files","file_urls":["..."]}
  • {"command":"add_subfolder","title":"..."}

The Folder ID may be provided with or without dashes.

Parameters (2 required, 3 optional)
Required
commandstring

The Folder update to apply.

Options:add_filesremove_filesadd_subfolder
folder_idstring

The ID of the Folder to update.

Optional
file_upload_idsarray

Required for add_files. One or more file upload IDs returned by the file upload tools.

file_urlsarray

Required for remove_files. The exact file URLs shown in the Folder's latest fetch output.

titlestring

Required for add_subfolder. The new Folder's title.

Update Notion page

notion-update-page
Full Description

Overview

Update a Notion page's properties or content.

Properties

Notion page properties are a JSON map of property names to SQLite values.

For pages in a database:

  • ALWAYS use the "fetch" tool first to get the data source schema and the exact property names.
  • Provide a non-null value to update a property's value.
  • Omitted properties are left unchanged.

IMPORTANT: Some property types require specific formats:

  • Date properties: Split into "date:{property}:start", "date:{property}:end" (optional), and "date:{property}:is_datetime" (0 or 1)
  • Place properties: Split into "place:{property}:name", "place:{property}:address", "place:{property}:latitude", "place:{property}:longitude", and "place:{property}:google_place_id" (optional)
  • Number properties: Use JavaScript numbers (not strings)
  • Checkbox properties: Use "__YES__" for checked, "__NO__" for unchecked
  • Relation properties: Use an array of related page URLs or page IDs, e.g. ["https://www.notion.so/26ab1f9f4c5f80b18d3bd10a6b1d2f4e", "26ab1f9f-4c5f-80b1-8d3b-d10a6b1d2f4e"]
  • Person properties: Use an array of user IDs, user or agent URLs, or group references copied from fetch output ("space_permission_group-<UUID>"). Bare group UUIDs are also supported.
  • Files properties: Use a JSON array of file IDs, Notion Folder URLs, and/or <folder> tags copied from fetch output. Folders are stored as native Folder references, not ordinary links.

Special property naming: Properties named "id" or "url" (case insensitive) must be prefixed with "userDefined:" (e.g., "userDefined:URL", "userDefined:id")

For pages outside of a database:

  • The only allowed property is "title", which is the title of the page in inline markdown format.

Content

Notion page content is a string in Notion-flavored Markdown format.

IMPORTANT: For the complete Markdown specification, first read the MCP resource notion://docs/enhanced-markdown-spec through your MCP client's resource-reading interface, or call the Notion "fetch" tool with this URI if your client does not support reading MCP resources. Do NOT pass this URI to any other URL-fetching tool. Do NOT guess or hallucinate Markdown syntax.

By default, use native Notion mentions for references you add to existing Notion pages, databases, data sources, and people. Use Markdown links only for external URLs or when the user requests a plain link.

Before changing content, fetch the page unless it is already loaded for this task. Inspect the target and nearby sections. Match their heading level, block type, nesting, list or table pattern, and prose style.

Make the smallest complete edit. Prefer "update_content" for targeted search-and-replace edits, and use "insert_content" only to prepend or append. Avoid full-page "replace_content" when a targeted command is sufficient. Preserve unrelated wording, structure, order, and native references; do not broadly rewrite or improve the page unless the user asks.

For "update_content", use the smallest exact old_str from the fetched page that uniquely identifies the target. If the edit would remove material content the user did not explicitly identify, ask for confirmation first.

After a multi-part or structural content edit, fetch the page again and verify the requested content and nesting. Skip this extra read for a simple, exact edit.

Preserving Child Pages and Databases

When using "replace_content", the operation will check if any child pages or databases would be deleted. If so, it will fail with an error listing the affected items.

To preserve child pages/databases, include them in new_str using <page url="..."> or <database url="..."> tags. Get the exact URLs from the "fetch" tool output.

CRITICAL: To intentionally delete child content: if the call failed with validation and requires allow_deleting_content to be true, DO NOT automatically assume the content should be deleted. ALWAYS show the list of pages to be deleted and ask for user confirmation before proceeding.

Icon and Cover

You can set or remove a page's icon and cover alongside any command.

  • "icon": An emoji character (e.g. "🚀"), a custom emoji by name (e.g. ":rocket_ship:"), a Notion icon identifier as returned by fetch (e.g. "icons/pizza_blue"), or an external image URL. Use "none" to remove. Omit to leave unchanged.
  • "cover": An external image URL. Use "none" to remove. Omit to leave unchanged.
  • When you set an icon, keep the page title free of a duplicate leading emoji. The icon is rendered separately before the title.

Skills

Set is_skill to true to mark the page as a skill, or false to remove the skill designation. This can be set alongside any command. To change only the skill status without making another page change, use the update_properties command and omit properties.

Async support

Default to "allow_async": true for page updates. Set it to false only when the next step needs the updated page immediately, or when async execution rejects the request as too large. When this update operation is accepted for background execution, it returns an "async_task" result. Use "get_async_task" to wait for a "succeeded" status before taking a dependent action on the page. For "apply_template", a "succeeded" status does not mean template content is ready; fetch and retry until it is ready before changing or relying on that content. If this field is omitted or false, the tool waits for a synchronous result when possible, but may still return a pollable "async_task" response if queued execution exceeds the synchronous wait deadline.

Examples

<example description="Update page icon and cover"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "update_properties", "properties": {"title": "My Page"}, "icon": "🚀", "cover": "https://example.com/cover.jpg" } </example>

<example description="Update page properties"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "update_properties", "properties": { "title": "New Page Title", "status": "In Progress", "priority": 5, "checkbox": "__YES__", "related_tasks": ["26ab1f9f-4c5f-80b1-8d3b-d10a6b1d2f4e"], "date:deadline:start": "2024-12-25", "date:deadline:is_datetime": 0, "place:office:name": "HQ", "place:office:latitude": 37.7749, "place:office:longitude": -122.4194 } } </example>

<example description="Replace the entire content of a page"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "replace_content", "new_str": "

New Section

Updated content goes here" } </example>

<example description="Update specific content in a page (search-and-replace)"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "update_content", "content_updates": [ { "old_str": "

Old Section

Old content here", "new_str": "

New Section

Updated content goes here" } ] } </example>

<example description="Insert new content at the top of a page"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "insert_content", "content": "

Latest update

Status update goes here", "position": { "type": "start" } } </example>

<example description="Insert content after a specific location"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "update_content", "content_updates": [ { "old_str": "

Previous section

Existing content", "new_str": "

Previous section

Existing content

New Section

Content to insert goes here" } ] } </example>

<example description="Multiple content updates in a single call"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "update_content", "content_updates": [ { "old_str": "Old text 1", "new_str": "New text 1" }, { "old_str": "Old text 2", "new_str": "New text 2" } ] } </example>

Templates

You can apply a template to an existing page using the "apply_template" command. The template content is appended to the page asynchronously. Get template IDs from the <templates> section in the fetch tool results for a database, or use any page ID as a template.

<example description="Apply a template to an existing page"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "apply_template", "template_id": "a5da15f6-b853-455d-8827-f906fb52db2b" } </example>

Verification

You can verify or unverify a page using the "update_verification" command. Verification marks a page as reviewed and up-to-date. Requires a Business or Enterprise plan (or the page must be in a wiki).

When updating verification, the owner will be automatically set to the authenticated actor.

<example description="Verify a page for 90 days"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "update_verification", "verification_status": "verified", "verification_expiry_days": 90 } </example>

<example description="Verify a page indefinitely"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "update_verification", "verification_status": "verified" } </example>

<example description="Remove verification from a page"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "update_verification", "verification_status": "unverified" } </example>

Parameters (2 required, 13 optional)
Required
commandstring

The update command to execute.

Options:update_propertiesupdate_contentreplace_contentinsert_contentapply_templateupdate_verification
page_idstring

The ID of the page to update, with or without dashes.

Optional
allow_asyncboolean

Default to true for page updates. Set to false only when the next step needs the updated page immediately, or when async execution rejects the request as too large. When this update operation is accepted for background execution, it returns an async_task result. Use get_async_task to wait for a succeeded status before taking a dependent action on the page. For apply_template, a succeeded status does not mean template content is ready; fetch and retry until it is ready before changing or relying on that content. If omitted or false, the tool waits for a synchronous result when possible, but may still return a pollable async_task response if queued execution exceeds the synchronous wait deadline.

allow_deleting_contentboolean

Optional for "replace_content" and "update_content" commands. Set to true to allow deletion of child pages and databases that are not referenced in the new content. If false or omitted, the operation will fail with an error listing the pages/databases that would be deleted.

contentstring

Required for "insert_content" command. The markdown content to insert into the page.

content_updatesarray

Required for "update_content" command. An array of search-and-replace operations, each with old_str (content to find) and new_str (replacement content).

coverstring

An external image URL for the page cover. Use "none" to remove the cover. Omit to leave unchanged. Can be set alongside any command.

iconstring

An emoji character (e.g. "🚀"), a custom emoji by name (e.g. ":rocket_ship:"), a Notion icon identifier as returned by fetch (e.g. "icons/pizza_blue"), or an external image URL. Use "none" to remove the icon. Omit to leave unchanged. Can be set alongside any command.

is_skillboolean

Set to true to mark this page as a skill, or false to remove the skill designation. Can be set alongside any command.

new_strstring

Required for "replace_content" command. The new content string to replace the entire page content with.

positionobject

Optional for "insert_content" command. Use {"type":"start"} to prepend content or {"type":"end"} to append content. Omit to append.

propertiesobject

Required for "update_properties" command. A JSON object that updates the page's properties. For pages in a database, use the SQLite schema definition shown in <database>. For pages outside of a database, the only allowed property is "title", which is the title of the page in inline markdown format. For a Files property, an uploaded file can be provided as {"type":"file_upload","file_upload":{"id":"<file-upload-id>"}} inside the property's array. Use null to remove a property's value.

template_idstring

Required for "apply_template" command. The ID of a template to apply to this page. Template content is appended to any existing page content.

verification_expiry_daysinteger

Optional for "update_verification" command when verification_status is "verified". Number of days until verification expires (e.g. 7, 30, 90). Omit for indefinite verification.

verification_statusstring

Required for "update_verification" command. Set to "verified" to mark the page as verified, or "unverified" to remove verification. When updating verification, the owner will be automatically set to the authenticated actor.

Options:verifiedunverified

Update a database view

notion-update-view
Full Description

Update a view's name, filters, sorts, or display configuration.

Use "fetch" to get view IDs from database responses. Only include fields you want to change. The "configure" param uses the same DSL as create_view. Use CLEAR to remove settings:

  • CLEAR FILTER — remove all filters
  • CLEAR QUICK FILTER — remove all quick filters, or name properties to remove only theirs (CLEAR QUICK FILTER "Status")
  • CLEAR SORT — remove all sorts
  • CLEAR GROUP BY — remove grouping

See notion://docs/view-dsl-spec resource for full syntax (readable via your MCP client's resource-reading interface, or by passing the URI to the Notion "fetch" tool).

<example description="Rename">{"view_id": "abc123", "name": "Sprint Board"}</example> <example description="Update filter">{"view_id": "abc123", "configure": "FILTER "Status" = "Done""}</example> <example description="Add quick filters without criteria">{"view_id": "abc123", "configure": "QUICK FILTER "Status", "Assignee""}</example> <example description="Clear filter, add sort">{"view_id": "abc123", "configure": "CLEAR FILTER; SORT BY "Created" DESC"}</example> <example description="Update grouping">{"view_id": "abc123", "configure": "GROUP BY "Priority"; SHOW "Name", "Status""}</example>

Parameters (1 required, 2 optional)
Required
view_idstring

The view to update. Accepts a view:// URI, a Notion URL with ?v= parameter, or a bare UUID.

Optional
configurestring

View configuration DSL string. Supports FILTER, QUICK FILTER, SORT BY, GROUP BY, CALENDAR BY, TIMELINE BY, MAP BY, CHART, FORM, SHOW, HIDE, COVER, WRAP CELLS, FREEZE COLUMNS, and CLEAR directives.

namestring

New name for the view.

Upload a Notion Skill

notion-upload-skill
Full Description

Import a spec-compliant Agent Skills directory into a page in a Skills database. First call action=prepare with page_id and the exact tar.gz content_length and checksum_crc32. PUT the raw archive bytes to upload_url with all upload_headers, then call action=complete with the same page_id and upload_token. The archive must contain SKILL.md with name/description YAML frontmatter, either at the root or in a single matching skill-name directory. Completion replaces the page title, Description, body, and Files; it preserves the page and uses the page-update diff engine rather than recreating all content blocks. SKILL.md becomes page content. Its sibling folders and files are added directly to Files, preserving nested directories without a skill-name wrapper. Previous folders are not deleted. For a new skill, create a page in a Skills database first. Maximum 20 MiB compressed, 25 MiB expanded, 1000 entries, 20 path levels, and 200 UTF-8 bytes per filename. Paths must be unique ignoring case. Only name and description are imported from frontmatter; optional fields are ignored. Links and special files are rejected. Upload URLs and tokens expire after ten minutes. Uploading never executes skill instructions or scripts.

If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.

Parameters (2 required, 3 optional)
Required
actionstring

Prepare an upload or complete a previously uploaded archive.

Options:preparecomplete
page_idstring

Target page in a Skills database. Create a new page first to import a new skill.

Optional
checksum_crc32string

Required for prepare. Base64-encoded big-endian CRC32 of the tar.gz bytes; S3 verifies it on upload.

content_lengthinteger

Required for prepare. Exact compressed archive size in bytes (maximum 20 MiB).

upload_tokenstring

Required for complete. Opaque token from prepare. Bound to the integration, workspace, and page; expires after ten minutes.

View email thread content

notion-view-thread-content
Full Description

View the content of an email thread from the user's email inbox (their Notion Mail connected account), including message bodies and attachment metadata.

Use a threadId returned by search-emails. The id is a single opaque string; a verification stamp may be appended after a "." (e.g. 1894c2bd0f58f2b7.a83f92c1) and that stamp is part of the value, not a separate field — pass the whole value exactly as received.

Thread ids are scoped to the mailbox they were found in: if the search ran against a non-default mailbox (see searched_email_address in the search result), pass that same address as user_email_address here.

The response may include url: a direct provider URL for opening the thread. Use it directly; never construct a provider URL from threadId or message IDs.

If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.

Parameters (1 required, 2 optional)
Required
thread_idstring

The thread ID to view (from search-emails). A stamped ref is accepted as-is.

Optional
most_recent_message_onlyboolean

If true (the default), returns only the most recent message. Set false to return all messages in the thread.

user_email_addressstring

The email address of the mailbox containing the thread. Omit to use the user's default connected account.

Wait for a Custom Agent session

notion-wait-session
Full Description

Wait for the latest turn in a Custom Agent session to stop running.

If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.

Parameters (2 required)
Required
secondsinteger

Maximum number of seconds to wait.

session_urlstring

Use the complete session_url returned by session tools, unchanged. Format: session://<spaceId>/<sessionId>. Shorthand session://<sessionId> and thread://<sessionId> use the connected workspace. Fully qualified URLs must refer to that workspace.

Query Notion data sources

query-data-sources
Full Description

Query Notion data sources using faithful structured rows, SQL, or a saved view.

If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.

Use fetch first to read the schema and collection:// URL for every data source you query.

Choose the mode by the data needed; omitting mode uses sql:

  • rows preserves rich-text mentions, links, formatting, dates, and equations. Use it before repairing or rewriting rich-text properties.
  • sql runs read-only SQLite. Use only table and column names shown in each fetched <sqlite-table> definition. The system columns include url and createdTime; use other metadata names only when the table lists them. Do not assume generic names such as Name or Title, or names such as page_id, rowid, or lastEditedTime. Date properties use the listed expanded columns date:<Property Name>:start, date:<Property Name>:end, and date:<Property Name>:is_datetime; the base date property is not a SQL column. If SQLite reports a missing column, fetch the data source again and rewrite the query using its current <sqlite-table> names. Do not guess another name. Bind untrusted values with ? placeholders and params, and include every needed filter. View filters are not applied automatically. SQL text is lossy: mentions and formatting may be omitted, and links may lose their destination. Never treat that output as proof that a property is corrupt.
  • view runs one saved view's filters and sorts. Omit is_archived or set it false for active rows; true selects archived rows. When has_more is true, pass next_cursor as start_cursor with the same is_archived value.

View mode has no tool-specific plan quota. SQL is unlimited on Business and Enterprise with Notion AI. Other plans have a shared workspace limit for single-data-source SQL and cannot query multiple data sources at once.

Parameters (1 required)
Required
dataobject

Mode parameter reference and examples. SQL mode: - Use single quotes for SQL string values, such as `"Status" = 'Done'`. Use double quotes for table and column names. In SQL, `''` is an empty string. - Prefer `?` placeholders for values. For text values, the `params` array uses JSON strings, so `[""]` passes an empty string and `["__YES__"]` passes a checked checkbox value. Do not add SQL quote marks around a bound value. - Checkbox SQL values: `'__YES__'` means checked; `'__NO__'` means unchecked. Rows mode: Return up to 100 rows with faithful rich-text property values and optional structured filters and sorts. Example: <example>{"mode":"rows","data_source_url":"collection://f336d0bc-b841-465b-8045-024475c079dd","filter":{"type":"group","operator":"and","filters":[{"type":"property","property":"Status","propertyType":"select","operator":"enum_is","value":{"type":"exact","value":"In Progress"}}]},"limit":20}</example> Examples: - Simple SQL: <example>{"data_source_urls":["collection://f336d0bc-b841-465b-8045-024475c079dd"],"query":"SELECT * FROM [collection://f336d0bc-b841-465b-8045-024475c079dd] LIMIT 10"}</example> - SQL parameters: <example>{"mode":"sql","data_source_urls":["collection://abc123"],"query":"SELECT * FROM [collection://abc123] WHERE Status = ? AND Priority = ?","params":["In Progress","High"]}</example> - Checkbox query: <example>{"data_source_urls":["collection://def456"],"query":"SELECT * FROM [collection://def456] WHERE Completed = ?","params":["__YES__"]}</example> View mode: Execute a specific database view's query with its filters and sorts. Omit "is_archived" or set it to false for non-archived rows. Set "is_archived": true to apply the view inside the archived partition. When the response has "has_more": true, pass its "next_cursor" as "start_cursor" in a follow-up view-mode request with the same "is_archived" value. Example: <example>{"mode":"view","view_url":"https://www.notion.so/workspace/Tasks-DB-abc123?v=def456","is_archived":false}</example>

Query multiple Notion data sources

query-multiple-data-sources
Full Description

Query data across multiple Notion data sources using read-only SQLite SQL.

If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.

Use this tool for JOINs, UNIONs, comparisons, and aggregations that need two or more data sources. Queries across multiple data sources require a Business or Enterprise plan with Notion AI. Use query_data_sources instead when you need one data source or a saved database view.

Prerequisites: 1. Use the "fetch" tool first to get each data source's schema and collection:// URL. 2. Data source URLs are found in <data-source url="..."> tags in fetch results.

SQL:

  • Use each collection:// URL as a quoted SQLite table name in the query.
  • Bind untrusted values with ? placeholders and params; do not interpolate them into SQL.
  • Include every needed filter in WHERE. Saved-view filters and sorts are not automatically applied.
  • Checkbox values: use "__YES__" for checked and "__NO__" for unchecked.

Returns matching rows, the queried data source IDs, and whether results were truncated.

Parameters (2 required, 2 optional)
Required
data_source_urlsarray

Notion data source URLs whose SQLite tables are available to the query; each data source is exposed as a table named by its URL. Obtain them from the fetch tool, in the format: collection://f336d0bc-b841-465b-8045-024475c079dd

querystring

Read-only SQLite query to execute against the data sources. Use a data source URL as the table name, e.g. SELECT * FROM "collection://..." WHERE .... Use only table and column names shown in the fetched `<sqlite-table>` definition; date properties use the expanded column names listed there, not the base name. Include every needed filter in WHERE (filters on views of the data source are not automatically applied). For time comparisons or ordering, normalize text timestamps with datetime(...) or date(...). SQL text values can omit rich-text mentions and formatting, and links can lose their destination. Use faithful rows mode or fetch the page before rewriting a rich-text property.

Optional
modestring

Optional SQL mode marker. This tool only supports SQL queries.

Options:sql
paramsarray

Positional parameters bound to `?` placeholders in the query. Prefer parameterized queries over string interpolation. Use "__YES__" for checked checkboxes and "__NO__" for unchecked checkboxes.

Search Notion

search
Full Description

Before the first content search for this connection, call get_tool_access with {} unless its current access result is already in context. Choose the content-search tool by current_tool_access.ai_search.status, not by query wording:

  • If the status is "available", use ai_search for every keyword, page-title, project-name, or natural-language content search.
  • If access discovery reports that AI search is not available to this connection, use search with short, specific keywords. Missing access information is not a denial; call get_tool_access first.

Start with a non-empty query and omit optional parameters unless needed. Do not add filters or sorting just to fill in defaults. Business or Enterprise is required for filters.edited_by_user_ids, filters.last_edited_date_range, filters.title_only=true, filters.content_status, more than one distinct teamspace across teamspace_id and filters.teamspace_ids, and sort other than relevance. Check current_tool_access.search.restricted_parameters; unavailable options are dropped with a notice and results may be broader. Keep filters nested inside "filters". Use page_size, not limit. When AI search is available, use ai_search for structured content searches too.

For user lookup, use ai_search with query_type="user" when AI search is available; otherwise use search with query_type="user". A document about a person is a content search, not a user lookup.

<example description="AI search unavailable: find a page by title"> {"query":"Q3 roadmap"} </example> <example description="Find a user on any plan"> {"query":"alex@example.com","query_type":"user"} </example>

Parameters (1 required, 9 optional)
Required
querystring

Short, specific keywords for Notion content search. For user search, enter a name or email address. Provide a non-empty query unless intentionally browsing with filters or a non-relevance sort.

Optional
content_search_modestring
Options:workspace_searchai_search
data_source_urlstring

Optionally restrict keyword search to a data source URL returned in a <data-source> tag.

filtersobject

Optional exact filters for Notion workspace search. Omit unless required by the request. Keep filter fields nested here; do not send them at the top level. Some filters require Business access.

max_highlight_lengthinteger

Maximum character length for result highlights (default 200). Set to 0 to omit highlights entirely.

page_sizeinteger

Maximum number of results to return (default 10). Lower values reduce response size.

page_urlstring

Optionally restrict keyword search to a page and its descendants. Accepts a Notion page URL or ID.

query_typestring

Specify type of the query as either "internal" or "user". Always include this input if performing "user" search.

Options:internaluser
sortstring

Result ordering for Notion workspace search. Omit for the default "relevance" ordering. "last_edited" and "created" require Business access.

Options:relevancelast_editedcreated
teamspace_idstring

Optionally, provide the ID of a teamspace to restrict search results to. This will perform a search over content within the specified teamspace only. Accepts the teamspace ID (UUIDv4) with or without dashes.