Skip to main content
Glama

workbench-mcp

Ein lokaler Python-MCP-Server für interaktive PostgreSQL-Datenexploration, API-Integration und Automatisierung auf Fedora/Linux-Systemen.

Übersicht

Version 1 enthält:

  • Einrichtung einer Python-virtuellen Umgebung für Fedora/Linux-Systeme

  • PostgreSQL 18-Konnektivität, konfiguriert über eine .env-Datei

  • MCP-Tools für:

    • Erkennung von Tabellen, Spalten und Schemastrukturen

    • Ausführung von schreibgeschützten Abfrage-Vorschauen

    • Ausführung von geschützten SQL-Batches mit Unterstützung für temporäre Tabellen

    • Aufruf von gespeicherten PostgreSQL-Funktionen und -Prozeduren

    • Zugriff auf externe APIs über vollständige URL-Anfragen

    • Ausführung von Bash-Skripten, die im PATH verfügbar sind

  • Durchgesetzte Sicherheit: Dauerhafte Schema- und Datenänderungen sind blockiert

  • Sitzungsbezogene Workflows für temporäre Tabellen innerhalb von SQL-Batches werden unterstützt

Related MCP server: PostgreSQL MCP Server

Fedora / Linux-Einrichtung

Beginnen Sie mit der Installation der erforderlichen Systempakete:

sudo dnf install -y python3 python3-pip nodejs npm

Python 3.12 oder neuer ist erforderlich. Verwenden Sie pyenv oder Ähnliches, wenn Sie mehrere Versionen verwalten.

Einrichtung der virtuellen Umgebung

Erstellen und aktivieren Sie im Projektstammverzeichnis eine virtuelle Python-Umgebung:

python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
pip install -e .

Umgebungsvariablen

Kopieren Sie die Beispielkonfiguration und tragen Sie die PostgreSQL-Verbindungsdetails ein:

cp .env.example .env

Erforderlich:

  • DB_HOST — Hostname des PostgreSQL-Servers

  • DB_NAME — Datenbankname

  • DB_USER — Datenbank-Benutzername

  • DB_PASSWORD — Datenbank-Passwort

Optional (Optimierung):

  • DB_PORT — Verbindungsport (Standard: 5432)

  • DB_SSLMODE — SSL-Modus (Standard: prefer)

  • DB_APPLICATION_NAME — Anwendungsbezeichner

  • DB_QUERY_TIMEOUT_SECONDS — Abfrage-Timeout (Standard: 30)

  • DB_MAX_ROWS — Maximale Zeilenanzahl pro Ergebnismenge (Standard: 100)

  • DB_MAX_RESULT_SETS — Maximale Ergebnismengen pro Batch (Standard: 5)

  • DB_OBJECT_PREVIEW_CHARS — Maximale Länge der Definitionsvorschau (Standard: 4000)

Beispiel für die lokale Entwicklung:

DB_HOST=localhost
DB_PORT=5432
DB_NAME=app_dev
DB_USER=app_user
DB_PASSWORD=your-secure-password
DB_SSLMODE=prefer

Optional: HTTP-Anfrage-Optimierung

Das HTTP-Tool verwendet pro Aufruf eine vollständige URL und erfordert keine API-Profilkonfiguration.

Unterstützte Umgebungseinstellungen:

Variable

Zweck

API_TIMEOUT_SECONDS

HTTP-Anfrage-Timeout

API_MAX_RESPONSE_BYTES

Maximale Antwortgröße in Bytes, die von HTTP-Tools zurückgegeben wird

API_VERIFY_SSL

true / false SSL-Verifizierung (lokale Entwicklungszertifikate)

API_BEARER_TOKEN

Standard-JWT, das verwendet wird, wenn ein Tool-Aufruf kein jwt_token übergibt

API_USER_TIMEZONE

Zeitzonen-Header, der als X-User-Timezone weitergeleitet wird

Beispiel für einen Aufruf:

url: https://localhost:44331/api/breakouts/filter/1871161/dd-table?ParameterSetId=231022
method: GET

Für authentifizierte Aufrufe setzen Sie API_BEARER_TOKEN in der .env (oder Prozess-Umgebung). HTTP-Tools verwenden es automatisch, sofern der Aufrufer kein eigenes jwt_token übergibt.

Umgang mit Autorisierung

HTTP-Tools unterstützen zwei Autorisierungsquellen:

  1. jwt_token, das im Tool-Aufruf übergeben wird

  2. API_BEARER_TOKEN aus der .env oder der Prozessumgebung

