工作台mcp
本地Python MCP服务器,用于交互式PostgreSQL数据探索、API集成以及Fedora/Linux系统上的自动化。
概述
版本1包括:
- Fedora/Linux系统的Python虚拟环境设置
- PostgreSQL 18连接配置通过
.env文件 - MCP工具用于:
- 发现表、列和模式结构 - 运行只读查询预览 - 使用临时表支持执行受保护的SQL批处理 - 调用PostgreSQL存储函数和过程 - 通过完整URL请求访问外部API - 执行bash脚本 PATH
- 强制安全:阻止持久模式和数据修改
- SQL批处理中支持会话范围的临时表工作流
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模式(默认:首选)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工具支持两种授权源:
jwt_token在工具调用中传递API_BEARER_TOKEN从.env或过程环境
优先
- 如果
jwt_token如果提供了,则该令牌将按以下方式转发Authorization: Bearer. - 如果
jwt_token如果省略或为空,服务器将回退到API_BEARER_TOKEN. - 如果两个值都不存在,则发送请求时将不带
Authorization头球
代理人的重要规则
做 不 将不记名代币放在里面 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使用目标用户的电子邮件。 - MCP服务器将共享密钥+电子邮件交换为来自后端代理的范围JWT(
POST /api/v1/mcp/exchange). - 令牌缓存在进程内存中。
- 后续每次省略的HTTP工具调用
jwt_token自动使用会话令牌。 - 代理可以检查会话
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 | 获取给定电子邮件的会话令牌 |
auth_switch_user | 将活动会话切换到其他用户(与开始相同) |
auth_status | 检查当前会话(电子邮件、到期、needs_refresh) |
auth_clear_session | 从内存中清除缓存的会话令牌 |
看 docs/SESSION_AUTH.md 供全体代理人参考。
在本地运行
激活虚拟环境并安装依赖关系后,使用以下任一命令启动MCP服务器:
workbench-mcppython -m workbench_mcp.serverMCP检查员
对于本地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启动后,打开Inspector UI,重新连接 STDIO,以及测试工具,如 health, describe_object,以及 exec_proc_preview.
断点(调试): 使用端口 5678 对于调试器,不是6274(6274只是检查器web UI)。循序渐进的工作流程和“之前出了什么问题”都在 docs/DEBUG_MCP.md.
VS代码设置
要在VS Code中注册本地MCP服务器,请在工作区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 对于同一个密钥。
VS代码中的HTTP调优示例:
{
"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"
}
}
}
}做 不 提交真正的代币。首选仅本地工作区配置或省略 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在即席PostgreSQL批处理中被阻止
- 只允许写入临时表,并且只允许在当前批中创建临时表
preview_query仅允许SELECT语句和基于CTE的读取exec_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"}
]
}