Skip to main content
Glama

workbench-mcp

Локальный MCP-сервер на Python для интерактивного исследования данных PostgreSQL, интеграции API и автоматизации в системах Fedora/Linux.

Обзор

Версия 1 включает:

  • Настройку виртуального окружения Python для систем Fedora/Linux

  • Подключение к PostgreSQL 18, настроенное через файл .env

  • Инструменты MCP для:

    • Обнаружения таблиц, столбцов и структуры схемы

    • Запуска предварительного просмотра запросов только для чтения

    • Выполнения защищенных SQL-пакетов с поддержкой временных таблиц

    • Вызова хранимых функций и процедур PostgreSQL

    • Доступа к внешним API через полные URL-запросы

    • Выполнения bash-скриптов, доступных в PATH

  • Обеспечение безопасности: постоянные изменения схемы и данных заблокированы

  • Поддержку рабочих процессов с временными таблицами в рамках сессии внутри SQL-пакетов

Related MCP server: PostgreSQL MCP Server

Настройка в Fedora / Linux

Начните с установки необходимых системных пакетов:

sudo dnf install -y python3 python3-pip nodejs npm

Требуется Python 3.12 или новее. Используйте pyenv или аналогичный инструмент, если управляете несколькими версиями.

Настройка виртуального окружения

Из корневой директории проекта создайте и активируйте виртуальное окружение Python:

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

Переменные окружения

Скопируйте пример конфигурации и заполните данные для подключения к PostgreSQL:

cp .env.example .env

Обязательно:

  • DB_HOST — имя хоста сервера PostgreSQL

  • DB_NAME — имя базы данных

  • DB_USER — имя пользователя базы данных

  • DB_PASSWORD — пароль пользователя базы данных

Опционально (настройка):

  • DB_PORT — порт подключения (по умолчанию: 5432)

  • DB_SSLMODE — режим SSL (по умолчанию: prefer)

  • DB_APPLICATION_NAME — идентификатор приложения

  • DB_QUERY_TIMEOUT_SECONDS — таймаут запроса (по умолчанию: 30)

  • DB_MAX_ROWS — максимальное количество строк в наборе результатов (по умолчанию: 100)

  • DB_MAX_RESULT_SETS — максимальное количество наборов результатов в пакете (по умолчанию: 5)

  • DB_OBJECT_PREVIEW_CHARS — максимальная длина предварительного просмотра определения (по умолчанию: 4000)

Пример локальной разработки:

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

Опционально: Настройка HTTP-запросов

Инструмент HTTP принимает полный URL для каждого вызова и не требует настройки профиля API.

Поддерживаемые настройки окружения:

Переменная

Назначение

API_TIMEOUT_SECONDS

Таймаут HTTP-запроса

API_MAX_RESPONSE_BYTES

Максимальное количество байт ответа, возвращаемых HTTP-инструментами

API_VERIFY_SSL

true / false проверка SSL (локальные сертификаты разработки)

API_BEARER_TOKEN

JWT по умолчанию, используемый, когда вызов инструмента не передает jwt_token

API_USER_TIMEZONE

Заголовок часового пояса, передаваемый как X-User-Timezone

Пример формы вызова:

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

Для аутентифицированных вызовов установите API_BEARER_TOKEN в .env (или переменной окружения процесса). HTTP-инструменты автоматически используют его, если вызывающий не передает свой собственный jwt_token.

Обработка авторизации

HTTP-инструменты поддерживают два источника авторизации:

  1. jwt_token, переданный в вызове инструмента

  2. API_BEARER_TOKEN из .env или окружения процесса

Приоритет

  • Если предоставлен jwt_token, этот токен передается как Authorization: Bearer <jwt_token>.

  • Если jwt_token опущен или пуст, сервер использует API_BEARER_TOKEN.

  • Если ни одно из значений не присутствует, запрос отправляется без заголовка Authorization.

Важное правило для агентов

Не помещайте токен bearer внутрь headers.Authorization. MCP-сервер удаляет Authorization из headers и принимает авторизацию только через выделенное поле jwt_token.

Это предотвращает случайные конфликты заголовков и делает приоритет токенов явным.

Пример: использование токена сервера по умолчанию

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

Пример: передача собственного токена вызывающего

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

Пример: передача токена вызывающего с дополнительными заголовками

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

То же поле jwt_token доступно в http_get, http_head, http_post, http_put, http_patch и http_delete.

Сессионная авторизация

Вместо передачи jwt_token для каждого вызова, агенты могут один раз получить JWT в рамках сессии, и каждый вызов HTTP-инструмента будет автоматически использовать его до конца сессии.

