关于 io.modelcontext/clojure-sdk
clojure-sdk 是一个用于创建 MCP 服务的 Clojure SDK,目前计划后续支持客户端。适合使用 Clojure 或 Java 生态的开发者。SDK 基于 jsonrpc4clj 构建,并附带示例服务。
主要功能
- 01用于创建 MCP 服务的 Clojure SDK
- 02基于 jsonrpc4clj 处理 JSON-RPC
- 03提供 STDIO 传输层
- 04附带计算器、Vega-lite 和代码分析示例服务
适用场景
- 01使用 Clojure 构建 MCP 服务
- 02参考示例服务学习 MCP 工具、资源和提示词的实现
MCP 相关
该 SDK 用于构建 MCP 服务,支持 initialize、tools/list、resources/list、prompts/list 等方法,可向 MCP 客户端暴露工具、资源和提示词。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
io.modelcontext/clojure-sdk
用于创建 Model Context Protocol 服务的 clojure-sdk!
目录 :TOC_4:
用法
calculator_server.clj 文件 和 vegalite_server.clj 文件 中的示例包含定义 MCP 服务的完整可运行代码。
examples 是一个 deps-new 应用项目,编译和运行各个示例服务的说明见 examples/README.md
文件(也复制在本节下方)。
依赖
clojure-sdk 的依赖如下:
{io.modelcontextprotocol/mcp-clojure-sdk
{:git/url "https://github.com/unravel-team/mcp-clojure-sdk.git"
:git/sha "d42474c5f66b6f5ad1e4d6ce2a4e8972640fb831"}}
快速入门模板
为了方便使用,我们还提供了一个 deps-new 模板和一个 Github 模板。请参阅:
- mcp-clojure-server-deps-new
这是一个基于
deps-new的模板,可用于快速创建新的 MCP 服务。 - example-cool-mcp-server 这是一个 Github 模板项目,可用于快速创建新的 MCP 服务。
示例
构建示例 JAR
$ make clean && make examples-jar
示例 JAR 包含以下服务:
- 计算器:
calculator_server - Vega-lite:
vegalite_server - 代码分析:
code_analysis_server
计算器:calculator_server
提供基本算术工具:add、subtract、multiply、
divide、power、square-root、average、factorial
可以在 Claude Desktop 或 Inspector 中尝试以下示例命令:
- [1, 2, 3, 4, 5] 的平均值是多少?
- 15 的阶乘是多少?
- 2 的 1000 次方是多少?
- 64 的平方根是多少?
运行计算器 MCP 服务之前:
请记住:
- 使用系统中示例 JAR 的完整路径
在 Claude Desktop 中
"calculator": {
"command": "java",
"args": [
"-Dclojure.tools.logging.factory=clojure.tools.logging.impl/log4j2-factory",
"-Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.Slf4jLog",
"-Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector",
"-Dlog4j2.configurationFile=log4j2-mcp.xml",
"-Dbabashka.json.provider=metosin/jsonista",
"-Dlogging.level=INFO",
"-cp",
"/Users/vedang/mcp-clojure-sdk/examples/target/io.modelcontextprotocol.clojure-sdk/examples-1.2.0.jar",
"calculator_server"
]
}
在 MCP Inspector 中
npx @modelcontextprotocol/inspector java -Dclojure.tools.logging.factory=clojure.tools.logging.impl/log4j2-factory -Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.Slf4jLog -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -Dlog4j2.configurationFile=log4j2-mcp.xml -Dbabashka.json.provider=metosin/jsonista -Dlogging.level=INFO -cp examples/target/io.modelcontextprotocol.clojure-sdk/examples-1.2.0.jar calculator_server
Vega-lite:vegalite_server
提供用于生成 Vega-lite 图表的工具:save-data、
visualize-data。
前置条件:需要安装 vl-convert CLI。
可以在 Claude Desktop 或 Inspector 中尝试以下示例命令:
以下是一些示例数据:
[
{ "year": 2011, "value": 14.6, "growth_type": "Market Cap Growth" },
{ "year": 2011, "value": 11.4, "growth_type": "Revenue Growth" },
{ "year": 2011, "value": 26.6, "growth_type": "Net Income Growth" },
{ "year": 2012, "value": 40.1, "growth_type": "Market Cap Growth" },
{ "year": 2012, "value": 42.7, "growth_type": "Revenue Growth" },
{ "year": 2012, "value": 36.9, "growth_type": "Net Income Growth" },
{ "year": 2013, "value": 16.9, "growth_type": "Market Cap Growth" },
{ "year": 2013, "value": 14.6, "growth_type": "Revenue Growth" },
{ "year": 2013, "value": 15.3, "growth_type": "Net Income Growth" },
{ "year": 2014, "value": 9.6, "growth_type": "Market Cap Growth" },
{ "year": 2014, "value": 7.9, "growth_type": "Revenue Growth" },
{ "year": 2014, "value": 10.9, "growth_type": "Net Income Growth" },
{ "year": 2015, "value": 5.8, "growth_type": "Market Cap Growth" },
{ "year": 2015, "value": 6.7, "growth_type": "Revenue Growth" },
{ "year": 2015, "value": 6.2, "growth_type": "Net Income Growth" },
{ "year": 2016, "value": -12.4, "growth_type": "Market Cap Growth" },
{ "year": 2016, "value": -3.9, "growth_type": "Revenue Growth" },
{ "year": 2016, "value": -32.2, "growth_type": "Net Income Growth" },
{ "year": 2017, "value": 25.3, "growth_type": "Market Cap Growth" },
{ "year": 2017, "value": 5.9, "growth_type": "Revenue Growth" },
{ "year": 2017, "value": 43.9, "growth_type": "Net Income Growth" }
]
请使用 Vega-lite 为我可视化这些数据。
运行 vegalite MCP 服务之前
请记住:
- 将示例 JAR 的完整路径替换为系统上的正确路径
- 指定系统中
vl-convert的完整路径
在 Claude Desktop 中
"vegalite": {
"command": "java",
"args": [
"-Dclojure.tools.logging.factory=clojure.tools.logging.impl/log4j2-factory",
"-Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.Slf4jLog",
"-Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector",
"-Dlog4j2.configurationFile=log4j2-mcp.xml",
"-Dbabashka.json.provider=metosin/jsonista",
"-Dlogging.level=INFO",
"-Dmcp.vegalite.vl_convert_executable=/Users/vedang/.cargo/bin/vl-convert",
"-cp",
"/Users/vedang/mcp-clojure-sdk/examples/target/io.modelcontextprotocol.clojure-sdk/examples-1.2.0.jar",
"vegalite_server"
]
}
在 MCP Inspector 中
请记得使用系统中示例 JAR 的完整路径,或者
在 mcp-clojure-sdk 仓库中执行此命令。
npx @modelcontextprotocol/inspector java -Dclojure.tools.logging.factory=clojure.tools.logging.impl/log4j2-factory -Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.Slf4jLog -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -Dlog4j2.configurationFile=log4j2-mcp.xml -Dbabashka.json.provider=metosin/jsonista -Dlogging.level=INFO -Dmcp.vegalite.vl_convert_executable=/Users/vedang/.cargo/bin/vl-convert -cp examples/target/io.modelcontextprotocol.clojure-sdk/examples-1.2.0.jar vegalite_server
代码分析:code_analysis_server
此服务是一个提供提示词而非工具的服务示例。可用提示词包括:analyse-code 和
poem-about-code。
你可以在 Claude Desktop 或 Inspector 中试用这些提示词。虽然这些提示词非常基础,但这是一种了解如何通过此技术 公开强大提示词的好方法。
运行代码分析 MCP 服务之前
请记住:
- 将示例 JAR 的完整路径替换为系统上的正确路径
在 Claude Desktop 中
"code-anaylsis": {
"command": "java",
"args": [
"-Dclojure.tools.logging.factory=clojure.tools.logging.impl/log4j2-factory",
"-Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.Slf4jLog",
"-Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector",
"-Dlog4j2.configurationFile=log4j2-mcp.xml",
"-Dbabashka.json.provider=metosin/jsonista",
"-Dlogging.level=INFO",
"-cp",
"/Users/vedang/mcp-clojure-sdk/examples/target/io.modelcontextprotocol.clojure-sdk/examples-1.2.0.jar",
"code_analysis_server"
]
}
在 MCP Inspector 中
(请记得使用系统上示例 JAR 的完整路径,或
在 mcp-clojure-sdk 仓库中执行此命令)
npx @modelcontextprotocol/inspector java -Dclojure.tools.logging.factory=clojure.tools.logging.impl/log4j2-factory -Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.Slf4jLog -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -Dlog4j2.configurationFile=log4j2-mcp.xml -Dbabashka.json.provider=metosin/jsonista -Dlogging.level=INFO -cp examples/target/io.modelcontextprotocol.clojure-sdk/examples-1.2.0.jar code_analysis_server
核心组件
-
服务端实现:核心服务端功能在
server.clj中实现, 用于处理各种 MCP 方法的请求/响应周期。 -
传输层:SDK 在
stdio_server.clj中实现了 STDIO 传输, 使用io_chan.clj在 IO 流与 core.async 通道之间进行转换。 -
错误处理:自定义错误处理定义在
mcp/errors.clj中。 -
协议规范:所有协议规范都定义在
specs.clj中, 该文件为请求、响应和服务端组件提供验证。
通信流程
此时序图展示了 MCP 客户端与服务端交互的典型生命周期:
-
初始化阶段:
- 客户端连接并发送
initialize请求 - 服务端返回其功能
- 客户端通过
initialized通知进行确认
- 客户端连接并发送
-
发现阶段:
- 客户端使用
tools/list、resources/list和prompts/list方法发现可用的工具、资源和提示词 - 这些内容在创建上下文时注册到服务端
- 客户端使用
-
工具交互:
- 客户端可以携带参数调用工具
- 服务端将请求路由到相应的处理函数
- 结果会返回给客户端
-
资源交互:
- 客户端可以通过 URI 读取资源
- 服务端获取资源内容
-
提示词交互:
- 客户端可以请求预定义的提示词
- 服务端返回相应的消息
-
可选功能:
- 资源订阅更新
- 通过 ping/pong 进行健康检查
sequenceDiagram
participant Client
participant MCPServer
participant Tool
participant Resource
participant Prompt
Note over Client,MCPServer: Initialization Phase
Client->>+MCPServer: initialize
MCPServer-->>-Client: initialize response (capabilities)
Client->>MCPServer: notifications/initialized
Note over Client,MCPServer: Discovery Phase
Client->>+MCPServer: tools/list
MCPServer-->>-Client: List of available tools
Client->>+MCPServer: resources/list
MCPServer-->>-Client: List of available resources
Client->>+MCPServer: prompts/list
MCPServer-->>-Client: List of available prompts
Note over Client,MCPServer: Tool Interaction
Client->>+MCPServer: tools/call (name, arguments)
MCPServer->>+Tool: handler(arguments)
Tool-->>-MCPServer: result
MCPServer-->>-Client: Tool response
Note over Client,MCPServer: Resource Interaction
Client->>+MCPServer: resources/read (uri)
MCPServer->>+Resource: handler(uri)
Resource-->>-MCPServer: contents
MCPServer-->>-Client: Resource contents
Note over Client,MCPServer: Prompt Interaction
Client->>+MCPServer: prompts/get (name, arguments)
MCPServer->>+Prompt: handler(arguments)
Prompt-->>-MCPServer: messages
MCPServer-->>-Client: Prompt messages
Note over Client,MCPServer: Optional Subscription
Client->>+MCPServer: resources/subscribe (uri)
MCPServer-->>-Client: Empty response
MCPServer-->>Client: notifications/resources/updated
Note over Client,MCPServer: Health Check
Client->>+MCPServer: ping
MCPServer-->>-Client: pong
待完成工作
亲爱的读者,你也可以参与其中!前往 todo.org 文件 查看待处理的更改列表,列表大致按照我计划处理的顺序排列。
SDK 开发
clojure-sdk 是一个标准的 deps-new 项目,因此你可以
预期所有 deps-new 命令都能按预期工作。即便如此:
运行项目测试:
$ make test ## or clojure -T:build test
运行项目的 CI 流水线并构建 JAR:
$ make build ## or clojure -T:build ci
这将生成更新后的 pom.xml 文件,其中包含已同步的依赖项,位于
target/classes 内的 META-INF 目录中;JAR 则位于 target 中。
你可以通过更新 build.clj,修改生成的 pom.xml 中的版本(及 SCM 标签)
信息。
在本地安装:
$ make install ## or clojure -T:build install
将其部署到 Clojars——需要设置 CLOJARS_USERNAME 和
CLOJARS_PASSWORD 环境变量(需要先运行 ci 任务):
$ make deploy ## or clojure -T:build deploy
默认情况下,你的库将部署到 clojars.org 上的 io.modelcontext/clojure-sdk。
灵感来源
此 SDK 构建于
jsonrpc4clj 之上,该库
解决了基于 JSON-RPC 的服务端处理各种边界情况这一难题。我手动构建了这一层,
并在意识到 jsonrpc4clj 是更明智的选择之前,发现了所有这些边界情况。
它的代码写得非常出色,也很容易根据我的需求进行修改。
许可证
版权所有 © 2025 Unravel.tech
根据 MIT 许可证分发
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。