mcpField
I
io.modelcontext/clojure-sdk

io.modelcontext/clojure-sdk

本地服务
github.com/unravel-team开发工具6520 周前更新

关于 io.modelcontext/clojure-sdk

clojure-sdk 是一个用于创建 MCP 服务的 Clojure SDK,目前计划后续支持客户端。适合使用 Clojure 或 Java 生态的开发者。SDK 基于 jsonrpc4clj 构建,并附带示例服务。

主要功能

  1. 01用于创建 MCP 服务的 Clojure SDK
  2. 02基于 jsonrpc4clj 处理 JSON-RPC
  3. 03提供 STDIO 传输层
  4. 04附带计算器、Vega-lite 和代码分析示例服务

适用场景

  1. 01使用 Clojure 构建 MCP 服务
  2. 02参考示例服务学习 MCP 工具、资源和提示词的实现

MCP 相关

该 SDK 用于构建 MCP 服务,支持 initialize、tools/list、resources/list、prompts/list 等方法,可向 MCP 客户端暴露工具、资源和提示词。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"clojure-sdk": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/inspector"
]
}
}
}
启动命令npx -y @modelcontextprotocol/inspector

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@modelcontextprotocol/inspector

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

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 模板。请参阅:

  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

提供基本算术工具:add、subtract、multiply、 divide、power、square-root、average、factorial

可以在 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-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 服务之前

请记住:

  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-code 和 poem-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 流与 core.async 通道之间进行转换。

  3. 错误处理:自定义错误处理定义在 mcp/errors.clj 中。

  4. 协议规范:所有协议规范都定义在 specs.clj 中, 该文件为请求、响应和服务端组件提供验证。

通信流程

此时序图展示了 MCP 客户端与服务端交互的典型生命周期:

  1. 初始化阶段:

    • 客户端连接并发送 initialize 请求
    • 服务端返回其功能
    • 客户端通过 initialized 通知进行确认
  2. 发现阶段:

    • 客户端使用 tools/list、resources/list 和 prompts/list 方法发现可用的工具、资源和提示词
    • 这些内容在创建上下文时注册到服务端
  3. 工具交互:

    • 客户端可以携带参数调用工具
    • 服务端将请求路由到相应的处理函数
    • 结果会返回给客户端
  4. 资源交互:

    • 客户端可以通过 URI 读取资源
    • 服务端获取资源内容
  5. 提示词交互:

    • 客户端可以请求预定义的提示词
    • 服务端返回相应的消息
  6. 可选功能:

    • 资源订阅更新
    • 通过 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 许可证分发

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。