Priorität

  • Wenn ein jwt_token bereitgestellt wird, wird dieses Token als Authorization: Bearer <jwt_token> weitergeleitet.

  • Wenn jwt_token weggelassen oder leer ist, greift der Server auf API_BEARER_TOKEN zurück.

  • Wenn kein Wert vorhanden ist, wird die Anfrage ohne Authorization-Header gesendet.

Wichtige Regel für Agenten

Platzieren Sie das Bearer-Token nicht innerhalb von headers.Authorization. Der MCP-Server entfernt Authorization aus den headers und akzeptiert Autorisierung nur über das dedizierte jwt_token-Feld.

Dies verhindert versehentliche Header-Kollisionen und macht die Token-Priorität explizit.

Beispiel: Verwendung des Standard-Server-Tokens

{
  "url": "https://localhost:5001/api/v1/sales/my-sales"
}

Beispiel: Weiterleitung des eigenen Tokens des Aufrufers

{
  "url": "https://localhost:5001/api/v1/sales/my-sales",
  "jwt_token": "eyJhbGciOi..."
}

Beispiel: Weiterleitung des Aufrufer-Tokens mit zusätzlichen Headern

{
  "url": "https://localhost:5001/api/v1/sales/my-sales",
  "jwt_token": "eyJhbGciOi...",
  "headers": {
    "Accept": "application/json"
  }
}

Das gleiche jwt_token-Feld ist für http_get, http_head, http_post, http_put, http_patch und http_delete verfügbar.

Sitzungs-Auth

Anstatt pro Aufruf ein jwt_token zu übergeben, können Agenten einmalig ein sitzungsbezogenes JWT erwerben, das automatisch für jeden HTTP-Tool-Aufruf während der restlichen Sitzung verwendet wird.

Funktionsweise

  1. Ein Agent ruft auth_start_session mit der E-Mail-Adresse des Zielbenutzers auf.

  2. Der MCP-Server tauscht das gemeinsame Geheimnis (Shared Secret) + E-Mail gegen ein sitzungsbezogenes JWT vom Backend-Broker aus (POST /api/v1/mcp/exchange).

  3. Das Token wird im Prozessspeicher zwischengespeichert.

  4. Jeder nachfolgende HTTP-Tool-Aufruf, der jwt_token weglässt, verwendet automatisch das Sitzungstoken.

  5. Der Agent kann die Sitzung mit auth_status überprüfen, mit auth_switch_user den Benutzer wechseln oder sie mit auth_clear_session löschen.

Token-Priorität (höchste → niedrigste)

Priorität

Quelle

1

jwt_token, das im Tool-Aufruf übergeben wird

2

Sitzungstoken, das durch auth_start_session gesetzt wurde

3

API_BEARER_TOKEN Umgebungsvariable

Erforderliche Umgebungsvariablen

Variable

Zweck

MCP_EXCHANGE_URL

Vollständige URL des Backend-Broker-Endpunkts

MCP_SHARED_SECRET

Gemeinsames Geheimnis, das im X-MCP-SECRET-Header gesendet wird

MCP_TOKEN_TTL_BUFFER_SECONDS

Aktualisierung, wenn weniger als N Sekunden verbleiben (Standard: 60)

Sitzungs-Auth-Tools

Tool

Beschreibung

auth_start_session

Erwirbt ein Sitzungstoken für die angegebene E-Mail

auth_switch_user

Wechselt die aktive Sitzung zu einem anderen Benutzer (identisch mit Start)

auth_status

Überprüft die aktuelle Sitzung (E-Mail, Ablauf, needs_refresh)

auth_clear_session

Löscht das zwischengespeicherte Sitzungstoken aus dem Speicher

Siehe docs/SESSION_AUTH.md für die vollständige Referenz für Agenten.

Lokal ausführen

Nachdem die virtuelle Umgebung aktiviert und die Abhängigkeiten installiert wurden, starten Sie den MCP-Server mit einem der folgenden Befehle:

workbench-mcp
python -m workbench_mcp.server

MCP Inspector

Für die lokale MCP-Entwicklung und das Debugging bietet der MCP Inspector eine schnelle manuelle Testschleife:

npx @modelcontextprotocol/inspector .venv/bin/python -m workbench_mcp.server

Um den MCP-Server unter debugpy für Breakpoint-Debugging im Inspector zu starten:

