MCP App Store
by KeenEthics

Overview

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.

Tools

fetch

ChatGPT
Retrieves details about a Notion entity (page, database, or data source) by URL or ID. Provide URL or ID in id parameter. Make multiple calls to fetch multiple entities. Pages use enhanced Markdown format. For the complete specification, fetch the MCP resource at notion://docs/enhanced-markdown-spec. 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. 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. <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>

notion-calendar-cancel-events

ChatGPT
Cancel one or more identified events the user can manage. Cancellation may notify attendees. For an event the user does not organize, use calendar_update_events with updateType: "RSVP" instead.

notion-calendar-create-events

ChatGPT
Create one or more events on writable calendars. Use this after the date, time, attendees, and target calendar are known. Creating events may notify attendees.

notion-calendar-list-calendar-resources

ChatGPT
List rooms or other calendar resources available for specific times. Resource discovery is scoped to the connected account of the target calendar and only works with Google Workspace accounts that have admin permissions to view Calendar resources.

notion-calendar-list-calendars

ChatGPT
List calendars grouped by connected account. Use this to identify a target or conflict calendar before another Calendar operation.

notion-calendar-list-contacts

ChatGPT
Find contacts by name or email across the user's connected Calendar accounts. Use this to resolve attendee identities before another Calendar operation.

notion-calendar-list-coworkers-events

ChatGPT
List detailed events for coworkers in the same organization within a time range. Use this when event titles or context are needed, not only free/busy availability.

notion-calendar-list-events

ChatGPT
List the user's events across connected calendars within a time range. Use this to inspect the user's own schedule or identify events before changing them.

notion-calendar-update-events

ChatGPT
Update one or more identified events, including timing, attendees, recurrence, resources, or RSVP status. Updates require permission and may notify attendees.

notion-check-mcp-next-steps

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

notion-convert-page-to-skill

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

notion-create-attachment

ChatGPT
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 file available at a direct, publicly reachable HTTPS URL. This supports binary files and temporary signed download URLs. Notion performs a metadata-only HEAD request when supported, followed by the GET request that downloads the file. The URL must not redirect, require cookies or request headers, or resolve to a private network address. The filename must use a supported extension. The optional content_type is a MIME type and must agree with the filename; omit it to infer the type from the extension. Inline content is limited to 200 KiB after UTF-8 encoding. URL downloads must complete within one minute and are limited to 5 MiB for free workspaces and 50 MiB for paid workspaces. For local files, larger files, URLs that redirect, or authenticated downloads requiring headers, use ntn files create or the Notion File Upload API instead. The response includes a markdown_source value. To place the uploaded file on a page, pass that source to create-pages or update-page. Attach it within one hour: unattached uploads remain temporary and are deleted after they expire. "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. <examples> 1. Create an HTML artifact: {"filename":"report.html","content":"<!doctype html><html><body><h1>Report</h1></body></html>"} 2. Create Markdown with an explicit MIME type: {"filename":"notes.md","content_type":"text/markdown","content":"# Notes Hello"} 3. Import a PDF from a signed URL: {"filename":"report.pdf","source_url":"https://storage.example.com/report.pdf?signature=..."} </examples>

notion-create-comment

ChatGPT
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, fetch notion://docs/enhanced-markdown-spec and 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."} </example>

notion-create-database

ChatGPT
Creates a new Notion database using SQL DDL syntax. If no title property provided, "Name" is auto-added. 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. The schema param accepts a CREATE TABLE statement defining columns. 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('data_source_id') — one-way relation - RELATION('data_source_id', DUAL) — two-way relation - RELATION('data_source_id', DUAL 'synced_name') — two-way with synced property name - RELATION('data_source_id', DUAL 'synced_name' 'synced_id') — two-way with synced name and 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 <example description="Minimal">{"schema": "CREATE TABLE ("Name" TITLE)"}</example> <example description="Task DB">{"title": "Tasks", "schema": "CREATE TABLE ("Task Name" TITLE, "Status" SELECT('To Do':red, 'Done':green), "Due Date" DATE)"}</example> <example description="With parent and options">{"parent": {"page_id": "f336d0bc-b841-465b-8045-024475c079dd"}, "title": "Projects", "schema": "CREATE TABLE ("Name" TITLE, "Budget" NUMBER FORMAT 'dollar', "Tags" MULTI_SELECT('eng':blue, 'design':pink), "Task ID" UNIQUE_ID PREFIX 'PRJ')"}</example> <example description="Self-relation (two-step: create database first, then use its data source ID with update_data_source to add self-relations)">{"title": "Tasks", "schema": "CREATE TABLE ("Name" TITLE, "Parent" RELATION('ds_id', DUAL 'Children' 'children'), "Children" RELATION('ds_id', DUAL 'Parent' 'parent'))"}</example>

