# How to connect Notion MCP to Claude

```json
{
  "title": "How to connect Notion MCP to Claude",
  "toolkit": "Notion MCP",
  "toolkit_slug": "notion_mcp",
  "framework": "Claude Cowork",
  "framework_slug": "claude-cowork",
  "url": "https://composio.dev/toolkits/notion_mcp/framework/claude-cowork",
  "markdown_url": "https://composio.dev/toolkits/notion_mcp/framework/claude-cowork.md",
  "updated_at": "2026-09-24T15:43:20.207Z"
}
```

## Introduction

Claude is Anthropic's AI assistant, available on the web, in the desktop app, and on mobile. Cowork is its agent for knowledge work, and it runs on all of those surfaces too. Connected to your apps, Claude can work with your files and services to accomplish complex tasks on your behalf.
This guide walks you through the easiest and most secure way to connect your Notion account to Claude via Composio Connect, enabling it to summarize recent meeting notes in Notion, create a Notion project page from tasks, find overdue tasks across Notion databases, and more such actions on your behalf without compromising your account security.
Setup is the same on Claude Web, Desktop, and Cowork, and you only need to do it once. The connector is tied to your account, so it's available in all three.

## Also integrate Notion MCP with

- [ChatGPT](https://composio.dev/toolkits/notion_mcp/framework/chatgpt)
- [Hermes](https://composio.dev/toolkits/notion_mcp/framework/hermes-agent)
- [Atomic Agent](https://composio.dev/toolkits/notion_mcp/framework/atomic-agent)

## Connect Notion MCP to Claude Cowork

### Connecting Notion to Claude Web, Desktop, and Cowork
Two ways to add the Composio connector. Pick whichever you prefer.
### 1. Add with one click
Click the button. Claude opens with the Composio connector filled in. Click Add, then go to step 2.
[Add to Claude](https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=Composio&connectorUrl=https%3A%2F%2Fconnect.composio.dev%2Fmcp)
### Add manually
In Claude Desktop, click Customize in the left sidebar, then select Connectors and click the + icon at the top.
Click Add custom connector and paste in the Composio MCP server URL:

```bash
https://connect.composio.dev/mcp
```

## What is the Notion MCP server, and what's possible with it?

The Notion MCP server is an implementation of the Model Context Protocol that connects your AI agent and assistants like Claude, Cursor, etc directly to your Notion account. It provides structured and secure access so your agent can perform Notion operations on your behalf.

## Supported Tools

| Tool slug | Name | Description |
|---|---|---|
| `NOTION_MCP_NOTION_CONVERT_PAGE_TO_SKILL` | Notion-convert-page-to-skill | 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. |
| `NOTION_MCP_NOTION_CREATE_ATTACHMENT` | Notion-create-attachment | 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. - source_file_id for a file this integration already uploaded. When create_file_upload is available, use it for local files so the upload is created by this same MCP integration; otherwise use ntn files create or the Notion File Upload API with this integration's token. Nothing is re-sent or re-downloaded. The upload must have a status of uploaded and must have been created by this exact integration; an upload made with a different token is not visible here. For content and source_url, the filename must use a supported extension, and the optional content_type is a MIME type that must agree with the filename; omit it to infer the type from the extension. source_file_id takes neither, because the stored upload already carries both. 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, use create_file_upload when available. For larger files, URLs that redirect, or authenticated downloads requiring headers, 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 so Notion renders the sandboxed preview. Never place HTML in a code block or file block. Use for other files. 1. Create an HTML artifact: {"filename":"report.html","content":"Report"} 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=..."} 4. Reference a file already uploaded by this integration: {"source_file_id":"1e2f3a4b-5c6d-7e8f-9a0b-1c2d3e4f5a6b"} |
| `NOTION_MCP_NOTION_CREATE_COMMENT` | Notion-create-comment | 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 ``. To attach a file created by `create-file-upload` or `create-attachment`, include its returned `suggested_markdown` on a separate line; up to three file attachments are supported. 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. Other 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" {"page_id": "uuid", "markdown": "Comment with **important** context."} {"page_id": "uuid", "selection_with_ellipsis": "# Meeting No...es heading", "markdown": "Comment on this section."} {"page_id": "uuid", "discussion_id": "discussion://pageId/blockId/discussionId", "markdown": "Reply with [context](https://example.com)."} |
| `NOTION_MCP_NOTION_CREATE_DATABASE` | Notion-create-database | 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. Returns Markdown with schema, SQLite definition, and data source ID in tag for use with update_data_source and query_data_sources tools. 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 {"schema": "CREATE TABLE ("Name" TITLE)"} {"database_type": "tasks", "title": "Tasks"} {"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')"} {"title": "Tasks", "schema": "CREATE TABLE ("Name" TITLE, "Parent" RELATION('ds_id', DUAL 'Children' 'children'), "Children" RELATION('ds_id', DUAL 'Parent' 'parent'))"} |
| `NOTION_MCP_NOTION_CREATE_FILE_UPLOAD` | Notion-create-file-upload | 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. 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"} |
| `NOTION_MCP_NOTION_CREATE_FOLDER` | Notion-create-folder | 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_MCP_NOTION_CREATE_PAGES` | Notion-create-pages | ## Overview Creates one or more Notion pages, with the specified properties and content. ## Parent If the user explicitly names a private or shared destination, omit "creation_mode" and create the page under that parent. Otherwise, use "creation_mode": "draft" as the safe default when the user clearly wants a durable page but has not named a destination. Create the draft without first asking where it should live. Draft mode is server-enforced: it creates workspace-level private pages and cannot be combined with "parent". After creation, tell the user the draft is private and offer to move it once they name a destination. Do not move or share it without explicit user direction. 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. When no destination is named, prefer explicit draft mode instead of simply omitting the parent. 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://). 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. 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. ## 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"] - Files properties: Use a JSON array of file IDs, Notion Folder URLs, and/or 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") ## Skills When the user explicitly asks to create reusable instructions or a repeatable workflow, set "is_skill" to true on that page. Before creating or updating a skill, read the MCP resource `notion://docs/skills` through your MCP client's resource-reading interface. If your client does not support reading MCP resources, call the Notion "fetch" tool with this URI instead. Do NOT pass this URI to any other URL-fetching tool. Do not mark ordinary reference pages, one-time documents, or drafts as skills. ## 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 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. - When you set an icon, keep the page title free of a duplicate leading emoji. The icon is rendered separately before the title. ## Examples { "pages": [ { "properties": {"title": "My Page"}, "icon": "🚀", "cover": "https://example.com/cover.jpg" } ] } { "parent": {"data_source_id": "f336d0bc-b841-465b-8045-024475c079dd"}, "pages": [ { "template_id": "a5da15f6-b853-455d-8827-f906fb52db2b", "properties": { "Task Name": "New urgent bug" } } ] } { "creation_mode": "draft", "pages": [ { "properties": {"title": "Page title"}, "content": "# Section 1 {color="blue"} Section 1 content Toggle block Hidden content inside toggle " } ] } { "pages": [ { "properties": {"title": "Prepare a weekly project update"}, "content": "# Outcome Create a concise weekly update from the project source pages. # Instructions 1. Read the linked project pages. 2. Summarize progress, risks, and next steps. 3. Ask when ownership or status is unclear.", "is_skill": true } ] } { "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 } } ] } { "parent": {"page_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"}, "pages": [ { "properties": {"title": "Page title"}, "content": "# Section 1 Section 1 content # Section 2 Section 2 content" } ] } ## 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. |
| `NOTION_MCP_NOTION_CREATE_VIEW` | Notion-create-view | 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 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 (readable via your MCP client's resource-reading interface, or by passing the URI to the Notion "fetch" tool). Key directives: - FILTER "Property" = "value" — filter rows. Relation values must be a page URL or UUID; person values must be a user URI (user://), user UUID, or "me". Names are not supported for either. - 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 {"database_id": "abc123", "data_source_id": "def456", "name": "All Tasks", "type": "table"} {"database_id": "abc123", "data_source_id": "def456", "name": "Task Board", "type": "board", "configure": "GROUP BY "Status""} {"database_id": "abc123", "data_source_id": "def456", "name": "Active", "type": "table", "configure": "FILTER "Status" = "In Progress"; SORT BY "Due Date" ASC"} {"database_id": "abc123", "data_source_id": "def456", "name": "Calendar", "type": "calendar", "configure": "CALENDAR BY "Due Date""} {"database_id": "abc123", "data_source_id": "def456", "name": "Overview", "type": "dashboard"} {"parent_page_id": "ghi789", "data_source_id": "def456", "name": "Company tasks", "type": "table", "configure": "FILTER "Company" = "Acme""} |
| `NOTION_MCP_NOTION_DOWNLOAD_ATTACHMENT` | Notion-download-attachment | 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. 1. Download a text attachment: {"file_upload_id":"12345678-90ab-cdef-1234-567890abcdef"} |
| `NOTION_MCP_NOTION_DUPLICATE_PAGE` | Notion-duplicate-page | 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_MCP_NOTION_FETCH` | Notion-fetch | 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. 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. 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 `` 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 `` 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. {"id": "https://notion.so/workspace/Page-a1b2c3d4e5f67890"} {"id": "12345678-90ab-cdef-1234-567890abcdef"} {"id": "https://myspace.notion.site/Page-Title-abc123def456"} {"id": "page-uuid", "include_discussions": true} {"id": "collection://12345678-90ab-cdef-1234-567890abcdef"} {"id": "view://12345678-90ab-cdef-1234-567890abcdef"} {"id": "self"} {"id": "notion://docs/enhanced-markdown-spec"} |
| `NOTION_MCP_NOTION_GET_ASYNC_TASK` | Notion-get-async-task | 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. 1. Check a task's status: {"task_id": "task_abc123"} |
| `NOTION_MCP_NOTION_GET_COMMENTS` | Notion-get-comments | 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 {"page_id": "page-uuid"} {"page_id": "page-uuid", "include_all_blocks": true} {"page_id": "page-uuid", "discussion_id": "discussion://pageId/blockId/discussionId"} |
| `NOTION_MCP_NOTION_GET_SESSION_STATUS` | Notion-get-session-status | Get the latest turn's status for a Custom Agent session without waiting. |
| `NOTION_MCP_NOTION_GET_TEAMS` | Notion-get-teams | 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. 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"} |
| `NOTION_MCP_NOTION_GET_USERS` | Notion-get-users | 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. 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"} |
| `NOTION_MCP_NOTION_LIST_FAVORITE_PAGES` | Notion-list-favorite-pages | 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_MCP_NOTION_LIST_PRIVATE_PAGES` | Notion-list-private-pages | List the current user's top-level pages and databases in their Private sidebar section. Use this to browse private workspace structure; use search when looking for content by meaning or keyword. Follow cursor pagination when the complete list is needed. |
| `NOTION_MCP_NOTION_LIST_RECENT_PAGES` | Notion-list-recent-pages | 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. |
| `NOTION_MCP_NOTION_LIST_SESSION_EVENTS` | Notion-list-session-events | List short summaries of saved events in a Custom Agent session. |
| `NOTION_MCP_NOTION_LIST_SHARED_PAGES` | Notion-list-shared-pages | List pages and databases in the current user's Shared sidebar section. Use this to browse content shared directly with the user; use search when looking for content by meaning or keyword. Follow cursor pagination when the complete list is needed. |
| `NOTION_MCP_NOTION_MOVE_PAGES` | Notion-move-pages | Move one or more Notion pages or databases to a new parent. |
| `NOTION_MCP_NOTION_QUERY_DATA_SOURCES` | Notion-query-data-sources | Query data from Notion databases using SQL or by specifying a view. This is the canonical replacement for the deprecated query_database_view tool. By default, uses SQL mode to execute SQLite queries against one or more data sources. Alternatively, use view mode to execute a database view's existing filters and sorts. Pass the same view_url previously used with query_database_view. Archive selection is supported in view mode only. SQL mode does not accept "is_archived"; SQL archive support is a separate infrastructure follow-up. Limits: View mode is available without a tool-specific quota on every plan. SQL is unlimited on Business and Enterprise plans with Notion AI. Other plans have a shared workspace usage limit for single-data-source queries and cannot query multiple data sources at once. Prerequisites: 1. Use the "fetch" tool first to get database schema and data source URLs 2. Data source URLs are found in tags in fetch results SQL mode (default): Execute custom SQLite queries against 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. 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: { "data": { "mode": "view", "view_url": "https://www.notion.so/workspace/Tasks-DB-abc123?v=def456", "is_archived": false } } 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_MCP_NOTION_QUERY_MEETING_NOTES` | Notion-query-meeting-notes | 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 - "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: } - 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": "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": "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_MCP_NOTION_QUERY_SESSIONS` | Notion-query-sessions | List agent sessions available to the integration. Filter, sort, or search by title. |
| `NOTION_MCP_NOTION_READ_SESSION_EVENT` | Notion-read-session-event | Read the full visible content of one saved Custom Agent session event. |
| `NOTION_MCP_NOTION_SEARCH` | Notion-search | Search the user's Notion workspace and connected sources (Slack, Google Drive, GitHub, Jira, Teams, SharePoint, OneDrive, Linear) and return a ranked list of results to read. Two query types: - "internal" (default): content across Notion and connected sources. - "user": find people by name or email. When to use this vs. get-answer: - Use search when you want results to read, filter, cite, or fetch in full, or when you'll synthesize across sources yourself. - Use get-answer when you just want one synthesized answer and don't need the underlying pages. If its answer isn't good enough, come back to search for the full results. How to search well: - One question or topic per call. Make separate calls for separate needs. - If the question names a person, timeframe, teamspace, or database, pass the matching filter. Otherwise omit filters for the broadest recall. - Date filter values use the YYYY-MM-DD calendar-date format. - Keep responses small: set page_size (default 10, max 50) and max_highlight_length (default 200; 0 to omit) as low as you can. - After finding a Notion result, call fetch with its "id" for full contents. The backend is auto-selected: AI search when the user has Notion AI and connectors, otherwise faster workspace-only search. Use content_search_mode only when you specifically need one or the other. Exact filters, empty-query filter searches, and non-relevance sorts use workspace search; they cannot be combined with content_search_mode "ai_search". Edited-by and last-edited filters, searches across multiple teamspaces, title-only search, content-status filters, and non-relevance sorting are available with full Notion MCP on Business and Enterprise plans. If they are unavailable, retry with the query and any creator, created-date, or single location filters that still help. To search within a database: fetch the database first to get its data source URL (collection://...) from tags, then pass that as data_source_url. For multi-source databases, match by view ID (?v=...) or search each source. Don't combine a database URL or ID with the collection:// prefix, and don't use a database URL as page_url. { "query": "quarterly revenue report", "query_type": "internal", "filters": { "created_date_range": { "start_date": "2024-01-01", "end_date": "2025-01-01" } } } {"query": "project updates", "query_type": "internal", "teamspace_id": "f336d0bc-b841-465b-8045-024475c079dd", "filters": {"created_by_user_ids": ["a1b2c3d4-e5f6-7890-abcd-ef1234567890"]}} {"query": "design review", "data_source_url": "collection://f336d0bc-b841-465b-8045-024475c079dd", "filters": {"created_date_range": {"start_date": "2024-10-01"}, "created_by_user_ids": ["a1b2c3d4-e5f6-7890-abcd-ef1234567890", "b2c3d4e5-f6a7-8901-bcde-f12345678901"]}} {"query": "john@example.com", "query_type": "user"} |
| `NOTION_MCP_NOTION_SEARCH_AGENTS` | Notion-search-agents | Search agents by name or description, or browse the current user's favorite agents and the workspace's newest agents. Use this instead of list_agents when personal favorites or relevance-ranked search are needed. |
| `NOTION_MCP_NOTION_SEARCH_SESSIONS` | Notion-search-sessions | 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. |
| `NOTION_MCP_NOTION_SEND_MESSAGE_TO_SESSION` | Notion-send-message-to-session | Send a follow-up message to a Custom Agent session you can access. |
| `NOTION_MCP_NOTION_SPAWN_SESSION` | Notion-spawn-session | Start a session with a published Custom Agent. Use get_session_status or wait_session to check its progress. |
| `NOTION_MCP_NOTION_STOP_SESSION` | Notion-stop-session | Stop a running Custom Agent session you can access. |
| `NOTION_MCP_NOTION_UPDATE_DATA_SOURCE` | Notion-update-data-source | 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 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" - add a new property - DROP COLUMN "Name" - remove a property - RENAME COLUMN "Old" TO "New" - rename a property - ALTER COLUMN "Name" SET - 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 {"data_source_id": "f336d0bc-b841-465b-8045-024475c079dd", "statements": "ADD COLUMN "Priority" SELECT('High':red, 'Medium':yellow, 'Low':green); ADD COLUMN "Due Date" DATE"} {"data_source_id": "f336d0bc-b841-465b-8045-024475c079dd", "statements": "RENAME COLUMN "Status" TO "Project Status""} {"data_source_id": "f336d0bc-b841-465b-8045-024475c079dd", "statements": "DROP COLUMN "Old Property""} {"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')"} {"data_source_id": "f336d0bc-b841-465b-8045-024475c079dd", "title": "Project Tracker 2024"} {"data_source_id": "f336d0bc-b841-465b-8045-024475c079dd", "in_trash": true} 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 tags. |
| `NOTION_MCP_NOTION_UPDATE_FOLDER` | Notion-update-folder | 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_MCP_NOTION_UPDATE_PAGE` | Notion-update-page | ## 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"] - Files properties: Use a JSON array of file IDs, Notion Folder URLs, and/or 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 `` or `` 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. - When you set an icon, keep the page title free of a duplicate leading emoji. The icon is rendered separately before the title. ## Skills For skill creation or updates: Before creating or updating a skill, read the MCP resource `notion://docs/skills` through your MCP client's resource-reading interface. If your client does not support reading MCP resources, call the Notion "fetch" tool with this URI instead. Do NOT pass this URI to any other URL-fetching tool. 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`. ## Examples { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "update_properties", "properties": {"title": "My Page"}, "icon": "🚀", "cover": "https://example.com/cover.jpg" } { "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 } } { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "replace_content", "new_str": "# New Section Updated content goes here" } { "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" } ] } { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "insert_content", "content": "## Latest update Status update goes here", "position": { "type": "start" } } { "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" } ] } { "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" } ] } ## 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 section in the fetch tool results for a database, or use any page ID as a template. { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "apply_template", "template_id": "a5da15f6-b853-455d-8827-f906fb52db2b" } ## 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. { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "update_verification", "verification_status": "verified", "verification_expiry_days": 90 } { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "update_verification", "verification_status": "verified" } { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "update_verification", "verification_status": "unverified" } |
| `NOTION_MCP_NOTION_UPDATE_VIEW` | Notion-update-view | 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 (readable via your MCP client's resource-reading interface, or by passing the URI to the Notion "fetch" tool). {"view_id": "abc123", "name": "Sprint Board"} {"view_id": "abc123", "configure": "FILTER "Status" = "Done""} {"view_id": "abc123", "configure": "CLEAR FILTER; SORT BY "Created" DESC"} {"view_id": "abc123", "configure": "GROUP BY "Priority"; SHOW "Name", "Status""} |
| `NOTION_MCP_NOTION_WAIT_SESSION` | Notion-wait-session | Wait for the latest turn in a Custom Agent session to stop running. |

## Supported Triggers

None listed.

## Troubleshooting

### 1. Why does Claude not use the Composio connector for Notion?

The connector can show as connected, but Claude must use it in each Notion conversation.
- Click + at the lower left of the chat, or type /.
- Hover Connectors.
- Turn on Composio.
- Ask Claude to connect to Notion again.

### 2. Why does Claude show an MCP server error before Notion connects?

Claude can show Couldn't reach the MCP server or Authorization with the MCP server failed when you add the connector for Notion.
- Check that the connector URL is https://connect.composio.dev/mcp.
- Connectors run from Anthropic's cloud, so your device network is usually not the problem.
- Add the connector again from Customize > Connectors, then ask Claude to connect Notion.
- If it fails again, send the error and the ofid_ reference id to support@composio.dev.

### 3. Why does the Notion authorization link not work?

The Composio connector is one server. Your Notion account connects separately when Claude asks for it.
- If the browser does not open, or the link expires, ask Claude to retry the Notion connection.
- Composio creates a fresh Notion authorization link.
- Open that link in your browser and finish the Notion sign-in.

### 4. Why do Notion actions fail after they worked before?

The Notion connection can expire or lose permission.
- Ask Claude to inspect the Notion connection.
- If the connection is unhealthy, disconnect it when Claude prompts you.
- Reconnect the Notion account and retry the action.
- If Claude shows a permission prompt, approve it before Claude changes data in Notion.
- If the action still fails with a permission error, check that the connected account has that permission in Notion itself.

### 5. How do I switch to a different Notion account?

Claude can manage the Notion connection for you.
- Ask Claude to disconnect or delete the current Notion account.
- Ask Claude to connect Notion again.
- Open the new Composio authorization link for Notion.
- Sign in with the other Notion account in the browser.
- After the account connects, ask Claude to retry the Notion task.

### 6. Why is my Notion connection missing in Claude Desktop or on a Team plan?

The connector belongs to your Claude account, so your Notion connection works in Claude Web, Desktop, and Cowork.
- In Claude Desktop, open Customize > Connectors.
- Next to Composio, click ⋮ and click Clear cache.
- If Notion tools still do not appear, click ⋮, disconnect, remove the connector, and add it again.
- On Team or Enterprise, an Owner or Primary Owner must enable the connector before you can connect Notion.

## Creating MCP Server - Stand-alone vs Composio SDK

The Notion MCP server connects Claude Web, Desktop, and Cowork to your Notion account through Composio. Once connected, Claude can use the available Notion tools and triggers to complete tasks on your behalf.

## Complete Code

None listed.

## How to build Notion MCP Agent with another framework

- [ChatGPT](https://composio.dev/toolkits/notion_mcp/framework/chatgpt)
- [Hermes](https://composio.dev/toolkits/notion_mcp/framework/hermes-agent)
- [Atomic Agent](https://composio.dev/toolkits/notion_mcp/framework/atomic-agent)

## Related Toolkits

- [Google Sheets](https://composio.dev/toolkits/googlesheets) - Google Sheets is a cloud-based spreadsheet tool for real-time collaboration and data analysis. It lets teams work together from anywhere, updating information instantly.
- [Notion](https://composio.dev/toolkits/notion) - Notion is a collaborative workspace for notes, docs, wikis, and tasks. It streamlines team knowledge, project tracking, and workflow customization in one place.
- [Airtable](https://composio.dev/toolkits/airtable) - Airtable combines the flexibility of spreadsheets with the power of a database for easy project and data management. Teams use Airtable to organize, track, and collaborate with custom views and automations.
- [Asana](https://composio.dev/toolkits/asana) - Asana is a collaborative work management platform for teams to organize and track projects. It streamlines teamwork, boosts productivity, and keeps everyone aligned on goals.
- [Google Tasks](https://composio.dev/toolkits/googletasks) - Google Tasks is a to-do list and task management tool integrated into Gmail and Google Calendar. It helps you organize, track, and complete tasks across your Google ecosystem.
- [Linear](https://composio.dev/toolkits/linear) - Linear is a modern issue tracking and project planning tool for fast-moving teams. It helps streamline workflows, organize projects, and boost productivity.
- [Jira](https://composio.dev/toolkits/jira) - Jira is Atlassian’s platform for bug tracking, issue tracking, and agile project management. It helps teams organize work, prioritize tasks, and deliver projects efficiently.
- [Clickup](https://composio.dev/toolkits/clickup) - ClickUp is an all-in-one productivity platform for managing tasks, docs, goals, and team collaboration. It streamlines project workflows so teams can work smarter and stay organized in one place.
- [Monday](https://composio.dev/toolkits/monday) - Monday.com is a customizable work management platform for project planning and collaboration. It helps teams organize tasks, automate workflows, and track progress in real time.
- [Addressfinder](https://composio.dev/toolkits/addressfinder) - Addressfinder is a data quality platform for verifying addresses, emails, and phone numbers. It helps you ensure accurate customer and contact data every time.
- [Agiled](https://composio.dev/toolkits/agiled) - Agiled is an all-in-one business management platform for CRM, projects, and finance. It helps you streamline workflows, consolidate client data, and manage business processes in one place.
- [AirOps MCP](https://composio.dev/toolkits/airops_mcp) - AirOps MCP is AirOps' managed content platform exposing brand context, knowledge bases, and workflows. Use it to give agents brand-aware content, automate content workflows, and track Brand Kit edits.
- [Amazing Marvin](https://composio.dev/toolkits/amazing_marvin) - Amazing Marvin is a personal productivity app for tasks, projects, habits, planning, time tracking, and rewards. It helps you build a flexible workflow that matches how you actually work.
- [AnyDB](https://composio.dev/toolkits/any_db) - AnyDB is a flexible collaborative database platform for organizing records, files, and automated workflows. It helps teams centralize data, collaborate on records, and automate routine tasks.
- [ApptiveGrid](https://composio.dev/toolkits/apptivegrid) - ApptiveGrid is a collaborative no-code database and app platform for spaces, grids, forms, and structured records. It helps teams organize operational data, collect inputs, and build lightweight business apps without custom backend work.
- [Ascora](https://composio.dev/toolkits/ascora) - Ascora is a cloud-based field service management platform for service businesses. It streamlines scheduling, invoicing, and customer operations in one place.
- [Atlassian MCP](https://composio.dev/toolkits/atlassian_mcp) - Atlassian Rovo MCP connects agents to Jira, Jira Service Management, Confluence, Bitbucket, Compass, and Teamwork Graph workflows. It lets teams surface and act on Atlassian data while respecting existing user permissions.
- [Basecamp](https://composio.dev/toolkits/basecamp) - Basecamp is a project management and team collaboration tool by 37signals. It helps teams organize tasks, share files, and communicate efficiently in one place.
- [Beeminder](https://composio.dev/toolkits/beeminder) - Beeminder is an online goal-tracking platform that uses monetary pledges to keep you motivated. Stay accountable and hit your targets with real financial incentives.
- [Boxhero](https://composio.dev/toolkits/boxhero) - Boxhero is a cloud-based inventory management platform for SMBs, offering real-time updates, barcode scanning, and team collaboration. It helps businesses streamline stock tracking and analytics for smarter inventory decisions.

## Frequently Asked Questions

### What are the differences in Tool Router MCP and Notion MCP?

With a standalone Notion MCP server, the agents and LLMs can only access a fixed set of Notion tools tied to that server. However, with the Composio Tool Router, agents can dynamically load tools from Notion and many other apps based on the task at hand, all through a single MCP endpoint.

### Can I use Tool Router MCP with Claude Cowork?

Yes, you can. Claude Cowork fully supports MCP integration. You get structured tool calling, message history handling, and model orchestration while Tool Router takes care of discovering and serving the right Notion tools.

### Can I manage the permissions and scopes for Notion while using Tool Router?

Yes, absolutely. You can configure which Notion scopes and actions are allowed when connecting your account to Composio. You can also bring your own OAuth credentials or API configuration so you keep full control over what the agent can do.

### How safe is my data with Composio Tool Router?

All sensitive data such as tokens, keys, and configuration is fully encrypted at rest and in transit. Composio is SOC 2 Type 2 compliant and follows strict security practices so your Notion data and credentials are handled as safely as possible.

---
[See all toolkits](https://composio.dev/toolkits) · [Composio docs](https://docs.composio.dev/llms.txt)
