使用说明
# MCP Text2SQL PoC(本地+云)
只读SQL Server MCP服务器,带有护栏、日志记录、下载和LLM集成测试。
MCP工具
list_databasesget_schemaexecute_readonly_sqlexplain_reasoningpreview_tabledownload_resultdownload_mode=link(默认):将CSV保存在服务器上,返回URLdownload_mode=base64:以base64内联返回CSV内容
build_chartbuild_dashboard
大多数SQL工具接受可选 database 从中选择数据库配置文件 list_databases.
主要终点
POST /mcpGET /ssePOST /messages?session_id=<id>POST /tools/get_schemaPOST /tools/list_databasesPOST /tools/execute_readonly_sqlPOST /tools/explain_reasoningPOST /tools/preview_tablePOST /tools/download_resultPOST /tools/build_chartPOST /tools/build_dashboardGET /downloads/<file_name>.csv
设置
python -m venv venvvenv\\Scripts\\python.exe -m pip install -r requirements.txt- 复制
.env.example到.env并填充值。- 单个数据库:设置
DB_* - 多数据库:设置
DB_CATALOG_PATH到现有的JSON文件(请参见db_catalog.example.json)
- 单个数据库:设置
- 运行服务器:
venv\\Scripts\\python.exe mcp_server.py
云访问
云模型无法调用 127.0.0.1 直接。
- 使用HTTPS隧道暴露本地服务器(示例:
ngrok http 8000) - 对于基于SSE的MCP连接器,请使用
https://<public-host>/sse作为MCP服务器URL - 集
MCP_PUBLIC_BASE_URL如果你想要绝对下载链接 - 配置
x-api-key在连接器中
项目文件
mcp_server.py- 薄兼容性入口点
- 再出口
app和SSE_SESSIONS - 通过运行服务器
main()
src/mcp_app.py- FastAPI应用+所有HTTP/SSE路由
- 山丘
/downloads/*
src/mcp_runtime.py- MCP JSON-RPC处理程序(
initialize,tools/list,tools/call等等) - API密钥身份验证、跟踪/日志助手、SSE会话存储
- MCP JSON-RPC处理程序(
src/mcp_models.py- Pydantic请求模型
/tools/*
- Pydantic请求模型
src/tools.py- 工具实现:
list_databasesget_schemaexecute_readonly_sqlexplain_reasoningpreview_tabledownload_result(只读SQL->CSV)build_chartbuild_dashboard
- 工具实现:
src/guard.py- SQL安全规则:
- 仅限单一声明
- 仅选择
- denylist危险代币
- 块
SELECT INTO - 强制执行
TOP (SQL_MAX_ROWS) - 限制复杂性
SQL_MAX_TABLES
- SQL安全规则:
src/db_connection.py- SQLAlchemy+SQL Server连接层
- 支持来自的传统单个数据库
.env以及模块化多数据库DB_CATALOG_PATH
db_catalog.example.json- 具有共享凭据和每个数据库名称的多数据库目录示例
src/logger.py- 事件记录接收器(
file/sql/both) - SQL接收器写入SQL Server表(默认目标:
mcp_logging.events) - 截断/清理字段(包括
user_prompt)
- 事件记录接收器(
logs/sql/001_create_mcp_logging.sql- 用于在可观察性数据库中创建日志模式/表/索引/视图的SQL Server脚本
logs/sql/002_mcp_logging_analysis_queries.sql- 准备运行SQL查询以进行跟踪/会话/错误/性能分析
logs/sql/000_create_mcp_observability_db.sql- 创建专用的可观察性数据库(
McpObservability默认情况下)
- 创建专用的可观察性数据库(
logs/sql/003_mcp_logging_security_and_retention.sql- 创建最低权限角色/用户和保留过程
mcp_tools.json- MCP工具定义由返回
tools/list
- MCP工具定义由返回
logs/export_logs_csv.py- 出口
logs/events.jsonl转换为CSV - 还导出列指南(CSV+XLSX)
- 回填物缺失
user_prompt通过trace_id
- 出口
logs/events.jsonl- 运行时事件日志(原始源)
logs/downloads/- CSV文件由创建
download_result在link模式
- CSV文件由创建
日志和导出
- JSONL运行时日志(原始):
logs/events.jsonl - SQL日志接收器:
- 建议的安装顺序:
- 跑
logs/sql/000_create_mcp_observability_db.sql - 跑
logs/sql/001_create_mcp_logging.sql - 跑
logs/sql/003_mcp_logging_security_and_retention.sql
- 跑
- 脚本默认为数据库名称
McpObservability(编辑USE [...]如果您选择其他名称) - 如果你没有
CREATE DATABASE权限,请DBA预先创建McpObservability然后从步骤2开始 - 使用专用数据库+专用登录记录写入(最低权限)
- 集
.env:LOG_SINK=sql(仅限SQL)或LOG_SINK=both(SQL+jsonl)- 通过设置专用SQL日志连接
LOG_DB_*(推荐)LOG_DB_HOST,LOG_DB_PORT,LOG_DB_NAMELOG_DB_USER,LOG_DB_PASSWORDLOG_DB_DRIVER,LOG_DB_ENCRYPT,LOG_DB_TRUST_SERVER_CERTIFICATE- 最低建议值:
LOG_DB_NAME=McpObservabilityLOG_DB_USER=<logging_writer_user>LOG_DB_PASSWORD=<logging_writer_password>
LOG_DB_*行为:- 仅在以下情况下使用
LOG_SINK是sql或both - 按字段回退:如果
LOG_DB_*缺失/为空,记录器恢复匹配DB_* - 回退是针对每个变量的(不是全部或全无),因此是部分的
LOG_DB_*配置有效 - 如果
LOG_DB_HOST是基于实例的(例如:AMI02\\SQLEXPRESS),LOG_DB_PORT被忽略
- 仅在以下情况下使用
- 默认表目标:
LOG_DB_SCHEMA=mcp_logging,LOG_DB_TABLE=events
- 保留:
- 计划执行SQL代理作业:
EXEC mcp_logging.usp_purge_events_older_than_days @retention_days = 90, @batch_size = 5000;
- 计划执行SQL代理作业:
- 如果SQL插入失败,记录器将回退JSONL写入
LOG_SQL_FALLBACK_PATH
- 建议的安装顺序:
- 导出日志时使用:
venv\\Scripts\\python.exe logs/export_logs_csv.py
- 可选的自定义输出路径:
--input logs/events.jsonl--output logs/events.csv--columns-guide-output logs/events_columns_guide.csv--columns-guide-xlsx-output logs/events_columns_guide.xlsx
- 导出行为:
- 做 不 修改原始
logs/events.jsonl - 仅写入新的导出文件
- 如果目标文件被锁定,则创建一个新的文件名,如下所示
*_new1.csv
- 做 不 修改原始
备注
- 要跨工具事件捕获原始激活提示,请传递
user_prompt(或x-user-prompt标题为/mcp).
