使用说明
CoreMCP
一个用Go编写的模型上下文协议(MCP)服务器,它将SQL数据库作为MCP工具和提示公开。它作为单个静态二进制文件运行,嵌入其驱动程序,并与stdio(用于本地MCP客户端,如Claude Desktop)或出站WebSocket(用于NAT后的远程操作)进行通信。
目前附带MSSQL(SQL Server 2000+, Turkish_CI_AS 支持排序规则)和PostgreSQL适配器。火鸟正在进行中;MySQL正在规划中。
状态
- 稳定: MSSQL适配器、PostgreSQL适配器、stdio传输、模式发现、自定义工具、NOLOCK/土耳其语规范化中间件、WebSocket连接模式。
- 正在进行中: Firebird适配器(出厂时当前返回占位符错误)。
- 路线图: MySQL、HTTP传输、审计日志、查询结果缓存。
默认值
默认情况下,CoreMCP是只读的。省略 readonly 在源配置中,仅SELECT模式处于活动状态;你必须设置 readonly: false 使能够 execute_procedure即便如此,推荐的姿势是专门的DB用户 SELECT (以及 EXECUTE 仅基于您打算公开的过程)——深度防御,而不是仅依赖服务器端防护。
安装
二进制
从下载 发布页面 — linux/amd64, linux/arm64, darwin/{amd64,arm64}, windows/amd64.
单行安装程序(Linux/macOS):
curl -fsSL https://get.corebasehq.com | sh
码头工人
docker pull y11t0/coremcp:latest
多拱形图像(linux/amd64, linux/arm64).
来源
需要Go 1.23+。
git clone https://github.com/corebasehq/coremcp.git
cd coremcp
go build -o coremcp ./cmd/coremcp
配置
coremcp.yaml 在工作目录中:
server:
name: "coremcp-agent"
version: "0.1.0"
transport: "stdio"
port: 8080
logging:
level: "info"
format: "json"
sources:
- name: "my_database"
type: "mssql"
dsn: "sqlserver://username:password@localhost:1433?database=mydb&encrypt=disable"
readonly: true
no_lock: true # READ UNCOMMITTED isolation (WITH (NOLOCK) equivalent)
normalize_turkish: true # Turkish character + mojibake normalization
看 coremcp.example.yaml 举个更全面的例子。
DSN格式
MSSQL:
sqlserver://username:password@host:port?database=dbname&encrypt=disable
PostgreSQL:
postgresql://username:password@host:port/dbname?sslmode=disable
虚拟适配器(用于在没有真实数据库的情况下进行测试):
dummy://test
源选项
| 选项 | 类型 | 默认值 | 描述 |
|---|---|---|---|
name |
string | -- | 唯一源标识符 |
type |
string | -- | 适配器类型: mssql, postgres (或 postgresql), rest, graphql, dummy |
dsn |
string | -- | 连接字符串 |
readonly bool的。 true |
仅在配置级别选择。集 false 明确允许 execute_procedure. |
||
no_lock bool的。 false |
(仅限MSSQL) 在下面运行SELECT READ UNCOMMITTED.相当于 WITH (NOLOCK) 每张桌子上都有参考。消除繁忙OLTP上的共享锁获取。 权衡: 脏读是可能的。 |
||
normalize_turkish bool的。 false |
(仅限MSSQL) 双向中间件。传出:在发送查询之前,SQL字符串文字中的土耳其语字符被折叠为ASCII大写('Hüseyin' → 'HUSEYIN').传入:Windows-1254/Windows-1252结果字符串中的mojibake将自动更正。适用于土耳其传统ERP数据库 Turkish_CI_AS. |
示例:带NOLOCK的MSSQL
sources:
- name: "oltp_db"
type: "mssql"
dsn: "sqlserver://user:pass@localhost:1433?database=production&encrypt=disable"
readonly: true
no_lock: true
示例:土耳其传统ERP
sources:
- name: "erp_db"
type: "mssql"
dsn: "sqlserver://user:pass@localhost:1433?database=LOGO&encrypt=disable"
readonly: true
no_lock: true
normalize_turkish: true
土耳其中间件的行为方式:
| 模型发射 | 发送到数据库 | 为什么 |
|---|---|---|
WHERE ADI = 'Hüseyin' |
WHERE ADI = 'HUSEYIN' |
ERP将名称存储为大写ASCII |
WHERE SEHIR LIKE '%şeker%' |
WHERE SEHIR LIKE '%SEKER%' |
Ş → S |
WHERE SEHIR = 'İstanbul' |
WHERE SEHIR = 'ISTANBUL' |
İ → I |
Mojibake对入站行的更正:
| DB返回 | 已修复 | 原因 |
|---|---|---|
GÐKHAN |
GĞKHAN |
Win-1254字节 0xD0 读作Win-1252 |
ÝSTANBUL |
İSTANBUL |
Win-1254字节 0xDD 读作Win-1252 |
ÞEHİR |
ŞEHİR |
Win-1254字节 0xDE 读作Win-1252 |
安全配置
security:
max_row_limit: 1000 # forced LIMIT cap
enable_pii_masking: true
pii_patterns:
- name: "credit_card"
pattern: '\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}\b'
replacement: "****-****-****-****"
enabled: true
- name: "email"
pattern: '\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
replacement: "***@***.***"
enabled: true
- name: "turkish_id"
pattern: '\b[1-9]\d{10}\b'
replacement: "***********"
enabled: true
这能实现什么:
- T-SQL感知词法分析器。 失败关闭的自定义标记器会删除注释和字符串文字,然后对语句进行分类——仅
SELECT和WITH通过。DROP,ALTER,UPDATE,DELETE,TRUNCATE,EXEC,OPENROWSET,SELECT…INTO并且类似的在到达DB之前被拒绝。多语句有效载荷(任何;外部字符串/注释)是致命的——堆叠查询攻击会独立阻止方言。之所以选择第三方Go SQL解析器(xwb1989/sqlparser、vitess、cockroachdb),是因为它们在T-SQL提示下失败关闭,任何“落入正则表达式”的放松都可以通过以下方式绕过EX/**/EC以及类似的伎俩。将其视为一个层,而不是唯一的层——与权限最小的DB角色配对。 - 强制行帽。
LIMIT在每个SELECT上附加(或包装),因此模型永远不会通过协议流式传输数百万行。 - PII屏蔽。 在结果字符串到达客户端之前,对其进行基于正则表达式的后处理。
用法
CoreMCP有两种操作模式。
1.当地(serve)
对于本地MCP客户端(Claude Desktop等):
coremcp serve --config coremcp.yaml
stdio是默认传输方式:
coremcp serve -t stdio
Claude桌面配置(claude_desktop_config.json):
{
"mcpServers": {
"coremcp": {
"command": "/path/to/coremcp",
"args": ["serve", "-c", "/path/to/coremcp.yaml"],
"env": {}
}
}
}
2.远程(connect)
connect 向中继(通常是CoreBase Cloud)打开出站WebSocket,并通过它为MCP流量提供服务。代理从不接受入站连接,因此它在不允许入站443的网络内部工作(工厂车间、公司VPC、医院网络)。
coremcp connect --server="wss://api.corebasehq.com/ws/agent" --token="sk_xxx"
旗帜:
-s, --server string Relay WebSocket URL (required)
-t, --token string Authentication token (required)
-a, --agent-id string Agent ID (auto-generated if omitted)
-r, --max-reconnect int Max reconnect attempts (default 10; 0 = infinite)
-d, --reconnect-delay duration Delay between reconnect attempts (default 5s)
示例,长时间运行:
./coremcp connect \
--server="wss://api.corebasehq.com/ws/agent" \
--token="sk_xxx" \
--agent-id="site-istanbul-001" \
--max-reconnect=0
中继协议支持的有线命令:
run_sql--执行SQLget_schema--转储缓存的架构list_sources--枚举已配置的源health_check--试剂活性config_sync--将更新的源配置推送到正在运行的代理
建筑
coremcp/
├── cmd/coremcp/ # CLI entry point
│ ├── main.go
│ ├── root.go
│ ├── serve.go # stdio mode
│ └── connect.go # WebSocket mode
├── pkg/
│ ├── adapter/ # Database adapters
│ │ ├── factory.go
│ │ ├── dummy/
│ │ └── mssql/
│ ├── config/
│ ├── core/ # Shared types, Source interface
│ ├── security/ # Query validation, PII masking
│ └── server/ # MCP server
└── coremcp.yaml
工具和提示
内置工具
query_database
对配置的源执行任意SQL。
source_name(必填)query(必填)
list_tables
包含列计数、主键和外键计数的表。
source_name(必填)
describe_table
一个表的完整架构:列、类型、可空性、PK、FK、列注释。
source_name(必填)table_name(必填)
list_views
所有具有列定义的视图。
source_name(必填)
list_procedures
具有参数名称、类型和模式的存储过程(IN/OUT/INOUT),以及一个准备复制的示例调用。
source_name(必填)
execute_procedure
使用命名参数调用存储过程。 仅在以下情况下启用 readonly: false.
source_name(必填)procedure_name(必填)params(可选)--名称/值对的JSON对象
硬化:
- 程序名称已验证
^[a-zA-Z_][a-zA-Z0-9_#@.]*$ - 参数名称已验证(字母数字+下划线)
- 值通过以下方式绑定
sql.Named--无字符串插值 - 当来源被直接拒绝时
readonly: true
例子:
{
"source_name": "erp_db",
"procedure_name": "sp_CiroHesapla",
"params": "{\"StartDate\":\"2024-01-01\",\"EndDate\":\"2024-12-31\"}"
}
定制工具
将可重用的参数化查询定义为一流的MCP工具:
custom_tools:
- name: "get_daily_sales"
description: "Daily sales summary for a given date"
source: "production_db"
query: "SELECT * FROM orders WHERE DATE(created_at) = '{{date}}'"
parameters:
- name: "date"
description: "Date in YYYY-MM-DD format"
required: true
- name: "get_top_customers"
description: "Top N customers by order count"
source: "production_db"
query: "SELECT user_id, COUNT(*) AS order_count FROM orders GROUP BY user_id ORDER BY order_count DESC LIMIT {{limit}}"
parameters:
- name: "limit"
description: "Number of customers to return"
required: true
default: "10"
这些参数通过其声明的参数模式暴露给模型,因此模型可以直接调用它们,而无需每次重新推导SQL。
database_schema 提示
启动时,CoreMCP连接到每个配置的源,扫描表/列/键/关系,并提取列注释(例如。 MS_Description 在MSSQL上)。结果以单个MCP提示的形式公开,该提示用模式上下文(包括注释)为模型设置初始值,因此它可以在每次对话中编写正确的查询,而无需手动模式转储。
添加适配器
- 创建
pkg/adapter/yourdb/. - 实施
core.Source. - 注册于
pkg/adapter/factory.go.
pkg/adapter/dumy/dummy.go 是最低参考实现。
路线图
- [x] 启动时发现架构
- [x] 专栏评论/描述
- [x] 内置
list_tables/describe_table - [x] 自定义参数化工具
- [x] 用于查询净化的T-SQL感知词法分析器(失败关闭、多语句拒绝、无第三方解析器)
- [x] PII屏蔽
- [x] 强制排帽
- [x] websocket
connect模式 - [x] 自动重新连接
- [x] 远程配置同步
- [x] 每个源(MSSQL)均未锁定/读取
- [x] 土耳其语+mojibake中间件(MSSQL)
- [x] 查看和过程发现(
list_views,list_procedures,execute_procedure) - [x] PostgreSQL适配器
- []Firebird适配器(正在进行中)
- []MySQL适配器
- []HTTP传输
- []查询结果缓存
- []写操作(有明确的安全防护)
- []审核日志记录
- []多代理管理
- []实时监控
贡献
许可证
Apache许可证2.0——请参阅 许可证.
支持
关于
CoreMCP是 CoreBase --客户使用的AI代理的内存基础设施。CoreBase为这些代理提供了对操作系统(SQL Server 2000+、REST、GraphQL、Slack、Microsoft 365)的结构化访问,并在其上构建了企业内存层:模式关系、术语和经过验证的查询模式,将原始访问转化为准确的答案。