The Notion MCP connector routes your AI agent's tool calls to Notion's own MCP server through Scalekit. Each user signs in to Notion once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 28 tools.
- Tools
- 28
- What they doRead · write · destructive
- 14 · 12 · 214 read12 write2 destructive
- Users sign in with
- OAuth
- OAuth app
- Scalekit's or your own
What you can do
- Search and fetch content: search the workspace and connected sources, and retrieve pages, databases, and data sources
- Create and edit pages: create pages with Markdown content, update properties and content, duplicate, and move pages
- Query databases: query databases with SQL or saved views, including the user’s meeting notes
- Manage databases and views: create databases, update their schema, and create or update filtered, sorted views
- Comment on pages: add comments to pages and discussion threads, and read existing discussions
- Browse the workspace: list recent, favorite, private, and shared pages, plus users and teamspaces
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet your credentials
Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret>Create the Notion MCP connection
In AgentKit > Connections, create a Notion MCP connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Scalekit credentials are available for Notion, so you don't need to register an OAuth app.
Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'notionmcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Notion MCP:', link)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'notionmcp_notion-get-teams',toolInput: {},})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "notionmcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Notion MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="notionmcp_notion-get-teams",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user signs in once. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolnotionmcp_notion-download-attachmentDownload the contents of a small UTF-8 text attachment created by the Notion create-attachment tool.Read-onlyNotion Download Attachment
Download the contents of a small UTF-8 text attachment created by the Notion create-attachment tool. Limited to 200 KiB and text formats such as HTML, Markdown, plain text, CSV, JSON, XML, CSS, YAML, TSV, calendar, GPX, or SVG.
Inputs
file_upload_idstringrequired- The FileUpload ID returned by the create-attachment tool. Example: "12345678-90ab-cdef-1234-567890abcdef".
notionmcp_notion-fetchRetrieve details about a Notion page, database, or data source by URL or ID.Read-onlyNotion Fetch
Retrieve details about a Notion page, database, or data source by URL or ID.
Inputs
idstringrequired- The ID or URL of the Notion page, database, or data source to fetch. Supports notion.so URLs, Notion Sites URLs (*.notion.site), raw UUIDs, and data source URLs (collection://...).
include_discussionsboolean- Set to true to include discussion threads in the response.
include_transcriptboolean- Set to true to include a meeting transcript in the response.
notionmcp_notion-get-async-taskRetrieve the current status of an async task started by another tool (for example, create-pages or update-page called with allow_async: true).Read-onlyNotion Get Async Task
Retrieve the current status of an async task started by another tool (for example, create-pages or update-page called with allow_async: true). Status is one of queued, running, retrying, succeeded, or failed.
Inputs
task_idstringrequired- The ID of the async task to retrieve, as returned in the async_task response of the tool that started it. Example: "task_abc123".
notionmcp_notion-get-commentsRetrieve comments and discussion threads from a Notion page.Read-onlyNotion Get Comments
Retrieve comments and discussion threads from a Notion page.
Inputs
page_idstringrequired- Identifier for a Notion page.
discussion_idstring- Fetch a specific discussion by ID or discussion URL (e.g., discussion://pageId/blockId/discussionId).
include_all_blocksboolean- Set to true to return all comment blocks, not just the first.
include_resolvedboolean- Set to true to include resolved discussions in the response.
notionmcp_notion-get-teamsRetrieve a list of teams (teamspaces) in the current workspace.Read-onlyNotion Get Teams
Retrieve a list of teams (teamspaces) in the current workspace.
Inputs
querystring- Optional search query to filter teams by name (case-insensitive).
notionmcp_notion-get-usersRetrieve a list of users in the current Notion workspace.Read-onlyNotion Get Users
Retrieve a list of users in the current Notion workspace.
Inputs
page_sizeinteger- Number of users to return per page (default: 100, max: 100).
querystring- Optional search query to filter users by name or email (case-insensitive).
start_cursorstring- Cursor for pagination. Use the next_cursor value from the previous response to get the next page.
user_idstring- Return only the user matching this ID. Pass "self" to fetch the current user.
notionmcp_notion-list-favorite-pagesList the current user's favorite pages and databases in sidebar order.Read-onlyNotion 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.
Inputs
cursorstring- Opaque pagination cursor from the previous response. Example: "eyJpZCI6IjEwMDI1In0=".
limitnumber- Maximum results to return (1-200). Example: 25.
notionmcp_notion-list-private-pagesList the current user's top-level pages and databases in their Private sidebar section.Read-onlyNotion 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.
Inputs
cursorstring- Opaque pagination cursor from the previous response. Example: "eyJpZCI6IjEwMDI1In0=".
limitnumber- Maximum results to return (1-200). Example: 25.
notionmcp_notion-list-recent-pagesList pages and databases the current user recently viewed, ranked by recency and visit frequency.Read-onlyNotion 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.
Inputs
cursorstring- Opaque pagination cursor from the previous response. Example: "eyJpZCI6IjEwMDI1In0=".
limitnumber- Maximum results to return (1-200). Example: 25.
notionmcp_notion-query-data-sourcesQuery Notion databases using SQL or by specifying a view.Read-onlyNotion Query Data Sources
Query Notion databases using SQL or by specifying a view.
Inputs
datastringrequired- The data required for querying data sources
notionmcp_notion-query-meeting-notesQuery the current user's Notion meeting notes data source with optional filters.Read-onlyNotion Query Meeting Notes
Query the current user's Notion meeting notes data source with optional filters.
Inputs
filterobject- Acceptable filter for querying current user's meeting notes data source.
notionmcp_notion-searchSearch pages, databases, and connected sources in the Notion workspace.Read-onlyNotion Search
Search pages, databases, and connected sources in the Notion workspace.
Inputs
querystringrequired- Semantic search query over your entire Notion workspace and connected sources (Slack, Google Drive, Github, Jira, Microsoft Teams, Sharepoint, OneDrive, or Linear). For best results, don't provide more than one question per tool call. Use a separate "search" tool call for each search you want to perform. Alternatively, the query can be a substring or keyword to find users by matching against their name or email address. For example: "john" or "john@example.com"
content_search_modestring- How to search within page content. Accepted values: keyword, semantic.one of
workspace_searchai_search data_source_urlstring- Optionally, provide the URL of a Data source to search. This will perform a semantic search over the pages in the Data Source. Note: must be a Data Source, not a Database. <data-source> tags are part of the Notion flavored Markdown format returned by tools like fetch. The full spec is available in the create-pages tool description.
filtersobject- Optionally provide filters to apply to the search results. Only valid when query_type is 'internal'.
max_highlight_lengthinteger- Maximum character length for result highlights (default 200). Set to 0 to omit highlights entirely.
page_sizeinteger- Maximum number of results to return (default 10). Lower values reduce response size.
page_urlstring- Optionally, provide the URL or ID of a page to search within. This will perform a semantic search over the content within and under the specified page. Accepts either a full page URL (e.g. https://notion.so/workspace/Page-Title-1234567890) or just the page ID (UUIDv4) with or without dashes.
query_typestring- The search mode. Accepted values: semantic, keyword.one of
internaluser teamspace_idstring- Optionally, provide the ID of a teamspace to restrict search results to. This will perform a search over content within the specified teamspace only. Accepts the teamspace ID (UUIDv4) with or without dashes.
notionmcp_notion-search-agentsSearch agents by name or description, or browse the current user's favorite agents and the workspace's newest agents.Read-onlyNotion Search Agents
Search agents by name or description, or browse the current user's favorite agents and the workspace's newest agents.
Inputs
scopestringrequired- Which agents to list: "favorites" for the current user's favorite agents, or "workspace" for agents shared with the workspace.one of
favoritesworkspace cursorstring- Opaque pagination cursor from the previous response. Example: "eyJpZCI6IjEwMDI1In0=".
limitnumber- Maximum results to return (1-200). Example: 25.
querystring- Search text matched against agent names and descriptions. When omitted, favorites are returned in sidebar order and workspace agents are returned newest first.
notionmcp_notion-convert-page-to-skillMark a Notion page as an AI skill.WriteNotion Convert Page To Skill
Mark a Notion page as an AI skill. The page must be in the current workspace, and the authenticated user must have permission to edit it.
- Idempotent
Inputs
page_urlstringrequired- The full Notion URL of the page to mark as an AI skill. Example: https://www.notion.so/workspace/My-Page-1234567890abcdef1234567890abcdef
notionmcp_notion-create-attachmentCreate an attachment and upload it to Notion.WriteNotion Create Attachment
Create an attachment and upload it to Notion. Provide exactly one of content (small UTF-8 text), source_url (a direct publicly reachable HTTPS URL), or source_file_id (a file already uploaded by this integration).
Inputs
contentstring- The complete UTF-8 text content of the file. Maximum 200 KiB after UTF-8 encoding. Requires filename. Example: "Hello world".
content_typestring- Optional MIME type, such as text/html or application/pdf. It must match the filename extension; omit it to infer the type from the filename. Omit it with source_file_id.
filenamestring- The filename to create in Notion, including a supported extension such as .html, .md, .pdf, or .png. Required with content and source_url. Omit it with source_file_id.
source_file_idstring- The ID of a file upload this exact integration already created, using create-file-upload or the Notion File Upload API with this integration's token. Its status must be uploaded. Example: "12345678-90ab-cdef-1234-567890abcdef".
source_urlstring- A direct, publicly reachable HTTPS URL from which Notion can download the file within one minute. Redirects, private network addresses, custom request headers, and cookies are not supported. Requires filename.
notionmcp_notion-create-commentAdd a comment to a Notion page or inline discussion thread.WriteNotion Create Comment
Add a comment to a Notion page or inline discussion thread.
Inputs
page_idstringrequired- The ID of the page to comment on (with or without dashes).
discussion_idstring- The ID or URL of an existing discussion to reply to (e.g., discussion://pageId/blockId/discussionId).
markdownstring- The content of the comment as a Markdown string. Provide exactly one of markdown or rich_text. For exact syntax, read the MCP resource notion://docs/enhanced-markdown-spec through your MCP client's resource-reading interface. Do not pass this URI to the Notion fetch tool or any URL-fetching tool, 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 fenced code blocks, headings, lists, tables, and blockquotes is stored as plain comment text rather than rendered as blocks.
rich_textarray- An array of rich text objects that represent the content of the comment. Provide exactly one of rich_text or markdown.
selection_with_ellipsisstring- Unique start and end snippet of the content to comment on. DO NOT provide the entire string. Instead, provide up to the first ~10 characters, an ellipsis, and then up to the last ~10 characters. Make sure you provide enough of the start and end snippet to uniquely identify the content. For example: "# Section heading...last paragraph."
notionmcp_notion-create-databaseCreate a new Notion database using a SQL DDL schema definition.WriteNotion Create Database
Create a new Notion database using a SQL DDL schema definition.
Inputs
database_typestring- Create a typed database with Notion's canonical required properties and metadata instead of a custom SQL schema. Supported values: tasks, projects, skills. Cannot be combined with schema. Example: "tasks".one of
tasksprojectsskills descriptionstring- The description of the new database.
parentobject- The parent under which to create the new database. If omitted, the database will be created as a private page at the workspace level.
schemastring- SQL DDL CREATE TABLE statement defining the database schema. Column names must be double-quoted, type options use single quotes. Cannot be combined with database_type.
titlestring- The title of the new database.
notionmcp_notion-create-file-uploadCreate a short-lived URL for uploading one local file directly to Notion.WriteNotion Create File Upload
Create a short-lived URL for uploading one local file directly to Notion. After calling this, send a multipart/form-data POST to the returned upload_url with the file and headers.
Inputs
filenamestringrequired- The filename to create in Notion, including a supported extension such as .pdf, .png, or .zip. Example: "diagram.png".
content_typestring- Optional MIME type, such as application/pdf or image/png. Prefer omitting it so the type is inferred from the filename.
notionmcp_notion-create-folderCreate an empty Notion Folder under a page or another Folder.WriteNotion Create Folder
Create an empty Notion Folder under a page or another Folder. This tool creates only the empty Folder; it is non-idempotent and creates a new Folder on every successful call.
Inputs
parentstringrequired- Where to create the Folder. Provide either a page_id (top-level Folder owned by a page) or a folder_id (nested Folder inside another Folder).
titlestring- The title of the new Folder. Example: "Design Assets".
notionmcp_notion-create-pagesCreate one or more Notion pages with properties and Markdown content.WriteNotion Create Pages
Create one or more Notion pages with properties and Markdown content.
Inputs
pagesarrayrequired- The pages to create.
allow_asyncboolean- Set to true to opt into receiving an async_task result when this create operation is accepted for background execution instead of completing synchronously. Poll the returned task_id with the get-async-task tool. If omitted or false, the tool keeps the existing synchronous result shape. Example: true.
parentstring- The parent under which the new pages will be created. This can be a page (page_id), a database page (database_id), or a data source/collection under a database (data_source_id). If omitted, the new pages will be created as private pages at the workspace level. Use data_source_id when you have a collection:// URL from the fetch tool.
notionmcp_notion-create-viewCreate a new view on a Notion database with optional filters and sorts.WriteNotion Create View
Create a new view on a Notion database with optional filters and sorts.
Inputs
data_source_idstringrequired- The data source (collection) ID. Accepts a collection:// URI from <data-source> tags or a bare UUID.
namestringrequired- The name of the view.
typestringrequired- The view type. Accepted values: table, board, calendar, gallery, list, timeline.one of
tableboardlistcalendartimelinegalleryformchartmapdashboard configurestring- View configuration DSL string. Supports FILTER, SORT BY, GROUP BY, CALENDAR BY, TIMELINE BY, MAP BY, CHART, FORM, SHOW, HIDE, COVER, WRAP CELLS, and FREEZE COLUMNS directives. See notion://docs/view-dsl-spec.
database_idstring- The database to add a view tab to. Accepts a Notion URL or a bare UUID. Mutually exclusive with `parent_page_id`; exactly one must be provided.
parent_page_idstring- A page to create an inline linked database view on. Accepts a Notion URL or a bare UUID. The new linked view block is appended at the end of the page and references `data_source_id`. Mutually exclusive with `database_id`; exactly one must be provided.
notionmcp_notion-duplicate-pageDuplicate an existing Notion page within the current workspace.WriteNotion Duplicate Page
Duplicate an existing Notion page within the current workspace.
Inputs
page_idstringrequired- The ID of the page to duplicate. This is a v4 UUID, with or without dashes, and can be parsed from a Notion page URL.
notionmcp_notion-move-pagesMove one or more Notion pages or databases to a new parent.WriteNotion Move Pages
Move one or more Notion pages or databases to a new parent.
- Idempotent
Inputs
new_parentstringrequired- The new parent under which the pages will be moved. This can be a page, the workspace, a database, or a specific data source under a database when there are multiple. Moving pages to the workspace level adds them as private pages and should rarely be used.
page_or_database_idsarrayrequired- An array of up to 100 page or database IDs to move. IDs are v4 UUIDs and can be supplied with or without dashes (e.g. extracted from a <page> or <database> URL given by the "search" or "fetch" tool). Data Sources under Databases can't be moved individually.
notionmcp_notion-update-folderUpdate an existing Notion Folder: add uploaded files, remove files by their exact fetched URLs, or add a new nested subfolder.WriteNotion Update Folder
Update an existing Notion Folder: add uploaded files, remove files by their exact fetched URLs, or add a new nested subfolder. Use exactly one command shape at a time.
Inputs
commandstringrequired- The Folder update to apply. Accepted values: add_files, remove_files, add_subfolder.one of
add_filesremove_filesadd_subfolder folder_idstringrequired- The ID of the Folder to update, with or without dashes.
file_upload_idsarray- Required for add_files. One or more file upload IDs returned by the file upload tools.
file_urlsarray- Required for remove_files. The exact file URLs shown in the Folder's latest fetch output.
titlestring- Required for add_subfolder. The new Folder's title.
notionmcp_notion-update-viewUpdate a Notion database view's name, filters, sorts, or display configuration.WriteNotion Update View
Update a Notion database view's name, filters, sorts, or display configuration.
Inputs
view_idstringrequired- The view to update. Accepts a view:// URI, a Notion URL with ?v= parameter, or a bare UUID.
configurestring- View configuration DSL string. Supports FILTER, SORT BY, GROUP BY, CALENDAR BY, TIMELINE BY, MAP BY, CHART, FORM, SHOW, HIDE, COVER, WRAP CELLS, FREEZE COLUMNS, and CLEAR directives.
namestring- New name for the view.
notionmcp_notion-update-data-sourceUpdate a Notion data source's schema, title, or attributes using SQL DDL statements.DestructiveNotion Update Data Source
Update a Notion data source's schema, title, or attributes using SQL DDL statements.
Inputs
data_source_idstringrequired- The data source to update. Accepts a collection:// URI from <data-source> tags, a bare UUID, or a database ID (only if the database has a single data source).
descriptionstring- The new description of the data source.
in_trashboolean- Set to true to move the data source to the trash.
is_inlineboolean- Set to true to make the database display inline within a page.
statementsstring- Semicolon-separated SQL DDL statements to update the schema. Supports ADD COLUMN, DROP COLUMN, RENAME COLUMN, ALTER COLUMN SET.
titlestring- The new title of the data source.
notionmcp_notion-update-pageUpdate a Notion page's properties, content, icon, cover, or verification status.DestructiveNotion Update Page
Update a Notion page's properties, content, icon, cover, or verification status.
Inputs
commandstringrequired- The update operation to perform. Accepted values: update_properties, update_content, replace_content, insert_content, apply_template, update_verification.one of
update_propertiesupdate_contentreplace_contentinsert_contentapply_templateupdate_verification page_idstringrequired- The ID of the page to update, with or without dashes.
allow_asyncboolean- Set to true to opt into an async_task response after the update is validated, durably persisted, and accepted for queued execution. If omitted or false, the tool waits for a synchronous result when possible, but may still return a pollable async_task response if queued execution exceeds the synchronous wait deadline. Example: true.
allow_deleting_contentboolean- Set to true to confirm deletion of child pages or databases when replacing content.
contentstring- Required for "insert_content" command. The markdown content to insert into the page.
content_updatesarray- Required for "update_content" command. An array of search-and-replace operations, each with old_str (content to find) and new_str (replacement content).
coverstring- An external image URL for the page cover. Use "none" to remove the cover. Omit to leave unchanged. Can be set alongside any command.
iconstring- An emoji character (e.g. "🚀"), a custom emoji by name (e.g. ":rocket_ship:"), or an external image URL. Use "none" to remove the icon. Omit to leave unchanged. Can be set alongside any command.
is_skillboolean- Set to true to mark this page as an AI skill, or false to remove the AI skill designation. Can be set alongside any command. Example: true.
new_strstring- Required for "replace_content" command. The new content string to replace the entire page content with.
positionstring- Optional for "insert_content" command. Use {"type":"start"} to prepend content or {"type":"end"} to append content. Omit to append.
propertiesobject- Required for "update_properties" command. A JSON object that updates the page's properties. For pages in a database, use the SQLite schema definition shown in <database>. For pages outside of a database, the only allowed property is "title", which is the title of the page in inline markdown format. Use null to remove a property's value.
template_idstring- Required for "apply_template" command. The ID of a template to apply to this page. Template content is appended to any existing page content.
verification_expiry_daysinteger- Optional for "update_verification" command when verification_status is "verified". Number of days until verification expires (e.g. 7, 30, 90). Omit for indefinite verification.
verification_statusstring- The verification state to set. Accepted values: verified, unverified.one of
verifiedunverified
No tools match.