Clojure SDK 协议服务器

用于创建 Model Context Protocol 服务器的 Clojure SDK,提供工具交互、资源管理和提示处理等功能,适用于开发高效的数据处理和代码分析工具。

  • by unravel-team
  • Clojure
  • 本地部署
  • 65 星标
  • 更新于
在 GitHub 查看 unravel-team/mcp-clojure-sdk

使用说明

io.modelcontext/clojure-sdk

A. clojure-sdk 用于创建模型上下文协议服务器!

目录:TOC_4:

用法

这 计算器服务器.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模板。请参阅:

  1. mcp clojure服务器安装新 为了一个 deps-new 基于模板,快速创建新的MCP服务器。
  2. 示例酷mcp服务器 对于Github模板项目,可以快速创建新的MCP服务器。

例子

构建示例罐

$ make clean && make examples-jar

示例jar包含以下服务器:

  1. 计算器: calculator_server
  2. 织女星岩: 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的完整路径
在克劳德桌面
    "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服务器之前

记得:

  1. 将示例JAR的完整路径替换为上的正确路径 您的系统
  2. 指定到的完整路径 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服务器之前

记得:

  1. 将示例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

核心组件

  1. 服务器实现:服务器的核心功能是 实现于 server.clj,它处理请求/响应周期 用于各种MCP方法。

  2. 传输层:SDK在中实现了STDIO传输 stdio_server.clj 使用 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. 可选功能:

    • 更新的资源订阅
    • 通过乒乓球进行健康检查
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许可证分发