workbench-mcp
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-DateiMCP-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
PATHverfü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 npmPython 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 .envErforderlich:
DB_HOST— Hostname des PostgreSQL-ServersDB_NAME— DatenbanknameDB_USER— Datenbank-BenutzernameDB_PASSWORD— Datenbank-Passwort
Optional (Optimierung):
DB_PORT— Verbindungsport (Standard: 5432)DB_SSLMODE— SSL-Modus (Standard: prefer)DB_APPLICATION_NAME— AnwendungsbezeichnerDB_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=preferOptional: HTTP-Anfrage-Optimierung
Das HTTP-Tool verwendet pro Aufruf eine vollständige URL und erfordert keine API-Profilkonfiguration.
Unterstützte Umgebungseinstellungen:
Variable | Zweck |
| HTTP-Anfrage-Timeout |
| Maximale Antwortgröße in Bytes, die von HTTP-Tools zurückgegeben wird |
|
|
| Standard-JWT, das verwendet wird, wenn ein Tool-Aufruf kein |
| Zeitzonen-Header, der als |
Beispiel für einen Aufruf:
url: https://localhost:44331/api/breakouts/filter/1871161/dd-table?ParameterSetId=231022
method: GETFü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:
jwt_token, das im Tool-Aufruf übergeben wirdAPI_BEARER_TOKENaus der.envoder der Prozessumgebung
Priorität
Wenn ein
jwt_tokenbereitgestellt wird, wird dieses Token alsAuthorization: Bearer <jwt_token>weitergeleitet.Wenn
jwt_tokenweggelassen oder leer ist, greift der Server aufAPI_BEARER_TOKENzurü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
Ein Agent ruft
auth_start_sessionmit der E-Mail-Adresse des Zielbenutzers auf.Der MCP-Server tauscht das gemeinsame Geheimnis (Shared Secret) + E-Mail gegen ein sitzungsbezogenes JWT vom Backend-Broker aus (
POST /api/v1/mcp/exchange).Das Token wird im Prozessspeicher zwischengespeichert.
Jeder nachfolgende HTTP-Tool-Aufruf, der
jwt_tokenweglässt, verwendet automatisch das Sitzungstoken.Der Agent kann die Sitzung mit
auth_statusüberprüfen, mitauth_switch_userden Benutzer wechseln oder sie mitauth_clear_sessionlöschen.
Token-Priorität (höchste → niedrigste)
Priorität | Quelle |
1 |
|
2 | Sitzungstoken, das durch |
3 |
|
Erforderliche Umgebungsvariablen
Variable | Zweck |
| Vollständige URL des Backend-Broker-Endpunkts |
| Gemeinsames Geheimnis, das im |
| Aktualisierung, wenn weniger als N Sekunden verbleiben (Standard: 60) |
Sitzungs-Auth-Tools
Tool | Beschreibung |
| Erwirbt ein Sitzungstoken für die angegebene E-Mail |
| Wechselt die aktive Sitzung zu einem anderen Benutzer (identisch mit Start) |
| Überprüft die aktuelle Sitzung (E-Mail, Ablauf, needs_refresh) |
| 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-mcppython -m workbench_mcp.serverMCP 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.serverUm 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:
workbench-mcp/.envenvin.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
healthdescribe_objectlist_tables_and_columnspreview_queryexecute_readonly_sqlexec_proc_previewexec_function_previewinsert_rowinsert_rowshttp_gethttp_headhttp_posthttp_puthttp_patchhttp_deleteauth_start_sessionauth_switch_userauth_statusauth_clear_sessionexecute_path_bash_script(Skriptname wird überPATHaufgelö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_queryerlaubt nurSELECT-Anweisungen und CTE-basierte Lesezugriffeexec_proc_previewkann PostgreSQL-Prozeduren und -Funktionen ausführen; überladene Routinen sollten mit einer Signatur wiepublic.my_func(integer, text)übergeben werdenexecute_path_bash_scriptakzeptiert nur Skriptnamen (keine Pfade), löst diese überPATHauf und führt sie überbashaus
Empfohlene erste Prüfungen
Nachdem .env konfiguriert ist, ist ein typischer Validierungsablauf:
Beschreiben Sie die Funktion, Prozedur, Tabelle oder Ansicht, die inspiziert werden soll.
Zeigen Sie die unterstützende Konfiguration oder Referenzdaten an, die zum Verständnis dieses Objekts erforderlich sind.
Führen Sie
exec_proc_preview,preview_queryoderexecute_readonly_sqlmit bekannten Eingaben aus.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 toolsauth_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,5arrays:
[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-qualifiedrow: object mapping column names to valuesreturning_columns: optional list of columns to return viaRETURNING
Example:
table_name:sales.ordersrow:{ "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-qualifiedrows: list of objects mapping column names to valuesreturning_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
Scored across 19 tools
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.
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.
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.
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
Related MCP Connectors
Text-to-SQL MCP server: read-only queries on PostgreSQL, MySQL and SQL Server with your real schema
Hosted PostgreSQL MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Hosted SQL Server MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
PostgreSQL, MySQL, and SQL Server in one session. 26 read-only MCP tools for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn 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 npmMIT
- AlicenseAqualityCmaintenanceFull-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.367 npmMIT
- AlicenseNot gradedqualityDmaintenanceA 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
- AlicenseNot gradedqualityCmaintenanceA Python MCP server that enables schema discovery, read-only SQL queries, table previews, and index/relationship analysis on PostgreSQL databases.1MIT