之前开源了universal-db-mcp万能数据库连接器,支持了stdio、SSE、Streamable、REST等传输方式。REST方式都比较熟,Streamable在使用ApiPost/Postman进行测试的时候跟REST有一些差异,遂记录一下。 本文介绍如何使用 ApiPost 测试 Universal DB MCP 的 Streamable HTTP 传输方式,当然只要是Streamable HTTP 传输方式的MCP都可以按照下文逻辑进行测试。
1. 什么是 Streamable HTTP? #
Streamable HTTP 是 MCP (Model Context Protocol) 2025 规范中引入的新传输方式,专为 AI 与外部工具/服务的交互设计。它基于 HTTP 协议,但采用了 JSON-RPC 2.0 消息格式和 SSE (Server-Sent Events) 流式响应机制。
1.1 核心特点 #
| 特性 | 说明 |
|---|---|
| 协议基础 | HTTP + JSON-RPC 2.0 |
| 响应格式 | SSE (Server-Sent Events) 流式传输 |
| 会话管理 | 通过 mcp-session-id 维护有状态会话 |
| 双向通信 | 支持服务器主动推送消息 |
| 标准化 | 遵循 MCP 协议规范,跨平台兼容 |
1.2 工作流程 #
┌─────────────┐ ┌─────────────┐
│ 客户端 │ │ 服务器 │
└──────┬──────┘ └──────┬──────┘
│ │
│ 1. initialize (建立会话) │
│ ─────────────────────────────────>│
│ │
│ 2. 返回 session-id + 能力声明 │
│ <─────────────────────────────────│
│ │
│ 3. tools/list (获取工具列表) │
│ ─────────────────────────────────>│
│ │
│ 4. 返回可用工具 │
│ <─────────────────────────────────│
│ │
│ 5. tools/call (调用工具) │
│ ─────────────────────────────────>│
│ │
│ 6. SSE 流式返回结果 │
│ <═════════════════════════════════│
│ │
2. Streamable HTTP vs REST API 对比 #
Universal DB MCP 同时支持 Streamable HTTP 和 REST API 两种方式访问,以下是它们的详细对比:
2.1 协议层面对比 #
| 对比项 | Streamable HTTP (MCP) | REST API |
|---|---|---|
| 协议规范 | MCP + JSON-RPC 2.0 | RESTful HTTP |
| 消息格式 | 统一的 JSON-RPC 格式 | 标准 JSON |
| 响应格式 | SSE 流式 (text/event-stream) | 普通 JSON (application/json) |
| 会话状态 | 有状态(需要 session-id) | 有状态(需要 session-id) |
| 端点设计 | 单一端点 /mcp | 多个 RESTful 端点 |
2.2 请求方式对比 #
Streamable HTTP 请求示例:
POST /mcp
Content-Type: application/json
Accept: application/json, text/event-stream
mcp-session-id: xxx
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "execute_query",
"arguments": {"query": "SELECT * FROM users"}
}
}
REST API 请求示例:
POST /api/query
Content-Type: application/json
X-Session-ID: xxx
{
"query": "SELECT * FROM users"
}
2.3 响应格式对比 #
Streamable HTTP 响应(SSE 格式):
event: message
data: {"jsonrpc":"2.0","id":1,"result":{"content":[{"type":"text","text":"{...}"}]}}
REST API 响应(普通 JSON):
{
"success": true,
"data": {
"rows": [...],
"executionTime": 15
}
}
2.4 功能端点对比 #
| 功能 | Streamable HTTP | REST API |
|---|---|---|
| 连接数据库 | initialize + Headers | POST /api/connect |
| 执行查询 | tools/call (execute_query) | POST /api/query |
| 获取Schema | tools/call (get_schema) | GET /api/schema |
| 获取表信息 | tools/call (get_table_info) | GET /api/tables/:name |
| 断开连接 | DELETE /mcp | POST /api/disconnect |
2.5 适用场景 #
| 场景 | 推荐方式 | 原因 |
|---|---|---|
| AI 助手集成 | Streamable HTTP | MCP 是 AI 工具调用的标准协议 |
| Dify/Coze 等平台 | Streamable HTTP | 这些平台原生支持 MCP |
| 传统应用集成 | REST API | 更简单直接,无需理解 MCP 协议 |
| 快速原型开发 | REST API | 请求/响应格式更简单 |
| 需要流式响应 | Streamable HTTP | 原生支持 SSE 流式传输 |
2.6 选择建议 #
- 选择 Streamable HTTP:当你需要与 AI 平台(如 Claude Desktop、Dify、Coze)集成,或需要遵循 MCP 标准协议时
- 选择 REST API:当你只需要简单的数据库查询功能,或在传统 Web 应用中集成时
3. 前置准备 #
3.1 启动服务 #
# 启动HTTP模式服务
MODE=http HTTP_PORT=3000 npx universal-db-mcp
或者直接部署在服务器上即可
3.2 请求流程概览 #
1. POST /mcp (initialize) → 获取 mcp-session-id
↓
2. POST /mcp (initialized) → 通知服务器初始化完成(可选)
↓
3. POST /mcp (tools/list) → 获取可用工具列表
↓
4. POST /mcp (tools/call) → 调用具体工具
↓
5. DELETE /mcp → 关闭会话(可选)
现在PostMan、ApiFox都已经支持直接对MCP进行调试了,但是ApiPost还不支持。所以下面将有两种方法对其进行测试,一种是支持MCP模式的,一种是不支持的
4. 不支持直接MCP测试的情况(ApiPost) #
4.1 第一步:初始化会话 (Initialize) #
4.1.1 请求配置 #
| 项目 | 值 |
|---|---|
| 方法 | POST |
| URL | http://localhost:3000/mcp |
4.1.2 请求头 (Headers) #
| Header | 值 | 说明 |
|---|---|---|
Content-Type | application/json | 必填 |
Accept | application/json, text/event-stream | 必填,MCP规范要求 |
X-API-Key | your-api-key | API密钥,用于身份验证 |
X-DB-Type | mysql | 数据库类型 |
X-DB-Host | localhost | 数据库主机 |
X-DB-Port | 3306 | 端口 |
X-DB-User | root | 用户名 |
X-DB-Password | your_password | 密码 |
X-DB-Database | your_database | 数据库名 |
X-DB-Allow-Write | false | 是否允许写入操作 |
重要:
Accept头必须同时包含application/json和text/event-stream,否则会返回错误:{"jsonrpc":"2.0","error":{"code":-32000,"message":"Not Acceptable: Client must accept both application/json and text/event-stream"},"id":null}
4.1.3 请求体 (Body) #
选择 raw → JSON 格式:
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2026-11-05",
"capabilities": {},
"clientInfo": {
"name": "apipost-test",
"version": "1.0.0"
}
}
}
4.1.4 响应说明 #
响应采用 SSE (Server-Sent Events) 格式:
event: message
data: {"result":{"protocolVersion":"2026-11-05","capabilities":{"tools":{}},"serverInfo":{"name":"universal-db-mcp","version":"1.0.0"}},"jsonrpc":"2.0","id":1}
实际 JSON 数据在 data: 后面,解析后为:
{
"result": {
"protocolVersion": "2026-11-05",
"capabilities": {
"tools": {}
},
"serverInfo": {
"name": "universal-db-mcp",
"version": "1.0.0"
}
},
"jsonrpc": "2.0",
"id": 1
}
4.1.5 获取 Session ID #
重要:查看 ApiPost 的响应头 (Response Headers),找到 mcp-session-id 字段:
mcp-session-id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
复制此值,后续所有请求都需要在请求头中带上它。
4.1.6 ApiPost示例 #


