之前开源了universal-db-mcp万能数据库连接器,支持了stdio、SSE、Streamable、REST等传输方式。REST方式都比较熟,Streamable在使用ApiPost/Postman进行测试的时候跟REST有一些差异。加上最近看到有佬友在使用universal-db-mcp的时候,使用Postman对Streamable进行测试有些疑问,遂记录一下。
本文介绍如何使用 ApiPost 测试 Universal DB MCP 的 Streamable HTTP 传输方式,当然只要是Streamable HTTP 传输方式的MCP都可以按照下文逻辑进行测试。
什么是 Streamable HTTP?
Streamable HTTP 是 MCP (Model Context Protocol) 2025 规范中引入的新传输方式,专为 AI 与外部工具/服务的交互设计。它基于 HTTP 协议,但采用了 JSON-RPC 2.0 消息格式和 SSE (Server-Sent Events) 流式响应机制。
核心特点
| 特性 | 说明 |
|---|---|
| 协议基础 | HTTP + JSON-RPC 2.0 |
| 响应格式 | SSE (Server-Sent Events) 流式传输 |
| 会话管理 | 通过 mcp-session-id 维护有状态会话 |
| 双向通信 | 支持服务器主动推送消息 |
| 标准化 | 遵循 MCP 协议规范,跨平台兼容 |
工作流程
┌─────────────┐ ┌─────────────┐
│ 客户端 │ │ 服务器 │
└──────┬──────┘ └──────┬──────┘
│ │
│ 1. initialize (建立会话) │
│ ─────────────────────────────────>│
│ │
│ 2. 返回 session-id + 能力声明 │
│ <─────────────────────────────────│
│ │
│ 3. tools/list (获取工具列表) │
│ ─────────────────────────────────>│
│ │
│ 4. 返回可用工具 │
│ <─────────────────────────────────│
│ │
│ 5. tools/call (调用工具) │
│ ─────────────────────────────────>│
│ │
│ 6. SSE 流式返回结果 │
│ <═════════════════════════════════│
│ │Streamable HTTP vs REST API 对比
Universal DB MCP 同时支持 Streamable HTTP 和 REST API 两种方式访问,以下是它们的详细对比:
协议层面对比
| 对比项 | 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 端点 |
请求方式对比
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"
}响应格式对比
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}}功能端点对比
| 功能 | 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 |
适用场景
| 场景 | 推荐方式 | 原因 |
|---|---|---|
| AI 助手集成 | Streamable HTTP | MCP 是 AI 工具调用的标准协议 |
| Dify/Coze 等平台 | Streamable HTTP | 这些平台原生支持 MCP |
| 传统应用集成 | REST API | 更简单直接,无需理解 MCP 协议 |
| 快速原型开发 | REST API | 请求/响应格式更简单 |
| 需要流式响应 | Streamable HTTP | 原生支持 SSE 流式传输 |
选择建议
- 选择 Streamable HTTP:当你需要与 AI 平台(如 Claude Desktop、Dify、Coze)集成,或需要遵循 MCP 标准协议时
- 选择 REST API:当你只需要简单的数据库查询功能,或在传统 Web 应用中集成时
前置准备
启动服务
# 启动HTTP模式服务
MODE=http HTTP_PORT=3000 npx universal-db-mcp或者直接部署在服务器上即可
请求流程概览
1. POST /mcp (initialize) → 获取 mcp-session-id
↓
2. POST /mcp (initialized) → 通知服务器初始化完成(可选)
↓
3. POST /mcp (tools/list) → 获取可用工具列表
↓
4. POST /mcp (tools/call) → 调用具体工具
↓
5. DELETE /mcp → 关闭会话(可选)第一步:初始化会话 (Initialize)
请求配置
| 项目 | 值 |
|---|---|
| 方法 | POST |
| URL | http://localhost:3000/mcp |
请求头 (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}
请求体 (Body)
选择 raw → JSON 格式:
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2026-11-05","capabilities":{},"clientInfo":{"name":"apipost-test","version":"1.0.0"}}}响应说明
响应采用 SSE (Server-Sent Events) 格式:
实际 JSON 数据在 data: 后面,解析后为:
{"result":{"protocolVersion":"2026-11-05","capabilities":{"tools":{}},"serverInfo":{"name":"universal-db-mcp","version":"1.0.0"}},"jsonrpc":"2.0","id":1}获取 Session ID
重要:查看 ApiPost 的响应头 (Response Headers),找到 mcp-session-id 字段:
mcp-session-id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx复制此值,后续所有请求都需要在请求头中带上它。
ApiPost示例


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

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

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

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

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

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

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

支持的数据库类型
在 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 |
常见问题
Q1: 返回 “Not Acceptable” 错误
原因:缺少 Accept 头或值不正确
解决:确保请求头包含:
Accept: application/json, text/event-streamQ2: 返回 “Bad Request: No valid session ID provided”
原因:非初始化请求缺少 mcp-session-id 头
解决:从第一步的响应头中获取 mcp-session-id,并在后续请求中携带
Q3: 响应是 SSE 格式,如何解析?
说明:Streamable HTTP 使用 SSE 格式返回数据
格式:
event: messagedata: {实际的JSON数据}提取 data: 后面的内容即为实际响应 JSON。
Q4: SQLite 数据库如何配置?
SQLite 使用文件路径而非网络连接:
| Header | 值 |
|---|---|
X-DB-Type | sqlite |
X-DB-Filepath | /path/to/database.db |
原文【开源自荐5】MCP 数据库万能连接器:用自然语言查询和分析数据
本站部分文章来自网络或用户投稿。涉及到的言论观点不代表本站立场。发布者:恰卡,如若本篇文章侵犯了原著者的合法权益,可联系我们进行处理。本文链接:https://fajihao.com/i/26231.html