mcp notion server

Local 2025-09-01 00:02:48 0

A bridge between Claude AI and Notion that enables users to interact with Notion databases and pages through natural language, supporting operations like creating, reading, updating, and deleting content.


A Model Context Protocol server for Notion integration

This TypeScript-based MCP server implements a bridge between Claude and Notion, allowing seamless interaction with Notion's databases and pages. It demonstrates core MCP concepts through:

  • Resource management for Notion pages and databases
  • Tools for CRUD operations on Notion content
  • AI-powered prompts for content analysis

Features

Resources

  • Access Notion pages and databases via URIs
  • Support for plain text and rich text content types
  • Metadata extraction from Notion properties

Tools

Database Operations

  • list_databases - List all accessible Notion databases
  • create_database - Create a new database with custom properties
  • query_database - Search and filter database entries
  • update_database - Modify database properties and schema

Page Operations

  • create_page - Create new pages in databases or as subpages
  • Support for title, properties, and markdown content
  • update_page - Update existing page properties
  • get_page - Retrieve page content and metadata
  • delete_page - Remove pages from databases or parent pages

Block Operations

  • append_blocks - Add new blocks to a page
  • delete_blocks - Remove blocks from a page
  • get_blocks - Retrieve block content
  • update_blocks - Modify existing block content

Prompts

  • summarize_notes - Generate concise summaries of notes
  • analyze_content - Provide insights and analysis of page content
  • suggest_tags - Recommend relevant tags based on content

Setup

Prerequisites

  • Node.js 18 or higher
  • Notion API Key and Integration setup
  • Claude Desktop application

Integration with Claude Desktop

Create a Notion Integration:

  1. Visit the Notion Your Integrations page.

  2. Click "New Integration".

  3. Name your integration and select appropriate permissions (e.g., "Read content", "Update content").
  4. Retrieve the Secret Key:

  5. Copy the "Internal Integration Token" from your integration. This token will be used for authentication.

  6. Add the Integration to Your Workspace:

  7. Open the page or database you want the integration to access in Notion.

  8. Click the navigation button in the top right corner.
  9. Click "Connect to" button and select your integration.

Configuration Setup

Add the server configuration to Claude Desktop:

MacOS:

~/Library/Application Support/Claude/claude_desktop_config.json

Windows:

%APPDATA%/Claude/claude_desktop_config.json

Configuration content:

{
  "mcpServers": {
   "mcp-notion-server": {
      "command": "npx",
      "args": [
        "-y",
        "@gabornyerges/mcp-notion-server"
      ],
      "env": {
        "NOTION_API_KEY": "your-notion-api-key"
      }
    }
  }
}

Debugging

Since MCP servers communicate over stdio, debugging can be challenging. We recommend using the MCP Inspector, which is available as a package script:

  1. MCP Inspector
    npm run inspector

MIT License - see LICENSE for details

[
  {
    "description": "List all accessible databases",
    "inputSchema": {
      "properties": {},
      "required": [],
      "type": "object"
    },
    "name": "list_databases"
  },
  {
    "description": "Create a new database",
    "inputSchema": {
      "properties": {
        "parent_id": {
          "description": "ID of the parent page",
          "type": "string"
        },
        "properties": {
          "description": "Database properties schema",
          "type": "object"
        },
        "title": {
          "description": "Title of the database",
          "type": "string"
        }
      },
      "required": [
        "parent_id",
        "title",
        "properties"
      ],
      "type": "object"
    },
    "name": "create_database"
  },
  {
    "description": "Create a new page",
    "inputSchema": {
      "properties": {
        "content": {
          "description": "Content in markdown format",
          "type": "string"
        },
        "parent_id": {
          "description": "ID of the parent page or database",
          "type": "string"
        },
        "parent_type": {
          "description": "Type of parent (database or page)",
          "enum": [
            "database",
            "page"
          ],
          "type": "string"
        },
        "properties": {
          "description": "Page properties (required for database pages)",
          "type": "object"
        },
        "title": {
          "description": "Title of the page",
          "type": "string"
        }
      },
      "required": [
        "parent_type",
        "parent_id"
      ],
      "type": "object"
    },
    "name": "create_page"
  },
  {
    "description": "Update an existing page",
    "inputSchema": {
      "properties": {
        "page_id": {
          "description": "ID of the page to update",
          "type": "string"
        },
        "properties": {
          "description": "Updated page properties",
          "type": "object"
        }
      },
      "required": [
        "page_id",
        "properties"
      ],
      "type": "object"
    },
    "name": "update_page"
  },
  {
    "description": "Append blocks to a page",
    "inputSchema": {
      "properties": {
        "blocks": {
          "description": "Array of block objects to append",
          "type": "array"
        },
        "page_id": {
          "description": "ID of the page",
          "type": "string"
        }
      },
      "required": [
        "page_id",
        "blocks"
      ],
      "type": "object"
    },
    "name": "append_blocks"
  },
  {
    "description": "Delete blocks from a page",
    "inputSchema": {
      "properties": {
        "block_id": {
          "description": "ID of the block to delete",
          "type": "string"
        }
      },
      "required": [
        "block_id"
      ],
      "type": "object"
    },
    "name": "delete_blocks"
  },
  {
    "description": "Retrieve a page by ID",
    "inputSchema": {
      "properties": {
        "page_id": {
          "description": "ID of the page to retrieve",
          "type": "string"
        }
      },
      "required": [
        "page_id"
      ],
      "type": "object"
    },
    "name": "get_page"
  },
  {
    "description": "Retrieve a database by ID",
    "inputSchema": {
      "properties": {
        "database_id": {
          "description": "ID of the database to retrieve",
          "type": "string"
        }
      },
      "required": [
        "database_id"
      ],
      "type": "object"
    },
    "name": "get_database"
  },
  {
    "description": "Query a database with filters and sorting",
    "inputSchema": {
      "properties": {
        "database_id": {
          "description": "ID of the database to query",
          "type": "string"
        },
        "filter": {
          "description": "Filter conditions",
          "type": "object"
        },
        "page_size": {
          "description": "Number of results per page",
          "type": "number"
        },
        "sorts": {
          "description": "Sorting parameters",
          "type": "array"
        },
        "start_cursor": {
          "description": "Pagination cursor",
          "type": "string"
        }
      },
      "required": [
        "database_id"
      ],
      "type": "object"
    },
    "name": "query_database"
  },
  {
    "description": "Search pages and databases",
    "inputSchema": {
      "properties": {
        "filter": {
          "description": "Filter by object type (page or database)",
          "type": "object"
        },
        "page_size": {
          "description": "Number of results per page",
          "type": "number"
        },
        "query": {
          "description": "Search query",
          "type": "string"
        },
        "sort": {
          "description": "Sort by last edited or created time",
          "type": "object"
        },
        "start_cursor": {
          "description": "Pagination cursor",
          "type": "string"
        }
      },
      "required": [
        "query"
      ],
      "type": "object"
    },
    "name": "search"
  }
]