Как это работает

  1. Агент вызывает auth_start_session с email целевого пользователя.

  2. MCP-сервер обменивает общий секрет + email на JWT с ограниченной областью действия от бэкенд-брокера (POST /api/v1/mcp/exchange).

  3. Токен кэшируется в памяти процесса.

  4. Каждый последующий вызов HTTP-инструмента, в котором опущен jwt_token, автоматически использует сессионный токен.

  5. Агент может проверить сессию с помощью auth_status, переключить пользователей с помощью auth_switch_user или очистить её с помощью auth_clear_session.

Приоритет токенов (от высшего к низшему)

Приоритет

Источник

1

jwt_token, переданный в вызове инструмента

2

Сессионный токен, установленный auth_start_session

3

Переменная окружения API_BEARER_TOKEN

Обязательные переменные окружения

Переменная

Назначение

MCP_EXCHANGE_URL

Полный URL конечной точки бэкенд-брокера

MCP_SHARED_SECRET

Общий секрет, отправляемый в заголовке X-MCP-SECRET

MCP_TOKEN_TTL_BUFFER_SECONDS

Обновление, когда остается менее N секунд (по умолчанию: 60)

Инструменты сессионной авторизации

Инструмент

Описание

auth_start_session

Получить сессионный токен для указанного email

auth_switch_user

Переключить активную сессию на другого пользователя (аналогично start)

auth_status

Проверить текущую сессию (email, срок действия, необходимость обновления)

auth_clear_session

Очистить кэшированный сессионный токен из памяти

См. docs/SESSION_AUTH.md для получения полной справочной информации для агентов.

Запуск локально

После активации виртуального окружения и установки зависимостей запустите MCP-сервер одной из команд:

workbench-mcp
python -m workbench_mcp.server

Инспектор MCP

Для локальной разработки и отладки MCP, Инспектор MCP предоставляет быстрый цикл ручного тестирования:

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

Чтобы запустить MCP-сервер под debugpy для отладки с точками останова в Инспекторе:

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

После запуска откройте интерфейс Инспектора, подключитесь через STDIO и протестируйте инструменты, такие как health, describe_object и exec_proc_preview.

Точки останова (debugpy): Используйте порт 5678 для отладчика, а не 6274 (6274 — это только веб-интерфейс Инспектора). Пошаговый рабочий процесс и описание «что было не так раньше» находятся в docs/DEBUG_MCP.md.

Настройка VS Code

Чтобы зарегистрировать локальный MCP-сервер в VS Code, добавьте запись в файл конфигурации MCP рабочей области:

  • Файл рабочей области: .vscode/mcp.json

Пример конфигурации:

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

Замените путь к команде на локальный путь к репозиторию вашего виртуального окружения Python.

Секреты и значения окружения

Вы можете предоставить значения окружения в одном из двух мест:

  1. workbench-mcp/.env

  2. env в .vscode/mcp.json — VS Code внедряет их в процесс MCP-сервера.

Приоритет: окружение процесса (включая .vscode/mcp.json → env) переопределяет значения из .env для того же ключа.

Пример с настройкой HTTP в 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"
      }
    }
  }
}

Не фиксируйте реальные токены в git. Предпочитайте локальную конфигурацию рабочей области или опустите env и используйте .env (который должен оставаться вне git).

Если другие MCP-серверы уже настроены, добавьте workbench-mcp внутрь существующего объекта servers вместо замены всего файла.

После сохранения .vscode/mcp.json перезагрузите VS Code или обновите MCP-серверы, чтобы новый сервер был обнаружен. После загрузки сервера запустите инструмент health перед тестированием процедур базы данных.

Начальные инструменты

  • 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 (имя скрипта разрешается через PATH)

Модель безопасности

  • Постоянные DDL и DML заблокированы в ad-hoc пакетах PostgreSQL

  • Разрешена запись только во временные таблицы, и только для временных таблиц, созданных в текущем пакете

  • preview_query разрешает только операторы SELECT и чтение на основе CTE

  • exec_proc_preview может выполнять процедуры и функции PostgreSQL; перегруженные подпрограммы должны передаваться с сигнатурой, например public.my_func(integer, text)

  • execute_path_bash_script принимает только имена скриптов (не пути), разрешает их через PATH и выполняет через bash

Рекомендуемые первые проверки

После настройки .env типичный процесс проверки выглядит так:

  1. Опишите функцию, процедуру, таблицу или представление для проверки.

  2. Просмотрите вспомогательную конфигурацию или справочные данные, необходимые для понимания этого объекта.

  3. Запустите exec_proc_preview, preview_query или execute_readonly_sql с известными входными данными.

  4. Сравните возвращенную форму с функцией, исследованием или сценарием отладки, который оценивается.

Пример выполнения функции

Для позиционных вызовов функций PostgreSQL используйте exec_function_preview. Передавайте массивы PostgreSQL как обычные списки JSON.

Пример SQL-цели:

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

Эквивалентный ввод инструмента MCP:

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

Примеры вставки

Вставка одной строки:

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

Пакетная вставка:

{
  "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