Supabase
MCP server for interacting with the Supabase platform
Beschreibung vom Entwickler (englisches Original)
MCP server for natural-language queries against SAP CAP db-layer entities via real CQN/SQL JOINs.
Diese drei werden nie zu einer Punktzahl zusammengefasst: Meinungen, Messungen und Beliebtheit sind verschiedene Dinge.
Für diesen Server haben wir noch keine Zusammenfassung in einfacher Sprache geschrieben. Unten stehen die Fakten, die wir aus der Registry gelesen haben.
Wähle die KI-App, die du nutzt, und kopiere die Einstellungen.
ANTHROPIC_API_KEY, OPENAI_API_KEY, MCP_ALLOWED_ENTITIES, MCP_BLOCKED_COLUMNSAls geheim markierte Werte sind Schlüssel zu deinem Konto. Gib sie nie weiter und füge sie nie in einen Chat ein.
Du brauchst
Welche App nutzt du?
Wähle oben deine App. Wir merken sie uns, damit der Button beim nächsten Mal „In … installieren“ anzeigt.
Öffne Claude Desktop → Settings → Developer → Edit Config und füge dies in claude_desktop_config.json ein
{
"mcpServers": {
"cds-db-nlquery": {
"command": "npx",
"args": [
"-y",
"@shahid.la/cds-db-nlquery-mcp"
],
"env": {
"ANTHROPIC_API_KEY": "your-value",
"OPENAI_API_KEY": "your-value",
"MCP_ALLOWED_ENTITIES": "your-value",
"MCP_BLOCKED_COLUMNS": "your-value"
}
}
}
}Führe das in deinem Terminal aus
claude mcp add cds-db-nlquery --env ANTHROPIC_API_KEY=your-value --env OPENAI_API_KEY=your-value --env MCP_ALLOWED_ENTITIES=your-value --env MCP_BLOCKED_COLUMNS=your-value -- npx -y @shahid.la/cds-db-nlquery-mcpTrag die leeren Werte ein, bevor du ihn startest.
In .cursor/mcp.json in deinem Projekt oder in ~/.cursor/mcp.json einfügen
{
"mcpServers": {
"cds-db-nlquery": {
"command": "npx",
"args": [
"-y",
"@shahid.la/cds-db-nlquery-mcp"
],
"env": {
"ANTHROPIC_API_KEY": "your-value",
"OPENAI_API_KEY": "your-value",
"MCP_ALLOWED_ENTITIES": "your-value",
"MCP_BLOCKED_COLUMNS": "your-value"
}
}
}
}Dein Browser fragt, ob er die App öffnen darf, dann zeigt die App die Einstellungen und bittet dich um Bestätigung. Schlüsselwerte bleiben leer, damit du sie selbst einträgst.
In .vscode/mcp.json in deinem Projekt einfügen
{
"servers": {
"cds-db-nlquery": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@shahid.la/cds-db-nlquery-mcp"
],
"env": {
"ANTHROPIC_API_KEY": "your-value",
"OPENAI_API_KEY": "your-value",
"MCP_ALLOWED_ENTITIES": "your-value",
"MCP_BLOCKED_COLUMNS": "your-value"
}
}
}
}Dein Browser fragt, ob er die App öffnen darf, dann zeigt die App die Einstellungen und bittet dich um Bestätigung. Schlüsselwerte bleiben leer, damit du sie selbst einträgst.
Dieser Server läuft auf deinem Computer, und ChatGPT kann sich nur mit Servern im Internet verbinden. Wähle eine andere App.
Deine Auswahl bleibt in einem Cookie auf diesem Gerät; kein Konto nötig.
MCP_ALLOWED_ENTITIES envMCP_BLOCKED_COLUMNS envDiese Einstellungen werden aus dem Registry-Eintrag des Entwicklers erzeugt. Wenn in der README etwas anderes steht, folge der README.
Läuft auf deinem Computer; die Tool-Liste erscheint nach der Installation in deiner KI-App.
Wir prüfen Informationen, die jeder sehen kann; den Code haben wir nicht gelesen. Checks, die nicht zutreffen, werden nicht mitgezählt. · Geprüft am 8. Nov. 2026
Der Registry-Name wurde mit dem GitHub-Konto shahidla bestätigt, dem das Repo gehört
Dieses Repo haben wir noch nicht von GitHub gelesen
Dieses Repo haben wir noch nicht von GitHub gelesen
Dieser Server läuft auf deinem Computer; es gibt keinen Endpunkt im Internet
Läuft auf deinem Computer und nutzt stattdessen lokale Einstellungen
Läuft auf deinem Computer; Tool-Listen können wir nur von Endpunkten im Internet lesen
Verglichen mit allen aktiven Servern dieser Kategorie in der Registry. Sterne zählen nur, wenn dem Herausgeber das Repo gehört.
Er hat 1 von 1 zutreffenden Basischecks bestanden. Den Code haben wir nicht gelesen. Bevor du einen Schlüssel oder Token hinzufügst, sieh nach, welche Zugriffe der Server verlangt, und nutze einen Schlüssel, der nur die Berechtigungen hat, die du brauchst.
Das musst du eintragen: ANTHROPIC_API_KEY, OPENAI_API_KEY
Er läuft auf deinem Computer. Deine KI-App startet ihn bei Bedarf, und die Daten laufen nicht über die Server des Entwicklers (außer der Server ruft selbst einen Onlinedienst auf).
Das GitHub-Repo wurde zuletzt – geändert, und die neueste Version (0.7.3) kam vor 5 Monaten in die Registry.
Apps, die MCP unterstützen, etwa Claude Desktop, Claude Code, Cursor und VS Code. Außerdem brauchst du Node.js auf deinem Computer.
In derselben Kategorie: Supabase, MongoDB MCP Server, Elasticsearch MCP Server
Server derselben Kategorie von anderen Entwicklern, sortiert nach Sternen.
So liest du eine Karte:★ GitHub-SterneiDrei Säulen: Bewertungen · Checks · NutzungiAktualisiert = neueste Version in der Registry veröffentlichti
MCP server for interacting with the Supabase platform
MongoDB Model Context Protocol Server
MCP server for interacting with Elasticsearch
Unverändert aus dem Repo des Entwicklers übernommen. PopNx MCP hat den Inhalt weder geprüft noch empfiehlt es ihn. HTML, Bilder und Skripte wurden entfernt. Links führen von dieser Website weg.
MCP server for natural language queries against CDS db-layer entities (db/schema.cds).
Ask questions about your database in plain English. The server discovers your schema automatically, generates real SQL JOINs using CDS, and returns rows. No hardcoded queries, no SQL, no schema configuration. Bring your own LLM: Anthropic or OpenAI, or any OpenAI-compatible endpoint (Azure OpenAI, Groq, Ollama, local models, etc.).
Targets the `db/` layer, not OData services. If your entities are exposed as OData services, use an MCP package that targets the service layer instead.
Read-only. This package only executes SELECT queries. No INSERT, UPDATE, or DELETE.
@sap/cds >= 71. Install in your CAP project
npm install @shahid.la/cds-db-nlquery-mcp
2. Create `.mcp.json` in your CAP project root (same folder as package.json)
{
"mcpServers": { "cds-db-nlquery": { "command": "npx", "args": ["-y", "@shahid.la/cds-db-nlquery-mcp"], "cwd": "/absolute/path/to/your/cap/project", "env": { "ANTHROPIC_API_KEY": "sk-ant-..." } } } }
Set cwd to the absolute path of your CAP project root, where db/schema.cds lives. See LLM provider for using OpenAI, Gemini, or another provider instead.
npx -y re-resolves the package on every server start (from npm's cache once downloaded, not a fresh network fetch each time, but still an extra resolution step). If you've run npm install @shahid.la/cds-db-nlquery-mcp already, you can point "command" at the installed binary directly instead, node_modules/.bin/cds-db-nlquery-mcp, for a slightly more predictable startup, especially in production.
3. Open your project in Claude Code and ask a question
Which customers have a DTI ratio above 5?
Show me all open payments overdue by more than 30 days, include the borrower name. List all loans in the MINING sector with the customer's current DTI ratio.
Example response: the server tells the client to render rows as a vertical field/value list, not a markdown table (real output, verified against a live deployment):
Found 3 customers with DTI above 5:
PARTNER : 30100003 DTI_RATIO : 7.20 BU_SORT1 : Domestic Customer AU 3
PARTNER : 30100001 DTI_RATIO : 5.80 BU_SORT1 : Domestic Customer AU 1
PARTNER : 30100002 DTI_RATIO : 5.40 BU_SORT1 : Domestic Customer AU 2
When you ask a question:
natural_language_query tool with your question.customer.BU_SORT1) generate real SQL JOINs, executed by your database, not by JavaScript. Scales to production data volumes.The LLM call in step 2 is a small, cheap planning step (translating your question into JSON). It does not need a large or expensive model. A fast/cheap tier model is recommended.
All configuration is via environment variables in the .mcp.json env block.
{
"mcpServers": { "cds-db-nlquery": { "command": "npx", "args": ["-y", "@shahid.la/cds-db-nlquery-mcp"], "cwd": "/path/to/your/cap/project", "env": { "ANTHROPIC_API_KEY": "sk-ant-...", "MCP_ALLOWED_ENTITIES": "Customers,Orders,Products", "MCP_BLOCKED_COLUMNS": "PASSWORD,EMBEDDING,SSN", "MCP_MAX_ROWS": "100", "MCP_MODEL_PATH": "db" } } } }
| Variable | Default | Description |
|---|---|---|
MCP_ALLOWED_ENTITIES | *(all entities)* | Comma-separated list of entity short names, the name after the last dot in the FQN (e.g. Customers, not my.app.Customers). Leave unset during development; always set for production. |
MCP_BLOCKED_COLUMNS | *(none)* | Comma-separated column names to exclude from all results. Stripped before the query runs. Useful for columns like EMBEDDING, PASSWORD, SSN. |
MCP_MAX_ROWS | 500 | Maximum rows per query. Enforced as a SQL LIMIT, not a post-fetch filter. |
MCP_MODEL_PATH | db | Path to your CDS model folder or file, relative to cwd. Change if your schema is at model/, srv/, etc. |
MCP_DB_USER / MCP_DB_PASSWORD | *(consumer app's own DB user)* | Connect with a different HANA user than your app's runtime user. Host/port/schema are reused, only credentials are overridden. See Security → Production for why this matters. |
A small LLM call translates your question into a query descriptor. Bring your own provider, set ONE of the following in the env block:
Anthropic (Claude):
"env": {
"ANTHROPIC_API_KEY": "sk-ant-...", "ANTHROPIC_MODEL": "claude-haiku-4-5-20251001" }
OpenAI, or any OpenAI-compatible provider:
"env": {
"OPENAI_API_KEY": "sk-...", "OPENAI_MODEL": "gpt-4o-mini" }
OPENAI_MODEL accepts any model name. Use whatever your provider expects. Set OPENAI_BASE_URL to point at a different OpenAI-compatible endpoint:
| Provider | OPENAI_BASE_URL | Example OPENAI_MODEL |
|---|---|---|
| OpenAI | *(omit, uses default)* | gpt-4o-mini |
| Google Gemini | https://generativelanguage.googleapis.com/v1beta/openai/ | gemini-2.0-flash |
| Groq | https://api.groq.com/openai/v1 | llama-3.1-8b-instant |
| Mistral | https://api.mistral.ai/v1 | mistral-small-latest |
| DeepSeek | https://api.deepseek.com | deepseek-chat |
| xAI (Grok) | https://api.x.ai/v1 | grok-2-latest |
| Azure OpenAI | your Azure endpoint | your deployment name |
| Ollama (local) | http://localhost:11434/v1 | llama3.1 (API key can be any non-empty string) |
| Variable | Description |
|---|---|
LLM_PROVIDER | "anthropic" or "openai". Auto-detected from whichever API key is set, only needed if both are set and you want to force one. |
ANTHROPIC_API_KEY / ANTHROPIC_MODEL | Anthropic native API |
OPENAI_API_KEY / OPENAI_MODEL / OPENAI_BASE_URL | OpenAI or any OpenAI-compatible endpoint |
This is a planning-only call (question to JSON descriptor). A fast/cheap tier model is sufficient and recommended.
The server uses your project's existing database connection, whatever CDS has configured in default-env.json or your service binding. No extra setup needed.
Important: this package queries the database directly via cds.run(). It does not go through the CAP service layer, so CAP @requires and @restrict annotations are not enforced. Access control is entirely your responsibility at the database and configuration level.
Step 1: Create a dedicated read-only database user
-- Run as DBADMIN in SAP HANA Cloud Central
CREATE USER MCP_READER PASSWORD 'your-password'; GRANT SELECT ON SCHEMA YOUR_HDI_SCHEMA TO MCP_READER;
-- Revoke tables you do not want queryable REVOKE SELECT ON "YOUR_HDI_SCHEMA"."your.AuditLog" FROM MCP_READER; REVOKE SELECT ON "YOUR_HDI_SCHEMA"."your.RegulatoryDocuments" FROM MCP_READER;
This user can only read. No write access. HANA itself enforces it, independently of this package.
Step 2: Point the server at it with `MCP_DB_USER`/`MCP_DB_PASSWORD`
The server connects with these credentials instead of inheriting your app's own database connection. Host, port, and schema are reused automatically, only the user/password are overridden:
"env": {
"MCP_DB_USER": "MCP_READER", "MCP_DB_PASSWORD": "your-password" }
If you keep these in a separate gitignored file instead of directly in .mcp.json, that's fine too. The server just reads process.env, same as any other variable here.
Step 3: Set `MCP_ALLOWED_ENTITIES`
"env": {
"MCP_ALLOWED_ENTITIES": "Customers,Orders,Products" }
This is enforced on the entity you query directly and on any entity reached via an association join in select/where. For example, if Customers isn't in the allowlist, a query against Orders can't read Customers data through a customer.NAME join path either. The database user restricts access at the HANA level; MCP_ALLOWED_ENTITIES adds a second layer at the application level. Use both.
The server reads CDS associations from your schema. When the LLM references customer.BU_SORT1 in a query, CDS generates a real SQL JOIN, executed by the database.
Multiple associations in one query work:
*"Show loans in the MINING sector with borrower name and current DTI"*
Generates a single SQL statement joining Loans → BusinessPartners → BCA_DTI in one database round-trip.
One constraint: do not select the same column name from two different entities in the same query (e.g. LOAN_ID from both the main entity and a joined entity). The database rejects duplicate column names. Claude is instructed to avoid this, but worth being aware of.
Most filters compare a column to a fixed value (DTI_RATIO > 5). For questions like *"which loans have collateral worth less than the loan amount"*, the comparison is between two columns instead. Use valCol in place of val:
{ "col": "collateral.VALUE", "op": "<", "valCol": "AMOUNT" }
Either side can be an association path. This is handled by the same join mechanism as everything else. No separate query, no JavaScript-side comparison.
If a column has a @Common.Text value-help association (see Coded values), filter via the text field directly rather than guessing the underlying code:
{ "col": "status.TEXT", "op": "like", "val": "Active" }
like is case-insensitive (enforced via UPPER() on both sides, not relying on database collation), so the exact case of the value doesn't need to match.
The LLM only sees what's in your CDS model: column names, types, and any labels you've annotated. Plain code comments (// customer name) are invisible to it. Without a label, an ambiguous column name can cause the LLM to guess wrong, regardless of how capable the model is.
@title: reused automatically, zero extra workIf your schema already has SAP's standard @title annotation (common in projects with a Fiori UI or OData service), the server picks it up automatically. You don't need to do anything:
entity Customers {
key PARTNER : String(10); @title: 'Customer Name' BU_SORT1 : String(40); }
@NLP.label: for disambiguation @title isn't meant forUse this when you need to tell the LLM something a UI-facing label shouldn't say, e.g. "don't use this column for X." This was a real bug we hit: a BU_TYPE code column (1=person, 2=organisation) was being picked by the LLM whenever a question asked for a customer's "name," because nothing told it otherwise. The fix:
entity Customers {
key PARTNER : String(10); @NLP.label: 'Partner type code: 1=person, 2=organisation. NOT a name, never use for name lookups' BU_TYPE : String(2); @NLP.label: 'Customer / business partner full name, use this whenever a question asks for a name' BU_SORT1 : String(40); }
After adding the
Nur der Anfang wird gezeigt; den Rest findest du im Repo