Skip to main content
Glama
dkautomation23

mcp-data-server

mcp-data-server

Beispielprojekt, das produktive Web-Scraping- / Automatisierungsmuster demonstriert.

Ein MCP-Server, der Claude (oder einem anderen MCP-Client) schreibgeschützten Zugriff auf eine Geschäftsdatenbank gewährt — mit den Sicherheitsvorkehrungen, die erforderlich sind, um eine KI mit echten Unternehmensdaten zu verbinden: schreibgeschützte Verbindung, Tabellen-Whitelist, Maskierung personenbezogener Daten, Zeilenbegrenzungen, Abfrage-Timeout und ein vollständiges Audit-Log.

Fragen Sie "Welche Länder bestellen am meisten, und wie viel haben uns Rückerstattungen im letzten Quartal gekostet?" in Claude Desktop und erhalten Sie die Antwort aus der tatsächlichen Datenbank — ohne dass das Modell die Möglichkeit hat, eine Tabelle zu schreiben, zu löschen, anzuhängen oder zu lesen, die ihm nicht gewährt wurde.


Warum es das gibt

Das Hindernis bei den meisten Projekten zur „KI mit unseren Daten verbinden“ ist nicht die Verkabelung, sondern die erste Frage des Datenbank-Eigentümers: Was hindert sie daran, etwas zu lesen oder zu beschädigen, das sie nicht sollte? Dieser Server beantwortet diese Frage in Code.

Related MCP server: Database Assistant MCP Server

Vier unabhängige Barrieren

#

Barriere

Was sie verhindert

1

Verbindung geöffnet mode=ro

jegliches Schreiben, selbst wenn jede darüberliegende Prüfung umgangen wird

2

Anweisungsanalyse

mehrere Anweisungen, alles, was nicht SELECT / WITH ist

3

Keyword-Blockliste

ATTACH, PRAGMA, DDL, VACUUM, GRANT

4

Whitelist + Maskierung + Begrenzungen

nicht gewährte Tabellen, PII-Spalten, überdimensionierte Ergebnisse, ausufernde Abfragen

Jede ausgeführte Anweisung wird mit ihrer Zeilenanzahl und Dauer an das Audit-Log angehängt, sodass der Datenbank-Eigentümer genau sehen kann, wonach das Modell gefragt hat.

2026-08-18T11:22:41  6 rows in 1ms       SELECT country, COUNT(*) FROM customers GROUP BY 1 LIMIT 201
2026-08-18T11:22:44  error: rejected     DELETE FROM customers

Verfügbare Tools

Tool

Zweck

list_tables()

lesbare Tabellen + Zeilenanzahlen

describe_table(table)

Spalten, Typen, welche maskiert sind, 3 Beispielzeilen

run_sql(sql)

ein schreibgeschütztes SELECT, begrenzt und auditiert

search(table, column, term, limit)

Teilstringsuche ohne SQL zu schreiben

summarize_column(table, column)

Nullwerte, eindeutige Anzahl, Min/Max, Top-5-Werte

Zusätzlich eine schema://tables-Ressource, sodass ein Client das gesamte Schema laden kann, ohne einen Tool-Aufruf zu verbrauchen.

Schnellstart

git clone https://github.com/dkautomation23/mcp-data-server.git
cd mcp-data-server
python -m venv .venv && . .venv/bin/activate      # Windows: .venv\Scripts\activate
pip install -r requirements.txt

python -m mcp_data_server.seed                    # creates demo.db
cp .env.example .env                              # then point DATABASE_PATH at your file
python -m mcp_data_server                         # serves over stdio

Python 3.10+. Die Demo-Datenbank enthält customers, orders, order_items und eine bewusst sensible Tabelle internal_notes, die unten verwendet wird, um die Zugriffsblockade durch die Whitelist zu zeigen.

Mit Claude Desktop verbinden

Zu claude_desktop_config.json hinzufügen (vollständiges Beispiel in examples/claude_desktop_config.json):

{
  "mcpServers": {
    "business-data": {
      "command": "python",
      "args": ["-m", "mcp_data_server"],
      "cwd": "C:/path/to/mcp-data-server",
      "env": {
        "DATABASE_PATH": "C:/path/to/your.db",
        "ALLOWED_TABLES": "customers,orders,order_items",
        "MASKED_COLUMNS": "customers.email,customers.phone"
      }
    }
  }
}