4.2 第二步:发送 initialized 通知(可选) #
此步骤用于通知服务器客户端已完成初始化,属于 MCP 协议的握手确认机制。大多数情况下可以跳过。
4.2.1 请求头 (Headers) #
| Header | 值 |
|---|---|
Content-Type | application/json |
Accept | application/json, text/event-stream |
X-API-Key | your-api-key |
mcp-session-id | {第一步获取的session-id} |
4.2.2 请求体 (Body) #
{
"jsonrpc": "2.0",
"method": "notifications/initialized"
}
注意:这是一个通知(notification),没有
id字段,服务器不会返回响应。
4.2.3 ApiPost示例 #

4.3 第三步:获取可用工具列表 #
4.3.1 请求头 (Headers) #
| Header | 值 |
|---|---|
Content-Type | application/json |
Accept | application/json, text/event-stream |
X-API-Key | your-api-key |
mcp-session-id | {你的session-id} |
4.3.2 请求体 (Body) #
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list",
"params": {}
}
4.3.3 预期响应 #
返回 4 个可用工具:
| 工具名 | 功能 |
|---|---|
execute_query | 执行 SQL 查询 |
get_schema | 获取数据库结构 |
get_table_info | 获取指定表详细信息 |
clear_cache | 清除 Schema 缓存 |
4.3.4 ApiPost示例 #

