Skip to main content
Glama

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 .env

  • Herramientas 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 npm

Se 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 .env

Obligatorio:

  • DB_HOST — Nombre de host del servidor PostgreSQL

  • DB_NAME — Nombre de la base de datos

  • DB_USER — Nombre de usuario de la base de datos

  • DB_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ón

  • DB_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=prefer

Opcional: 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

API_TIMEOUT_SECONDS

Tiempo de espera de solicitud HTTP

API_MAX_RESPONSE_BYTES

Máximo de bytes de respuesta devueltos por herramientas HTTP

API_VERIFY_SSL

true / false verificación SSL (certificados de desarrollo local)

API_BEARER_TOKEN

JWT predeterminado utilizado cuando una llamada de herramienta no pasa jwt_token

API_USER_TIMEZONE

Encabezado de zona horaria reenviado como X-User-Timezone

Forma de llamada de ejemplo:

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

Para 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:

  1. jwt_token pasado en la llamada a la herramienta

  2. API_BEARER_TOKEN desde .env o el entorno del proceso

Precedencia

  • Si se proporciona jwt_token, ese token se reenvía como Authorization: Bearer <jwt_token>.

  • Si se omite o está vacío jwt_token, el servidor recurre a API_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

  1. Un agente llama a auth_start_session con el correo electrónico del usuario objetivo.

  2. El servidor MCP intercambia el secreto compartido + correo electrónico por un JWT con alcance del intermediario de backend (POST /api/v1/mcp/exchange).

  3. El token se almacena en caché en la memoria del proceso.

  4. Cada llamada posterior a la herramienta HTTP que omita jwt_token utiliza el token de sesión automáticamente.

  5. El agente puede inspeccionar la sesión con auth_status, cambiar de usuario con auth_switch_user o borrarla con auth_clear_session.

Precedencia de tokens (de mayor a menor)

Prioridad

Fuente

1

jwt_token pasado en la llamada a la herramienta

2

Token de sesión establecido por auth_start_session

3

Variable de entorno API_BEARER_TOKEN

Variables de entorno requeridas

Variable

Propósito

MCP_EXCHANGE_URL

URL completa del punto final del intermediario de backend

MCP_SHARED_SECRET

Secreto compartido enviado en el encabezado X-MCP-SECRET

MCP_TOKEN_TTL_BUFFER_SECONDS

Actualizar cuando queden menos de N segundos (predeterminado: 60)

Herramientas de autenticación de sesión

Herramienta

Descripción

auth_start_session

Adquirir un token de sesión para el correo electrónico dado

auth_switch_user

Cambiar la sesión activa a un usuario diferente (igual que iniciar)

auth_status

Inspeccionar la sesión actual (correo electrónico, caducidad, necesita_actualización)

auth_clear_session

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-mcp
python -m workbench_mcp.server

Inspector 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.server

Para 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.server

Despué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:

  1. workbench-mcp/.env

  2. env en .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

  • 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 (nombre del script resuelto a través de PATH)

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_query solo permite declaraciones SELECT y lecturas basadas en CTE

  • exec_proc_preview puede ejecutar procedimientos y funciones de PostgreSQL; las rutinas sobrecargadas deben pasarse con una firma como public.my_func(integer, text)

  • execute_path_bash_script solo acepta nombres de script (no rutas), los resuelve a través de PATH y los ejecuta a través de bash

Primeras comprobaciones sugeridas

Después de configurar .env, un flujo de validación típico es:

  1. Describa la función, procedimiento, tabla o vista a inspeccionar.

  2. Obtenga una vista previa de la configuración de soporte o los datos de referencia necesarios para comprender ese objeto.

  3. Ejecute exec_proc_preview, preview_query o execute_readonly_sql con entradas conocidas.

  4. 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 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