仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接
模型上下文协议MCP与Ollama的整合实现指南
在过去一两个个月里,模型上下文协议(ModelContextProtocol,MCP)频繁出现在各种技术微信交流群中。我们已经看到了许多很酷的集成案例,大家似乎相信这个标准会长期存在,因为它为大模型与工具或软件的集成设立了规范。
前面一篇文章给大家分享了MCP一些基础概念,但是读完之后还是模棱两可,所以决定尝试将Ollama中的小型语言模型与MCP服务器连接起来,体验一下这个新标准。今天,向大家展示如何实现Ollama与MCP服务器的集成。
整个集成的主要步骤包括:
创建测试以及使用MCP服务
创建客户端文件来发送请求并启动服务
从服务获取工具到客户端
将工具转换为pydantic模型
通过responseformat将工具(作为pydantic模型)传递给Ollama
通过Ollama发送对话并接收结构化输出
如果响应中包含工具,则向服务器发送请求
要运行这个项目,需要安装必要的包。fastmcp库在使用uv运行代码时效果最佳。uv很容易下载和使用,类似于Poetry和pip。
使用以下命令将所需库添加到你的项目中:
这会同时安装MCP服务器和Ollama聊天库,以便你在它们的基础上构建客户端和服务器逻辑。
设置时,你的文件夹应该是这样的:
server.py文件包含MCP服务器和想要暴露的工具。client.py文件在后台进程中启动服务器,获取可用工具,并与Ollama连接。
首先,让我们使用fastmcp库创建一个简单的MCP服务器。该服务器暴露了一个名为magicoutput的工具。这个函数接受两个字符串输入并返回一个固定的字符串作为输出。
@mcp.tool()装饰器用于将函数注册为MCP服务器中的可用工具。当服务器启动后,任何客户端都可以获取并调用这个工具。
通过在主块中调用mcp.run()来启动服务器。
我们运行下面命令,进行调试服务端的工具:
输入日志如下:
本地访问页面http ://127.0.0.1:6274/#tools,我们可以看构造的函数,并且可以调试
为了连接到MCP服务器并列出可用工具,我们使用来自mcp库的ClientSession、StdioServerParameters和stdio_client。
我们定义一个名为OllamaMCP的类来处理服务器连接和工具获取。在类内部,_async_run方法启动异步会话,初始化它,并从服务器获取工具列表。
我们使用threading.Event()来跟踪会话何时准备就绪,并将工具列表存储在self.tools中。
在脚本末尾,我们定义服务器参数并在后台线程中运行客户端。这会启动连接并打印服务器返回的工具元数据。
运行上面的代码后,你会从服务器得到以下响应,其中可以看到服务器上可用的工具列表。
现在我们已经从服务器接收到了工具列表,下一步是将它们转换为Pydantic模型。我们使用Pydantic的create_model来动态定义新的响应模式,基于服务器的工具定义。还有一个辅助函数来将JSON类型映射到有效的Python类型。
Pydantic是一个用于数据验证和序列化的Python模型库。它在FastAPI中广泛使用,用于定义请求体、响应体和其他数据模型,提供了强大的类型检查和自动文档生成功能
这帮助我们动态定义模型,使语言模型确切知道在返回工具参数时应使用什么结构。
运行代码后,print(Response.model_fields)的输出显示了我们刚刚构建的响应模型的完整结构。这个模型包括两部分:一部分是助手发送给用户的消息,另一部分是可选字段,保存工具参数。
如果模型填充了工具字段,我们将使用它来调用服务器。否则,我们只使用普通的响应字符串。
现在工具可以作为pydantic模型使用了,我们可以继续并启用工具调用。为此,我们使用后台线程并设置两个队列。一个用于向服务器发送请求,另一个用于接收响应。
call_tool方法将请求放入队列,后台线程监听该请求。一旦使用MCP会话调用工具,结果就会放入响应队列。
请注意,在这个阶段,我们正在使用call_tool方法手动传递函数名称和参数。在下一节中,我们将根据Ollama返回的结构化输出触发这个调用。
运行此代码后,我们可以确认一切正常。工具被服务器正确识别、执行,并返回结果。
首先我们先通过Ollama部署一个大模型服务,这里我们下gemma3
下面代码中,我是设置的局域网的ip
有了队列和call_tool函数,现在是时候该集成Ollama了。我们将响应类传递到Ollama的format字段中,告诉我们的语言模型(这里是Gemma)在生成输出时遵循该模式。
我们还定义了一个ollama_chat方法,用于发送对话,验证模型的响应是否符合模式,并检查是否包含工具。如果是,它提取函数名称和参数,然后使用在后台线程中的持久MCP会话调用它。
在main函数中,我们设置服务器连接,启动后台循环,并等待一切就绪。然后我们准备系统提示和用户消息,将它们发送给Ollama,并等待结构化输出。
最后,我们打印服务器的结果并关闭会话。
你可以看到输出工作得非常完美。我们收到了一个带有模型简短消息的响应,然后是一个带有将发送到MCP服务器的参数的工具。最后,我们得到了来自服务器的输出,如下所示:
下一篇,我们讲一下如何构造一个arxiv相关的mcp
添加微信,备注”LLM“进入大模型技术交流群
如果你觉得这篇文章对你有帮助,别忘了点个赞、送个喜欢
/作者:致Great