notion-create-file-upload

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

notion-create-folder

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

notion-create-pages

ChatGPT
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 fetch the MCP resource at notion://docs/enhanced-markdown-spec. 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 expanded 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 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>

notion-create-view

ChatGPT
Create a new view on a Notion database. Exactly one of "database_id" or "parent_page_id" must be provided: - "database_id": add a new view tab to an existing database. - "parent_page_id": create an inline linked database view on a page that references the existing "data_source_id" (like the UI "/linked" command). The linked view block is appended to the end of the parent page. Use "fetch" first to get the database_id, parent_page_id, and data_source_id (from <data-source> tags in the response). The caller must have edit access to the database (or parent page) and access to the data source. Supported types: table, board, list, calendar, timeline, gallery, form, chart, map, dashboard. The optional "configure" param accepts a DSL for filters, sorts, grouping, and display options. See the notion://docs/view-dsl-spec resource for full syntax. Key directives: - FILTER "Property" = "value" — filter rows - 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 description="Table view on existing database">{"database_id": "abc123", "data_source_id": "def456", "name": "All Tasks", "type": "table"}</example> <example description="Board grouped by Status">{"database_id": "abc123", "data_source_id": "def456", "name": "Task Board", "type": "board", "configure": "GROUP BY "Status""}</example> <example description="Filtered + sorted table">{"database_id": "abc123", "data_source_id": "def456", "name": "Active", "type": "table", "configure": "FILTER "Status" = "In Progress"; SORT BY "Due Date" ASC"}</example> <example description="Calendar view">{"database_id": "abc123", "data_source_id": "def456", "name": "Calendar", "type": "calendar", "configure": "CALENDAR BY "Due Date""}</example> <example description="Dashboard">{"database_id": "abc123", "data_source_id": "def456", "name": "Overview", "type": "dashboard"}</example> <example description="Linked view on a page">{"parent_page_id": "ghi789", "data_source_id": "def456", "name": "Company tasks", "type": "table", "configure": "FILTER "Company" = "Acme""}</example>

notion-delete-comment

ChatGPT
Delete a comment you wrote. Get the comment ID from get_comments or create_comment. If it is the last comment in its discussion, the discussion is removed too. Use this only when the user asks to delete a comment; to fix a comment, use update_comment instead. You can only delete your own comments.

notion-delete-databases

ChatGPT
Move Notion databases to Trash. They can be restored with the restore_pages tool or from Trash in Notion. Each database goes to Trash with all of its rows. Pass a full-page or inline database that owns its data, not a linked view. To move a page or database row to Trash, use delete_pages. Use this tool only when the user explicitly asks to delete specific databases. Never use it on your own initiative to clean up, deduplicate, or reorganize content. Without user_confirmed: true, nothing is trashed and the error lists what would be moved to Trash; show that list to the user and retry only after they confirm.

notion-delete-pages

ChatGPT
Move Notion pages to Trash. They can be restored with the restore_pages tool or from Trash in Notion. Database rows are pages. To move a database to Trash, use delete_databases. To remove content inside a page, use update_page instead. Use this tool only when the user explicitly asks to delete specific pages. Never use it on your own initiative to clean up, deduplicate, or reorganize content. Without user_confirmed: true, nothing is trashed and the error lists what would be moved to Trash; show that list to the user and retry only after they confirm.

