workbench-mcp
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— имя хоста сервера PostgreSQLDB_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.
Поддерживаемые настройки окружения:
Переменная | Назначение |
| Таймаут HTTP-запроса |
| Максимальное количество байт ответа, возвращаемых HTTP-инструментами |
|
|
| JWT по умолчанию, используемый, когда вызов инструмента не передает |
| Заголовок часового пояса, передаваемый как |
Пример формы вызова:
url: https://localhost:44331/api/breakouts/filter/1871161/dd-table?ParameterSetId=231022
method: GETДля аутентифицированных вызовов установите API_BEARER_TOKEN в .env (или переменной окружения процесса). HTTP-инструменты автоматически используют его, если вызывающий не передает свой собственный jwt_token.
Обработка авторизации
HTTP-инструменты поддерживают два источника авторизации:
jwt_token, переданный в вызове инструмента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-инструмента будет автоматически использовать его до конца сессии.
Как это работает
Агент вызывает
auth_start_sessionс email целевого пользователя.MCP-сервер обменивает общий секрет + email на JWT с ограниченной областью действия от бэкенд-брокера (
POST /api/v1/mcp/exchange).Токен кэшируется в памяти процесса.
Каждый последующий вызов HTTP-инструмента, в котором опущен
jwt_token, автоматически использует сессионный токен.Агент может проверить сессию с помощью
auth_status, переключить пользователей с помощьюauth_switch_userили очистить её с помощьюauth_clear_session.
Приоритет токенов (от высшего к низшему)
Приоритет | Источник |
1 |
|
2 | Сессионный токен, установленный |
3 | Переменная окружения |
Обязательные переменные окружения
Переменная | Назначение |
| Полный URL конечной точки бэкенд-брокера |
| Общий секрет, отправляемый в заголовке |
| Обновление, когда остается менее N секунд (по умолчанию: 60) |
Инструменты сессионной авторизации
Инструмент | Описание |
| Получить сессионный токен для указанного email |
| Переключить активную сессию на другого пользователя (аналогично start) |
| Проверить текущую сессию (email, срок действия, необходимость обновления) |
| Очистить кэшированный сессионный токен из памяти |
См. docs/SESSION_AUTH.md для получения полной справочной информации для агентов.
Запуск локально
После активации виртуального окружения и установки зависимостей запустите MCP-сервер одной из команд:
workbench-mcppython -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.
Секреты и значения окружения
Вы можете предоставить значения окружения в одном из двух мест:
workbench-mcp/.envenvв.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 перед тестированием процедур базы данных.
Начальные инструменты
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(имя скрипта разрешается черезPATH)
Модель безопасности
Постоянные DDL и DML заблокированы в ad-hoc пакетах PostgreSQL
Разрешена запись только во временные таблицы, и только для временных таблиц, созданных в текущем пакете
preview_queryразрешает только операторыSELECTи чтение на основе CTEexec_proc_previewможет выполнять процедуры и функции PostgreSQL; перегруженные подпрограммы должны передаваться с сигнатурой, напримерpublic.my_func(integer, text)execute_path_bash_scriptпринимает только имена скриптов (не пути), разрешает их черезPATHи выполняет черезbash
Рекомендуемые первые проверки
После настройки .env типичный процесс проверки выглядит так:
Опишите функцию, процедуру, таблицу или представление для проверки.
Просмотрите вспомогательную конфигурацию или справочные данные, необходимые для понимания этого объекта.
Запустите
exec_proc_preview,preview_queryилиexecute_readonly_sqlс известными входными данными.Сравните возвращенную форму с функцией, исследованием или сценарием отладки, который оценивается.
Пример выполнения функции
Для позиционных вызовов функций 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 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