Modex:Clojure中的模型上下文协议服务器和客户端库
Modex(MOdel+ContEXt)是一个Clojure库,可以让你用新的工具、资源和提示来增强你的人工智能。
Modex实现了(大部分) 模型上下文协议 在“原生”Clojure中构建MCP服务器和客户端。
因为它是原生的Clojure,你不需要处理Anthropic的 MCP Java SDK.
Modex实现了 stdio 2024-11-05 MCP规范中的传输,因此不需要像这样的代理 mcp代理 在SSE\stdio之间进行转换,反之亦然。
Modex在行动中的截图
Claude Desktop可以通过其MCP客户端与Modex MCP服务器通信:
目录
示例工具
- Datomic MCP 使用Modex公开Datomic工具,以便您的模型可以在开发或产品中查询数据库模式和数据。
快速启动
git clone git@github.com:theronic/modex.gitcd modex./build.sh在target/modex-mcp-0.2.2.jar.- 在以下位置打开您的Claude桌面配置
~/Library/Application\ Support/Claude/claude_desktop_config.json - 配置一个新的MCP服务器,该服务器将在其 _完整路径_:
{
"mcpServers": {
"modex-mcp-hello-world": {
"command": "java",
"args": ["-jar", "/Users/your-username/code/modex/target/modex-mcp-0.2.2.jar"]
}
},
"globalShortcut": ""
}- 重新启动Claude Desktop以激活新的MCP服务器+工具:)(Cmd+R刷新不会重新加载配置,只会重新启动工具)
- 告诉Claude“用123运行inc工具”,授权该工具,你应该看到124的输出。
什么是MCP?
MCP允许您使用工具、资源和提示来增强您的AI模型:
- 工具 它可以做的事情,比如查询数据库(例如Datomic)。
- 资源 是它可以读取的文件和数据,如PDF银行对账单。
- 提示 是模板化的消息和工作流。
用例
调制解调器由以下人员使用 数据经济学mcp,它将我们的生产Datomic数据库暴露给像Claude Desktop这样的MCP客户端。AI模型通过读取我们的数据库模式并运行检查服务器状态和IP的查询来智能诊断生产中的支持查询,因此它可以尝试访问它并将VM的期望状态与集群中的实际状态进行比较。
随着时间的推移,我希望使用Modex+其他MCP工具自动化我们的大部分定期支持查询。
Modex能做什么?
完整示例
中有一个MCP服务器示例 src/modex/mcp/core.clj 它使用一些基本工具定义了MCP服务器。
您的MCP客户端(例如Claude Desktop)可以连接到此服务器,并使用公开的工具为您的AI模型提供额外的上下文。
数据结构
工具
在内部,工具只是 Tool 记录几个 Parameter 论据:
(defrecord Tool [name doc args handler])(defrecord Parameter [name doc type required default])
然而,使用以下方式定义工具更方便 tool & tools 下面的宏。
描述一个单独的工具 tool 宏:
这 tool 宏观行为如下 defrecord,其中处理程序定义采用参数映射ala {:keys [arg1 arg2 ...]} 但有额外的(可选)地图 :type, :or & :doc此元数据用于向MCP客户端描述该工具。
- MCP规范目前仅支持
:string&:number刀具参数类型。 - 存在于
:or地图意味着可选性。 - 缺少参数docstring默认为参数名称字符串。
(require '[modex.mcp.tools :as tools])
(def add-tool
(tools/tool
; feels like defrecord.
(add [{:keys [x y]
:type {x :number
y :number}
:or {y 0} ; y is optional due to its presence in the :or map.
:doc {x "First number"
y "Second number"}}]
[(+ x y)]))) ; tools should return a vector (to support multiple values).使用以下命令调用工具 invoke-tool 包括验证:
调用使用参数映射,就像MCP客户端对 tools/call 请求:
(tools/invoke-tool add-tool {:x 5 :y 6}) ; Modex will map these arguments and call the handler.
=> {:success true, :results [11]} ; note :results is vector to support multiple values.直接调用工具处理程序以跳过验证和错误处理:
(tools/invoke-handler (:handler add-tool) {:x 5 :y 6})
=> [11] ; note vector result to support multiple values.使用定义工具集 tools 宏
这 tools 宏只是调用 tool 宏用于每个工具定义,并返回一个基于工具名称(关键字)的工具映射:
(def my-tools
"Define your tools here."
(tools/tools
(greet
"Greets a person by name." ; tools can have a docstring
[{:keys [first-name last-name]
:doc {first-name "A person's first name."
last-name "A person's last name (optional)."}
:type {first-name :string
last-name :string}
:or {last-name nil}}] ; last-name is optional, implied by presence in `:or` map.
; tools should return collection.
[(str "Hello from Modex, "
(if last-name ; args can be optional
(str first-name " " last-name)
first-name) "!")])
(add
"Adds two numbers."
; Tool handler args also support deprecated vector arg-style,
; but this is superseded by the newer map-destructuring style:
[^{:type :number :doc "First number to add."} a
^{:type :number :doc "Second number to add."} b]
[(+ a b)])
(subtract
"Subtracts two numbers (- a b)"
[^{:type :number :doc "First number."} a
^{:type :number :doc "Second number."} b]
[(- a b)])
(error-handling
"This tool throws intentionally. Modex will handle errors for you."
[]
(throw (ex-info "Modex will handle exceptions." {})))))创建Modex MCP服务器+工具:
(require '[modex.mcp.server :as server])
(def my-mcp-server
"Here we create a reified instance of AServer. Only tools are presently supported."
(server/->server
{:name "Modex MCP Server"
:version "0.0.2"
:initialize (fn [_init-params] ; init-params, but may contain client capabilities in future.
"Do long-running setup & blocking I/O here, like connecting to prod database.")
:tools my-tools
:prompts nil ; Prompts are WIP.
:resources nil})) ; Resources are WIP.启动MCP服务器
(server/start-server! my-mcp-server)或者把它放在你的 -main 功能。
协议
Modex暴露了一个 AServer 协议和DSL,用于定义描述MCP服务器的工具协议,这些协议公开了工具、资源和提示。
A服务器协议:
(defprotocol AServer
(protocol-version [this])
(server-name [this])
(version [this])
(capabilities [this])
(initialize [this _init-params]) ; init-params is empty for now, but may contain client capabilities in future.
(list-tools [this])
(call-tool [this tool-name arg-map])
(list-resources [this])
(list-prompts [this]))详细的分步说明
第一步:构建Uberjar
在运行它之前,你必须先构建它。构建输出一个uberjar,它类似于Java可执行文件。
clojure -T:build uber或者运行执行该操作的助手:
./build.sh(你可能需要跑步 chmod +x build.sh)
步骤2:打开Claude桌面配置
打开您的Claude桌面配置文件, claude_desktop_config.json,在MacOS上应位于:
~/Library/Application\ Support/Claude/claude_desktop_config.json步骤3:配置MCP服务器
在下面添加一个元素 mcpServers 所以看起来像这样:
{
"mcpServers": {
"modex": {
"command": "java",
"args": ["-jar", "/Users/your-username/code/modex/target/modex-mcp-0.2.2.jar"]
}
},
"globalShortcut": ""
}这个消息告诉克劳德桌面有一个名为 modex 它可以通过运行连接到 java -jar /path/to/your/uber.jar.
其工作方式是,您的本地MCP客户端(即Claude Desktop)启动您的MCP服务器进程,并通过stdin/stdout管道与其通信。
步骤4:重新启动克劳德桌面
现在,你应该可以问Claude“run foo”或“foo说什么?”,它就会运行 这 foo 工具,并回复“你好,AI!”。
实施
Modex在Clojure中实现了MCP客户端和服务器 _大多_ 符合 2024-11-05 MCP规范.
消息使用JSON-RPC 2.0有线格式进行编码。
有三种消息类型:
- 请求有
{:keys [id method ?params]} - 回应有
{:keys [id result ?error]} - 通知已
{:keys [method ?params}
MCP支持两种传输类型:
- \[x\] stdio/ststdout——在Modex中实现。
- \[\]服务器发送事件(SSE)-尚未实现。适用于受限网络
项目状态
- \[x\] 通过测试
- \[x\] 人机工程学(服务器/客户端协议?)
- \[x\] 工具
- \[x\] nREPL用于实时更改正在运行的进程
- \[\]资源
- \[\]提示
- \[进行中\]SSE支持
- \[进行中\]流式HTTP支持(2025-03-26 MCP规范)
依据
有一个现有的图书馆 mcp clj 它使用SSE,因此需要mcp代理从SSE\stdio进行代理。我对此很恼火,所以我做了Modex。
常见问题解答
当MCP客户端(如Claude Desktop)连接时,我可以修改服务器吗?
还没有,但我很快就会添加一个nREPL,这样你就可以在Claude Desktop连接到进程时评估更改,而无需重建uberjar。
顺便说一句,我试着让它跑起来 clojure -M -m modex.mcp.server,但您无法设置Claude Desktop的工作目录。
所以目前,我重建了uberjar并重新启动了Claude Desktop。会修好的。
感谢付费Modex客户:
许可证
总之:
- 非商业用途免费:使用它、修改它、在下共享它 GPLv3 免费,只要保持开源。
- 商业用途:想将更改保密吗?一次性支付20美元获得永久商业许可证。这涵盖了我在公共场合继续构建AI代币的成本。
此工具根据 GNU通用公共许可证v3.0(GPLv3)。您可以自由使用、修改和分发它,前提是任何衍生作品也根据GPLv3获得许可并开源。这确保了该工具可供社区免费使用,同时要求任何更改都具有透明度。
如果你想在专有项目中使用或修改这个工具,而不在GPLv3下发布你的更改,你 可以购买商业许可证。这允许您将您的修改保密,以供个人或商业使用。 要获得商业许可证,请通过以下方式联系我 modex@petrus.co.za.
