Notion
Search, read, and edit pages and databases.
MCP server URL
https://notion-mcp.gumstack.com/mcp
Works with
Tools 69
Notion Search
Search Notion pages and databases, or look up a user by name or email. Does not search connected apps; use connector_search, when listed, for sources such as Slack, Google Drive, GitHub, mail, or calendar. When connector_search is listed, call it in parallel with search on the first search for an information need, unless the user names a source, the request is a user lookup, or the request is about Notion pages or databases themselves, such as finding a page to read or edit. Decisions, status updates, and discussions often live in connected sources. Preserve distinctive names and identifiers. Use a non-empty query for content searches. Leave the query empty only when you also send filters or a non-relevance sort, as in the browse example below. Omit optional parameters unless needed. Do not add filters or sorting just to fill in defaults. Business or Enterprise is required for filters.edited_by_user_ids, filters.last_edited_date_range, filters.title_only=true, filters.content_status, more than one distinct teamspace across teamspace_id and filters.teamspace_ids, and sort other than relevance. On other plans, those options are dropped with a notice in the result, and results may be broader. Keep filters nested inside "filters". Use page_size, not limit. For user lookup, set query_type="user" and provide a name or email. A document about a person is a content search, not a user lookup. <example description="Find a page by title"> {"query":"Q3 roadmap"} </example> <example description="Browse pages you edited most recently"> {"query":"","filters":{"edited_by_user_ids":["me"]},"sort":"last_edited"} </example> <example description="Find a user"> {"query":"alex@example.com","query_type":"user"} </example>
Notion Memory Search
Search memories that the user's connected agents saved in earlier sessions: context, preferences, corrections, and decisions. Returns the best matches, not every memory. To list, count, or filter memories, fetch id "memory" and run query-data-sources on its data source. The first time you use memory in a conversation, whether searching or saving, read notion://docs/memory once.
Notion Get Tool Access
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 Fetch
Retrieves details about a Notion entity (page, database, data source, or saved database view) by URL or ID. Provide a URL or ID in `id`. Make multiple calls for multiple entities. For pages, use path, verification, edit time, and truncation metadata to assess the source. Treat recency as context, not proof. Report material uncertainty when sources conflict. Pages use Notion-flavored Markdown. For the complete specification, read the MCP resource `notion://docs/notion-flavored-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 as `id` to read that MCP documentation resource. Databases return data sources in `<data-source url="collection://...">` tags. Fetch the collection:// URL for its schema and use it with update_data_source or query_data_sources. Multi-source databases return more than one data source. Saved views return filters, sorts, and display settings. To query their rows, use query_data_sources with `mode: "view"`. A null cover or icon means none; an omitted one means unavailable, not absent. Keep a page's Markdown icon attribute for edit round trips. File URLs expire; re-fetch to refresh them. Uploaded media blocks use stable `notion-file-block://` sources; keep them when editing or copying Markdown. Get download URLs with get_file_download_urls, or set `include_file_urls` to true for a `references` map. Before relying on page content, check `truncated`, `unknown_block_count`, and `unknown_block_ids` for omitted subtrees. Set `include_discussions` to true for discussion counts, markers, previews, and `discussion://` URLs that correlate with get_comments. Use get_tool_access to check tool availability, parameter restrictions, and upgrade links for this connection.
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 direct, publicly reachable HTTPS file URL. - source_file_id for a file this exact integration already uploaded. When create_file_upload is available, use it for local files so the upload has the same owner. For content and source_url, filename must use a supported extension and content_type must agree with it. Omit content_type to infer it. source_file_id takes neither because the stored upload carries both. For larger files, redirects, or authenticated downloads, upload through the Notion File Upload API with this integration's token and pass source_file_id. The response includes a markdown_source value. To place the uploaded file on a page, pass that source to create-pages or update-page. To attach it to a comment, include suggested_markdown on a separate line in create-comment markdown. Unattached uploads remain temporary and are deleted once they expire: content and source_url open a fresh one-hour window, while source_file_id keeps the window that opened when the file was first uploaded, so place that source promptly and upload the file again if it has already expired. "HTML", "HTML block", "HTML artifact", and "HTML embed" all mean an HTML file placed with <embed source="file-upload://..." /> so Notion renders the sandboxed preview. Never place HTML in a code block or file block. Use <file source="file-upload://..." /> for other files.
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. <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 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. <examples> 1. Download a text attachment: {"file_upload_id":"12345678-90ab-cdef-1234-567890abcdef"} </examples> If availability is not already known for this connection, call get_tool_access with {} before using this tool. Reuse the returned access map across tools; check the status and restricted_parameters.
Notion Get File Download Urls
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 Create Pages
Creates one or more Notion pages with the specified properties and content. ## Core rules **IMPORTANT**: Before writing page content, read the MCP resource `notion://docs/notion-flavored-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. Do not put the page title at the top of content; set it in properties. By default, use native Notion mentions for references you add to existing Notion pages, databases, data sources, people, and dates. Use Markdown links only for external URLs or when the user requests a plain link. For a person, use a user mention with their user URL, found with search using query_type "user"; do not write "@Name" as plain text. For a specific date or time, such as a due date or meeting time, use a date mention. The Markdown specification gives the mention syntax. Use a named destination as parent. Otherwise use "creation_mode": "draft" for a durable private page. Do not combine draft mode with parent, or move or share it without direction. For a meeting note, use create_meeting_note if available, even in a Meetings database, unless the user wants a regular page. For a database destination, ALWAYS fetch first. Use its collection:// URL as data_source_id, exact property names, and title property. Never put a database ID in page_id. Outside a database, the only allowed property is the required "title". For reusable instructions, set "is_skill": true. Before creating 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 pages or drafts as skills. Report any "warnings" in the result to the user.
Notion Update Page
Update a Notion page's properties, content, icon, or cover. For only an icon or cover, use "update_properties" without "properties". ## Core rules **IMPORTANT**: Before writing page content, read the MCP resource `notion://docs/notion-flavored-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. Don't guess Markdown syntax. By default, use native Notion mentions for references you add to existing Notion pages, databases, data sources, people, and dates. Use Markdown links only for external URLs or when the user requests a plain link. For a person, use a user mention with their user URL, found with search using query_type "user"; do not write "@Name" as plain text. For a specific date or time, such as a due date or meeting time, use a date mention. The Markdown specification gives the mention syntax. Before changing content, fetch unless already loaded. Match nearby headings, block types, nesting, lists, tables, and prose style. Make the smallest edit. Use "update_content" for targeted search-and-replace and "insert_content" only to prepend or append. Avoid "replace_content" when a targeted command works. Preserve unrelated wording, structure, order, and native references. Do not broadly rewrite unless asked. For "update_content", use the smallest exact old_str that uniquely matches the target. Ask before removing material content the user did not identify. Don't fetch just to verify an update that completed without warnings. Fetch to resolve warnings, or when a later step needs the page's exact saved state. For "replace_content", preserve child pages and databases with their exact fetched tags. If validation says child content would be deleted, show the list and ask first. Never retry with "allow_deleting_content": true without confirmation. Report any "warnings" in the result.
Notion Delete Pages
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 Delete Databases
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.