Mit Claude Code verbinden

claude mcp add business-data -- python -m mcp_data_server

Wie eine Sitzung aussieht

Tatsächliche Ausgabe des laufenden Servers (siehe examples/demo_session.md für das vollständige Protokoll):

// run_sql("SELECT status, COUNT(*) n, ROUND(SUM(total_eur)) revenue FROM orders GROUP BY 1 ORDER BY 3 DESC")
{
  "sql": "SELECT status, COUNT(*) n, ROUND(SUM(total_eur)) revenue FROM orders GROUP BY 1 ORDER BY 3 DESC LIMIT 201",
  "columns": ["status", "n", "revenue"],
  "rows": [["paid", 92, 149914.0], ["pending", 39, 64596.0], ["refunded", 31, 45911.0]],
  "row_count": 3, "truncated": false, "elapsed_ms": 0
}

// run_sql("DELETE FROM customers")
{ "error": "only SELECT (or WITH ... SELECT) statements are allowed" }

// run_sql("SELECT * FROM internal_notes")
{ "error": "table 'internal_notes' is not in the allowlist (allowed: customers, orders, order_items)" }

// run_sql("SELECT id, name, email FROM customers LIMIT 2")
{ "rows": [[1, "Customer 001", "***"], [2, "Customer 002", "***"]] }

Konfiguration

Variable

Standard

Zweck

DATABASE_PATH

demo.db

SQLite-Datei, die bereitgestellt wird (immer schreibgeschützt geöffnet)

ALLOWED_TABLES

alle

Komma-getrennte Whitelist; alles andere ist unsichtbar

MASKED_COLUMNS

tabelle.spalte-Liste, die in jedem Ergebnis durch *** ersetzt wird

MAX_ROWS

200

harte Obergrenze pro Aufruf; Ergebnisse darüber werden als truncated gekennzeichnet

QUERY_TIMEOUT_SECONDS

10

eine längere Abfrage wird abgebrochen

AUDIT_LOG_PATH

audit.log

Nur-Anhängen-Protokoll jeder Anweisung; leer deaktiviert es

Tests

pytest -q
...............................                                          [100%]
31 passed in 1.77s

Drei Ebenen: die SQL-Sicherheitsvorkehrungen (Injection, zweite Anweisungen, Kommentar-Schmuggel, verbotene Tabellen), die Datenbankebene gegen eine echte, vorbefüllte Datei (einschließlich eines Schreibversuchs, den SQLite selbst ablehnt), und sieben Tests, die den Server über das tatsächliche MCP-Protokoll steuern — denselben Handshake, list_tools und call_tool-Ablauf, den ein Desktop-Client durchführt.

Anpassung an den Stack eines Kunden

  • Postgres / MySQL: Ersetzen Sie die Verbindung in db.py durch einen gepoolten Treiber und eine SET TRANSACTION READ ONLY-Sitzung; die Validierungsebene bleibt unverändert.

  • Geschäftsspezifische Tools: Fügen Sie eine Funktion mit @mcp.tool() in server.py hinzu — ein gut benanntes top_customers(period) ist besser, als das Modell SQL schreiben zu lassen.

  • HTTP-Transport anstelle von stdio: mcp.run(transport="streamable-http"), dann hinter Ihrer eigenen Authentifizierung platzieren.

Lizenz

MIT — siehe LICENSE.

A
license - permissive license
-
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    -
    quality
    A
    maintenance
    Provides a read-only PostgreSQL SQL surface for LLM agents via MCP, with defense-in-depth security layers for safe database queries.
    3
    MIT
  • F
    license
    A
    quality
    C
    maintenance
    Enables read-only exploration and querying of PostgreSQL or MySQL databases via MCP, with schema discovery, safe SQL validation, natural language to SQL conversion, and CSV export.
    11
    1
  • A
    license
    -
    quality
    B
    maintenance
    Enables governed, agent-agnostic data exploration by allowing users to ask natural language questions through MCP-compatible agents, executing safe, permission-scoped queries against data sources and returning interactive charts.
    48
    Apache 2.0
  • F
    license
    -
    quality
    C
    maintenance
    Enables read-only access to company data across PostgreSQL, MongoDB Atlas, and flat files through MCP tools, allowing AI assistants to query and retrieve information via natural language.

View all related MCP servers

Related MCP Connectors

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/dkautomation23/mcp-data-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server