workbench-mcp
workbench-mcp
Un servidor MCP local en Python para la exploración interactiva de datos de PostgreSQL, integración de API y automatización en sistemas Fedora/Linux.
Descripción general
La versión 1 incluye:
Configuración de entorno virtual de Python para sistemas Fedora/Linux
Conectividad con PostgreSQL 18 configurada mediante el archivo
.envHerramientas MCP para:
Descubrir tablas, columnas y la estructura del esquema
Ejecutar vistas previas de consultas de solo lectura
Ejecutar lotes SQL protegidos con soporte para tablas temporales
Llamar a funciones y procedimientos almacenados de PostgreSQL
Acceder a API externas mediante solicitudes de URL completas
Ejecutar scripts bash disponibles en
PATH
Seguridad reforzada: las modificaciones persistentes de esquema y datos están bloqueadas
Flujos de trabajo de tablas temporales con alcance de sesión admitidos dentro de lotes SQL
Related MCP server: PostgreSQL MCP Server
Configuración en Fedora / Linux
Comience instalando los paquetes del sistema necesarios:
sudo dnf install -y python3 python3-pip nodejs npmSe requiere Python 3.12 o posterior. Utilice pyenv o similar si gestiona varias versiones.
Configuración del entorno virtual
Desde la raíz del proyecto, cree y active un entorno virtual de Python:
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
pip install -e .Variables de entorno
Copie la configuración de ejemplo y rellene los detalles de conexión de PostgreSQL:
cp .env.example .envObligatorio:
DB_HOST— Nombre de host del servidor PostgreSQLDB_NAME— Nombre de la base de datosDB_USER— Nombre de usuario de la base de datosDB_PASSWORD— Contraseña de la base de datos
Opcional (ajustes):
DB_PORT— Puerto de conexión (predeterminado: 5432)DB_SSLMODE— Modo SSL (predeterminado: prefer)DB_APPLICATION_NAME— Identificador de la aplicaciónDB_QUERY_TIMEOUT_SECONDS— Tiempo de espera de la consulta (predeterminado: 30)DB_MAX_ROWS— Máximo de filas por conjunto de resultados (predeterminado: 100)DB_MAX_RESULT_SETS— Máximo de conjuntos de resultados por lote (predeterminado: 5)DB_OBJECT_PREVIEW_CHARS— Longitud máxima de vista previa de definición (predeterminado: 4000)
Ejemplo de desarrollo local:
DB_HOST=localhost
DB_PORT=5432
DB_NAME=app_dev
DB_USER=app_user
DB_PASSWORD=your-secure-password
DB_SSLMODE=preferOpcional: Ajuste de solicitudes HTTP
La herramienta HTTP toma una URL completa por llamada y no requiere configuración de perfil de API.
Configuraciones de entorno admitidas:
Variable | Propósito |
| Tiempo de espera de solicitud HTTP |
| Máximo de bytes de respuesta devueltos por herramientas HTTP |
|
|
| JWT predeterminado utilizado cuando una llamada de herramienta no pasa |
| Encabezado de zona horaria reenviado como |
Forma de llamada de ejemplo:
url: https://localhost:44331/api/breakouts/filter/1871161/dd-table?ParameterSetId=231022
method: GETPara llamadas autenticadas, establezca API_BEARER_TOKEN en .env (o en el entorno del proceso). Las herramientas HTTP lo utilizan automáticamente a menos que el llamador pase su propio jwt_token.
Manejo de autorización
Las herramientas HTTP admiten dos fuentes de autorización:
jwt_tokenpasado en la llamada a la herramientaAPI_BEARER_TOKENdesde.envo el entorno del proceso
Precedencia
Si se proporciona
jwt_token, ese token se reenvía comoAuthorization: Bearer <jwt_token>.Si se omite o está vacío
jwt_token, el servidor recurre aAPI_BEARER_TOKEN.Si ninguno de los valores está presente, la solicitud se envía sin un encabezado
Authorization.
Regla importante para agentes
No coloque el token de portador (bearer token) dentro de headers.Authorization.
El servidor MCP elimina Authorization de headers y solo acepta autenticación a través del campo dedicado jwt_token.
Esto evita colisiones accidentales de encabezados y hace explícita la precedencia de los tokens.
Ejemplo: usar el token de servidor predeterminado
{
"url": "https://localhost:5001/api/v1/sales/my-sales"
}Ejemplo: reenviar el propio token del llamador
{
"url": "https://localhost:5001/api/v1/sales/my-sales",
"jwt_token": "eyJhbGciOi..."
}Ejemplo: reenviar el token del llamador con encabezados adicionales
{
"url": "https://localhost:5001/api/v1/sales/my-sales",
"jwt_token": "eyJhbGciOi...",
"headers": {
"Accept": "application/json"
}
}El mismo campo jwt_token está disponible en http_get, http_head, http_post, http_put, http_patch y http_delete.
Autenticación de sesión
En lugar de pasar un jwt_token por llamada, los agentes pueden adquirir un JWT con alcance de sesión una vez y hacer que cada llamada a la herramienta HTTP lo use automáticamente durante el resto de la sesión.
Cómo funciona
Un agente llama a
auth_start_sessioncon el correo electrónico del usuario objetivo.El servidor MCP intercambia el secreto compartido + correo electrónico por un JWT con alcance del intermediario de backend (
POST /api/v1/mcp/exchange).El token se almacena en caché en la memoria del proceso.
Cada llamada posterior a la herramienta HTTP que omita
jwt_tokenutiliza el token de sesión automáticamente.El agente puede inspeccionar la sesión con
auth_status, cambiar de usuario conauth_switch_usero borrarla conauth_clear_session.
Precedencia de tokens (de mayor a menor)
Prioridad | Fuente |
1 |
|
2 | Token de sesión establecido por |
3 | Variable de entorno |
Variables de entorno requeridas
Variable | Propósito |
| URL completa del punto final del intermediario de backend |
| Secreto compartido enviado en el encabezado |
| Actualizar cuando queden menos de N segundos (predeterminado: 60) |
Herramientas de autenticación de sesión
Herramienta | Descripción |
| Adquirir un token de sesión para el correo electrónico dado |
| Cambiar la sesión activa a un usuario diferente (igual que iniciar) |
| Inspeccionar la sesión actual (correo electrónico, caducidad, necesita_actualización) |
| Borrar el token de sesión almacenado en caché de la memoria |
Consulte docs/SESSION_AUTH.md para obtener la referencia completa para el agente.
Ejecutar localmente
Después de activar el entorno virtual e instalar las dependencias, inicie el servidor MCP con cualquiera de los comandos:
workbench-mcppython -m workbench_mcp.serverInspector MCP
Para el desarrollo y depuración local de MCP, el Inspector MCP proporciona un bucle de prueba manual rápido:
npx @modelcontextprotocol/inspector .venv/bin/python -m workbench_mcp.serverPara iniciar el servidor MCP bajo debugpy para la depuración de puntos de interrupción en el Inspector:
npx @modelcontextprotocol/inspector .venv/bin/python -m debugpy --listen 127.0.0.1:5678 -m workbench_mcp.serverDespués del inicio, abra la interfaz de usuario del Inspector, conéctese a través de STDIO y pruebe herramientas como health, describe_object y exec_proc_preview.
Puntos de interrupción (debugpy): Use el puerto 5678 para el depurador, no 6274 (6274 es solo la interfaz web del Inspector). El flujo de trabajo paso a paso y "qué estaba mal antes" se encuentran en docs/DEBUG_MCP.md.
Configuración de VS Code
Para registrar el servidor MCP local en VS Code, agregue una entrada al archivo de configuración MCP del espacio de trabajo:
Archivo de espacio de trabajo:
.vscode/mcp.json
Configuración de ejemplo:
{
"servers": {
"workbench-mcp": {
"type": "stdio",
"command": "/absolute/path/to/workbench-mcp/.venv/bin/python",
"args": ["-m", "workbench_mcp.server"]
}
}
}Reemplace la ruta del comando con la ruta del repositorio local a su Python de entorno virtual.
Secretos y valores de entorno
Puede proporcionar valores de entorno en cualquiera de los dos lugares:
workbench-mcp/.envenven.vscode/mcp.json— VS Code los inyecta en el proceso del servidor MCP.
Precedencia: el entorno del proceso (incluido .vscode/mcp.json → env) anula los valores de .env para la misma clave.
Ejemplo con ajuste HTTP en 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"
}
}
}
}No confirme tokens reales. Prefiera una configuración de espacio de trabajo solo local u omita env y use .env (que debe mantenerse fuera de git).
Si ya hay otros servidores MCP configurados, agregue workbench-mcp dentro del objeto servers existente en lugar de reemplazar todo el archivo.
Después de guardar .vscode/mcp.json, vuelva a cargar VS Code o actualice los servidores MCP para que se descubra el nuevo servidor. Después de que se cargue el servidor, ejecute la herramienta health antes de probar los procedimientos de la base de datos.
Herramientas iniciales
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(nombre del script resuelto a través dePATH)
Modelo de seguridad
DDL y DML persistentes están bloqueados en lotes ad-hoc de PostgreSQL
Solo se permiten escrituras en tablas temporales, y solo para tablas temporales creadas en el lote actual
preview_querysolo permite declaracionesSELECTy lecturas basadas en CTEexec_proc_previewpuede ejecutar procedimientos y funciones de PostgreSQL; las rutinas sobrecargadas deben pasarse con una firma comopublic.my_func(integer, text)execute_path_bash_scriptsolo acepta nombres de script (no rutas), los resuelve a través dePATHy los ejecuta a través debash
Primeras comprobaciones sugeridas
Después de configurar .env, un flujo de validación típico es:
Describa la función, procedimiento, tabla o vista a inspeccionar.
Obtenga una vista previa de la configuración de soporte o los datos de referencia necesarios para comprender ese objeto.
Ejecute
exec_proc_preview,preview_queryoexecute_readonly_sqlcon entradas conocidas.Compare la forma devuelta con la característica, investigación o escenario de depuración que se está evaluando.
Ejemplo de ejecución de función
Para llamadas a funciones posicionales de PostgreSQL, use exec_function_preview.
Pase las matrices de PostgreSQL como listas JSON normales.
Ejemplo de destino SQL:
select * from sales."Fn_GetSalesChamps"(2, 2025, array[1,2,5,6,7,8,9,10,11,12,15,16,18,19], 5);Entrada de herramienta MCP equivalente:
{
"function_name": "sales.\"Fn_GetSalesChamps\"",
"parameters": [2, 2025, [1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 15, 16, 18, 19], 5]
}Ejemplos de inserción
Inserción de una sola fila:
{
"table_name": "sales.orders",
"row": {
"customer_id": 10,
"status": "new"
},
"returning_columns": ["order_id"]
}Inserción por lotes:
{
"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