integration · notion

Claude + Notion — read, write, query.

Notion's API is REST-shaped but its data model is unusual — pages, blocks, databases, properties, all schema-flexible. wmcp.sh wraps it as clean MCP tools your agent can call without learning Notion's quirks. Connect once, the worker handles OAuth.

Last updated 2026-05-28 · works with Claude, OpenAI, LangChain, and any MCP client

vs. the alternatives

Capability@notionhq/client SDKComposio Notionwmcp.sh
Setup timeInstall SDK + integration tokenComposio platform + OAuth flowConnect Notion once in dashboard
Workspace OAuthInternal-only by defaultComposio managesPublic OAuth + token vault
MCP shapeWrap each call yourselfAuto-mappedNative MCP tools
Database queriesRaw filter/sort JSONCurated query helpersTool args mirror Notion's filter shape
PaginationYou handle cursorsComposio handlesCursor surfaced to agent
CostFree SDKPlatform tierFree 100/day + $29/mo Pro

Tools your agent calls

All MCP-shaped — consumed directly by Claude tool_use, OpenAI function-calling, or LangChain.

ToolTypeReturns
searchLive actionPages + databases matching a query
pages.retrieveLive actionPage properties
pages.createLive actionNew page ID + URL
blocks.children.appendLive actionAppended blocks
blocks.children.listLive actionPage content (blocks)
databases.queryLive actionFiltered + sorted rows
databases.retrieveLive actionDatabase schema
users.meLive actionCurrent OAuth user

Python — agent files a note into a Notion database

from wmcp import WmcpClient
from wmcp.anthropic import to_anthropic_tools, execute_tool_use
from anthropic import Anthropic

client = WmcpClient(api_key="webmcp_live_…")
spec   = "https://api.notion.com/openapi"
tools  = [t for t in client.tools(spec)
          if t.name in {"pages_create", "databases_query", "search"}]

anthropic = Anthropic()
msg = anthropic.messages.create(
    model="claude-opus-4-7",
    max_tokens=1024,
    tools=to_anthropic_tools(tools),
    messages=[{"role": "user",
               "content": "Add a note to my Inbox database: 'follow up with stripe re: Connect verification'."}],
)

for block in msg.content:
    if block.type == "tool_use":
        # Worker auto-injects your connected Notion OAuth token
        result = execute_tool_use(client, spec, block.model_dump())
        print(result)

Frequently asked

Internal integration vs public OAuth?
wmcp.sh's Notion provider is registered as a Public integration with OAuth — any wmcp user can connect their own Notion workspace. Internal integrations (single-workspace, no OAuth) work via the _auth arg if you'd rather pass the token directly.
How does Notion's odd data model affect tool shape?
Notion's pages-have-blocks-have-children model is preserved. Each tool's input schema mirrors Notion's REST request body shape. Your agent passes the same JSON Notion's SDK would — wmcp doesn't try to flatten or simplify the model.
Can it read content from an existing page?
Yes. blocks.children.list returns the block tree for a page. For nested content, recursively call on child blocks. The agent can also pages.retrieve for property values.
Database queries — how does filtering work?
databases.query accepts Notion's full filter/sort JSON. Tell the agent the database schema (or have it call databases.retrieve first), then have it build the filter. Compound filters with and/or nest as deep as Notion supports.
Rate limits?
Notion's API: 3 requests/second average per integration. wmcp.sh doesn't add its own throttle — your agent's bursting hits Notion directly. For high-throughput use, batch operations where Notion supports it (e.g. append multiple blocks in one children.append call).

Docs agent-readiness

Notion overlaps with docs sites — same agent-discovery dynamics. See the docs-site guide for llms.txt + structured search.

→ /agent-ready/docs  ·  cornerstone  ·  done-for-you ($499+)

Need this done for you?

Skip the wiring — we build, deploy, and monitor.

Custom adapter + hosted MCP at mcp.yourbrand.com + verified badge. From $499 one-time setup.

See /managed → Submit (free)