返回市场
麦普克洛jure软件开发工具包

麦普克洛jure软件开发工具包

作者:unravel-team55 星标更新:2025-05-26

项目介绍

技术文档摘要

io.modelcontext/clojure-sdk

一个用于创建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模板。详情如下:

  1. mcp-clojure-server-deps-new 基于deps-new的模板,可以快速创建新的MCP服务器。
  2. example-cool-mcp-server 一个Github模板项目,可以快速创建新的MCP服务器。

示例

构建示例Jar包

$ make clean && make examples-jar

示例Jar包包含以下服务器:

  1. 计算器:calculator_server
  2. Vega-lite:vegalite_server
  3. 代码分析:code_analysis_server

计算器:calculator_server

提供基本的算术工具:addsubtractmultiplydividepowersquare-rootaveragefactorial

在Claude Desktop或Inspector中可以尝试以下命令:

  1. [1, 2, 3, 4, 5]的平均值是多少?
  2. 15的阶乘是多少?
  3. 2的1000次方是多少?
  4. 64的平方根是多少?
在运行计算器MCP服务器之前:

记得:

  1. 使用系统上的完整路径到示例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-datavisualize-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可视化这些数据。

在运行Vega-lite MCP服务器之前

记得:

  1. 替换系统上示例JAR文件的完整路径
  2. 指定系统上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-codepoem-about-code

可以在Claude Desktop或Inspector中尝试这些提示。虽然这些提示非常基础,但这是展示如何通过这种技术暴露强大提示的好方法。

在运行代码分析MCP服务器之前

记得:

  1. 替换系统上示例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

核心组件

  1. 服务器实现:核心服务器功能实现在server.clj中,处理各种MCP方法的请求/响应循环。
  2. 传输层:SDK在stdio_server.clj中实现了STDIO传输,使用io_chan.clj在IO流和核心异步通道之间进行转换。
  3. 错误处理:自定义错误处理定义在mcp/errors.clj中。
  4. 协议规范:所有协议规范定义在specs.clj中,提供了对请求、响应和服务器组件的验证。

通信流程

序列图展示了MCP客户端-服务器交互的典型生命周期:

  1. 初始化阶段

    • 客户端连接并发送initialize请求
    • 服务器响应其能力
    • 客户端确认initialized通知
  2. 发现阶段

    • 客户端使用tools/listresources/listprompts/list方法发现可用的工具、资源和提示
    • 这些在上下文创建时注册在服务器中
  3. 工具交互

    • 客户端可以调用带有参数的工具
    • 服务器将这些路由到适当的处理器函数
    • 结果返回给客户端
  4. 资源交互

    • 客户端可以通过URI读取资源
    • 服务器检索资源内容
  5. 提示交互

    • 客户端可以请求预定义的提示
    • 服务器返回相应的消息
  6. 可选特性

    • 资源订阅以获取更新
    • 通过ping/pong进行健康检查
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文件,查看待办更改列表,这些更改大致按照我计划解决的顺序排列。

SDK开发

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_USERNAMECLOJARS_PASSWORD环境变量(需要先运行ci任务):

$ make deploy ## 或 clojure -T:build deploy

你的库将默认部署到clojars.org上的io.modelcontext/clojure-sdk。

灵感来源

这个SDK是在lsp4clj的基础上构建的,它解决了基于JSON-RPC服务器的所有边缘情况处理难题。我手动构建了这一层,并发现了所有边缘情况,直到意识到lsp4clj是更聪明的方法。代码编写得非常好,易于修改以满足我的需求。

许可

版权所有 © 2025 Unravel.tech

根据MIT许可证分发