4.4 第四步:调用工具 #
4.4.1 获取数据库结构 (get_schema) #
4.4.1.1 请求头 (Headers) #
| Header | 值 |
|---|---|
Content-Type | application/json |
Accept | application/json, text/event-stream |
X-API-Key | your-api-key |
mcp-session-id | {你的session-id} |
4.4.1.2 请求体 (Body) #
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "get_schema",
"arguments": {
"forceRefresh": false
}
}
}
4.4.1.3 ApiPost示例 #

4.4.2 执行 SQL 查询 (execute_query) #
4.4.2.1 请求头 (Headers) #
| Header | 值 |
|---|---|
Content-Type | application/json |
Accept | application/json, text/event-stream |
X-API-Key | your-api-key |
mcp-session-id | {你的session-id} |
4.4.2.2 请求体 (Body) #
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "execute_query",
"arguments": {
"query": "SELECT * FROM your_table LIMIT 10"
}
}
}
4.4.2.3 带参数的查询(防 SQL 注入) #
{
"jsonrpc": "2.0",
"id": 5,
"method": "tools/call",
"params": {
"name": "execute_query",
"arguments": {
"query": "SELECT * FROM users WHERE id = ?",
"params": ["123"]
}
}
}
4.4.2.4 ApiPost示例 #

4.4.3 获取表详细信息 (get_table_info) #
4.4.3.1 请求体 (Body) #
{
"jsonrpc": "2.0",
"id": 6,
"method": "tools/call",
"params": {
"name": "get_table_info",
"arguments": {
"tableName": "users",
"forceRefresh": false
}
}
}
4.4.3.2 ApiPost示例 #

4.4.4 清除缓存 (clear_cache) #
4.4.4.1 请求体 (Body) #
{
"jsonrpc": "2.0",
"id": 7,
"method": "tools/call",
"params": {
"name": "clear_cache",
"arguments": {}
}
}
4.4.4.2 ApiPost示例 #

4.5 第五步:关闭会话(可选) #
4.5.1 请求配置 #
| 项目 | 值 |
|---|---|
| 方法 | DELETE |
| URL | http://localhost:3000/mcp |
4.5.2 请求头 (Headers) #
| Header | 值 |
|---|---|
X-API-Key | your-api-key |
mcp-session-id | {你的session-id} |
4.5.3 预期响应 #
{
"success": true,
"message": "Session closed"
}
4.5.4 ApiPost示例 #

4.6 支持的数据库类型 #
在 X-DB-Type 头中可以使用以下值:
| 数据库 | X-DB-Type 值 | 默认端口 |
|---|---|---|
| MySQL | mysql | 3306 |
| PostgreSQL | postgres | 5432 |
| SQL Server | sqlserver | 1433 |
| Oracle | oracle | 1521 |
| MongoDB | mongodb | 27017 |
| Redis | redis | 6379 |
| SQLite | sqlite | - |
| 达梦 | dm | 5236 |
| 人大金仓 | kingbase | 54321 |
| 华为GaussDB | gaussdb | 5432 |
| 蚂蚁OceanBase | oceanbase | 2881 |
| PingCAP TiDB | tidb | 4000 |
| ClickHouse | clickhouse | 8123 |
| 阿里PolarDB | polardb | 3306 |
| 海量Vastbase | vastbase | 5432 |
| 瀚高HighGo | highgo | 5866 |
| 中兴GoldenDB | goldendb | 3306 |
4.7 常见问题 #
Q1: 返回 “Not Acceptable” 错误 #
原因:缺少 Accept 头或值不正确
解决:确保请求头包含:
Accept: application/json, text/event-stream
Q2: 返回 “Bad Request: No valid session ID provided” #
原因:非初始化请求缺少 mcp-session-id 头
解决:从第一步的响应头中获取 mcp-session-id,并在后续请求中携带
Q3: 响应是 SSE 格式,如何解析? #
说明:Streamable HTTP 使用 SSE 格式返回数据
格式:
event: message
data: {实际的JSON数据}
提取 data: 后面的内容即为实际响应 JSON。
Q4: SQLite 数据库如何配置? #
SQLite 使用文件路径而非网络连接:
| Header | 值 |
|---|---|
X-DB-Type | sqlite |
X-DB-Filepath | /path/to/database.db |
5. 支持直接MCP测试的情况(PostMan、ApiFox) #
5.1 新建一个 MCP Client #


5.2 填写 URL 和 Token #
- URL 默认的话就是 http://localhost:3000/mcp
- Auth Type 选 Bearer Token,填写你的 token


5.3 在 Header 填写数据库信息 #
我是连接本地的 MongoDB,配置 X-DB-Type、X-DB-Host、X-DB-Port 即可


5.4 点击连接,选择工具,即可调试 #


这样就不用关注那些网络协议的细节了,直接测试 MCP 工具本身。