Supabase
MCP server for interacting with the Supabase platform
作者による説明(英語の原文)
Governed warehouse context for agents: docs, lineage, freshness and read-only, PII-safe SQL.
この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。
このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。
使っているAIアプリを選んで、設定をコピーしてください。
必要なもの
どのアプリを使っていますか?
上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。
Claude Desktop → Settings → Developer → Edit Config を開き、claude_desktop_config.json にこれを貼り付けます
{
"mcpServers": {
"warehouse-context": {
"command": "uvx",
"args": [
"warehouse-context-mcp",
"--demo"
]
}
}
}ターミナルでこれを実行します
claude mcp add warehouse-context -- uvx warehouse-context-mcp --demoプロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます
{
"mcpServers": {
"warehouse-context": {
"command": "uvx",
"args": [
"warehouse-context-mcp",
"--demo"
]
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
プロジェクトの .vscode/mcp.json に貼り付けます
{
"servers": {
"warehouse-context": {
"type": "stdio",
"command": "uvx",
"args": [
"warehouse-context-mcp",
"--demo"
]
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
これはパソコンで動くサーバーですが、ChatGPTがつなげるのはインターネット上のサーバーだけです。ほかのアプリを選んでください。
選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。
この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。
パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。
誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月7日にチェック
レジストリ名は、リポジトリを所有するGitHubアカウント AndreMuraro で確認済みです
このリポジトリはまだGitHubから読み取っていません
このリポジトリはまだGitHubから読み取っていません
これはパソコンで動くため、インターネット上のエンドポイントはありません
パソコンで動き、代わりにローカルの設定を使います
パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです
レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。
当てはまる基本チェック1項目のうち1項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。
レジストリには必須のキーは載っていません。ただし、最初に使うときにサインインを求めるサーバーもあります。
あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。
GitHubリポジトリの最終更新は–、最新バージョン(0.5.1)がレジストリに届いたのは昨日です。
Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにPython (uv)も必要です。
同じカテゴリには:Supabase, MongoDB MCP Server, Elasticsearch MCP Server
同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。
カードの見方:★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i
MCP server for interacting with the Supabase platform
MongoDB Model Context Protocol Server
MCP server for interacting with Elasticsearch
作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。
An MCP server that gives AI agents trustworthy, governed context about a data warehouse: what each table means, where it comes from, how fresh it is, and a way to query it that cannot write, cannot run away, and cannot leak personal data.
Coding and analytics agents are good at SQL and bad at knowing *which* table to trust. Schema alone does not tell them that fct_voyage_economics is the governed source for TCE, that stg_voyages is staging, that contact_email is personal data, or that a table stopped updating two days ago. This server puts that context one tool call away, and puts guardrails around everything else.
| Tool | What the agent gets |
|---|---|
list_tables | Every table with its documented purpose and owner |
describe_table | Columns, types, descriptions, PII flags, grain, row count, undocumented columns |
table_lineage | Upstream sources and downstream consumers, cycle-safe, depth-limited |
table_freshness | Last update, age, and whether it meets the documented expectation |
sample_rows | A few example rows, PII masked |
run_query | One read-only SELECT, row-limited, with PII protected |
| Backend | Status | Native context it reads | Read-only connection layer |
|---|---|---|---|
| DuckDB | v0.1 | none (YAML catalog only) | file opened read_only |
| Snowflake | v0.2 | table/column comments, pii object tags | a SELECT-only role (WCM_READER in the demo script) |
| Databricks | v0.2 | Unity Catalog comments, pii column tags | a principal with only USE + SELECT grants |
Comments and tags stored in the warehouse are merged with the curated YAML catalog: curated values win, native ones fill the gaps, and a PII flag from either source sticks.
Every query an agent sends is treated as written by an attacker, since agents can be prompt-injected by what they read. Protection comes in independent layers, each tested on its own:
LATERAL, SUMMARIZE, recursive CTEs and every vendor function such as SYSTEM$…, READ_FILES, SECRET, HTTP_REQUEST or GETENV.* is expanded and every column must resolve to a real column of a known table, through aliases, CTEs and subqueries; a whole row used as a value is refused.'***' before the query is sent, so the value never leaves the warehouse. It can be counted (COUNT(DISTINCT email)), but filtering, sorting, grouping or computing on it is refused, so its values cannot be guessed one test at a time.USE and SELECT grants.Scope: only tables in the configured schema; names are compared after the dialect's own case rules and every table is fully qualified in the SQL that runs.
PII tags stored in the warehouse (Snowflake tags, Unity Catalog column tags) are merged with the curated catalog, must be readable at startup (fail closed), and are refreshed every 10 minutes. For production data, also use warehouse-native masking (masking policies or column masks): the server's masking is defence in depth.
The queries an independent review used to break an earlier version live in tests/attacks/ and run on every commit. See the threat model, ADR 0004 and SECURITY.md.
Try it without cloning (needs uv); --demo serves a bundled, fully synthetic shipping warehouse that is built on first run:
uvx warehouse-context-mcp --demo
Also on PyPI, as a container image (ghcr.io/andremuraro/warehouse-context-mcp), and in the MCP Registry as io.github.AndreMuraro/warehouse-context-mcp. Releases carry build provenance; see SECURITY.md.
Clone the repository and it is already configured: .mcp.json (Claude Code), .vscode/mcp.json (VS Code) and .codex/config.toml (Codex) each start the demo server. Each client asks before trusting a project's servers.
To add it everywhere instead:
| Client | Command or config |
|---|---|
| Claude Code | claude mcp add --scope user warehouse -- uvx warehouse-context-mcp --demo |
| Claude Desktop | claude_desktop_config.json: "warehouse": {"command": "uvx", "args": ["warehouse-context-mcp", "--demo"]} under mcpServers |
| VS Code | user mcp.json: "warehouse": {"type": "stdio", "command": "uvx", "args": ["warehouse-context-mcp", "--demo"]} under servers |
| Codex | codex mcp add warehouse -- uvx warehouse-context-mcp --demo |
| Any client, over HTTP | docker compose up, then point it at http://127.0.0.1:8000/mcp |
The repository is also a Claude Code plugin marketplace. The plugin bundles the server and a warehouse-context skill that teaches the agent the workflow (find, describe, check freshness, query, cite the executed SQL) and how to respond to refusals:
/plugin install warehouse-context --marketplace AndreMuraro/warehouse-context-mcp
The same skill is checked in for project use: .claude/skills/ (Claude Code), .agents/skills/ (Codex) and both are read by VS Code. Or copy plugins/warehouse-context/skills/warehouse-context/ into your personal skills folder.
Replace --demo with --backend snowflake or --backend databricks (and the settings below) for a real warehouse.
Then ask: *"Which vessel class had the best average TCE last quarter, and is that table fresh?"*
Requires uv; it installs Python 3.14 if missing.
uv sync --all-extras # creates .venv from uv.lock
uv run pytest
uv sync --extra snowflake # or --extra databricks, or --all-extras
cp .env.example .env # fill in your own values; .env is git-ignored
uv run warehouse-context-mcp --backend snowflake --catalog path/to/catalog.yaml
Settings come from SNOWFLAKE_* / DATABRICKS_* environment variables or ./.env; real environment variables win, and blank values count as unset. Key-pair auth for Snowflake: uv run scripts/snowflake_keypair.py prints the one ALTER USER statement to run.
If you use Snowflake CLI, point the server at one of its connections instead of repeating the account and sign-in details:
# connections.toml (~/.snowflake/, or %USERPROFILE%\AppData\Local\snowflake\ on Windows)
[wcm] account = "orgname-accountname" user = "you" authenticator = "SNOWFLAKE_JWT" private_key_file = "~/.snowflake/snowflake_key.p8"
snow sql -c wcm -f examples/snowflake_demo.sql # one-time demo setup, as an admin role
SNOWFLAKE_CONNECTION_NAME=wcm SNOWFLAKE_ROLE=WCM_READER uv run warehouse-context-mcp --backend snowflake
The connection supplies the account and sign-in; any SNOWFLAKE_* value you set overrides it, and this package's defaults never do. After connecting, the server adopts the session's actual database and schema, and refuses admin roles (ACCOUNTADMIN, SYSADMIN, …), so a CLI connection kept for admin work cannot bypass the SELECT-only role.
Live tests run the demo expectations against a real warehouse and are skipped otherwise:
WCM_LIVE=snowflake uv run pytest -m live
On Windows the same commands work in PowerShell; set the variable with $env:WCM_LIVE = "snowflake".
On the Databricks Free Edition the personal access token belongs to the workspace admin, so the read-only connection layer is not available there; the query policy still applies. In a real workspace, use a service principal with only USE and SELECT grants.
| 3.14 | 3.15 | |
|---|---|---|
| Core, DuckDB | ✓ | ✓ |
| Databricks extra | ✓ | ✓ (lz4 and thrift build from source) |
| Snowflake extra | ✓ | not yet: no 3.15 wheels, and the source build fails; the extra is skipped by an environment marker |
By default the server speaks MCP over stdio: the client launches it. With --transport http it runs as a long-lived Streamable HTTP service instead, with stateless JSON responses and a /healthz endpoint:
uv run warehouse-context-mcp --demo --transport http --port 8000
claude mcp add --transport http warehouse http://127.0.0.1:8000/mcp
The HTTP transport has no authentication. DNS-rebinding protection stays on even when bound to every interface: only requests whose Host header names localhost, or a name passed with --allowed-host, are served. Publish it on loopback, or put an authenticating proxy in front.
docker compose up --build # demo warehouse at http://127.0.0.1:8000/mcp
docker run --rm -i warehouse-context-mcp:local # or stdio, for clients that launch a command
The image is built from uv.lock, runs as a non-root user, and contains every backend plus the synthetic demo warehouse. Compose runs it with a read-only filesystem, no Linux capabilities and no-new-privileges, and publishes ports on 127.0.0.1 only.
For a real warehouse, fill in .env and start a profile. Credentials reach the container as secret files under /run/secrets, not as environment variables:
docker compose --profile snowflake up --build # :8001, key-pair sign-in (no browser in a container)
docker compose --profile databricks up --build # :8002, token from DATABRICKS_TOKEN
SNOWFLAKE_ACCOUNT, SNOWFLAKE_USER and the key file at SNOWFLAKE_PRIVATE_KEY_PATH; Snowflake CLI connection names are a host-only convenience.WCM_UID=$(id -u) WCM_GID=$(id -g) docker compose ....ghcr.io/andremuraro/warehouse-context-mcp.CI builds the image, checks the stdio transport, brings the Compose service up until healthy, calls a tool over HTTP, confirms a foreign Host header is refused, and verifies the container is non-root and read-only.
Meaning lives in a YAML file reviewed in Git like code (the demo's catalog):
tables:
fct_voyage_economics: description: Time-charter-equivalent economics per voyage. owner: freight-analytics grain: voyage_id upstream: [stg_voyages] freshness_column: computed_at expected_freshness_hours: 12 columns: tce_usd_per_day: { description: TCE in USD per day. }
--dbt-manifest target/manifest.json reads the docs a dbt project already has: model, seed, snapshot and source descriptions, column descriptions, owner and grain from meta, lineage from depends_on, source freshness from loaded_at_field and warn_after, and
冒頭だけを表示しています。続きはリポジトリで読めます