一个用于创建Model Context Protocol服务器的clojure-sdk!
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 "039cf220ac6bb3858f71e823016035e257a5380d"}}
为了方便使用,还提供了一个deps-new模板和一个Github模板。详情如下:
deps-new的模板,可以快速创建新的MCP服务器。$ make clean && make examples-jar
示例Jar包包含以下服务器:
calculator_servervegalite_servercode_analysis_servercalculator_server提供基本的算术工具:add、subtract、multiply、divide、power、square-root、average、factorial
在Claude Desktop或Inspector中可以尝试以下命令:
记得:
"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"
]
}
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
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可视化这些数据。
记得:
vl-convert的完整路径 "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"
]
}
记得使用系统上示例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中尝试这些提示。虽然这些提示非常基础,但这是展示如何通过这种技术暴露强大提示的好方法。
记得:
"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"
]
}
(记得使用系统上示例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方法的请求/响应循环。stdio_server.clj中实现了STDIO传输,使用io_chan.clj在IO流和核心异步通道之间进行转换。mcp/errors.clj中。specs.clj中,提供了对请求、响应和服务器组件的验证。序列图展示了MCP客户端-服务器交互的典型生命周期:
初始化阶段:
initialize请求initialized通知发现阶段:
tools/list、resources/list和prompts/list方法发现可用的工具、资源和提示工具交互:
资源交互:
提示交互:
可选特性:
sequenceDiagram
participant 客户端
participant MCPServer
participant 工具
participant 资源
participant 提示
Note over 客户端,MCPServer: 初始化阶段
客户端->>+MCPServer: initialize
MCPServer-->>-客户端: initialize响应(能力)
客户端->>MCPServer: notifications/initialized
Note over 客户端,MCPServer: 发现阶段
客户端->>+MCPServer: tools/list
MCPServer-->>-客户端: 可用工具列表
客户端->>+MCPServer: resources/list
MCPServer-->>-客户端: 可用资源列表
客户端->>+MCPServer: prompts/list
MCPServer-->>-客户端: 可用提示列表
Note over 客户端,MCPServer: 工具交互
客户端->>+MCPServer: tools/call (名称, 参数)
MCPServer->>+工具: handler(参数)
工具-->>-MCPServer: 结果
MCPServer-->>-客户端: 工具响应
Note over 客户端,MCPServer: 资源交互
客户端->>+MCPServer: resources/read (uri)
MCPServer->>+资源: handler(uri)
资源-->>-MCPServer: 内容
MCPServer-->>-客户端: 资源内容
Note over 客户端,MCPServer: 提示交互
客户端->>+MCPServer: prompts/get (名称, 参数)
MCPServer->>+提示: handler(参数)
提示-->>-MCPServer: 消息
MCPServer-->>-客户端: 提示消息
Note over 客户端,MCPServer: 可选订阅
客户端->>+MCPServer: resources/subscribe (uri)
MCPServer-->>-客户端: 空响应
MCPServer-->>客户端: notifications/resources/updated
Note over 客户端,MCPServer: 健康检查
客户端->>+MCPServer: ping
MCPServer-->>-客户端: pong
亲爱的读者,你可以帮忙!前往todo.org文件,查看待办更改列表,这些更改大致按照我计划解决的顺序排列。
clojure-sdk是一个标准的deps-new项目,因此你应该期望所有的deps-new命令都能按预期工作。即便如此:
运行项目的测试:
$ make test ## 或 clojure -T:build test
运行项目的CI管道并构建一个JAR:
$ make build ## 或 clojure -T:build ci
这将生成一个更新的pom.xml文件,并同步依赖项在target/classes目录下的META-INF目录内,以及在target中的JAR。你可以通过更新build.clj来更新生成的pom.xml中的版本(和SCM标签)信息。
本地安装:
$ make install ## 或 clojure -T:build install
部署到Clojars——需要CLOJARS_USERNAME和CLOJARS_PASSWORD环境变量(需要先运行ci任务):
$ make deploy ## 或 clojure -T:build deploy
你的库将默认部署到clojars.org上的io.modelcontext/clojure-sdk。
这个SDK是在lsp4clj的基础上构建的,它解决了基于JSON-RPC服务器的所有边缘情况处理难题。我手动构建了这一层,并发现了所有边缘情况,直到意识到lsp4clj是更聪明的方法。代码编写得非常好,易于修改以满足我的需求。
版权所有 © 2025 Unravel.tech
根据MIT许可证分发