npx @modelcontextprotocol/inspector .venv/bin/python -m debugpy --listen 127.0.0.1:5678 -m workbench_mcp.server

Öffnen Sie nach dem Start die Inspector-Benutzeroberfläche, verbinden Sie sich über STDIO und testen Sie Tools wie health, describe_object und exec_proc_preview.

Breakpoints (debugpy): Verwenden Sie Port 5678 für den Debugger, nicht 6274 (6274 ist nur die Inspector-Web-UI). Der schrittweise Workflow und "was vorher falsch war" finden Sie in docs/DEBUG_MCP.md.

VS Code-Einrichtung

Um den lokalen MCP-Server in VS Code zu registrieren, fügen Sie einen Eintrag zur MCP-Konfigurationsdatei des Arbeitsbereichs hinzu:

  • Arbeitsbereichsdatei: .vscode/mcp.json

Beispielkonfiguration:

{
  "servers": {
    "workbench-mcp": {
      "type": "stdio",
      "command": "/absolute/path/to/workbench-mcp/.venv/bin/python",
      "args": ["-m", "workbench_mcp.server"]
    }
  }
}

Ersetzen Sie den Befehlspfad durch den lokalen Repository-Pfad zu Ihrer virtuellen Python-Umgebung.

Geheimnisse und Umgebungswerte

Sie können Umgebungswerte an zwei Stellen angeben:

  1. workbench-mcp/.env

  2. env in .vscode/mcp.json — VS Code injiziert diese in den MCP-Serverprozess.

Priorität: Die Prozessumgebung (einschließlich .vscode/mcp.json → env) überschreibt Werte aus .env für denselben Schlüssel.

Beispiel mit HTTP-Optimierung in VS Code:

{
  "servers": {
    "workbench-mcp": {
      "type": "stdio",
      "command": "/absolute/path/to/workbench-mcp/.venv/bin/python",
      "args": ["-m", "workbench_mcp.server"],
      "env": {
        "API_TIMEOUT_SECONDS": "30",
        "API_MAX_RESPONSE_BYTES": "2097152",
        "API_VERIFY_SSL": "false"
      }
    }
  }
}

Übertragen Sie keine echten Token in das Repository. Bevorzugen Sie eine lokale Arbeitsbereichskonfiguration oder lassen Sie env weg und verwenden Sie .env (welche nicht in Git eingecheckt werden sollte).

Wenn bereits andere MCP-Server konfiguriert sind, fügen Sie workbench-mcp innerhalb des bestehenden servers-Objekts hinzu, anstatt die gesamte Datei zu ersetzen.

Nach dem Speichern von .vscode/mcp.json laden Sie VS Code neu oder aktualisieren Sie die MCP-Server, damit der neue Server erkannt wird. Führen Sie nach dem Laden des Servers das health-Tool aus, bevor Sie Datenbankprozeduren testen.

Erste Tools

  • health

  • describe_object

  • list_tables_and_columns

  • preview_query

  • execute_readonly_sql

  • exec_proc_preview

  • exec_function_preview

  • insert_row

  • insert_rows

  • http_get

  • http_head

  • http_post

  • http_put

  • http_patch

  • http_delete

  • auth_start_session

  • auth_switch_user

  • auth_status

  • auth_clear_session

  • execute_path_bash_script (Skriptname wird über PATH aufgelöst)

Sicherheitsmodell

  • Dauerhafte DDL- und DML-Befehle sind in Ad-hoc-PostgreSQL-Batches blockiert

  • Nur Schreibvorgänge in temporäre Tabellen sind erlaubt, und nur für temporäre Tabellen, die im aktuellen Batch erstellt wurden

  • preview_query erlaubt nur SELECT-Anweisungen und CTE-basierte Lesezugriffe

  • exec_proc_preview kann PostgreSQL-Prozeduren und -Funktionen ausführen; überladene Routinen sollten mit einer Signatur wie public.my_func(integer, text) übergeben werden

  • execute_path_bash_script akzeptiert nur Skriptnamen (keine Pfade), löst diese über PATH auf und führt sie über bash aus

Empfohlene erste Prüfungen

Nachdem .env konfiguriert ist, ist ein typischer Validierungsablauf:

  1. Beschreiben Sie die Funktion, Prozedur, Tabelle oder Ansicht, die inspiziert werden soll.

  2. Zeigen Sie die unterstützende Konfiguration oder Referenzdaten an, die zum Verständnis dieses Objekts erforderlich sind.

  3. Führen Sie exec_proc_preview, preview_query oder execute_readonly_sql mit bekannten Eingaben aus.

  4. Vergleichen Sie die zurückgegebene Form mit dem Szenario, das evaluiert wird (Feature, Untersuchung oder Debugging).