notion-download-attachment

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

notion-download-skill

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

notion-duplicate-page

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

notion-get-async-task

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

notion-get-comments

ChatGPT
Get comments and discussions from a Notion page. Returns discussions with full comment content in XML format. By default, returns page-level discussions only. 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>

notion-get-enabled-skills

ChatGPT
Use this tool to view the Notion skills the user has enabled for you and other external MCP clients, each with a name and a description of when it should be used. If you choose to use one of these skills, mention to the user that you are loading the skill from Notion first, then download them.

notion-get-file-download-urls

ChatGPT
Get signed download URLs for files that fetch output cites by stable notion-file-block:// references. Pass up to 25 references exactly as they appear in the page Markdown. Each reference resolves independently: files lists the ones that resolved and unresolved lists the rest with a reason. The URLs expire after a few minutes; call this tool again for fresh ones. Keep the stable references, not the URLs, when editing or copying page Markdown. <examples> 1. Get download URLs: {"references":["notion-file-block://12345678-90ab-4def-8234-567890abcdef/abcdef12-3456-4890-abcd-ef1234567890?space_id=fedcba98-7654-4321-8fed-cba987654321&name=diagram.png"]} </examples>

notion-get-groups

ChatGPT
Retrieves permission groups in the current workspace that you can see, with their IDs and names. People properties reference a group as space_permission_group-<id>. Use this tool to find the name of a group in a People property value, or to find a group by name before setting it in a People property. Listings are sorted by name and searches return the closest matches first. Results are limited to a maximum of 25 groups. <examples> 1. List groups (up to the limit): {} 2. Search for groups by name: {"query": "engineering"} 3. Look up a group from a People property value: {"query": "space_permission_group-141083e9-5e66-4c8f-8a38-bce5762903c2"} </examples>

notion-get-self

ChatGPT
Get the current Notion connection's workspace and authenticated user. Call with {}. Returns the workspace ID and name, and the user's ID, name, type, and email when available. Use this tool to identify the connected account. To check tool availability, use get_tool_access.

notion-get-session-status

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

notion-get-teams

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

notion-get-tool-access

ChatGPT
Get current tool availability, parameter restrictions, and available upgrade links for this Notion connection. Call with {} to get the full access map before using a conditionally available tool, unless current access is already in context. Reuse this map across tools. When current_tool_access.ai_search.status is "available", use ai_search for every content search; otherwise use search. Tool availability and restricted_parameters are independent: omit restricted options even when the tool is available. Optionally pass tool_names, for example ["search", "ai_search"], to narrow the result. Unknown names and tools not exposed to this connection are omitted. When ai_search is available, legacy search is also omitted from this map; user lookup uses ai_search with query_type="user". This tool does not grant access or change the workspace.

notion-get-users

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

notion-list-favorite-pages

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

notion-list-private-pages

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

notion-list-recent-pages

ChatGPT
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. This reflects views, not edits; to find pages the user edited, use search with filters.edited_by_user_ids: ["me"] and sort: "last_edited". Follow cursor pagination when the complete list is needed.

notion-list-session-events

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

notion-list-shared-pages

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

notion-move-pages

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

notion-query-data-sources

ChatGPT
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

notion-query-database-view

ChatGPT
Query data from a Notion database view. Executes a database view's existing filters, sorts, and column selections to return matching pages. Use this to query a view exactly as configured. For custom SQL queries, aggregation, or querying across multiple data sources, use query_data_sources instead. By default, it returns non-archived rows only. Set "is_archived": true to query archived rows only. Prerequisites: 1. Use the "fetch" tool first to get the database and its view URLs 2. View URLs are found in database responses, typically in the format: https://www.notion.so/workspace/db-id?v=view-id Example: { "view_url": "https://www.notion.so/workspace/Tasks-DB-abc123?v=def456", "is_archived": false } When the response has "has_more": true, pass its "next_cursor" as "start_cursor" in a follow-up request with the same "is_archived" value. Common use cases: - Query databases using pre-defined views (filters/sorts already configured), e.g. look for all tickets marked "In Progress" in a Tasks DB - Export filtered data for analysis - Generate reports from database content

