MCP 的 Streamable HTTP 端点——Ring 处理器(designs/server-module.md §4)。协议在 clj-agent-mcp:
im.ttalk.agent.mcp.server/handle-message(纯函数,一条进一条出)与 check-headers(HTTP 头与信封一致性);
这里只做 HTTP 那一层。转正自 examples/mcp/server_example.clj 的 http-kit 接线。
(require '[im.ttalk.agent.mcp.server :as srv]
'[im.ttalk.agent.server.mcp :as mcp-http])
(def s (srv/server {:name "demo" :version "1.0" :tools [...]}))
(mcp-http/handler s {:origin-allowed nil}) ;; 一个 Ring 处理器,交给任何 Ring 服务端
(mcp-http/routes "/mcp" s opts) ;; 或 im.ttalk.agent.server.routing 的路由表
POST:读体(受 :max-body-bytes,超了 413)→ 解析 JSON(坏 ⇒ 400 -32700;JSON 数组 ⇒ 400 -32600,批量自
2025-06-18 起已从协议删除)→ check-headers(头与信封不一致 ⇒ 400 -32020)→ handle-message → 有响应 ⇒ JSON,
校验类错误(-32602 -32020 -32021 -32022)400、其余 200(客户端的双时代探测看状态码);通知 ⇒ 202 空体(协议禁止给
通知回响应)。handle-message 意外抛出 ⇒ 500 -32603(不把异常文本吐给客户端)。GET / DELETE / 其他 ⇒ 405 带 Allow: POST, OPTIONS:本端点不开服务端推送流、也没有会话(规范允许)。OPTIONS ⇒ 预检 204。:origin-allowed 里 ⇒ 403(规范要求服务端校验 Origin 防 DNS rebinding);
不带 Origin(非浏览器客户端)放行。白名单用 im.ttalk.agent.server.agui.http/origin-allow。选项::origin-allowed(Origin 谓词;缺省 nil = 拒所有带 Origin 的):credentials?(回 Allow-Credentials)
:allow-headers(预检额外放行的请求头):max-body-bytes(缺省 4 MiB)。
MCP 的 Streamable HTTP 端点——**Ring 处理器**(designs/server-module.md §4)。协议在 clj-agent-mcp:
`im.ttalk.agent.mcp.server/handle-message`(纯函数,一条进一条出)与 `check-headers`(HTTP 头与信封一致性);
这里只做 HTTP 那一层。转正自 examples/mcp/server_example.clj 的 http-kit 接线。
```clojure
(require '[im.ttalk.agent.mcp.server :as srv]
'[im.ttalk.agent.server.mcp :as mcp-http])
(def s (srv/server {:name "demo" :version "1.0" :tools [...]}))
(mcp-http/handler s {:origin-allowed nil}) ;; 一个 Ring 处理器,交给任何 Ring 服务端
(mcp-http/routes "/mcp" s opts) ;; 或 im.ttalk.agent.server.routing 的路由表
```
- `POST`:读体(受 `:max-body-bytes`,超了 413)→ 解析 JSON(坏 ⇒ 400 `-32700`;JSON 数组 ⇒ 400 `-32600`,批量自
2025-06-18 起已从协议删除)→ `check-headers`(头与信封不一致 ⇒ 400 `-32020`)→ `handle-message` → 有响应 ⇒ JSON,
校验类错误(`-32602 -32020 -32021 -32022`)400、其余 200(客户端的双时代探测看状态码);通知 ⇒ 202 空体(协议禁止给
通知回响应)。`handle-message` 意外抛出 ⇒ 500 `-32603`(不把异常文本吐给客户端)。
- `GET` / `DELETE` / 其他 ⇒ 405 带 `Allow: POST, OPTIONS`:本端点不开服务端推送流、也没有会话(规范允许)。
- `OPTIONS` ⇒ 预检 204。
- **Origin 缺省拒**:带 Origin 且不在 `:origin-allowed` 里 ⇒ 403(规范要求服务端校验 Origin 防 DNS rebinding);
不带 Origin(非浏览器客户端)放行。白名单用 `im.ttalk.agent.server.agui.http/origin-allow`。
- 只回 JSON、不回 SSE:一条请求一条响应,没有要推的中间消息(规范允许服务端选 JSON)。
选项:`:origin-allowed`(Origin 谓词;缺省 nil = 拒所有带 Origin 的)`:credentials?`(回 Allow-Credentials)
`:allow-headers`(预检额外放行的请求头)`:max-body-bytes`(缺省 4 MiB)。(handler server)(handler server opts)MCP Streamable HTTP 的 Ring 处理器(见 ns 文档)。同步与 Ring 异步(3 元)两种元数都有。
MCP Streamable HTTP 的 Ring 处理器(见 ns 文档)。同步与 Ring 异步(3 元)两种元数都有。
(routes path server)(routes path server opts)挂在 path 下的路由表(im.ttalk.agent.server.routing 的格式):任何方法都交给 handler(它自己回 405 / 预检)。
挂在 `path` 下的路由表(im.ttalk.agent.server.routing 的格式):任何方法都交给 `handler`(它自己回 405 / 预检)。
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |