io.modelcontext/clojure-sdk
A. clojure-sdk 用于创建模型上下文协议服务器!
目录:TOC_4:
- 用法 - 数字地球原型系统 - 快速入门模板 - 例子 - 构建示例罐 - 计算器: calculator_server - 织女星岩: vegalite_server - 代码分析: code_analysis_server - 核心组件 - 沟通流程 - 待定工作 - SDK的开发 - 灵感 - 许可证
用法
这 计算器服务器.clj文件 和 vegalite_server.clj文件 示例包含用于定义MCP服务器的完整工作代码。
examples 是一个 deps-new 应用程序项目和编译说明 并运行各种示例服务器 示例/README.md 文件 (也复制到本节下方)
数字地球原型系统
deps for clojure-sdk 是:
{io.modelcontextprotocol/mcp-clojure-sdk
{:git/url "https://github.com/unravel-team/mcp-clojure-sdk.git"
:git/sha "d42474c5f66b6f5ad1e4d6ce2a4e8972640fb831"}}快速入门模板
为了便于使用,还有一个 deps-new 模板和Github模板。请参阅:
为了一个 deps-new 基于模板,快速创建新的MCP服务器。
对于Github模板项目,可以快速创建新的MCP服务器。
例子
构建示例罐
$ make clean && make examples-jar示例jar包含以下服务器:
- 计算器:
calculator_server - 织女星岩:
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的完整路径
在克劳德桌面
"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检查器中
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转换 命令行界面 待安装。
您可以在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在您的系统上
在克劳德桌面
"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检查器中
记住使用系统上示例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的完整路径替换为上的正确路径
您的系统
在克劳德桌面
"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检查器中
(记住使用系统上示例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传输
stdio_server.clj 使用 io_chan.clj 在IO之间转换 流和core.async通道。
- 错误处理:自定义错误处理在中定义
mcp/errors.clj.
- 协议规范:所有协议规范
定义于 specs.clj其为请求提供验证, 响应和服务器组件。
沟通流程
序列图显示了MCP的典型生命周期 客户端-服务器交互:
- 初始化阶段:
- 客户端连接并发送 initialize 请求 - 服务器以其功能进行响应 - 客户确认 initialized 通知
- 发现阶段:
- 客户端发现可用的工具、资源和提示 使用方法 tools/list, resources/list 和 prompts/list - 这些在上下文创建期间在服务器中注册
- 工具交互:
- 客户端可以使用参数调用工具 - 服务器将这些路由到相应的处理程序函数 - 结果返回给客户端
- 资源交互:
- 客户端可以通过URI读取资源 - 服务器检索资源内容
- 快速互动:
- 客户端可以请求预定义的提示 - 服务器返回相应的消息
- 可选功能:
- 更新的资源订阅 - 通过乒乓球进行健康检查
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文件 查看待定更改列表,大致按顺序I排列 计划解决它们。
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 已同步的文件 内部的依赖关系 META-INF 目录内 target/classes JAR文件 target。您可以更新版本(和SCM标签) 生成的信息 pom.xml 通过更新 build.clj.
在本地安装:
$ make install ## or clojure -T:build install将其部署到Clojars——需要 CLOJARS_USERNAME 和 CLOJARS_PASSWORD 环境变量(需要 ci 任务是 先运行):
$ make deploy ## or clojure -T:build deploy您的库将部署到io.modelcontext/clojure-sdk 默认情况下为clojars.org。
灵感
此SDK构建于 jsonrpc4clj,其中 解决了处理JSON-RPC所有边缘情况的困难部分 基于服务器。我亲手建造了这一层,发现了所有 在意识到这一点之前,边缘案例 jsonrpc4clj 谁更聪明 方法。代码编写得非常好,易于修改 要求。
许可证
版权所有©2025 Unravel.tech
根据MIT许可证分发
