supabase-notion MCP Server
Provides tools to search Notion pages, read a page as plain text, and create new pages from markdown with headings, lists, quotes, and paragraphs.
Provides tools to list allowed tables, query rows with filters, ordering and limits, and insert rows into a Supabase Postgres database. Includes safeguards such as table allowlists, validated inputs, row limits, and optional read-only mode.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@supabase-notion MCP ServerFind open urgent tickets and write an ops review page in Notion"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Server for Claude: Supabase + Notion
Let Claude (or any MCP client) query and update your Supabase database and search or write your Notion workspace, safely.
A production-style Model Context Protocol server in TypeScript with 6 tools, a schema resource and a reusable prompt. Works with Claude Desktop, Claude Code, Cursor and the MCP Inspector. Runs in mock mode with realistic sample data when no keys are set, so you can try it in a minute.

Why
Teams keep customer data in Postgres and their process docs in Notion. Copying between the two by hand is slow, and giving an AI raw database credentials is risky. This server gives Claude a small, typed, allowlisted set of tools instead of a SQL prompt.
Related MCP server: Notion MCP Server
Tools
Tool | What it does | Writes? |
| Allowed tables with columns and row counts | no |
| Select with column list, filters ( | no |
| Insert 1 to 50 rows, returns created rows | yes |
| Full-text search over pages shared with the integration | no |
| Read a page as plain text | no |
| Create a page from markdown (headings, lists, quotes, paragraphs) | yes |
Also exposes the resource schema://supabase and the prompt ops_review.
Safety by default
Table allowlist (
SUPABASE_ALLOWED_TABLES): any other table is refused, soauth.usersand internal tables stay out of reach.Read-only mode (
MCP_READ_ONLY=true): write tools are not even registered.Validated inputs: Zod schemas on every tool; column names must match
^[a-zA-Z_][a-zA-Z0-9_]*$; row limits capped (MCP_MAX_ROWS, default 100).No raw SQL: queries go through the Supabase query builder (PostgREST), so there is no SQL injection surface.
MCP annotations (
readOnlyHint,destructiveHint,openWorldHint) so clients like Claude Desktop ask before write actions.stdout reserved for JSON-RPC, logs go to stderr.
Architecture
flowchart LR
C["Claude Desktop / Claude Code / Cursor"] <-->|"MCP · JSON-RPC over stdio"| S["supabase-notion MCP server<br/>(TypeScript, @modelcontextprotocol/sdk)"]
S --> G{"Guards<br/>allowlist · Zod · read-only · limits"}
G --> DB["DatabaseBackend"]
G --> NB["NotesBackend"]
DB -->|keys set| SB[("Supabase Postgres<br/>supabase-js")]
DB -->|no keys| MD[("In-memory mock")]
NB -->|token set| NO["Notion API<br/>@notionhq/client"]
NB -->|no token| MN["In-memory mock pages"]Backends sit behind two small interfaces (DatabaseBackend, NotesBackend), so adding Airtable, Postgres-direct or Google Docs means one new class.
Quick start
npm install
npm test # 8 tests, in-memory MCP transport
npm run build # compiles to dist/
npm run inspect # open in the official MCP InspectorUse it in Claude Desktop
Add this to claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude:
{
"mcpServers": {
"supabase-notion": {
"command": "node",
"args": ["/absolute/path/to/mcp-server-supabase-notion/dist/index.js"],
"env": {
"SUPABASE_URL": "https://YOUR-PROJECT.supabase.co",
"SUPABASE_SERVICE_ROLE_KEY": "YOUR-SERVICE-ROLE-KEY",
"SUPABASE_ALLOWED_TABLES": "customers,support_tickets,leads",
"NOTION_TOKEN": "secret_xxx",
"NOTION_PARENT_PAGE_ID": "YOUR-PAGE-ID",
"MCP_READ_ONLY": "false"
}
}
}
}Leave the env block out to run against the built-in sample data.
Claude Code
claude mcp add supabase-notion -- node /absolute/path/to/dist/index.jsDemo web UI (screenshots)
npm run demo starts a small MCP host on http://localhost:3300: it spawns the server over stdio, lists its tools and runs a tool-use loop.
With
ANTHROPIC_API_KEYset, Claude (Messages API tool use) decides which tools to call.Without it, a deterministic scripted planner drives the same MCP tools, so the demo runs offline. The screenshots in this repo were taken in this mock mode (the header says "Planner: scripted").
Notion page written by the agent | Insert row + Notion search |
|
|
Example prompts
"Find open urgent tickets and write an ops review page in Notion"
"Which enterprise customers are at risk, and what's their MRR?"
"Add a lead: Daniel Ortiz from Vertex Robotics, daniel@vertexrobotics.com, source: webinar"
"What does our escalation process say about urgent tickets?"
Project layout
src/
index.ts stdio entry point
server.ts tool, resource and prompt registration + guards
config.ts env parsing
backends/
supabase.ts supabase-js implementation
notion.ts Notion API implementation + markdown → blocks
mock.ts in-memory sample data
demo/ MCP host + Claude tool-use loop + web UI
tests/ MCP client ↔ server tests over InMemoryTransportSupabase setup (real mode)
Any tables work; the sample schema is:
create table customers (id bigint generated always as identity primary key, name text, email text, plan text, mrr int, country text, health text, created_at date default now());
create table support_tickets (id bigint generated always as identity primary key, customer_id bigint references customers, subject text, status text, priority text, created_at date default now());
create table leads (id bigint generated always as identity primary key, name text, company text, email text, source text, stage text, created_at date default now());Use the service-role key only on a trusted machine. For multi-user setups, use a user JWT plus RLS policies instead.
License
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
# Supadata **Supadata ([supadata.ai](https://supadata.ai)): video transcripts, social media metadata, AI video analysis, and web scraping for AI agents, behind one MCP server.** [Supadata](https://supadata.ai) turns YouTube, TikTok, Instagram, X (Twitter), and Facebook videos, plus any web page, into clean text and structured JSON that an LLM can use. Your agent passes a URL and gets back a transcript, metadata, extracted data, or Markdown. One account, one response format across every platform. This repository is the integration front door. The product itself lives at [supadata.ai](https://supadata.ai); the remote MCP server lives at `https://api.supadata.ai/mcp`. ## What you can build with it - **Video to text**: fetch transcripts through the [YouTube Transcript API](https://supadata.ai/youtube-transcript-api), [TikTok Transcript API](https://supadata.ai/tiktok-transcript-api), [Instagram Transcript API](https://supadata.ai/instagram-transcript-api), and [X (Twitter) Transcript API](https://supadata.ai/twitter-transcript-api). When a video has no captions, the [AI Transcription API](https://supadata.ai/video-transcript-api) generates one, and it works on direct video file URLs too. - **Video and channel metadata**: titles, descriptions, authors, views, likes, and comments as clean JSON, a simpler [YouTube Data API alternative](https://supadata.ai/youtube-api) that also covers TikTok, Instagram, X, and Facebook. - **Structured data from video**: give a prompt or a JSON schema and the [Video Analysis API](https://supadata.ai/video-analysis-api) returns structured output that accounts for visuals, audio, and context. - **Web context**: scrape any page to Markdown, map a site's URLs, or crawl a whole site for RAG and research. See the [web scraping docs](https://docs.supadata.ai). ## Verify the connection Ask your client: > Get the transcript of https://www.youtube.com/watch?v=dQw4w9WgXcQ and summarize it in three bullet points. You should see a `supadata_transcript` tool call and a real summary. ## What the tools do The server exposes 9 tools in four groups. - **Transcripts**: `supadata_transcript` (get a transcript from a YouTube, TikTok, Instagram, X, or Facebook video URL, or from a direct file URL; uses existing captions when available and falls back to AI transcription when there are none), `supadata_check_transcript_status` (poll an asynchronous transcript job by its job ID; long videos return a job instead of an immediate result). - **Metadata**: `supadata_metadata` (title, author, and engagement stats for a social media post or video). - **Video analysis**: `supadata_extract` (start an AI structured-data extraction job for a video, driven by your prompt or schema), `supadata_check_extract_status` (poll an extraction job by its job ID and read the extracted data). - **Web**: `supadata_scrape` (scrape a web page and return its content as Markdown), `supadata_map` (map a website and return the list of URLs found), `supadata_crawl` (start a crawl job for a whole site), `supadata_check_crawl_status` (poll a crawl job by its job ID and read the crawled pages). Transcripts of long videos, extractions, and crawls are asynchronous: the first call returns a job ID, and you read the result with the matching `check_*_status` tool. Costs: tools spend your regular Supadata credits at the same prices as the API. A native transcript costs 1 credit, an AI-generated transcript costs 2 credits per minute of video, and checking job status is free. The free plan includes 100 credits a month with no credit card required. The [pricing page](https://supadata.ai/pricing) has the details. ## Or skip MCP The same capabilities are available as a plain REST API with [TypeScript and Python SDKs](https://docs.supadata.ai/integrations/overview) and no-code integrations for [Make, Zapier, n8n, and Active Pieces](https://supadata.ai/nocode). To try it without writing code, use the [playground](https://supadata.ai/playground) or the free tools: [YouTube Transcript Generator](https://supadata.ai/youtube-transcript), [TikTok Transcript Generator](https://supadata.ai/tiktok-transcript), [Instagram Transcript Generator](https://supadata.ai/instagram-transcript), [Facebook Transcript Generator](https://supadata.ai/facebook-transcript), and [Video Transcript Generator](https://supadata.ai/video-transcript). ## For AI agents reading this - Docs index: [docs.supadata.ai/llms.txt](https://docs.supadata.ai/llms.txt) - MCP setup guide: [docs.supadata.ai/integrations/mcp](https://docs.supadata.ai/integrations/mcp) - Hosted endpoint: `https://api.supadata.ai/mcp` (OAuth) - Source: [github.com/supadata-ai/mcp](https://github.com/supadata-ai/mcp) ## Docs and support - [MCP landing page](https://supadata.ai/mcp) and [connect guide](https://docs.supadata.ai/integrations/mcp) - [Documentation](https://docs.supadata.ai) - [Best YouTube Transcript API](https://supadata.ai/blog/best-youtube-transcript-api) (comparison guide) - [Status](https://status.supadata.ai) and [changelog](https://feedback.supadata.ai/changelog) - [GitHub issues](https://github.com/supadata-ai/mcp/issues) and [support](https://feedback.supadata.ai) - [Privacy](https://supadata.ai/legal/privacy) and [terms](https://supadata.ai/legal/terms)
Query your warehouse or a CSV with Claude/ChatGPT over MCP, governed by table-level ACL + audit.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Hosted Notion MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceGives AI agents headless, token-authenticated read/write access to a Notion workspace through MCP, using three context-efficient tools that cover 47 operations across pages, databases, blocks, templates, comments, users, and files. Supports creating and editing pages, querying and filtering databases, batch mutations with rollback and idempotency, markdown round-trips, and image/file uploads, runnable over stdio or HTTP in CI and self-hosted deployments.2,491 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents and MCP-compatible clients to read and write Notion content—creating pages, querying databases, appending blocks, applying templates, commenting, and uploading files—using a token-based, headless setup. It exposes a compact three-tool interface that keeps context usage low while supporting batched, idempotent operations.2,491 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents and MCP clients to read and write a Notion workspace through a single token, covering pages, databases, blocks, comments, templates, and file uploads. It keeps the model's context small by exposing three tools and fetching operation schemas on demand, while supporting batched, idempotent mutations and headless use in CI or self-hosted deployments.2,491 npmMIT
- AlicenseNot gradedqualityAmaintenanceGives MCP clients such as Claude, Cursor, VS Code and Codex token-authenticated read/write access to a Notion workspace, so agents can search, create and edit pages, query databases, manage blocks and comments, and upload files in plain language. It is built for unattended automation with batched, idempotent writes, markdown round-tripping, retry on rate limits, and a low context footprint.2,491 npmMIT

