npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@n24q02m/better-notion-mcp

v2.38.0

Published

Better MCP server for Notion API with composite tools optimized for AI agents

Readme

Better Notion MCP

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

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

CI codecov npm Docker License: MIT

TypeScript Node.js Notion semantic-release Renovate

| Project | Tagline | Tag | |---|---|---| | better-code-review-graph | Knowledge graph for token-efficient code reviews -- semantic search and call-... | MCP | | better-email-mcp | IMAP/SMTP email for AI agents -- read, send, organize folders, and manage att... | MCP | | better-godot-mcp | Composite MCP server for Godot Engine -- 17 composite tools for AI-assisted g... | MCP | | better-notion-mcp | Markdown-first Notion for AI agents -- pages, databases, blocks, and comments... | MCP | | better-telegram-mcp | Telegram for AI agents -- messages, chats, media, and contacts across both bo... | MCP | | claude-plugins | Claude Code plugin marketplace for the n24q02m MCP servers -- install web sea... | Marketplace | | imagine-mcp | Image and video understanding + generation for AI agents -- across Gemini, Op... | MCP | | jules-task-archiver | Chrome Extension for bulk operations on Jules tasks via batchexecute API -- a... | Tooling | | mcp-core | Shared foundation for building MCP servers -- Streamable HTTP transport, OAut... | MCP | | mnemo-mcp | Persistent AI memory with hybrid search and embedded sync. Open, free, unlimi... | MCP | | qwen3-embed | Lightweight Qwen3 text embedding and reranking via ONNX Runtime and GGUF | Library | | skret | Secrets without the server. | CLI | | tacet | TACET: a self-distilling neuro-symbolic cascade that amortises LLM cost in kn... | Tooling | | web-core | Shared web infrastructure package for search, scraping, HTTP security, and st... | Library | | wet-mcp | Open-source MCP server for AI agents: web search, content extraction, and lib... | MCP |

Table of contents

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, help, and a relay-setup tool)
  • 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 (OAuth 2.1, no token to paste)

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": {
    "better-notion-mcp": {
      "command": "npx",
      "args": ["--yes", "@n24q02m/better-notion-mcp@latest"],
      "env": { "NOTION_TOKEN": "ntn_your_token_here" }
    }
  }
}

Or run the published Docker image (stdio):

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

See the Documentation section for per-client setup (Claude Code, Codex, Gemini CLI, Cursor, Windsurf) and HTTP/OAuth mode.

CLI

Installing the package exposes a better-notion-mcp binary (run it with npx or after a global install). It has no subcommands -- running 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.

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

# Start the remote HTTP server (OAuth 2.1) instead of stdio
npx --yes @n24q02m/better-notion-mcp@latest --http

| Argument / env | Effect | |:---------------|:-------| | (none) | stdio transport (default); requires NOTION_TOKEN | | --http | HTTP transport with OAuth 2.1 (equivalent to TRANSPORT_MODE=http / MCP_TRANSPORT=http) |

See Configuration for the full environment-variable reference.

Hosted endpoint

A ready-to-use remote instance is hosted at https://notion.n24q02m.com/mcp (HTTP transport, OAuth 2.1 -- no integration token to paste). Point an MCP client that supports remote HTTP servers at it:

// MCP client config -- remote HTTP (OAuth 2.1)
{
  "mcpServers": {
    "better-notion-mcp": {
      "type": "http",
      "url": "https://notion.n24q02m.com/mcp"
    }
  }
}

On first connect the client opens Notion's OAuth consent screen; per-user access tokens are held in-process only (see Trust Model). To run your own remote instance instead, see Self-Hosting (Remote Mode) and Deploy to Cloudflare.

Smithery

The repo ships a smithery.yaml config for Smithery. Smithery launches the server over stdio (npx -y @n24q02m/better-notion-mcp) and requires no install-time config -- provide your Notion credentials at runtime through the server's own setup flow (NOTION_TOKEN env, or the relay form; 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, OAuth 2.1)
  • Multi-user setup -- per-JWT-sub credential model (HTTP mode)

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

Install MCP server better-notion-mcp 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 three infrastructure tools (config, config__open_relay, help):

| Tool | Actions | Description | |:-----|:--------|:------------| | pages | create, get, get_property, update, move, archive, restore, duplicate | Create, read, update, and organize pages | | databases | create, get, query, create_page, update_page, delete_page, create_data_source, update_data_source, update_database, list_templates | Database CRUD and page management within databases | | blocks | get, children, append, update, delete | Read and manipulate block content | | users | list, get, me, from_workspace | List and retrieve user information | | workspace | info, search | Workspace metadata and cross-workspace search | | comments | list, get, create | Page comments and discussion replies | | content_convert | markdown-to-blocks, blocks-to-markdown | Convert between Markdown and Notion blocks (uses a direction parameter) | | file_uploads | create, send, complete, retrieve, list | Upload files to Notion (single or multi-part) | | config | status, setup_status, setup_start, setup_reset, setup_complete, set, cache_clear | Inspect and manage credential state and configuration lifecycle | | config__open_relay | - | Open the relay configuration form in the browser and return the relay URL + credential state | | help | - | Get full documentation for any composite tool (tool_name parameter) |

MCP Resources

