配置
首先需要配置好 gptel 有可以使用工具调用的 ai 模型, 比如 claude 之类的。 然后配置想要使用的 mcp server, 我拿 fetch 这个 mcp server 来举例,这个 mcp server 可以获取网页内容,并且转化为 markdown。
根据官方文档配置想要启动的服务器
这个配置和官方的一样,第一个参数是 mcp server 的名字,第二个参数是 command, 最后一个参数是 args
(require 'mcp-hub)
(setq mcp-hub-servers
'(("fetch" . (:command "uvx" :args ("mcp-server-fetch")))))
启动
然后使用命令 mcp-hub 启动服务器管理界面,或者也可以用 mcp-hub-start-all-server 来启动所有的配置好的 mcp 服务器。
可以看到 fetch 这个 mcp server 连接成功。注册工具
目前想要与 gptel 结合,可以用以下几个函数。 这个函数是让 mcp 生成符合 gptel 工具格式的列表,并且注册到 gptel 里面,这样 gptel 就知道可以调用那些 工具。
(defun gptel-mcp-register-tool ()
(interactive)
(let ((tools (mcp-hub-get-all-tool :asyncp t :categoryp t)))
(mapcar #'(lambda (tool)
(apply #'gptel-make-tool
tool))
tools)))
运行完这个函数,就可以在 gptel 的工具使用菜单中看到注册好的 mcp 工具。
激活工具
目前有两种方式。 第一种:使用 gptel 自带的 gptel-menu 里面的菜单激活工具。 第二种:使用以下函数激活所有所有 mcp 工具和 关闭所有 mcp 工具。(之后打算写一个单独的插件来处理与 gptel 交互)
;; 激活所有 mcp 工具
(defun gptel-mcp-use-tool ()
(interactive)
(let ((tools (mcp-hub-get-all-tool :asyncp t :categoryp t)))
(mapcar #'(lambda (tool)
(let ((path (list (plist-get tool :category)
(plist-get tool :name))))
(push (gptel-get-tool path)
gptel-tools)))
tools)))
;; 关闭所有 mcp 工具
(defun gptel-mcp-close-use-tool ()
(interactive)
(let ((tools (mcp-hub-get-all-tool :asyncp t :categoryp t)))
(mapcar #'(lambda (tool)
(let ((path (list (plist-get tool :category)
(plist-get tool :name))))
(setq gptel-tools
(cl-remove-if #'(lambda (tool)
(equal path
(list (gptel-tool-category tool)
(gptel-tool-name tool))))
gptel-tools))))
tools)))
激活工具之后可以看到 fetch 工具被激活。
使用工具
激活之后就正常和 ai 对话就好了,在这个过程中 ai 自己决定是否要使用工具来获取信息。