notion-query-meeting-notes

ChatGPT
Query the current user's meeting notes data source. Applies a filter over meeting note properties. Title keyword searching is done via filter on property "title" (e.g. string_contains). Title keyword matching is case-insensitive; capitalization does not matter. Returns up to 50 rows of matching meeting notes. Prerequisites: 1. Use the "search" tool to find people IDs if you need to filter by attendees Query building: - Ignore terms semantically related to meeting outputs (e.g. "summaries", "notes", "todos", "action items", "deliverables"). These signal the user wants outcomes from their meetings, not a title filter. - For example, "what are my meeting todos?" means filter meetings and find action items — do NOT add a title filter for "todos". - Only add a title filter when confident the user is targeting a specific meeting title (e.g. "standup", "sprint planning", "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. - If a filter returns no results, simplify to a single term. The system is lexical, so multi-word title filters may not match. - Unless a user explicitly asks about a meeting titled with another user's name, assume they're referring to attendees or creators. Only add a title filter with a person's name as a fallback if attendee filtering returns no results. Default behavior: - This tool by default returns meeting notes where the current user is an attendee or creator. There is no need to add a filter for the current user. Filterable properties: - "title" (text) — meeting title - "notion://meeting_notes/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. Example 1: Filter meetings from the past week (relative): { "filter": { "operator": "and", "filters": [ { "property": "created_time", "filter": { "operator": "date_is_within", "value": { "type": "relative", "value": "the_past_week" } } } ] } } Example 2: Filter meetings from the past 3 days (custom relative): { "filter": { "operator": "and", "filters": [ { "property": "created_time", "filter": { "operator": "date_is_within", "value": { "type": "relative", "value": "custom", "direction": "past", "unit": "day", "count": 3 } } } ] } } Example 3: Filter meetings by exact date range: { "filter": { "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 4: Filter meetings created after a specific date: { "filter": { "operator": "and", "filters": [ { "property": "created_time", "filter": { "operator": "date_is_after", "value": { "type": "exact", "value": { "type": "date", "start_date": "2025-06-01" } } } } ] } } Example 5: Filter meetings by a specific attendee (use "search" tool first to get user ID): { "filter": { "operator": "and", "filters": [ { "property": "notion://meeting_notes/attendees", "filter": { "operator": "person_contains", "value": [ { "type": "exact", "value": { "table": "notion_user", "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890" } } ] } } ] } } Example 6: Combine attendees with date range: { "filter": { "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": "created_time", "filter": { "operator": "date_is_on_or_before", "value": { "type": "exact", "value": { "type": "date", "start_date": "2025-01-31" } } } }, { "property": "notion://meeting_notes/attendees", "filter": { "operator": "person_contains", "value": [ { "type": "exact", "value": { "table": "notion_user", "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890" } } ] } } ] } } Example 7: Filter meetings by title content: { "filter": { "operator": "and", "filters": [ { "property": "title", "filter": { "operator": "string_contains", "value": { "type": "exact", "value": "design review" } } } ] } } Example 8: Filter meetings matching any of several title terms (using "or"): { "filter": { "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" } } } ] } }

notion-query-sessions

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

notion-read-session-event

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

notion-restore-pages

ChatGPT
Restore Notion pages or databases from Trash to where they were before they were deleted. Use this when the user asks to undo a deletion or to restore something from Trash. Database rows are pages. Restoring something that is already out of Trash succeeds and changes nothing. To restore a page whose parent is in Trash, restore the parent.

notion-search-agents

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

notion-search-emails

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

notion-search-sessions

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

notion-send-message-to-session

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

notion-set-comment-reaction

ChatGPT
Add or remove your emoji reaction on a comment. Get the comment ID from get_comments or create_comment. Safe to repeat: setting the same state twice changes nothing.

notion-set-discussion-resolved

ChatGPT
Resolve or reopen a comment discussion. Get the discussion ID from get_comments or create_comment. Use this tool only when a human explicitly asks to resolve that discussion. Do not infer resolution from addressing feedback, replying, completing related work, passing checks, or changing task status.

