MCPInstall
better-notion-mcp logo

better-notion-mcp

by n24q02m 35 stars n24q02m/notion

Markdown-first Notion for AI agents -- pages, databases, blocks, and comments in one call.

READMEmain

notion

mcp-name: io.github.n24q02m/better-notion-mcp

Markdown-first Notion for AI agents -- pages, databases, blocks, and comments in one call.

Mode CI codecov npm Docker License: Apache-2.0

TypeScript Node.js Notion semantic-release Renovate

Sister projects from n24q02m (click to expand)
ProjectTaglineTag
agent-chat-pluginPeer AI agents chat in a shared folder — no human relay, no orchestrator, wor...Tooling
better-code-review-graphKnowledge graph for token-efficient code reviews -- semantic search and call-...MCP
better-drive2-way Google Drive sync with .driveignore filter — rclone engine, Windows trayTooling
better-email-mcpIMAP/SMTP email for AI agents -- read, send, organize folders, and manage att...MCP
better-godot-mcpComposite MCP server for Godot Engine -- 17 composite tools for AI-assisted g...MCP
better-notion-mcpMarkdown-first Notion for AI agents -- pages, databases, blocks, and comments...MCP
better-semantic-releaseDrop-in python-semantic-release fork with built-in release-safety guards (orp...Tooling
better-telegram-mcpTelegram for AI agents -- messages, chats, media, and contacts across both bo...MCP
better-workspace-mcpGoogle Workspace MCP server (Docs/Drive/Calendar/Gmail/Sheets/Slides/Tasks/Ch...MCP
claude-pluginsClaude Code plugin marketplace for the n24q02m MCP servers -- install web sea...Marketplace
imagine-mcpImage and video understanding + generation for AI agents -- across Gemini, Op...MCP
jules-task-archiverChrome Extension for bulk operations on Jules tasks via batchexecute API -- a...Tooling
mcp-coreShared foundation for building MCP servers -- Streamable HTTP transport, OAut...MCP
mnemo-mcpPersistent AI memory with hybrid search and embedded sync. Open, free, unlimi...MCP
qwen3-embedLightweight Qwen3 text embedding and reranking via ONNX Runtime and GGUFLibrary
skretSecrets without the server.CLI
tacetA self-distilling neuro-symbolic cascade that amortises LLM cost across knowl...Tooling
web-coreShared web infrastructure package for search, scraping, HTTP security, and st...Library
wet-mcpOpen-source MCP server for AI agents: web search, content extraction, and lib...MCP

Table of contents

Better Notion MCP server

Features

  • Markdown in, Markdown out -- human-readable content instead of raw JSON blocks
  • 8 composite tools, 39 actions -- one call instead of chaining 2+ atomic Notion endpoints (plus config and help)
  • Auto-pagination and bulk operations -- no manual cursor handling or looping
  • Tiered token optimization -- ~77% reduction via compressed descriptions + on-demand help tool
  • Dual transport -- local stdio (integration token) or remote HTTP (per-user or shared bearer token)

Install

Run with npx (Node.js >= 24) and a Notion integration token from https://www.notion.so/my-integrations (starts with ntn_):

// MCP client config (e.g. .mcp.json / Claude Code / Cursor)
{
  "mcpServers": {
    "notion": {
      "command": "npx",
      "args": ["--yes", "@n24q02m/notion@latest"],
      "env": { "NOTION_TOKEN": "ntn_your_token_here" }
    }
  }
}

The package is @n24q02m/notion (formerly @n24q02m/better-notion-mcp; old package receives one final release then freezes). The MCP Registry id stays io.github.n24q02m/better-notion-mcp, and the legacy better-notion-mcp command is kept as an alias of notion.

Or run the published Docker image (stdio):

docker run --rm -i -e NOTION_TOKEN=ntn_your_token_here n24q02m/notion:latest

Install matrix

ClientInstall
Claude Code/plugin marketplace add n24q02m/claude-plugins + /plugin install better-notion-mcp@n24q02m-plugins (stdio; prompts for NOTION_TOKEN), or an mcpServers entry in .mcp.json / client settings
Codex CLI[mcp_servers.notion] block in ~/.codex/config.toml (stdio command/args or HTTP type/url)
OpenCodemcpServers block in opencode.json
Cursor / Windsurf / Gemini CLI / any MCP clientmcpServers JSON in the client's config — same shape as the example above

Full per-client walkthroughs: mcp.n24q02m.com/servers/better-notion-mcp/setup/. See the Documentation section for per-client setup (Claude Code, Codex, Gemini CLI, Cursor, Windsurf) and HTTP mode.

CLI

Installing the package exposes a notion binary (plus the legacy better-notion-mcp alias; run it with npx or after a global install). With no arguments it starts the MCP server and speaks the protocol over stdin/stdout, so it is normally launched by an MCP client rather than by hand. Subcommands: auth stores the Notion integration token; config, status, logout, doctor, and token come from the shared hull CLI.

# Start the stdio server (default transport; requires NOTION_TOKEN)
NOTION_TOKEN=ntn_your_token_here npx --yes @n24q02m/notion@latest

# Start the remote HTTP server (bearer token) instead of stdio
npx --yes @n24q02m/notion@latest --http
Argument / envEffect
(none)stdio transport (default); requires NOTION_TOKEN
--httpHTTP transport; auth chosen by MCP_AUTH_MODE (multi default, token, or no-auth)

See Configuration for the full environment-variable reference.

Remote (HTTP mode)

Deployed with the HTTP transport, the server is a remote endpoint gated by bearer-token auth -- no integration token in the server config. Point an MCP client that supports remote HTTP servers at the host you deployed it on:

// MCP client config -- remote HTTP (bearer token)
{
  "mcpServers": {
    "notion": {
      "type": "http",
      "url": "https://<your-host>/mcp",
      "headers": { "Authorization": "Bearer <your-token>" }
    }
  }
}

In multi mode (default) each user is listed in the users file (MCP_USERS_FILE, default ~/.hull/users.toml) and gets their own token and credential namespace. In token mode every client shares one token whose scrypt hash is set in MCP_AUTH_TOKEN_HASH. To stand up such an instance, see Self-Hosting (Remote Mode).

Smithery

The repo ships a smithery.yaml config for Smithery. Smithery launches the server over stdio (npx -y @n24q02m/notion) and requires no install-time config -- provide your Notion credentials at runtime through NOTION_TOKEN or the config tool (see Configuration).

Status

2026-05-02 -- Architecture stabilization update

Past months saw significant churn around credential handling and the daemon-bridge auto-spawn pattern. This caused multi-process races, browser tab spam, and inconsistent setup UX across plugins. The architecture is now stable: 2 clean modes (stdio + HTTP), no daemon-bridge layer, no auto-spawn from stdio.

Apologies for the instability period. If you encountered issues with prior versions, please update to the latest release and follow the current Setup guide -- most prior workarounds are no longer needed.

Related plugins from the same author:

All plugins share the same architecture -- install once, learn pattern transfers.

Documentation

Full docs at mcp.n24q02m.com/servers/better-notion-mcp/:

  • Setup -- install methods for Claude Code, Codex, Gemini CLI, Cursor, Windsurf, mcp.json
  • Modes overview -- stdio (local, integration token) and HTTP (remote, bearer token)
  • Multi-user setup -- per-user credential namespace (HTTP mode)

Install with AI agent -- paste this to your AI coding agent:

Install MCP server notion following the steps at https://raw.githubusercontent.com/n24q02m/claude-plugins/main/plugins/better-notion-mcp/setup-with-agent.md

Tools

Eight composite Notion tools (39 actions) plus two infrastructure tools (config, help):

ToolActionsDescription
pagescreate, get, get_property, update, move, archive, restore, duplicateCreate, read, update, and organize pages
databasescreate, get, query, create_page, update_page, delete_page, create_data_source, update_data_source, update_database, list_templatesDatabase CRUD and page management within databases
blocksget, children, append, update, deleteRead and manipulate block content
userslist, get, me, from_workspaceList and retrieve user information
workspaceinfo, searchWorkspace metadata and cross-workspace search
commentslist, get, createPage comments and discussion replies
content_convertmarkdown-to-blocks, blocks-to-markdownConvert between Markdown and Notion blocks (uses a direction parameter)
file_uploadscreate, send, complete, retrieve, listUpload files to Notion (single or multi-part)
configstatus, setup_status, setup_start, setup_reset, setup_complete, set, cache_clearInspect and manage credential state and configuration lifecycle
help-Get full documentation for any composite tool (tool_name parameter)

MCP Resources

URIDescription
notion://docs/pagesPage operations reference
notion://docs/databasesDatabase operations reference
notion://docs/blocksBlock operations reference
notion://docs/usersUser operations reference
notion://docs/workspaceWorkspace operations reference
notion://docs/commentsComment operations reference
notion://docs/content_convertContent conversion reference
notion://docs/file_uploadsFile upload reference

Configuration

VariableRequiredDefaultDescription
NOTION_TOKENYes (stdio)-Notion integration token
TRANSPORT_MODE / MCP_TRANSPORTNostdioSet either to http for remote mode (or pass --http)
MCP_AUTH_MODENo (http)multimulti (per-user tokens from MCP_USERS_FILE), token (one shared token, needs MCP_AUTH_TOKEN_HASH), or no-auth (trusted/local use only)
MCP_USERS_FILENo (http, multi)~/.hull/users.tomlUsers file for multi mode
MCP_AUTH_TOKEN_HASHYes (token mode)-scrypt$ hash of the shared token (mint with token hash)
MCP_RPMNo (token mode)-Optional per-minute request cap in token mode
PORTNo0 (OS-assigned)Server port; set explicitly (e.g. 8080) to bind a fixed port
HOSTNo127.0.0.1Bind address (http mode)

Self-Hosting (Remote Mode)

Run the HTTP server on your own host and choose an auth mode with MCP_AUTH_MODE:

  • multi (default): list each user in MCP_USERS_FILE; each user's Notion token is stored in their own namespace (~/.better-notion/subs/<ns>/config.json).
  • token: one shared bearer token. Mint the hash with token hash and pass it as MCP_AUTH_TOKEN_HASH.
  • no-auth: no bearer check. Use only on a trusted local network.
docker run -p 8080:8080 \
  -e TRANSPORT_MODE=http \
  -e PORT=8080 \
  -e MCP_AUTH_MODE=token \
  -e MCP_AUTH_TOKEN_HASH='scrypt$...' \
  n24q02m/notion:latest

Docker Compose (loopback)

docker-compose.http.yml builds the http image target and publishes it on the host loopback interface only (127.0.0.1:8081), so the server is never reachable from other machines directly:

export MCP_AUTH_MODE=token
export MCP_AUTH_TOKEN_HASH='scrypt$...'
docker compose -f docker-compose.http.yml up

The server listens on http://localhost:8081/mcp. To expose it, put your own TLS reverse proxy in front of the loopback port.

Release images are published multi-arch (amd64 + arm64) to Docker Hub (n24q02m/notion) and GHCR (ghcr.io/n24q02m/notion). There is no n24q02m-hosted HTTP endpoint.

Comparison

How notion stacks up against direct competitors in each pillar:

Capabilitynotionmakenotion/notion-mcp-serversuekou/mcp-notion-serverawkoy/notion-mcp-server
Markdown in / outYes (round-trip on pages + blocks)No (raw Notion JSON)partial (experimental, append + opt-in convert)Yes (round-trip + GFM)
Composite tool designYes (8 composite tools, 39 actions)No (22 endpoint-mapped tools)partial (simplified + raw JSON tools)Yes (2 dispatch tools, 35+ ops)
File uploads to NotionYes (file_uploads, single + multi-part)NoNoYes (upload_file, single + multi-part)
CommentsYes (comments: list/get/create)YesYesYes
Remote HTTP + bearer-token authYes (per-user namespaces or shared token)partial (HTTP + bearer token)No (stdio token only)No (stdio token only)
Self-hostableYes (Docker, own bearer token)YesYesYes
LicenseApache-2.0?MITMIT

Security

  • Bearer token auth -- per-user tokens (multi) or one scrypt-hashed shared token (token)
  • Rate limiting -- 120 req/min/IP on HTTP transport
  • Session owner binding -- IP check + TTL for pending token binds
  • Null safety -- Handles Notion API quirks (comments.list 404, undefined rich_text)

Build from Source

git clone https://github.com/n24q02m/notion.git
cd notion
bun install
bun run dev

Trust Model

Credentials are never sent to n24q02m: there is no hosted endpoint.

ModeStorageProtectionWho can read your data?
HTTP self-host (multi)~/.better-notion/subs/<ns>/config.json on the server hostFile mode 0600 under the server's data dirThe server operator and anyone with access to that host
HTTP self-host (token)~/.better-notion/config.json on the server hostFile mode 0600 under the server's data dirThe server operator and anyone with access to that host
stdio (local)~/.better-notion/config.jsonFile mode 0600; machine key in ~/.better-notion/.secretOnly your OS user

License

Apache-2.0 -- See LICENSE.

More Productivity & Workflow MCP servers

Similar servers from the same category.

Integrates with monday.com API to enable direct access to boards, workflows, and data for automating tasks and managing resources without context switching.

Productivity & Workflow

Activepieces

activepieces

Dynamic server to which you can add apps (Google Calendar, Notion, etc) or advanced Activepieces Flows (Refund logic, a research and enrichment logic, etc).

search

Time

modelcontextprotocol

Time and timezone conversion capabilities

timeconversion

Interact with Microsoft Word.

word