This is an automated email from the ASF dual-hosted git repository.
FreeOnePlus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris-mcp-server.git
The following commit(s) were added to refs/heads/master by this push:
new e329af4 Add MCP 2025-06-18 host compatibility coverage (#194)
e329af4 is described below
commit e329af4199a72a74061b6c6d1bd45b8d29cee535
Author: Yijia Su <[email protected]>
AuthorDate: Sat Aug 1 12:42:24 2026 +0800
Add MCP 2025-06-18 host compatibility coverage (#194)
---
CHANGELOG.md | 8 ++-
README.md | 6 ++
README.zh-CN.md | 6 ++
docs/getting-started/quickstart.md | 5 ++
docs/getting-started/quickstart.zh-CN.md | 4 ++
docs/integrations/hosts.md | 26 ++++++++-
docs/integrations/hosts.zh-CN.md | 24 +++++++-
docs/migration-1.0.0.md | 5 +-
docs/migration/1.0.0.md | 6 +-
docs/migration/1.0.0.zh-CN.md | 6 +-
docs/operations/deployment.md | 11 ++++
docs/operations/deployment.zh-CN.md | 10 ++++
docs/operations/troubleshooting.md | 5 +-
docs/operations/troubleshooting.zh-CN.md | 5 +-
docs/protocol/mcp-2026-07-28.md | 6 +-
docs/protocol/mcp-2026-07-28.zh-CN.md | 6 +-
docs/reference/configuration.md | 2 +-
docs/reference/configuration.zh-CN.md | 2 +-
docs/releases/1.0.0.md | 3 +-
docs/releases/1.0.0.zh-CN.md | 3 +-
test/protocol/test_http_transport_boundaries.py | 13 +++--
test/protocol/test_mcp_v2_protocol.py | 75 +++++++++++++++++++++++++
22 files changed, 211 insertions(+), 26 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e1a82e4..fbfe3bd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -27,6 +27,9 @@ under **Unreleased** until a new version is selected and
published.
### Added
+- Added an explicit Dify 1.16.1 compatibility profile for MCP `2025-06-18`
+ through the default-off `/mcp/legacy` endpoint, with initialize, stateless
+ tool-discovery, and tool-call regression coverage.
- Added eight default-off MetricFlow consumer children to `doris_semantic`
for exact-model discovery, status, metrics, group-bys, saved queries,
dimension values, Doris SQL compilation, and bounded execution through the
@@ -62,6 +65,9 @@ under **Unreleased** until a new version is selected and
published.
### Fixed
+- Documented the strict `/mcp` versus `/mcp/legacy` endpoint boundary in the
+ protocol, Host, quick-start, deployment, troubleshooting, migration, and
+ release guides without restoring pre-1.0 tool names or weakening security.
- Added the Apache SkyWalking Eyes release gate, its bounded repository
configuration, and the missing ASF license headers required for source
release verification.
@@ -83,7 +89,7 @@ under **Unreleased** until a new version is selected and
published.
### Added
- MCP `2026-07-28` stateless protocol support on Streamable HTTP and stdio,
- with a `2025-11-25` migration path.
+ with HTTP migration paths for `2025-06-18` and `2025-11-25`.
- Doris-backed OAuth with per-user Doris connection pools and operation gates.
- Client ID Metadata Document discovery for Doris-backed OAuth, including
bounded retrieval, DNS pinning, cache-control handling, and consent-screen
diff --git a/README.md b/README.md
index 777e74d..b83fb16 100644
--- a/README.md
+++ b/README.md
@@ -115,9 +115,15 @@ doris-mcp-server \
Endpoints:
- MCP: `POST http://127.0.0.1:3000/mcp`
+- legacy MCP (opt-in): `POST http://127.0.0.1:3000/mcp/legacy`
- liveness: `GET http://127.0.0.1:3000/live`
- Doris-backed readiness: `GET http://127.0.0.1:3000/ready`
+Hosts limited to handshake-era Streamable HTTP, including Dify 1.16.1 with
+MCP `2025-06-18`, must set `ENABLE_LEGACY_HTTP_ADAPTER=true` and connect to
+`/mcp/legacy`. The adapter changes only the protocol boundary; it preserves the
+same 1.0 tools, authorization, capability gates, and read-only execution.
+
Or run stdio for a local Host:
```bash
diff --git a/README.zh-CN.md b/README.zh-CN.md
index 1144ab0..88eeb82 100644
--- a/README.zh-CN.md
+++ b/README.zh-CN.md
@@ -112,9 +112,15 @@ doris-mcp-server \
服务端点:
- MCP:`POST http://127.0.0.1:3000/mcp`
+- 旧版 MCP(显式开启):`POST http://127.0.0.1:3000/mcp/legacy`
- 存活检查:`GET http://127.0.0.1:3000/live`
- Doris 就绪检查:`GET http://127.0.0.1:3000/ready`
+仅支持 Handshake-era Streamable HTTP 的 Host,包括使用 MCP `2025-06-18` 的
+Dify 1.16.1,需要设置 `ENABLE_LEGACY_HTTP_ADAPTER=true` 并连接
+`/mcp/legacy`。Adapter 只改变协议边界,仍使用相同的 1.0 Tool、授权、能力 Gate
+和只读执行链路。
+
也可以为本地 Host 启动 stdio:
```bash
diff --git a/docs/getting-started/quickstart.md
b/docs/getting-started/quickstart.md
index e4d7086..c1ef155 100644
--- a/docs/getting-started/quickstart.md
+++ b/docs/getting-started/quickstart.md
@@ -100,6 +100,11 @@ The modern MCP endpoint is:
POST http://127.0.0.1:3000/mcp
```
+For a validated handshake-era Host such as Dify 1.16.1 using MCP
+`2025-06-18`, restart with `ENABLE_LEGACY_HTTP_ADAPTER=true` and configure the
+Host URL as `http://127.0.0.1:3000/mcp/legacy`. Do not send legacy traffic to
+`/mcp`.
+
Health endpoints:
```bash
diff --git a/docs/getting-started/quickstart.zh-CN.md
b/docs/getting-started/quickstart.zh-CN.md
index e9748f2..372cef7 100644
--- a/docs/getting-started/quickstart.zh-CN.md
+++ b/docs/getting-started/quickstart.zh-CN.md
@@ -98,6 +98,10 @@ doris-mcp-server \
POST http://127.0.0.1:3000/mcp
```
+对于已经验证的 Handshake-era Host,例如使用 MCP `2025-06-18` 的 Dify
+1.16.1,请设置 `ENABLE_LEGACY_HTTP_ADAPTER=true` 后重启,并把 Host URL 配置为
+`http://127.0.0.1:3000/mcp/legacy`。不能把旧协议流量发送到 `/mcp`。
+
健康端点:
```bash
diff --git a/docs/integrations/hosts.md b/docs/integrations/hosts.md
index 7cb9e1e..d535745 100644
--- a/docs/integrations/hosts.md
+++ b/docs/integrations/hosts.md
@@ -147,6 +147,30 @@ Authorization: Bearer <token>
Do not put credentials in the URL. Remote access requires HTTPS and validated
Host/Origin/proxy policy.
+## Protocol endpoint compatibility
+
+Choose the endpoint from the Host's implemented MCP protocol. Do not rely on
+automatic downgrade or send an old handshake to the modern endpoint.
+
+| Host profile | Protocol | Endpoint | Status |
+|---|---|---|---|
+| Modern MCP Host | `2026-07-28` | `/mcp` | Preferred and release-gated |
+| Dify 1.16.1 | `2025-06-18` | `/mcp/legacy` | Validated with initialize, tool
discovery, and tool calls |
+| Legacy SDK v2 client | `2025-11-25` | `/mcp/legacy` | Regression-tested
migration path |
+
+Enable the compatibility endpoint explicitly:
+
+```bash
+export ENABLE_LEGACY_HTTP_ADAPTER=true
+doris-mcp-server --transport http --host 127.0.0.1 --port 3000
+```
+
+The legacy endpoint is a protocol adapter over the same Server. It does not
+restore removed tool names, weaken authentication or authorization, bypass
+Doris capability checks, or change read-only execution. Tool exposure mode is
+an independent startup choice; use `hierarchical` unless the Host specifically
+requires `flat`.
+
## Built-in command-line client
`doris-mcp-client` is useful for connection and protocol diagnostics. It is not
@@ -189,7 +213,7 @@ Hosts should:
| Requirement | Hierarchical | Flat |
|---|---:|---:|
-| MCP `2026-07-28` tool list/call | required | required |
+| tool list/call on the selected protocol endpoint | required | required |
| call a domain with `{}` | required | not required |
| feed discovered child schemas to model | required | not required |
| handle structured content | recommended | recommended |
diff --git a/docs/integrations/hosts.zh-CN.md b/docs/integrations/hosts.zh-CN.md
index d28d11e..bfecd7a 100644
--- a/docs/integrations/hosts.zh-CN.md
+++ b/docs/integrations/hosts.zh-CN.md
@@ -133,6 +133,28 @@ Authorization: Bearer <token>
不能把凭据放 URL。远程访问需要 HTTPS 与已校验 Host/Origin/Proxy Policy。
+## 协议端点兼容性
+
+应根据 Host 实现的 MCP 协议选择端点,不能依赖自动降级,也不能把旧初始化请求
+发送到现代端点。
+
+| Host Profile | 协议 | 端点 | 状态 |
+|---|---|---|---|
+| 现代 MCP Host | `2026-07-28` | `/mcp` | 首选且经过 Release Gate |
+| Dify 1.16.1 | `2025-06-18` | `/mcp/legacy` | 已验证初始化、Tool Discovery 与 Tool
Call |
+| 旧 SDK v2 Client | `2025-11-25` | `/mcp/legacy` | 有回归测试的迁移路径 |
+
+显式开启兼容端点:
+
+```bash
+export ENABLE_LEGACY_HTTP_ADAPTER=true
+doris-mcp-server --transport http --host 127.0.0.1 --port 3000
+```
+
+Legacy 端点是同一 Server 上的协议 Adapter,不会恢复已删除的 Tool 名称、降低认证
+或授权、绕过 Doris 能力检查或改变只读执行。Tool Exposure Mode 是独立的启动级
+选择;除非 Host 明确要求 `flat`,否则应使用 `hierarchical`。
+
## 内置命令行 Client
`doris-mcp-client` 用于连接与协议诊断。它不是 Server Executable,不能在 Host
@@ -172,7 +194,7 @@ Host 应当:
| 要求 | Hierarchical | Flat |
|---|---:|---:|
-| MCP `2026-07-28` Tool List/Call | 必需 | 必需 |
+| 在所选协议端点完成 Tool List/Call | 必需 | 必需 |
| 用 `{}` 调用领域 | 必需 | 不需要 |
| 把发现 Child Schema 交给模型 | 必需 | 不需要 |
| 处理 Structured Content | 推荐 | 推荐 |
diff --git a/docs/migration-1.0.0.md b/docs/migration-1.0.0.md
index cee5fd4..afedcd5 100644
--- a/docs/migration-1.0.0.md
+++ b/docs/migration-1.0.0.md
@@ -120,8 +120,9 @@ guess a model from the prompt.
## Protocol and transport
MCP `2026-07-28` is the modern protocol on Streamable HTTP and stdio. The
-isolated `2025-11-25` HTTP migration adapter remains default-off at
-`/mcp/legacy` and does not restore pre-1.0 tool names. Enable it only for a
+isolated HTTP migration adapter remains default-off at `/mcp/legacy` and has
+regression coverage for `2025-06-18` (including Dify 1.16.1) and
+`2025-11-25`. It does not restore pre-1.0 tool names. Enable it only for a
bounded protocol migration by setting `ENABLE_LEGACY_HTTP_ADAPTER=true`.
## Doris version handling
diff --git a/docs/migration/1.0.0.md b/docs/migration/1.0.0.md
index 37585b3..8f8107d 100644
--- a/docs/migration/1.0.0.md
+++ b/docs/migration/1.0.0.md
@@ -165,8 +165,10 @@ For HTTP `2026-07-28`:
5. accept modern structured content and typed errors.
For a bounded legacy HTTP migration, enable the adapter and point only the old
-client to `/mcp/legacy`. Do not point legacy traffic at `/mcp` and do not keep
-the adapter as a permanent architecture.
+client to `/mcp/legacy`. The regression-tested HTTP profiles are `2025-06-18`
+(including Dify 1.16.1) and `2025-11-25`. Do not point legacy traffic at
+`/mcp`; the adapter preserves the 1.0 tool and security contracts and is not a
+pre-1.0 compatibility alias.
## Doris version and capability migration
diff --git a/docs/migration/1.0.0.zh-CN.md b/docs/migration/1.0.0.zh-CN.md
index a609355..7793e2b 100644
--- a/docs/migration/1.0.0.zh-CN.md
+++ b/docs/migration/1.0.0.zh-CN.md
@@ -158,8 +158,10 @@ HTTP `2026-07-28`:
Session、HTTP GET Stream、Last-Event-ID 和 Resumable SSE 假设;
5. 接受现代 Structured Content 与类型化错误。
-有界旧 HTTP 迁移可以启用 Adapter,只让旧 Client 连接 `/mcp/legacy`。不能把旧
-流量发到 `/mcp`,也不能把 Adapter 当作永久架构。
+有界旧 HTTP 迁移可以启用 Adapter,只让旧 Client 连接 `/mcp/legacy`。经过回归
+测试的 HTTP Profile 是 `2025-06-18`(包括 Dify 1.16.1)和 `2025-11-25`。
+不能把旧流量发到 `/mcp`;Adapter 保留 1.0 Tool 与安全合同,不是 1.0 以前的
+兼容 Alias。
## Doris 版本与能力迁移
diff --git a/docs/operations/deployment.md b/docs/operations/deployment.md
index 3b70444..646356a 100644
--- a/docs/operations/deployment.md
+++ b/docs/operations/deployment.md
@@ -88,6 +88,17 @@ Endpoints:
- `GET /health` — compatibility health view;
- `/mcp/legacy` — default-off protocol migration adapter.
+Enable `/mcp/legacy` only for validated handshake-era clients such as Dify
+1.16.1 (`2025-06-18`) or SDK v2 clients using `2025-11-25`:
+
+```bash
+export ENABLE_LEGACY_HTTP_ADAPTER=true
+```
+
+Configure those Hosts with the exact `/mcp/legacy` URL. Keep modern
+`2026-07-28` Hosts on `/mcp`; the Server never silently downgrades that
+endpoint.
+
Keep the Server on loopback until authentication, Host/Origin policy, proxy
behavior, TLS termination, timeouts, and secret injection are tested together.
diff --git a/docs/operations/deployment.zh-CN.md
b/docs/operations/deployment.zh-CN.md
index b3b43c7..bbccc1d 100644
--- a/docs/operations/deployment.zh-CN.md
+++ b/docs/operations/deployment.zh-CN.md
@@ -84,6 +84,16 @@ doris-mcp-server --transport http --host 127.0.0.1 --port
3000
- `GET /health`——兼容健康视图;
- `/mcp/legacy`——默认关闭的协议迁移 Adapter。
+只为已验证的 Handshake-era Client 开启 `/mcp/legacy`,例如 Dify 1.16.1
+(`2025-06-18`)或使用 `2025-11-25` 的 SDK v2 Client:
+
+```bash
+export ENABLE_LEGACY_HTTP_ADAPTER=true
+```
+
+这些 Host 必须配置精确的 `/mcp/legacy` URL;现代 `2026-07-28` Host 继续使用
+`/mcp`,Server 不会在该端点静默降级。
+
在认证、Host/Origin、Proxy、TLS、Timeout 和 Secret 注入经过联合测试前,Server
应保持回环绑定。
diff --git a/docs/operations/troubleshooting.md
b/docs/operations/troubleshooting.md
index 06fe359..459e2ba 100644
--- a/docs/operations/troubleshooting.md
+++ b/docs/operations/troubleshooting.md
@@ -111,8 +111,9 @@ Ensure:
### Unsupported protocol (`-32022`)
-Use MCP `2026-07-28`. A `2025-11-25` HTTP client must use the explicitly
-enabled `/mcp/legacy` endpoint. HTTP+SSE clients must migrate.
+Use `/mcp` for MCP `2026-07-28`. Validated `2025-06-18` clients such as Dify
+1.16.1 and `2025-11-25` clients must use the explicitly enabled
+`/mcp/legacy` endpoint. HTTP+SSE clients must migrate.
## Authentication or authorization fails
diff --git a/docs/operations/troubleshooting.zh-CN.md
b/docs/operations/troubleshooting.zh-CN.md
index 09d8045..19b469a 100644
--- a/docs/operations/troubleshooting.zh-CN.md
+++ b/docs/operations/troubleshooting.zh-CN.md
@@ -106,8 +106,9 @@ Proxy Rewrite、TLS Scheme 和 Trusted Proxy CIDR。不要全局信任
Forwarded
### 不支持协议(`-32022`)
-使用 MCP `2026-07-28`。`2025-11-25` HTTP Client 必须连接显式启用的
-`/mcp/legacy`;HTTP+SSE Client 必须迁移。
+MCP `2026-07-28` 使用 `/mcp`。Dify 1.16.1 等已经验证的 `2025-06-18`
+Client 和 `2025-11-25` Client 必须连接显式启用的 `/mcp/legacy`;HTTP+SSE
+Client 必须迁移。
## Authentication 或 Authorization 失败
diff --git a/docs/protocol/mcp-2026-07-28.md b/docs/protocol/mcp-2026-07-28.md
index 3e37974..0d1580b 100644
--- a/docs/protocol/mcp-2026-07-28.md
+++ b/docs/protocol/mcp-2026-07-28.md
@@ -37,11 +37,13 @@ Authoritative protocol references:
|---|---|---|---|
| `2026-07-28` | Preferred at `/mcp` | Preferred | Stateless, self-contained
requests; release-gated |
| `2025-11-25` | Opt-in at `/mcp/legacy` | Migration only | Legacy
initialization accepted; no HTTP session is created |
-| `2025-06-18` and older | Not guaranteed | Not guaranteed | Upgrade the
client |
+| `2025-06-18` | Opt-in at `/mcp/legacy` | Not release-gated | HTTP
initialization, stateless tool discovery, and tool calls are regression-tested;
Dify 1.16.1 validated |
+| `2025-03-26` and older | Not guaranteed | Not guaranteed | Upgrade the
client |
| HTTP+SSE `2024-11-05` | Not supported | Not applicable | Retired separate
SSE endpoint is absent |
`ENABLE_LEGACY_HTTP_ADAPTER=true` enables only the isolated legacy HTTP path.
-It does not change `/mcp`, restore pre-1.0 tool names, or create a session.
+It does not change `/mcp`, restore pre-1.0 tool names, create a session, bypass
+authorization, or change the Server's tool catalog.
## Modern request metadata
diff --git a/docs/protocol/mcp-2026-07-28.zh-CN.md
b/docs/protocol/mcp-2026-07-28.zh-CN.md
index d857616..7c452fe 100644
--- a/docs/protocol/mcp-2026-07-28.zh-CN.md
+++ b/docs/protocol/mcp-2026-07-28.zh-CN.md
@@ -37,11 +37,13 @@ Apache Doris MCP Server 在 Streamable HTTP 和 stdio 上共用一套 MCP
SDK v2
|---|---|---|---|
| `2026-07-28` | `/mcp` 首选 | 首选 | 无状态、自包含请求,经过完整 Release Gate |
| `2025-11-25` | `/mcp/legacy` 显式开启 | 仅迁移 | 接受旧初始化,但不创建 HTTP Session |
-| `2025-06-18` 及更早 | 不保证 | 不保证 | 应升级 Client |
+| `2025-06-18` | `/mcp/legacy` 显式开启 | 未纳入发布门禁 | HTTP 旧初始化、无状态 Tool Discovery 和
Tool Call 有回归测试;Dify 1.16.1 已验证 |
+| `2025-03-26` 及更早 | 不保证 | 不保证 | 应升级 Client |
| HTTP+SSE `2024-11-05` | 不支持 | 不适用 | 独立 SSE 端点已移除 |
`ENABLE_LEGACY_HTTP_ADAPTER=true` 只启用隔离的旧 HTTP 路径,不会改变
-`/mcp`、恢复 1.0 以前 Tool 名称或创建 Session。
+`/mcp`、恢复 1.0 以前 Tool 名称、创建 Session、绕过授权或改变 Server Tool
+Catalog。
## 现代请求元数据
diff --git a/docs/reference/configuration.md b/docs/reference/configuration.md
index d606e4a..ff1be41 100644
--- a/docs/reference/configuration.md
+++ b/docs/reference/configuration.md
@@ -84,7 +84,7 @@ All FE/BE destinations are operator configuration, never
caller arguments.
| `SERVER_NAME` | product instance name, not product version |
| `MCP_ALLOWED_HOSTS` | validated HTTP Host policy inputs |
| `MCP_ALLOWED_ORIGINS` | validated Origin policy inputs |
-| `ENABLE_LEGACY_HTTP_ADAPTER` | default-off `/mcp/legacy` adapter |
+| `ENABLE_LEGACY_HTTP_ADAPTER` | default-off `/mcp/legacy` adapter for
validated `2025-06-18` and `2025-11-25` clients |
| `MCP_LIST_PAGE_SIZE` | entries per protocol list page (`1`–`1000`) |
| `MCP_STATE_HANDLE_SECRET` | shared HMAC secret for independent replicas |
| `MCP_STATE_HANDLE_TTL_SECONDS` | explicit handle lifetime (`1`–`3600`) |
diff --git a/docs/reference/configuration.zh-CN.md
b/docs/reference/configuration.zh-CN.md
index 2af78d9..dd09ea9 100644
--- a/docs/reference/configuration.zh-CN.md
+++ b/docs/reference/configuration.zh-CN.md
@@ -81,7 +81,7 @@ HTTP 安全:
| `SERVER_NAME` | 产品实例名,不是产品版本 |
| `MCP_ALLOWED_HOSTS` | 已校验 HTTP Host Policy 输入 |
| `MCP_ALLOWED_ORIGINS` | 已校验 Origin Policy 输入 |
-| `ENABLE_LEGACY_HTTP_ADAPTER` | 默认关闭的 `/mcp/legacy` Adapter |
+| `ENABLE_LEGACY_HTTP_ADAPTER` | 默认关闭的 `/mcp/legacy` Adapter,用于已验证的
`2025-06-18` 和 `2025-11-25` Client |
| `MCP_LIST_PAGE_SIZE` | 每个协议 List Page 条目数(`1`–`1000`) |
| `MCP_STATE_HANDLE_SECRET` | 独立 Replica 共享 HMAC Secret |
| `MCP_STATE_HANDLE_TTL_SECONDS` | 显式句柄有效期(`1`–`3600`) |
diff --git a/docs/releases/1.0.0.md b/docs/releases/1.0.0.md
index 3344893..8faeb9d 100644
--- a/docs/releases/1.0.0.md
+++ b/docs/releases/1.0.0.md
@@ -112,7 +112,8 @@ support results.
- Sanitized W3C trace-context propagation.
- Honest subscription boundary: no `subscriptions/listen` without a real
cross-worker event source.
-- Default-off isolated `2025-11-25` HTTP migration adapter at `/mcp/legacy`.
+- Default-off isolated `2025-06-18` and `2025-11-25` HTTP migration adapter at
+ `/mcp/legacy`, including a validated Dify 1.16.1 profile.
## Security
diff --git a/docs/releases/1.0.0.zh-CN.md b/docs/releases/1.0.0.zh-CN.md
index e7d0d48..1ca3aa2 100644
--- a/docs/releases/1.0.0.zh-CN.md
+++ b/docs/releases/1.0.0.zh-CN.md
@@ -104,7 +104,8 @@ Domain 一直注册,因此模型可以在同一对话中从 Catalog 切换到
- 清洗后的 W3C Trace Context 传播。
- 诚实 Subscription 边界:没有真实跨 Worker Event Source 就不提供
`subscriptions/listen`。
-- 默认关闭、隔离在 `/mcp/legacy` 的 `2025-11-25` HTTP Migration Adapter。
+- 默认关闭、隔离在 `/mcp/legacy` 的 `2025-06-18` 与 `2025-11-25` HTTP
+ Migration Adapter,其中包括已验证的 Dify 1.16.1 Profile。
## 安全
diff --git a/test/protocol/test_http_transport_boundaries.py
b/test/protocol/test_http_transport_boundaries.py
index 8ad539c..fd3742b 100644
--- a/test/protocol/test_http_transport_boundaries.py
+++ b/test/protocol/test_http_transport_boundaries.py
@@ -55,13 +55,13 @@ def _modern_headers() -> dict[str, str]:
}
-def _legacy_initialize() -> dict:
+def _legacy_initialize(protocol_version: str = "2025-11-25") -> dict:
return {
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
- "protocolVersion": "2025-11-25",
+ "protocolVersion": protocol_version,
"capabilities": {},
"clientInfo": {
"name": "legacy-http-boundary-test",
@@ -145,8 +145,11 @@ async def
test_modern_core_is_exact_post_only_and_never_falls_back_to_legacy():
assert inexact_path.status_code == 404
[email protected]("protocol_version", ["2025-06-18", "2025-11-25"])
@pytest.mark.asyncio
-async def test_opt_in_legacy_adapter_accepts_only_handshake_era_traffic():
+async def test_opt_in_legacy_adapter_accepts_only_handshake_era_traffic(
+ protocol_version: str,
+):
app = _transport(legacy_adapter_enabled=True)
async with (
@@ -159,11 +162,11 @@ async def
test_opt_in_legacy_adapter_accepts_only_handshake_era_traffic():
):
initialized = await client.post(
LEGACY_MCP_PATH,
- json=_legacy_initialize(),
+ json=_legacy_initialize(protocol_version),
headers=_legacy_headers(),
)
assert initialized.status_code == 200
- assert initialized.json()["result"]["protocolVersion"] == "2025-11-25"
+ assert initialized.json()["result"]["protocolVersion"] ==
protocol_version
assert "mcp-session-id" not in initialized.headers
modern_on_legacy = await client.post(
diff --git a/test/protocol/test_mcp_v2_protocol.py
b/test/protocol/test_mcp_v2_protocol.py
index df77137..f46cd51 100644
--- a/test/protocol/test_mcp_v2_protocol.py
+++ b/test/protocol/test_mcp_v2_protocol.py
@@ -728,6 +728,81 @@ async def
test_http_rejects_untrusted_origin_and_legacy_adapter_is_stateless():
assert legacy_server_info["version"] == __version__
[email protected]
+async def test_legacy_http_adapter_serves_2025_06_18_host_tools():
+ app = DorisMCPHTTPTransport(
+ app=create_test_server(),
+ security_settings=create_transport_security("127.0.0.1"),
+ legacy_adapter_enabled=True,
+ )
+ headers = {
+ "Accept": "application/json, text/event-stream",
+ "Content-Type": "application/json",
+ }
+ initialize = {
+ "jsonrpc": "2.0",
+ "id": 1,
+ "method": "initialize",
+ "params": {
+ "protocolVersion": "2025-06-18",
+ "capabilities": {},
+ "clientInfo": {"name": "dify", "version": "1.16.1"},
+ },
+ }
+
+ async with (
+ app.run(),
+ httpx2.ASGITransport(app.handle_request) as transport,
+ httpx2.AsyncClient(
+ transport=transport,
+ base_url="http://127.0.0.1:3000",
+ ) as client,
+ ):
+ initialized = await client.post(
+ LEGACY_MCP_PATH,
+ json=initialize,
+ headers=headers,
+ )
+ assert initialized.status_code == 200
+ assert initialized.json()["result"]["protocolVersion"] == "2025-06-18"
+ assert "mcp-session-id" not in initialized.headers
+
+ listed = await client.post(
+ LEGACY_MCP_PATH,
+ json={
+ "jsonrpc": "2.0",
+ "id": 2,
+ "method": "tools/list",
+ "params": {},
+ },
+ headers={**headers, "MCP-Protocol-Version": "2025-06-18"},
+ )
+ assert listed.status_code == 200
+ assert [tool["name"] for tool in listed.json()["result"]["tools"]] == [
+ "echo",
+ "fail",
+ ]
+
+ called = await client.post(
+ LEGACY_MCP_PATH,
+ json={
+ "jsonrpc": "2.0",
+ "id": 3,
+ "method": "tools/call",
+ "params": {
+ "name": "echo",
+ "arguments": {"value": "legacy"},
+ },
+ },
+ headers={**headers, "MCP-Protocol-Version": "2025-06-18"},
+ )
+ assert called.status_code == 200
+ assert called.json()["result"]["structuredContent"] == {
+ "name": "echo",
+ "arguments": {"value": "legacy"},
+ }
+
+
@pytest.mark.asyncio
async def test_http_validates_request_meta_and_required_client_capabilities():
server = create_test_server(
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]