notion-show-advanced-analysis-next-steps

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

notion-spawn-session

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

notion-stop-session

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

notion-update-data-source

ChatGPT
Update a Notion data source's schema, title, or attributes using 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 Same type syntax as create_database. Key types: - SELECT('opt':color, ...) / MULTI_SELECT('opt':color, ...) - NUMBER [FORMAT 'dollar'] / FORMULA('expression') - RELATION('ds_id') / RELATION('ds_id', DUAL) / RELATION('ds_id', DUAL 'synced_name' 'synced_id') - ROLLUP('rel_prop', 'target_prop', 'function') / UNIQUE_ID [PREFIX 'X'] - Simple: TITLE, RICH_TEXT, DATE, PEOPLE, CHECKBOX, URL, EMAIL, PHONE_NUMBER, STATUS, FILES <example description="Add properties">{"data_source_id": "f336d0bc-b841-465b-8045-024475c079dd", "statements": "ADD COLUMN "Priority" SELECT('High':red, 'Medium':yellow, 'Low':green); ADD COLUMN "Due Date" DATE"}</example> <example description="Rename property">{"data_source_id": "f336d0bc-b841-465b-8045-024475c079dd", "statements": "RENAME COLUMN "Status" TO "Project Status""}</example> <example description="Remove property">{"data_source_id": "f336d0bc-b841-465b-8045-024475c079dd", "statements": "DROP COLUMN "Old Property""}</example> <example description="Add self-relation">{"data_source_id": "f336d0bc-b841-465b-8045-024475c079dd", "statements": "ADD COLUMN "Parent" RELATION('f336d0bc-b841-465b-8045-024475c079dd', DUAL 'Children' 'children'); ADD COLUMN "Children" RELATION('f336d0bc-b841-465b-8045-024475c079dd', DUAL 'Parent' 'parent')"}</example> <example description="Update title">{"data_source_id": "f336d0bc-b841-465b-8045-024475c079dd", "title": "Project Tracker 2024"}</example> <example description="Trash data source">{"data_source_id": "f336d0bc-b841-465b-8045-024475c079dd", "in_trash": true}</example> 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.

notion-update-enabled-skills

ChatGPT
Enable or disable Notion Skills for external MCP clients, Notion AI, or both by adding or removing their page URLs. The surfaces option defaults to both and changes only the current user's Skill settings.

notion-update-folder

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

notion-update-page

ChatGPT
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 expanded 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 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 fetch the MCP resource at notion://docs/enhanced-markdown-spec. Do NOT guess or hallucinate Markdown syntax. Use "insert_content" to add content at the beginning or end of a page. If position is omitted, the content is appended to the end of the page. Before using "update_content", use the "fetch" tool first to get the existing content and find the Markdown snippets to use in the "update_content" command's old_str fields. 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:"), 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="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__", "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). <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>

notion-update-view

ChatGPT
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 SORT — remove all sorts - CLEAR GROUP BY — remove grouping See notion://docs/view-dsl-spec resource for full syntax. <example description="Rename">{"view_id": "abc123", "name": "Sprint Board"}</example> <example description="Update filter">{"view_id": "abc123", "configure": "FILTER "Status" = "Done""}</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>

notion-upload-skill

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

notion-view-thread-content

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

notion-wait-session

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

query-data-sources

ChatGPT
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 expand to date:<Name>:start, :end, :is_datetime; created_time keeps its base name. Try a column the error suggests, or fetch the data source again for its current <sqlite-table> names. 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.

query-multiple-data-sources

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

create-comment

Claude

create-database

Claude

create-pages

Claude

duplicate-page

Claude

fetch

Claude

get-comments

Claude

get-self

Claude

get-user

Claude

get-users

Claude

move-pages

Claude

update-database

Claude

update-page

Claude

Capabilities

WritesInteractive

App Stats

82

Tools

ChatGPT, Claude

Platforms

Category

Memory Notes

Works with

ChatGPT
Claude

Data refreshed daily