Beispiel für Funktionsausführung

Verwenden Sie für positionelle PostgreSQL-Funktionsaufrufe exec_function_preview. Übergeben Sie PostgreSQL-Arrays als normale JSON-Listen.

Beispiel-SQL-Ziel:

select * from sales."Fn_GetSalesChamps"(2, 2025, array[1,2,5,6,7,8,9,10,11,12,15,16,18,19], 5);

Äquivalente MCP-Tool-Eingabe:

{
  "function_name": "sales.\"Fn_GetSalesChamps\"",
  "parameters": [2, 2025, [1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 15, 16, 18, 19], 5]
}

Beispiele für Einfügungen

Einfügen einer einzelnen Zeile:

{
  "table_name": "sales.orders",
  "row": {
    "customer_id": 10,
    "status": "new"
  },
  "returning_columns": ["order_id"]
}

Batch-Einfügung:

{
  "table_name": "sales.orders",
  "rows": [
    {"customer_id": 10, "status": "new"},
    {"customer_id": 11, "status": "pending"}
  ]
}

Available Tools

19 tools
auth_clear_sessionA

Clear the active session token from memory.

After this call HTTP tools will fall back to API_BEARER_TOKEN (if configured) or make unauthenticated requests.

Returns

dict {"ok": True, "message": "Session cleared."}.

Inputs: no named parameters. Returns: object

auth_start_sessionA

Acquire a session-scoped JWT for email from the backend broker.

After a successful call every HTTP tool call in this session will automatically use the returned token (unless the tool call provides its own jwt_token).

Parameters

email: The user whose identity the MCP session will impersonate. reason: Optional free-text description of why this session is needed. Stored in the JWT claims for audit purposes.

Returns

dict ok=True with email, display_name, user_name, store on success; ok=False with error on failure.

Inputs: email (required), reason. Returns: object

auth_statusA

Return the current session status without exposing the raw token.

Returns

dict active=False when no session is set; otherwise active=True with email, display_name, expires_in_seconds, and needs_refresh.

Inputs: no named parameters. Returns: object

auth_switch_userA

Switch the active session to a different user.

Equivalent to calling auth_start_session — provided as a semantic alias when the intent is to change the active user rather than start a fresh session.

Parameters

email: The new user to impersonate. reason: Optional free-text description of why the switch is needed.

Returns

dict Same shape as auth_start_session.

Inputs: email (required), reason. Returns: object

describe_objectB

Retrieve structural details, parameters, and definition for a database object.

Inputs: object_name (required). Returns: object

exec_function_previewA

Execute a PostgreSQL function with positional parameters and return preview rows.

Use this tool for function calls such as sales."Fn_GetSalesChamps"(2, 2025, ARRAY[1,2,5], 5).

Pass arguments in positional order using JSON-compatible values:

  • scalars: 2, 2025, 5

  • arrays: [1, 2, 5]

  • null: null

PostgreSQL array parameters should be passed as normal lists; psycopg adapts them to PostgreSQL arrays automatically.

Inputs: function_name (required), parameters, max_rows. Returns: object

exec_proc_previewB

Execute PostgreSQL functions or procedures with optional parameters and result limiting.

Inputs: proc_name (required), parameters, max_rows. Returns: object

execute_readonly_sqlC

Execute read-only SQL batches with support for temporary tables within the session.

Inputs: sql (required), max_rows. Returns: object

healthB

Provide system status and configuration details without exposing secrets.

Inputs: no named parameters. Returns: object

http_deleteA

Send an HTTP DELETE request.

Use for delete operations. Some APIs allow delete payloads; if needed, provide body as JSON object/array or UTF-8 text. Pass jwt_token to forward the caller's JWT for this request only.

Inputs: url (required), body, content_type, headers, +1 more. Returns: object

http_getA

Send an HTTP GET request.

Use for read-only resource retrieval. Provide a full URL. Pass jwt_token to forward the caller's JWT for this request only. If jwt_token is omitted, API_BEARER_TOKEN is used when configured. headers.Authorization is ignored; use jwt_token instead.

Inputs: url (required), headers, jwt_token. Returns: object

http_headA

Send an HTTP HEAD request.

