返回市场
clojure-mcp-轻量版

clojure-mcp-轻量版

作者:bhauman28 星标更新:2025-11-20

项目介绍

clojure-mcp-light

这不是一个MCP服务器。

TL;DR:

  • 两个CLI工具:parinfer钩子 + nREPL评估器
  • 通过Claude Code钩子集成,实现干净的差异对比
  • 最小化方法:仅修复分隔符 + REPL评估

该项目的目标是通过几个简单的CLI工具,为Claude Code提供类似ClojureMCP的体验。

这些工具共同提供了更好的Clojure开发体验与Claude Code。

它们帮助解决两个主要问题:

  • 大型语言模型输出中的错误分隔符
  • 连接到状态化的Clojure nREPL

但您可能想要尝试这种方法的主要原因是,它可以让您在处理Clojure代码时获得纯净的Claude Code体验。

由于这个项目依赖于与默认Claude Code编辑工具一起工作的钩子,因此将其集成到您的Claude Code设置中不会影响UI。也就是说,您可以阅读并确认代码差异,并且不会再看到格式不佳的clojure-mcp工具调用。

您可以一次性设置clojure-mcp-light,然后在没有任何额外配置的情况下使用Claude Code编辑任何Clojure项目。

这些脚本从ClojureMCP开发和验证的模式中受益。

可以与ClojureMCP一起使用,因为没有硬性不兼容性,实际上,您可以在Claude Code配置的根级别安装这些钩子,以便能够无误地编辑Clojure文件。

⚠️ 实验性: 该项目尚处于早期阶段。我仍在大量使用它以评估其效果。预计会有更改,包括仓库名称的更改。

哲学

该项目探索了使用Claude Code进行Clojure开发的最小工具集。我们不是使用全面的MCP服务器,而是测试智能parinfer应用结合强大的REPL评估CLI脚本是否足以实现高效的Clojure开发。

为什么选择最小工具集?

  • Claude Code可能已经优化了其内置工具的有效使用
  • 更简单的工具集更容易维护和理解
  • 有可能支持Claude Code Web(不支持MCP服务器)
  • 如果最小工具集足够,这对Clojure社区来说是有价值的信息
  • 较少的复杂性意味着更少的活动部件和潜在问题

这与clojure-mcp有何不同?

ClojureMCP是一个完整的编码助手(不包括LLM循环),具有全面的Clojure工具集。而这个项目采取相反的方法:寻找最少的必要工具,以利用Claude Code的原生能力,获得良好的Clojure支持。

如果这种最小化的方法被证明足够,那么它表明Clojure开发者可以通过以下方式取得良好结果:

  • 智能分隔符修复(parinfer)
  • CLI上的REPL评估
  • Claude Code的内置工具

概览

Clojure-mcp-light提供了两个主要工具:

  1. 自动分隔符修复钩子clj-paren-repair-claude-hook)- 在使用Claude Code处理Clojure文件时检测并修复分隔符错误(括号、圆括号、大括号不匹配)。钩子系统拦截文件操作,在出现问题之前透明地修复分隔符问题。

  2. nREPL评估工具clj-nrepl-eval)- 一个命令行工具,用于通过nREPL评估Clojure代码,带有自动分隔符修复、超时处理和格式化输出。

功能

  • 自动分隔符错误检测 使用edamame解析器
  • 智能分隔符修复 自动后端选择:
    • 当可用时首选parinfer-rust(更快,经过实战考验)
    • 回退到parinferish(纯Clojure,无需外部依赖)
  • 写入操作:在写入文件之前检测并修复分隔符错误
  • 编辑操作:编辑前创建备份,自动修复或从备份恢复
  • 可选代码格式化--cljfmt标志启用写入/编辑操作后的自动代码格式化
  • 统计跟踪--stats标志启用分隔符错误、修复和成功的事件跟踪
  • 自动清理:会话结束钩子在Claude Code会话终止时删除临时文件
  • 会话作用域临时文件:组织目录结构,每个项目和每个会话隔离
  • 实时反馈:通过钩子响应向Claude Code传达修复和问题

要求

  • Babashka - 快速启动的Clojure脚本环境(包括cljfmt)
  • bbin - Babashka包管理器
  • Claude Code - Claude CLI工具

可选:

  • parinfer-rust - 分隔符推断和修复 - 当可用时,clojure-mcp-light将使用此工具

安装

