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
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"}
]
}Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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/antonov2010/mcp-dev'
If you have feedback or need assistance with the MCP directory API, please join our Discord server