数据库模型协议服务器

一个用Go编写的模型上下文协议(MCP)服务器,将SQL数据库暴露为MCP工具和提示,支持本地stdio和远程WebSocket连接模式。

  • by CoreBaseHQ
  • Go
  • 本地部署
  • 11 星标
  • 更新于
在 GitHub 查看 CoreBaseHQ/coremcp

使用说明

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 --执行SQL
  • get_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提示的形式公开,该提示用模式上下文(包括注释)为模型设置初始值,因此它可以在每次对话中编写正确的查询,而无需手动模式转储。

添加适配器

  1. 创建 pkg/adapter/yourdb/.
  2. 实施 core.Source.
  3. 注册于 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传输
  • []查询结果缓存
  • []写操作(有明确的安全防护)
  • []审核日志记录
  • []多代理管理
  • []实时监控

贡献

看 贡献.md.安全报告: 安全.md.

许可证

Apache许可证2.0——请参阅 许可证.

支持


关于

CoreMCP是 CoreBase --客户使用的AI代理的内存基础设施。CoreBase为这些代理提供了对操作系统(SQL Server 2000+、REST、GraphQL、Slack、Microsoft 365)的结构化访问,并在其上构建了企业内存层:模式关系、术语和经过验证的查询模式,将原始访问转化为准确的答案。