MCP Server

Notion AI Integration

Use Notion with Pickaxe to transform AI outputs into organized docs and knowledge that teams can execute from.

Dyllen Nellis, Pickaxe customerAnders van der Hagen, Pickaxe customerAidan Crawford, Pickaxe customerAlex Iteen, Pickaxe customerChris Scott, Pickaxe customer
Join 2,000+ builders
Pickaxe
Notion

Capabilities

14 capabilities

1 / 3

notion-search

Perform a search over: - "internal": Semantic search over Notion workspace and connected sources (Slack, Google Drive, Github, Jira, Microsoft Teams, Sharepoint, OneDrive, Linear). Supports filtering by creation date and creator. - "user": Search for users by name or email. Auto-selects AI search (with connected sources) or workspace search (workspace-only, faster) based on user's access to Notion AI. Use content_search_mode to override. Use "fetch" tool for full page/database contents after getting search results. Each result's "url" field contains a page ID for Notion results (pass directly to fetch tool's "id" param) or a full URL for external connector results (Slack, Google Drive, etc.). Set page_size (default 10, max 25) and max_highlight_length (default 200, 0 to omit) as low as possible to minimize response size. To search within a database: First fetch the database to get the data source URL (collection://...) from <data-source url="..."> tags, then use that as data_source_url. For multi-source databases, match by view ID (?v=...) in URL or search all sources separately. Don't combine database URL/ID with collection:// prefix for data_source_url. Don't use database URL as page_url. <example description="Search with date range filter (only documents created in 2024)"> { "query": "quarterly revenue report", "query_type": "internal", "filters": { "created_date_range": { "start_date": "2024-01-01", "end_date": "2025-01-01" } } } </example> <example description="Teamspace + creator filter"> {"query": "project updates", "query_type": "internal", "teamspace_id": "f336d0bc-b841-465b-8045-024475c079dd", "filters": {"created_by_user_ids": ["a1b2c3d4-e5f6-7890-abcd-ef1234567890"]}} </example> <example description="Database with date + creator filters"> {"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"]}} </example> <example description="User search"> {"query": "john@example.com", "query_type": "user"} </example>

Type: string

notion-fetch

Retrieves details about a Notion entity (page, database, or data source) by URL or ID. Provide URL or ID in `id` parameter. Make multiple calls to fetch multiple entities. Pages use enhanced Markdown format. For the complete specification, fetch the MCP resource at `notion://docs/enhanced-markdown-spec`. Databases return all data sources (collections). Each data source has a unique ID shown in `<data-source url="collection://...">` tags. You can pass a data source ID directly to this tool to fetch details about that specific data source, including its schema and properties. Use data source IDs with update_data_source and query_data_sources tools. Multi-source databases (e.g., with linked sources) will show multiple data sources. Set `include_discussions` to true to see discussion counts and inline discussion markers that correlate with the `get_comments` tool. The page output will include a `<page-discussions>` summary tag with discussion count, preview snippets, and `discussion://` URLs that match the discussion IDs returned by `get_comments`. <example>{"id": "https://notion.so/workspace/Page-a1b2c3d4e5f67890"}</example> <example>{"id": "12345678-90ab-cdef-1234-567890abcdef"}</example> <example>{"id": "https://myspace.notion.site/Page-Title-abc123def456"}</example> <example>{"id": "page-uuid", "include_discussions": true}</example> <example>{"id": "collection://12345678-90ab-cdef-1234-567890abcdef"}</example>

Type: string

notion-create-pages

## Overview Creates one or more Notion pages, with the specified properties and content. ## Parent All pages created with a single call to this tool will have the same parent. The parent can be a Notion page ("page_id") or data source ("data_source_id"). If the parent is omitted, the pages are created as standalone, workspace-level private pages, and the person that created them can organize them later as they see fit. If you have a database URL, ALWAYS pass it to the "fetch" tool first to get the schema and URLs of each data source under the database. You can't use the "database_id" parent type if the database has more than one data source, so you'll need to identify which "data_source_id" to use based on the situation and the results from the fetch tool (data source URLs look like collection://<data_source_id>). If you know the pages should be created under a data source, do NOT use the database ID or URL under the "page_id" parameter; "page_id" is only for regular, non-database pages. ## Content Notion page content is a string in Notion-flavored Markdown format. Don't include the page title at the top of the page's content. Only include it under "properties". **IMPORTANT**: For the complete Markdown specification, always first fetch the MCP resource at `notion://docs/enhanced-markdown-spec`. Do NOT guess or hallucinate Markdown syntax. This spec is also applicable to other tools like update-page and fetch. ## Properties Notion page properties are a JSON map of property names to SQLite values. When creating pages in a database: - Use the correct property names from the data source schema shown in the fetch tool results. - Always include a title property. Data sources always have exactly one title property, but it may not be named "title", so, again, rely on the fetched data source schema. For pages outside of a database: - The only allowed property is "title", which is the title of the page in inline markdown format. Always include a "title" property. **IMPORTANT**: Some property types require expanded formats: - Date properties: Split into "date:{property}:start", "date:{property}:end" (optional), and "date:{property}:is_datetime" (0 or 1) - Place properties: Split into "place:{property}:name", "place:{property}:address", "place:{property}:latitude", "place:{property}:longitude", and "place:{property}:google_place_id" (optional) - Number properties: Use JavaScript numbers (not strings) - Checkbox properties: Use "__YES__" for checked, "__NO__" for unchecked **Special property naming**: Properties named "id" or "url" (case insensitive) must be prefixed with "userDefined:" (e.g., "userDefined:URL", "userDefined:id") ## Templates When creating a page in a database, you can apply a template to pre-populate it with content and property values. Use the "fetch" tool on a database to see available templates in the <templates> section of each data source. When using a template: - Pass the template's ID as "template_id" in the page object. - Do NOT include "content" when using a template, as the template provides it. - You can still set "properties" alongside the template to override template defaults. - Template application is asynchronous. The page is created immediately but starts blank; the template content will appear shortly after. ## Icon and Cover Each page can optionally have an icon and a cover image. - "icon": An emoji character (e.g. "🚀"), a custom emoji by name (e.g. ":rocket_ship:"), or an external image URL. Use "none" to remove. Omit to leave unchanged. - "cover": An external image URL. Use "none" to remove. Omit to leave unchanged. ## Examples <example description="Create a page with an icon and cover"> { "pages": [ { "properties": {"title": "My Page"}, "icon": "🚀", "cover": "https://example.com/cover.jpg" } ] } </example> <example description="Create a page from a database template"> { "parent": {"data_source_id": "f336d0bc-b841-465b-8045-024475c079dd"}, "pages": [ { "template_id": "a5da15f6-b853-455d-8827-f906fb52db2b", "properties": { "Task Name": "New urgent bug" } } ] } </example> <example description="Create a standalone page with a title and content"> { "pages": [ { "properties": {"title": "Page title"}, "content": "# Section 1 {color="blue"} Section 1 content <details> <summary>Toggle block</summary> Hidden content inside toggle </details>" } ] } </example> <example description="Create a page under a database's data source"> { "parent": {"data_source_id": "f336d0bc-b841-465b-8045-024475c079dd"}, "pages": [ { "properties": { "Task Name": "Task 123", "Status": "In Progress", "Priority": 5, "Is Complete": "__YES__", "date:Due Date:start": "2024-12-25", "date:Due Date:is_datetime": 0 } } ] } </example> <example description="Create a page with an existing page as a parent"> { "parent": {"page_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"}, "pages": [ { "properties": {"title": "Page title"}, "content": "# Section 1 Section 1 content # Section 2 Section 2 content" } ] } </example>

Type: array

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 expanded formats: - Date properties: Split into "date:{property}:start", "date:{property}:end" (optional), and "date:{property}:is_datetime" (0 or 1) - Place properties: Split into "place:{property}:name", "place:{property}:address", "place:{property}:latitude", "place:{property}:longitude", and "place:{property}:google_place_id" (optional) - Number properties: Use JavaScript numbers (not strings) - Checkbox properties: Use "__YES__" for checked, "__NO__" for unchecked **Special property naming**: Properties named "id" or "url" (case insensitive) must be prefixed with "userDefined:" (e.g., "userDefined:URL", "userDefined:id") For pages outside of a database: - The only allowed property is "title", which is the title of the page in inline markdown format. ## Content Notion page content is a string in Notion-flavored Markdown format. **IMPORTANT**: For the complete Markdown specification, first fetch the MCP resource at `notion://docs/enhanced-markdown-spec`. Do NOT guess or hallucinate Markdown syntax. Before updating a page's content with this tool, use the "fetch" tool first to get the existing content to find out the Markdown snippets to use in the "update_content" command's old_str fields. ### Preserving Child Pages and Databases When using "replace_content", the operation will check if any child pages or databases would be deleted. If so, it will fail with an error listing the affected items. To preserve child pages/databases, include them in new_str using `<page url="...">` or `<database url="...">` tags. Get the exact URLs from the "fetch" tool output. **CRITICAL**: To intentionally delete child content: if the call failed with validation and requires `allow_deleting_content` to be true, DO NOT automatically assume the content should be deleted. ALWAYS show the list of pages to be deleted and ask for user confirmation before proceeding. ## Icon and Cover You can set or remove a page's icon and cover alongside any command. - "icon": An emoji character (e.g. "🚀"), a custom emoji by name (e.g. ":rocket_ship:"), or an external image URL. Use "none" to remove. Omit to leave unchanged. - "cover": An external image URL. Use "none" to remove. Omit to leave unchanged. ## Examples <example description="Update page icon and cover"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "update_properties", "properties": {"title": "My Page"}, "icon": "🚀", "cover": "https://example.com/cover.jpg" } </example> <example description="Update page properties"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "update_properties", "properties": { "title": "New Page Title", "status": "In Progress", "priority": 5, "checkbox": "__YES__", "date:deadline:start": "2024-12-25", "date:deadline:is_datetime": 0, "place:office:name": "HQ", "place:office:latitude": 37.7749, "place:office:longitude": -122.4194 } } </example> <example description="Replace the entire content of a page"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "replace_content", "new_str": "# New Section Updated content goes here" } </example> <example description="Update specific content in a page (search-and-replace)"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "update_content", "content_updates": [ { "old_str": "# Old Section Old content here", "new_str": "# New Section Updated content goes here" } ] } </example> <example description="Insert content after a specific location"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "update_content", "content_updates": [ { "old_str": "## Previous section Existing content", "new_str": "## Previous section Existing content ## New Section Content to insert goes here" } ] } </example> <example description="Multiple content updates in a single call"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "update_content", "content_updates": [ { "old_str": "Old text 1", "new_str": "New text 1" }, { "old_str": "Old text 2", "new_str": "New text 2" } ] } </example> ## Templates You can apply a template to an existing page using the "apply_template" command. The template content is appended to the page asynchronously. Get template IDs from the <templates> section in the fetch tool results for a database, or use any page ID as a template. <example description="Apply a template to an existing page"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "apply_template", "template_id": "a5da15f6-b853-455d-8827-f906fb52db2b" } </example> ## Verification You can verify or unverify a page using the "update_verification" command. Verification marks a page as reviewed and up-to-date. Requires a Business or Enterprise plan (or the page must be in a wiki). <example description="Verify a page for 90 days"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "update_verification", "verification_status": "verified", "verification_expiry_days": 90 } </example> <example description="Verify a page indefinitely"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "update_verification", "verification_status": "verified" } </example> <example description="Remove verification from a page"> { "page_id": "f336d0bc-b841-465b-8045-024475c079dd", "command": "update_verification", "verification_status": "unverified" } </example>

Type: string

notion-move-pages

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

Get Started

Click any tool below to instantly start building AI tools that enhance your workflow and productivity

Data Query Assistant

Build natural language interfaces that let users query databases using plain English questions.

Automated Data Sync

Create workflows that automatically sync data between databases and keep information up-to-date.

Data Analysis Dashboard

Transform raw database records into visual insights and actionable analytics reports.

Data Migration Tool

Automate data migration between systems with validation and error handling built-in.

Database Backup Manager

Schedule and manage automated database backups with notifications and recovery options.

Record Cleanup Automation

Identify and clean duplicate records, outdated entries, and invalid data automatically.

Explore Pickaxe Templates

Get started faster with pre-built templates. Choose from our library of ready-to-use AI tools and customize them for your needs.

Ready to Connect Notion?

Build your AI tool with this MCP server in the Agent Builder.

Build with Pickaxe

Frequently Asked Questions