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 8e38415 docs: document MCP protocol migration (#110)
8e38415 is described below
commit 8e38415f52307647d20439c7ae822fd3271c96db
Author: Yijia Su <[email protected]>
AuthorDate: Wed Jul 29 19:05:59 2026 +0800
docs: document MCP protocol migration (#110)
---
README.md | 192 ++++++++++++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 148 insertions(+), 44 deletions(-)
diff --git a/README.md b/README.md
index 2b27aa1..108d267 100644
--- a/README.md
+++ b/README.md
@@ -91,7 +91,7 @@ The primary communication mode offering optimal performance
and reliability:
# Full configuration with database connection
doris-mcp-server \
--transport http \
- --host 0.0.0.0 \
+ --host 127.0.0.1 \
--port 3000 \
--db-host 127.0.0.1 \
--db-port 9030 \
@@ -176,7 +176,7 @@ export
TOKEN_MANAGEMENT_ADMIN_TOKEN="your_secure_admin_token"
export TOKEN_MANAGEMENT_ALLOWED_IPS="127.0.0.1,::1"
# Then start with simplified command
-doris-mcp-server --transport http --host 0.0.0.0 --port 3000
+doris-mcp-server --transport http --host 127.0.0.1 --port 3000
```
### Command Line Arguments
@@ -186,7 +186,7 @@ The `doris-mcp-server` command supports the following
arguments:
| Argument | Description | Default | Required |
|:---------|:------------|:--------|:---------|
| `--transport` | Transport mode: `http` or `stdio` | `http` | No |
-| `--host` | HTTP server host (HTTP mode only) | `0.0.0.0` | No |
+| `--host` | HTTP server host (HTTP mode only) | `localhost` | No |
| `--port` | HTTP server port (HTTP mode only) | `3000` | No |
| `--db-host` | Doris database host | `localhost` | No |
| `--db-port` | Doris database port | `9030` | No |
@@ -332,20 +332,146 @@ docker run -d -p <port>:<port> -v
/*your-host*/doris-mcp-server/.env:/app/.env -
```
**Service Endpoints:**
-* **Streamable HTTP**: `http://<host>:<port>/mcp` (Primary MCP endpoint -
supports GET, POST, DELETE, OPTIONS)
+* **Streamable HTTP**: `http://<host>:<port>/mcp` (MCP messages use `POST`;
do not depend on `GET` or `DELETE` compatibility behavior)
* **Health Check**: `http://<host>:<port>/health`
-*
+
> **Note**: The server uses Streamable HTTP for web-based communication,
> providing unified request/response and streaming capabilities.
+## MCP Protocol Support and Migration
+
+Doris MCP Server uses the official Python SDK v2 protocol core for both
+Streamable HTTP and stdio. The MCP protocol revision used on the wire is
+independent of the Doris MCP Server package version and the Python SDK package
+version.
+
+The authoritative protocol references are the
+[MCP 2026-07-28
specification](https://modelcontextprotocol.io/specification/2026-07-28),
+[2026-07-28 key
changes](https://modelcontextprotocol.io/specification/2026-07-28/changelog),
+and [Streamable HTTP transport
specification](https://modelcontextprotocol.io/specification/2026-07-28/basic/transports/streamable-http).
+
+### Protocol and Transport Matrix
+
+| Client protocol | Streamable HTTP | stdio | Connection behavior | Doris MCP
Server status |
+|:----------------|:----------------|:------|:--------------------|:------------------------|
+| `2026-07-28` | Supported and preferred | Supported and preferred |
Stateless, self-contained requests; no initialization handshake or protocol
session | Covered by modern HTTP and real-process stdio tests |
+| `2025-11-25` | Supported for migration | Supported for migration | Legacy
`initialize` is accepted, but the server remains stateless and does not issue
`Mcp-Session-Id` | Covered by legacy HTTP and stdio tests |
+| `2025-06-18` and older | Not guaranteed | Not guaranteed | Older negotiation
and transport behavior is outside the supported compatibility contract |
Upgrade the client before connecting |
+| HTTP+SSE (`2024-11-05`) | Not supported | Not applicable | The retired
separate SSE endpoint is not exposed | Migrate to Streamable HTTP at `/mcp` |
+
+The compatibility path for `2025-11-25` exists to support migrations. New
+integrations should target `2026-07-28`.
+
+### MCP 2026-07-28 Request Contract
+
+Modern clients may call `server/discover` before any other method to inspect
the
+supported protocol versions, capabilities, and server identity. Discovery is
+optional; every normal request is still self-contained.
+
+Every modern request must carry these values in `params._meta`:
+
+* `io.modelcontextprotocol/protocolVersion`: `2026-07-28`
+* `io.modelcontextprotocol/clientCapabilities`: the capabilities available for
+ that request, or an empty object
+* `io.modelcontextprotocol/clientInfo`: the client name and version; this is
+ recommended by the specification
+
+For Streamable HTTP, send one JSON-RPC request per `POST /mcp` and include:
+
+| Header | Required | Value |
+|:-------|:---------|:------|
+| `Content-Type` | Yes | `application/json` |
+| `Accept` | Yes | Both `application/json` and `text/event-stream` |
+| `MCP-Protocol-Version` | Yes | Must match the protocol version in `_meta` |
+| `Mcp-Method` | Yes | Must match the JSON-RPC `method` |
+| `Mcp-Name` | For `tools/call`, `resources/read`, and `prompts/get` | Must
match `params.name` or `params.uri` |
+
+Header names are case-insensitive, but method and name values are not. A
+required header that is missing or disagrees with the request body is rejected
+with HTTP 400 and the protocol `HeaderMismatch` error (`-32020`). Unsupported
+protocol versions are rejected with `UnsupportedProtocolVersion` (`-32022`).
+If a name or URI is not safe as a plain ASCII header value, encode its UTF-8
+bytes as Base64 and send `Mcp-Name: =?base64?{value}?=` as defined by the
+transport specification.
+
+Example discovery request:
+
+```bash
+curl --request POST http://127.0.0.1:3000/mcp \
+ --header 'Content-Type: application/json' \
+ --header 'Accept: application/json, text/event-stream' \
+ --header 'MCP-Protocol-Version: 2026-07-28' \
+ --header 'Mcp-Method: server/discover' \
+ --data '{
+ "jsonrpc": "2.0",
+ "id": 1,
+ "method": "server/discover",
+ "params": {
+ "_meta": {
+ "io.modelcontextprotocol/protocolVersion": "2026-07-28",
+ "io.modelcontextprotocol/clientCapabilities": {},
+ "io.modelcontextprotocol/clientInfo": {
+ "name": "example-client",
+ "version": "1.0.0"
+ }
+ }
+ }
+ }'
+```
+
+Stdio carries the same JSON-RPC request metadata in the message body, but it
+does not use HTTP headers. Do not write logs or other diagnostics to stdout in
+stdio mode; stdout is reserved for MCP protocol messages.
+
+### Migrating from MCP 2025-11-25
+
+1. Upgrade the client to a `2026-07-28`-capable MCP SDK.
+2. Continue using the `/mcp` endpoint for Streamable HTTP, but send every
+ JSON-RPC message as its own POST request.
+3. Remove `initialize`, `notifications/initialized`, `Mcp-Session-Id`, and any
+ sticky-session dependency.
+4. Add the protocol version and client capabilities to every request's `_meta`.
+ Add client identity on every request where possible.
+5. Add `MCP-Protocol-Version` and `Mcp-Method` to every HTTP request, plus
+ `Mcp-Name` for named tool, resource, and prompt requests.
+6. Stop using the removed HTTP GET stream, `Last-Event-ID`, and resumable SSE
+ behavior. Reissue an interrupted request with a new JSON-RPC request ID.
+7. Accept the required `resultType` field in modern results and handle
+ protocol-defined errors such as `-32020`, `-32021`, and `-32022`.
+8. Validate the migrated client against both Streamable HTTP and stdio if the
+ integration supports both transports.
+
+Clients that cannot migrate immediately may keep the `2025-11-25`
+`initialize` flow. Doris MCP Server accepts that flow on both supported
+transports, but does not create an HTTP protocol session.
+
+### Deployment Constraints
+
+* Bind local deployments to `127.0.0.1`, `localhost`, or `::1`. The transport
+ validates both `Host` and `Origin` to protect against DNS rebinding.
+* A bind address is not a public service identity. In particular,
+ `0.0.0.0` does not authorize arbitrary Host or Origin values.
+* The current Host/Origin policy does not provide an operator-configured public
+ allowlist. Public hostnames and reverse proxies that rewrite Host or Origin
+ are therefore not a supported deployment shape yet.
+* Do not expose an unauthenticated listener on a non-loopback interface. The
+ current release does not reject every unsafe non-loopback configuration at
+ startup, so a successful startup is not proof that the deployment is safe.
+* Stateless MCP requests do not require sticky HTTP sessions and can use
+ multiple workers. Authentication modes can have stricter limits:
+ Doris-backed OAuth stores tokens and per-user pools in process memory and
+ must run with `WORKERS=1`.
+* Use HTTPS whenever traffic leaves the local machine, and keep credentials in
+ headers or process environment rather than URLs.
+
## Usage
Interaction with the Doris MCP Server requires an **MCP Client**. The client
connects to the server's Streamable HTTP endpoint and sends requests according
to the MCP specification to invoke the server's tools.
**Main Interaction Flow:**
-1. **Client Initialization**: Send an `initialize` method call to `/mcp`
(Streamable HTTP).
-2. **(Optional) Discover Tools**: The client can call `tools/list` to get the
list of supported tools, their descriptions, and parameter schemas.
-3. **Call Tool**: The client sends a `tools/call` request, specifying the
`name` and `arguments`.
+1. **(Optional) Discover the Server**: A modern client can call
`server/discover` to inspect supported protocol versions, capabilities, and
identity.
+2. **Discover Tools**: Call `tools/list` to get the supported tools,
descriptions, and parameter schemas.
+3. **Call Tool**: Send a self-contained `tools/call` request with its
required `_meta`, `name`, and `arguments`.
* **Example: Get Table Schema**
* `name`: `get_table_schema`
* `arguments`: Include `table_name`, `db_name`, `catalog_name`.
@@ -353,6 +479,9 @@ Interaction with the Doris MCP Server requires an **MCP
Client**. The client con
* **Non-streaming**: The client receives a response containing `content`
or `isError`.
* **Streaming**: The client receives a series of progress notifications,
followed by a final response.
+Legacy `2025-11-25` clients initialize as before, subject to the stateless
+compatibility limits described above.
+
### Catalog Federation Support
The Doris MCP Server supports **catalog federation**, enabling interaction
with multiple data catalogs (internal Doris tables and external data sources
like Hive, MySQL, etc.) within a unified interface.
@@ -890,9 +1019,9 @@ Streamable HTTP mode requires you to run the MCP server
independently first, and
1. **Configure `.env`:** Ensure your database credentials and any other
necessary settings are correctly configured in the `.env` file within the
project directory.
2. **Start the Server:** Run the server from your terminal in the project's
root directory:
```bash
- ./start_server.sh
+ MCP_HOST=127.0.0.1 ./start_server.sh
```
- This script reads the `.env` file and starts the FastAPI server with
Streamable HTTP support. Note the host and port the server is listening on
(default is `0.0.0.0:3000`).
+ This script reads the `.env` file and starts the FastAPI server with
Streamable HTTP support. Keep the listener on loopback unless the non-loopback
deployment has been separately secured and validated.
3. **Configure Cursor:** Add an entry like the following to your Cursor MCP
configuration, pointing to the running server's Streamable HTTP endpoint:
```json
@@ -1330,42 +1459,17 @@ HEALTH_CHECK_INTERVAL=60 # Pool health check
frequency
**Result**: 99.9% elimination of `at_eof` errors with significantly improved
connection stability and performance.
-### Q: How to resolve MCP library version compatibility issues? (Fixed in
v0.4.2)
+### Q: Which MCP protocol revisions are supported?
-**A:** Version 0.4.2 introduced an intelligent MCP compatibility layer that
supports both MCP 1.8.x and 1.9.x versions:
+**A:** New integrations should use MCP `2026-07-28`. Doris MCP Server also
+accepts the `2025-11-25` initialization flow as a migration bridge on both
+Streamable HTTP and stdio. Older revisions and the retired HTTP+SSE transport
+are not part of the supported compatibility contract.
-**The Problem:**
-- MCP 1.9.3 introduced breaking changes to the `RequestContext` class (changed
from 2 to 3 generic parameters)
-- This caused `TypeError: Too few arguments for RequestContext` errors
-
-**The Solution (v0.4.2):**
-- **Intelligent Version Detection**: Automatically detects the installed MCP
version
-- **Compatibility Layer**: Gracefully handles API differences between versions
-- **Flexible Version Support**: `mcp>=1.8.0,<2.0.0` in dependencies
-
-**Supported MCP Versions:**
-```bash
-# Both versions now work seamlessly
-pip install mcp==1.8.0 # Stable version (recommended)
-pip install mcp==1.9.3 # Latest version with new features
-```
-
-**Version Information:**
-```bash
-# Check which MCP version is being used
-doris-mcp-server --transport stdio
-# The server will log: "Using MCP version: x.x.x"
-```
-
-If you encounter MCP-related startup errors:
-```bash
-# Recommended: Use stable version
-pip uninstall mcp
-pip install mcp==1.8.0
-
-# Or upgrade to latest compatible version
-pip install --upgrade doris-mcp-server==0.5.0
-```
+Do not infer wire-protocol support from the Doris MCP Server package version or
+the Python `mcp` dependency version. See
+[MCP Protocol Support and Migration](#mcp-protocol-support-and-migration) for
+the request metadata, HTTP headers, migration steps, and deployment limits.
### Q: How to enable ADBC high-performance features? (New in v0.5.0)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]