
手把手教你构建Clojure MCP自定义服务器工厂函数模式全解析【免费下载链接】clojure-mcpClojure MCP项目地址: https://gitcode.com/gh_mirrors/cl/clojure-mcpClojure MCPclojure-mcp是一个把 LLM 客户端如 Claude、Cursor接入 Clojure 项目的 MCP 服务器提供 REPL 求值、括号修复和 Clojure 感知的编辑工具。如果你想打造一个只属于自己的 AI 开发助手构建 Clojure MCP自定义服务器比你想象中简单得多——从 v0.5.0 起项目引入了全新的工厂函数模式你只需要定义三个工厂函数再调用核心入口build-and-start-mcp-server一个完全定制化的服务器就诞生了。本文将从零开始带你彻底搞懂这套模式。为什么你需要一个自定义的 MCP 服务器默认的 Clojure MCP服务器已经集成了精心挑选的工具集参考src/clojure_mcp/main.clj但每个团队、每个项目都有自己的工作流。自定义服务器的价值在于个性化只保留你真正用得到的工具减少启动时间和认知负担安全控制构建只读服务器让 AI 只探索、不修改专属资源把团队文档、架构说明暴露给 AI 作为上下文技术栈集成为 Shadow-cljs、Figwheel 等添加专属工具核心思路一句话复用默认组件 按需替换工厂函数。核心概念工厂函数模式到底是什么工厂函数模式是 clojure-mcp 提供的一种装配式扩展机制。整个服务器由三部分组成每一部分都对应一个工厂函数工厂函数职责统一签名make-tools-fn生成工具Tools列表(fn [nrepl-client-atom working-dir] ...)make-prompts-fn生成提示词Prompts列表(fn [nrepl-client-atom working-dir] ...)make-resources-fn生成资源Resources列表(fn [nrepl-client-atom working-dir] ...)你只需把这三大工厂函数打包成一个 map交给core/build-and-start-mcp-server核心模块就会自动完成 nREPL 连接、配置加载、组件注册等全部复杂工作。想了解底层实现可以查看src/clojure_mcp/core.clj中的build-components和register-components。 小贴士三个工厂函数都是可选的。不提供某个函数对应类别就不会被注册。第一步搭建最小可运行的自定义服务器最简单的方式是完全复用main的工厂函数几行代码就能得到一个功能完整的服务器(ns my-company.mcp-server (:require [clojure-mcp.core :as core] [clojure-mcp.main :as main])) (defn start-mcp-server [opts] (core/build-and-start-mcp-server opts {:make-tools-fn main/make-tools :make-prompts-fn main/make-prompts :make-resources-fn main/make-resources}))没错就是这样这已经是一个开箱即用的完整 MCP 服务器。接下来我们在这个基础上逐步定制。第二步定制你的工具集打造只读安全服务器很多团队希望 AI 先看得懂再动手改。只加载读取类工具就能让探索更安全(defn make-read-only-tools [nrepl-client-atom _working-dir] [(directory-tree-tool/directory-tree-tool nrepl-client-atom) (unified-read-file-tool/unified-read-file-tool nrepl-client-atom) (new-grep-tool/grep-tool nrepl-client-atom) (glob-files-tool/glob-files-tool nrepl-client-atom) (eval-tool/eval-code nrepl-client-atom) (project-tool/inspect-project-tool nrepl-client-atom)])把make-tools-fn换成make-read-only-tools一个只读探索模式的服务器就完成了。各个工具的命名空间可以在src/clojure_mcp/tools/下找到例如tools/unified_read_file/tool.clj、tools/grep/tool.clj。在默认工具之上追加自定义工具如果你有自己的专属工具比如数据库查询工具用conj直接追加即可(defn make-tools [nrepl-client-atom working-directory] (conj (main/make-tools nrepl-client-atom working-directory) (db-tool/database-query-tool nrepl-client-atom)))第三步添加自定义资源与提示词用资源把团队文档喂给 AIMCP 资源Resources是 AI 可以直接读取的上下文。clojure-mcp.resources提供了两个现成工厂create-file-resource读取文件和create-string-resource直接传字符串。源码见src/clojure_mcp/resources.clj。(defn make-resources [nrepl-client-atom working-dir] (concat (main/make-resources nrepl-client-atom working-dir) [(resources/create-file-resource custom://architecture ; 资源 URL ARCHITECTURE.md ; 资源名称 系统架构文档 ; 描述 text/markdown ; MIME 类型 (.getCanonicalPath (io/file working-dir docs/ARCHITECTURE.md)))]))这样AI 助手就能在需要时读取你的架构文档给出更贴合项目的建议。添加团队专属提示词提示词Prompts可以标准化 AI 的行为。比如为数据库迁移定义一个模板让 AI 严格按团队的格式生成代码(defn make-prompts [nrepl-client-atom working-dir] (concat (main/make-prompts nrepl-client-atom working-dir) [{:name database-migration :description 生成数据库迁移代码 :arguments [{:name table-name :description 要迁移的表名 :required? true}] :prompt-fn (fn [_ args callback] (callback {:description 数据库迁移助手 :messages [{:role :user :content (str 请为表 (get args table-name) 生成数据库迁移代码使用团队标准格式。)}]}))}]))进阶技巧修改现有工具而不只是新增工厂函数返回的只是普通的 map因此你可以对已有工具改名、改描述、甚至删除。这非常实用改名防冲突合并多来源工具时用update :name加前缀例如把bash改成shell_command调整描述工具描述直接影响 AI 何时调用它比如强调读取文件前先看 README安全移除用remove过滤掉bash等危险工具参考doc/custom-mcp-server.md中的完整示例里面有逐行注释的改造模板。真实案例为 ClojureScript 项目扩展服务器项目自带两个真实示例是最佳的学习范本src/clojure_mcp/main_examples/figwheel_main.clj在默认工具上追加 Figwheel 的 ClojureScript 求值工具src/clojure_mcp/main_examples/shadow_main.clj演示 Shadow CLJS 的单连接/双连接两种模式甚至能复用 nREPL 创建额外连接它们的共同套路是先调用main/make-tools拿到全部默认工具再用conj追加专属工具最后传给build-and-start-mcp-server。跟着抄一遍你就能举一反三。配置 deps.edn 并启动写好自己的start-mcp-server后在deps.edn中注册执行入口{:aliases {:my-mcp {:deps {com.bhauman/clojure-mcp {:local/root ~/workspace/clojure-mcp}} :extra-paths [src] ; 你的自定义服务器代码所在目录 :exec-fn my-company.custom-mcp-server/start-mcp-server :exec-args {:port 7888}}}}然后一条命令启动clojure -X:my-mcp如需获取源码可执行git clone https://gitcode.com/gh_mirrors/cl/clojure-mcp。更多玩法HTTP 传输与环境切换工厂函数模式还支持传输层的切换。例如改用 Streamable HTTP 传输MCP 新一代标准单一/mcp端点只需调用streamable-http-core/build-and-start-mcp-server参考src/clojure_mcp/streamable_http_core.clj适合远程部署场景。另一个高频模式是环境差异化根据opts里的:env字段在开发环境加载全部工具、在生产环境只加载只读工具一套代码两种行为。常见问题与成功建议❓工厂函数签名记不住怎么办记住统一签名[nrepl-client-atom working-directory]即可这是硬性约定。❓默认配置才是最好的建议先复用main的工厂函数跑通再逐项定制每次只改一处并测试。最后送你六条心法从简开始、增量测试、注释决策、纳入版本控制、与团队共享配置、始终参考doc/custom-mcp-server.md与src/clojure_mcp/main.clj。掌握工厂函数模式后打造你的专属 Clojure MCP自定义服务器就是这么简单【免费下载链接】clojure-mcpClojure MCP项目地址: https://gitcode.com/gh_mirrors/cl/clojure-mcp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考