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
| Capability | @notionhq/client SDK | Composio Notion | wmcp.sh |
|---|---|---|---|
| Setup time | Install SDK + integration token | Composio platform + OAuth flow | Connect Notion once in dashboard |
| Workspace OAuth | Internal-only by default | Composio manages | Public OAuth + token vault |
| MCP shape | Wrap each call yourself | Auto-mapped | Native MCP tools |
| Database queries | Raw filter/sort JSON | Curated query helpers | Tool args mirror Notion's filter shape |
| Pagination | You handle cursors | Composio handles | Cursor surfaced to agent |
| Cost | Free SDK | Platform tier | Free 100/day + $29/mo Pro |
All MCP-shaped — consumed directly by Claude tool_use, OpenAI function-calling, or LangChain.
| Tool | Type | Returns |
|---|---|---|
search | Live action | Pages + databases matching a query |
pages.retrieve | Live action | Page properties |
pages.create | Live action | New page ID + URL |
blocks.children.append | Live action | Appended blocks |
blocks.children.list | Live action | Page content (blocks) |
databases.query | Live action | Filtered + sorted rows |
databases.retrieve | Live action | Database schema |
users.me | Live action | Current OAuth user |
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)
_auth arg if you'd rather pass the token directly.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.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.children.append call).Notion overlaps with docs sites — same agent-discovery dynamics. See the docs-site guide for llms.txt + structured search.
Custom adapter + hosted MCP at mcp.yourbrand.com + verified badge. From $499 one-time setup.