通过bbin安装

  1. 如果尚未安装,请先安装bbin:

    详情见 https://github.com/babashka/bbin。

  2. 安装clojure-mcp-light(运行两个命令):

    从GitHub:

    bbin install https://github.com/bhauman/clojure-mcp-light.git --tag v0.2.0
    
    bbin install https://github.com/bhauman/clojure-mcp-light.git --tag v0.2.0 --as clj-nrepl-eval --main-opts '["-m"  "clojure-mcp-light.nrepl-eval"]'
    

    或从本地检出:

    bbin install .
    
    bbin install . --as clj-nrepl-eval --main-opts '["-m"  "clojure-mcp-light.nrepl-eval"]'
    

    这是为了安装两个命令:

    • clj-paren-repair-claude-hook - 自动分隔符修复钩子
    • clj-nrepl-eval - nREPL评估工具
  3. ~/.claude/settings.json中配置Claude Code钩子:

    {
      "hooks": {
        "PreToolUse": [
          {
            "matcher": "Write|Edit",
            "hooks": [
              {
                "type": "command",
                "command": "clj-paren-repair-claude-hook --cljfmt"
              }
            ]
          }
        ],
        "PostToolUse": [
          {
            "matcher": "Edit|Write",
            "hooks": [
              {
                "type": "command",
                "command": "clj-paren-repair-claude-hook --cljfmt"
              }
            ]
          }
        ],
        "SessionEnd": [
          {
            "hooks": [
              {
                "type": "command",
                "command": "clj-paren-repair-claude-hook --cljfmt"
              }
            ]
          }
        ]
      }
    }
    

    配置说明:

    • --cljfmt标志启用自动代码格式化(使用捆绑在babashka中的cljfmt)
    • 添加--stats以启用分隔符事件跟踪至~/.clojure-mcp-light/stats.log
    • 添加--log-level debug(或trace)以调试钩子操作
    • 添加--log-file PATH自定义日志文件位置
    • 如果不需要自动格式化,则移除--cljfmt
    • SessionEnd钩子在Claude Code会话终止时自动清理临时文件
  4. 验证安装:

    # 测试nREPL评估(需要在7888端口上运行nREPL服务器)
    clj-nrepl-eval -p 7888 "(+ 1 2 3)"
    
    # 手动测试钩子
    echo '{"hook_event_name":"PreToolUse","tool_name":"Write","tool_input":{"file_path":"test.clj","content":"(def x 1)"}}' | clj-paren-repair-claude-hook
    
    # 测试带有cljfmt标志的钩子
    clj-paren-repair-claude-hook --help
    

斩号命令

实验性

该项目包括针对Claude Code的自定义斩号命令,以简化您的Clojure工作流程:

可用命令

  • /start-nrepl - 自动在后台启动nREPL服务器,检测端口,并创建.nrepl-port文件
  • /clojure-nrepl - 提供关于如何使用clj-nrepl-eval进行REPL驱动开发的信息

设置

将命令文件复制或符号链接到项目的.claude/commands/目录:

# 如果不存在,创建命令目录
mkdir -p .claude/commands

