Skip to main content
Glama
bobmatnyc
by bobmatnyc
README.md
# notion-mpm

Python MCP server + API library for Notion workspace integration.

Provides:
1. **Clean Python API**: `from notion_mpm.api import pages; await pages.get_page(token, page_id)`
2. **MCP server**: wraps the API for Claude Desktop (`uv run notion-mpm mcp`)
3. **20+ tools**: pages, blocks, databases, users, search, comments

## Setup

```bash
cp .env.local.example .env.local
# Add NOTION_API_KEY=secret_...
uv sync
```

Create a Notion integration at: https://www.notion.so/my-integrations

Then share your pages/databases with the integration inside Notion.

## Run

```bash
uv run notion-mpm setup    # verify token + workspace
uv run notion-mpm doctor   # health check
uv run notion-mpm mcp      # start MCP server (for Claude Desktop)
```

## Test

```bash
uv run pytest
uv run pytest --cov=src --cov-report=html
```

## Claude Desktop Config

Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "notion": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/notion-mpm", "notion-mpm", "mcp"]
    }
  }
}
```

## API Overview

```
src/notion_mpm/
├── api/
│   ├── _client.py      # Shared httpx client + NotionAPIError
│   ├── pages.py        # get, create, update, archive, restore pages
│   ├── blocks.py       # get, append, update, delete blocks + helpers
│   ├── databases.py    # get, create, update, query databases
│   ├── users.py        # list, get, get_bot_user
│   ├── search.py       # search pages and databases
│   └── comments.py     # get and create comments
├── auth/               # Token management from .env/.env.local
├── cli/                # Click CLI commands
└── server/             # Thin MCP adapter over api/
```

## MCP Tools

| Category  | Tools |
|-----------|-------|
| Pages     | `get_page`, `get_page_property`, `create_page`, `update_page`, `archive_page`, `restore_page` |
| Blocks    | `get_block`, `get_block_children`, `append_block_children`, `update_block`, `delete_block` |
| Databases | `get_database`, `create_database`, `update_database`, `query_database` |
| Users     | `list_users`, `get_user`, `get_bot_user` |
| Search    | `search` |
| Comments  | `get_comments`, `create_comment` |

## Token Scopes

Your integration needs these capabilities (set in Notion integration settings):

- **Read content** — required for all read operations
- **Update content** — required for create/update/archive
- **Insert comments** — required for `create_comment`
- **Read comments** — required for `get_comments`

## Release

```bash
make publish        # patch bump + PyPI + GitHub Release
make publish-minor  # minor bump
make publish-major  # major bump
```

TDQS

A3.7/5.0

Scored across 21 tools

Disambiguation5/5

Each tool maps to a distinct Notion resource and action. get_page_property targets a specific property vs get_page's full page, and append_block_children vs get_block_children are clearly read vs write. No two tools have overlapping purposes.

Naming Consistency5/5

All tools follow a verb_noun pattern with snake_case, e.g., get_page, create_database, update_block. The only deviation is 'search', but it is a clear imperative verb that fits the style. No mixed conventions.

Tool Count4/5

21 tools is above the typical 3-15 sweet spot, but the breadth of Notion's API (pages, blocks, databases, users, comments) justifies the count. Each tool serves a specific operation, so it doesn't feel bloated.

Completeness4/5

Core CRUD and lifecycle operations are covered for pages, blocks, and databases, plus search, comments, and user retrieval. A notable minor gap is lack of database archive/restore operations, but this does not severely hinder common workflows.

Maintenance

ActivityInactive
ResponsivenessNo issues