| URI | Description | |:----|:------------| | notion://docs/pages | Page operations reference | | notion://docs/databases | Database operations reference | | notion://docs/blocks | Block operations reference | | notion://docs/users | User operations reference | | notion://docs/workspace | Workspace operations reference | | notion://docs/comments | Comment operations reference | | notion://docs/content_convert | Content conversion reference | | notion://docs/file_uploads | File upload reference |

Configuration

| Variable | Required | Default | Description | |:---------|:---------|:--------|:------------| | NOTION_TOKEN | Yes (stdio) | - | Notion integration token | | TRANSPORT_MODE / MCP_TRANSPORT | No | stdio | Set either to http for remote mode (or pass --http) | | PUBLIC_URL | No (http) | - | Server's public URL for OAuth redirect links | | NOTION_OAUTH_CLIENT_ID | Yes (http) | - | Notion Public Integration client ID (or --oauth-client-id=<id> CLI flag, which overrides the env var) | | NOTION_OAUTH_CLIENT_SECRET | Yes (http) | - | Notion Public Integration client secret (or --oauth-client-secret=<secret> CLI flag, which overrides the env var) | | MCP_AUTH_DISABLE | No (http) | - | Set to 1 to skip Bearer JWT verification when behind an external auth gateway | | PORT | No | 0 (OS-assigned) | Server port; set explicitly (e.g. 8080) to bind a fixed port | | HOST | No | - | Bind address (http mode) |

Self-Hosting (Remote Mode)

You can self-host the remote server with your own Notion OAuth app.

Prerequisites:

  1. Create a Public Integration at https://www.notion.so/my-integrations
  2. Set the redirect URI to https://your-domain.com/callback
  3. Note your client_id and client_secret
docker run -p 8080:8080 \
  -e TRANSPORT_MODE=http \
  -e PORT=8080 \
  -e PUBLIC_URL=https://your-domain.com \
  -e NOTION_OAUTH_CLIENT_ID=your-client-id \
  -e NOTION_OAUTH_CLIENT_SECRET=your-client-secret \
  n24q02m/better-notion-mcp:latest

Deploy to Cloudflare

Deploy to Cloudflare

Run your own multi-user better-notion-mcp serverless on Cloudflare (Worker + Container + KV).

Prerequisites: a Cloudflare account on the Workers Paid plan — required for Containers (the Cloudflare free tier does not include Containers) — and the wrangler CLI.

  1. git clone https://github.com/n24q02m/better-notion-mcp && cd better-notion-mcp
  2. wrangler login
  3. Provision the KV namespace and paste its id into wrangler.jsonc:
    wrangler kv namespace create better-notion-kv
  4. Set secrets:
    wrangler secret put CREDENTIAL_SECRET
    wrangler secret put NOTION_OAUTH_CLIENT_ID
    wrangler secret put NOTION_OAUTH_CLIENT_SECRET
    CREDENTIAL_SECRET is REQUIRED: it derives a deterministic OAuth signing key so user identity survives container recreation.
  5. Push the http image to the CF managed registry and deploy:
    wrangler containers push better-notion-mcp:beta
    wrangler deploy
  6. Complete the Notion OAuth flow in the browser at your Worker domain.

Per-user Notion access tokens are encrypted into KV (MCP_STORAGE_BACKEND=cf-kv), so they survive scale-to-zero. Do NOT set MCP_AUTH_DISABLE on a shared/public deployment — it collapses all users into a single token bucket.

Comparison

How better-notion-mcp stacks up against direct competitors in each pillar:

| Capability | better-notion-mcp | makenotion/notion-mcp-server | suekou/mcp-notion-server | awkoy/notion-mcp-server | |---|---|---|---|---| | Markdown in / out | Yes (round-trip on pages + blocks) | No (raw Notion JSON) | partial (experimental, append + opt-in convert) | Yes (round-trip + GFM) | | Composite tool design | Yes (8 composite tools, 39 actions) | No (22 endpoint-mapped tools) | partial (simplified + raw JSON tools) | Yes (2 dispatch tools, 35+ ops) | | File uploads to Notion | Yes (file_uploads, single + multi-part) | No | No | Yes (upload_file, single + multi-part) | | Comments | Yes (comments: list/get/create) | Yes | Yes | Yes | | Remote HTTP + OAuth 2.1 transport | Yes (per-JWT-sub multi-user) | partial (HTTP + bearer token, no OAuth) | No (stdio token only) | No (stdio token only) | | Self-hostable | Yes (Docker, own OAuth app) | Yes | Yes | Yes | | License | MIT | ? | MIT | MIT |

Security

  • OAuth 2.1 + PKCE S256 -- Secure authorization with code challenge
  • 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/better-notion-mcp.git
cd better-notion-mcp
bun install
bun run dev

Trust Model

This plugin implements TC-NearZK (in-memory, ephemeral). See the trust model reference for full classification.

| Mode | Storage | Encryption | Who can read your data? | |---|---|---|---| | HTTP n24q02m-hosted (default) | In-memory Map<sub, OAuthToken> | In-process only | Server process (cleared on restart) | | HTTP self-host | Same as hosted | Same | Only you (admin = user) | | stdio (local) | config.enc in the OS config dir (%APPDATA%\mcp\Config\config.enc on Windows, ~/.config/mcp/config.enc on Linux/macOS) | AES-GCM, machine-bound key | Only your OS user |

License

MIT -- See LICENSE.