# 复制命令
cp commands/*.md .claude/commands/

# 或创建符号链接(推荐 - 保持同步更新)
ln -s $(pwd)/commands/clojure-nrepl.md .claude/commands/clojure-nrepl.md
ln -s $(pwd)/commands/start-nrepl.md .claude/commands/start-nrepl.md

使用

设置完成后,您可以在Claude Code对话中使用这些命令:

/start-nrepl

这将自动启动nREPL服务器并设置.nrepl-port文件。

/clojure-nrepl

这将为Claude提供关于REPL评估的上下文信息,使其更容易与正在运行的Clojure环境交互。

clj-paren-repair-claude-hook - 钩子工具

用于自动分隔符修复,可选代码格式化和日志记录的钩子命令。

功能

  • 自动分隔符检测 使用edamame解析器
  • 智能分隔符修复 自动后端选择(当可用时首选parinfer-rust,回退到parinferish)
  • 可选代码格式化 使用cljfmt
  • 可配置的日志文件 用于调试钩子操作

使用

# 基本使用(静默,无日志)
clj-paren-repair-claude-hook

# 带有自动代码格式化
clj-paren-repair-claude-hook --cljfmt

# 带有调试日志到默认位置(./.clojure-mcp-light-hooks.log)
clj-paren-repair-claude-hook --log-level debug --cljfmt

# 带有跟踪日志到自定义文件
clj-paren-repair-claude-hook --log-level trace --log-file /tmp/hook-debug.log

# 显示帮助
clj-paren-repair-claude-hook --help

选项

  • --cljfmt - 启用写入/编辑操作后的自动代码格式化
  • --stats - 启用分隔符事件的统计跟踪(日志到~/.clojure-mcp-light/stats.log
  • --log-level LEVEL - 设置文件日志的级别(trace, debug, info, warn, error, fatal, report)
  • --log-file PATH - 日志文件路径(默认:./.clojure-mcp-light-hooks.log
  • -h, --help - 显示帮助信息

日志

默认情况下,钩子运行时是静默的,没有日志。要启用日志以进行调试:

# 调试级别日志(推荐用于故障排除)
clj-paren-repair-claude-hook --log-level debug

# 跟踪级别日志(最大详细程度)
cl-paren-repair-claude-hook --log-level trace

# 自定义日志文件位置
clj-paren-repair-claude-hook --log-level debug --log-file ~/hook-debug.log

日志文件包括时间戳、命名空间、行号和结构化输出,便于调试。

在钩子中启用日志:

要在作为Claude Code钩子运行时启用日志,请在钩子命令中添加--log-level标志。例如:

clj-paren-repair-claude-hook --log-level debug --cljfmt

统计跟踪

--stats标志启用分隔符事件的跟踪,有助于分析LLM生成的代码质量。将其添加到您的钩子命令中:

clj-paren-repair-claude-hook --cljfmt --stats

跟踪的事件类型:

  • :delimiter-error - 在生成的代码中检测到分隔符错误
  • :delimiter-fixed - 成功自动修复分隔符错误
  • :delimiter-fix-failed - 无法自动修复分隔符错误
  • :delimiter-ok - 没有分隔符错误(干净代码)

日志格式:

统计数据写入~/.clojure-mcp-light/stats.log作为EDN条目:

{:event-type :delimiter-error, :hook-event "PreToolUse", :timestamp "2025-11-09T14:23:45.123Z", :file-path "/Users/me/project/src/core.clj"}
{:event-type :delimiter-fixed, :hook-event "PreToolUse", :timestamp "2025-11-09T14:23:45.234Z", :file-path "/Users/me/project/src/core.clj"}
{:event-type :delimiter-ok, :hook-event "PostToolUse", :timestamp "2-11-09T14:25:10.456Z", :file-path "/Users/me/project/src/util.clj"}

分析统计数据:

使用包含的统计数据摘要脚本快速概览:

# 显示综合统计数据摘要
./scripts/stats-summary.bb

# 示例输出:
# 分隔符事件统计数据
# ============================================================
#
# 总事件数:42
#
# 按类型分类的事件
# ==============
#   delimiter-ok               28  ( 66.7%)
#   delimiter-error             8  ( 19.0%)
#   delimiter-fixed             5  ( 11.9%)
#   delimiter-fix-failed        1  (  2.4%)
#
# 按钩子分类的事件
# ==============
#   PreToolUse:Write           30
#   PostToolUse:Edit           12
#
# 按事件数量排序的前10个文件
# ===========================
#       8  src/core.clj
#       6  src/util.clj
#       4  test/core_test.clj
#
# 成功指标
# ===============
#   清洁代码(无错误):        28
#   检测到的错误:                8
#   成功修复:                 5
#   未能修复:                  1
#
#   修复成功率:           62.5%
#   清洁代码率:            77.8%

或者使用Babashka进行自定义分析:

# 计算总事件数
cat ~/.clojure-mcp-light/stats.log | wc -l

# 按事件类型过滤
bb -e "(require '[clojure.edn :as edn]) \
  (->> (slurp \"$HOME/.clojure-mcp-light/stats.log\") \
       (clojure.string/split-lines) \
       (map edn/read-string) \
       (filter #(= :delimiter-error (:event-type %))) \
       (count))"

# 按事件类型分组
bb -e "(require '[clojure.edn :as edn]) \
  (->> (slurp \"$HOME/.clojure-mcp-light/stats.log\") \
       (clojure.string/split-lines) \
       (map edn/read-string) \
       (group-by :event-type) \
       (map (fn [[k v]] [k (count v)])) \
       (into {}))"

# 查找分隔符错误最多的文件
bb -e "(require '[clojure.edn :as edn]) \
  (->> (slurp \"$HOME/.clojure-mcp-light/stats.log\") \
       (clojure.string/split-lines) \
       (map edn/read-string) \
       (filter #(= :delimiter-error (:event-type %))) \
       (group-by :file-path) \
       (map (fn [[k v]] [k (count v)])) \
       (sort-by second >) \
       (take 5))"

clj-nrepl-eval - nREPL评估工具

主要的命令行工具,用于通过nREPL评估Clojure代码,带有自动分隔符修复。

功能

  • 直接nREPL通信 使用bencode协议
  • 自动分隔符修复 在评估前(当可用时首选parinfer-rust,回退到parinferish)
  • 长时间运行评估的超时和中断处理
  • 格式化输出 结果之间带有分隔符
  • 通过--discover-ports标志发现服务器(查找当前目录中的nREPL服务器)
  • 通过--connected-ports标志跟踪连接(显示先前连接的会话)
  • 持久会话 每个目标会话管理

使用

# 发现当前目录中的nREPL服务器
clj-nrepl-eval --discover-ports

# 检查先前连接的会话
clj-nrepl-eval --connected-ports

# 评估代码(需要端口)
clj-nrepl-eval -p 7888 "(+ 1 2 3)"

# 显式指定端口
clj-nrepl-eval --port 7888 "(println \"Hello\")"

# 设置超时(以毫秒为单位)
clj-nrepl-eval -p 7888 --timeout 5000 "(Thread/sleep 1000