Use for metadata/status checks without retrieving a full body. Pass jwt_token to override the default environment token for this call. headers.Authorization is ignored; use jwt_token instead.

Inputs: url (required), headers, jwt_token. Returns: object

http_patchA

Send an HTTP PATCH request.

Use for partial updates. body accepts JSON object/array or UTF-8 text. Pass jwt_token to forward the caller's JWT for this request only.

Inputs: url (required), body, content_type, headers, +1 more. Returns: object

http_postA

Send an HTTP POST request.

Use for create/actions. Provide a full URL. body accepts JSON object/array or UTF-8 text. content_type optionally overrides the Content-Type header. Pass jwt_token to forward the caller's JWT for this request only.

Inputs: url (required), body, content_type, headers, +1 more. Returns: object

http_putA

Send an HTTP PUT request.

Use for full updates/replacements. body accepts JSON object/array or UTF-8 text. Pass jwt_token to forward the caller's JWT for this request only.

Inputs: url (required), body, content_type, headers, +1 more. Returns: object

insert_rowA

Insert a single row into a PostgreSQL table.

Use this tool when you need one explicit insert with structured values.

  • table_name: table target, optionally schema-qualified

  • row: object mapping column names to values

  • returning_columns: optional list of columns to return via RETURNING

Example:

  • table_name: sales.orders

  • row: { "customer_id": 10, "status": "new" }

  • returning_columns: ["order_id"]

Inputs: table_name (required), row (required), returning_columns. Returns: object

insert_rowsA

Insert multiple rows into a PostgreSQL table in one batch.

Use this tool for bulk inserts where every row has the same columns.

  • table_name: table target, optionally schema-qualified

  • rows: list of objects mapping column names to values

  • returning_columns: optional list of columns to return from inserted rows

Notes:

  • Every row must use the same columns in the same order.

  • Arrays can be passed as JSON lists and psycopg adapts them automatically.

Inputs: table_name (required), rows (required), returning_columns. Returns: object

list_tables_and_columnsB

Discover tables and columns with optional filtering by schema or keyword search.

Inputs: schema_name, search_term, limit. Returns: object

preview_queryA

Execute read-only SELECT statements and CTEs with safety validation and row limits.

Inputs: sql (required), max_rows. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.8/5.0

    Scored across 19 tools

    Disambiguation4/5

    Most tools have distinct purposes, but there is some overlap between exec_function_preview and exec_proc_preview, which both execute PostgreSQL functions/procedures with similar parameters. The HTTP tools (http_get, http_post, etc.) are clearly differentiated by HTTP method, and auth tools are well-separated. Overall, the descriptions help clarify boundaries, but the function/procedure execution tools could cause confusion.

    Naming Consistency5/5

    Tool names follow a highly consistent snake_case pattern with clear verb_noun structures. Auth tools use auth_ prefix (e.g., auth_clear_session), HTTP tools use http_ prefix (e.g., http_get), and database tools use descriptive verbs like describe_, exec_, insert_, list_, preview_. There are no deviations in naming style across the set.

    Tool Count4/5

    With 19 tools, the count is slightly high but reasonable for a workbench server that combines authentication, HTTP operations, and database interactions. It covers multiple domains comprehensively without being excessive. A few tools might be consolidated (e.g., the two function execution tools), but overall the scope justifies the number.

    Completeness5/5

    The toolset provides complete coverage for its intended domains: authentication (session management), HTTP operations (full CRUD via different methods), and PostgreSQL database interactions (querying, inserting, describing objects, executing functions). There are no obvious gaps; agents can perform end-to-end workflows involving data retrieval, manipulation, and API calls with proper auth handling.

    Maintenance

    ActivityStale
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      An open-source MCP server for PostgreSQL schema introspection and guarded read-only queries. It enables MCP clients to discover schemas, tables, columns, indexes, relationships, and safe queryable data from a configured PostgreSQL database.
      11 npm
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      Full-featured MCP server that exposes 36 tools for interacting with PostgreSQL databases, covering schema introspection, query execution, data exploration, performance monitoring, security auditing, and maintenance.
      36
      7 npm
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      A Python MCP server that provides PostgreSQL database connectivity for Text-to-SQL workflows, enabling AI agents to explore schemas and execute parameterized SQL queries across multiple data marts.
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      A Python MCP server that enables schema discovery, read-only SQL queries, table previews, and index/relationship analysis on PostgreSQL databases.
      1
      MIT