自己开发 MCP 服务器

一、前言

MCP 已经火了一段时间了,目前也有许多现有的 MCP 服务器。今天我们要做的是自己开发一个 MCP 服务器,并编写 MCP 客户端,调用 MCP 服务器。并使用本地大语言模型与之联动。

除了自己编写 MCP 客户端,我们写好的 MCP 服务器也可以提供给 Cline、CherryStudio 等平台调用。

二、FastMCP

FastMCP 是一个用于快速构建 MCP 服务器、客户端的 Python 模块。可以通过 pip 安装:

bash 复制代码
pip install fastmcp

2.1 创建 MCP 服务器

首先我们来创建一个 MCP 服务器。创建 MCP 服务器的步骤如下:

  1. 创建 FastMCP 实例
  2. 创建工具
  3. 运行 MCP 服务器

在 FastMCP 中提供了 FastMCP 类用于构建服务器,另外提供了@mcp.tool注解用来添加工具,上述流程完整代码如下:

python 复制代码
from fastmcp import FastMCP

# 1、创建 FastMCP 实例
mcp = FastMCP()

# 2、创建工具
@mcp.tool()
def get_weather(city: str, date: str):
    """
    获取 city 的天气情况
    :param city: 城市
    :param date: 日期
    :return: 城市天气情况的描述
    """
    return f"{city} {date} 天晴,18度。"


# 3、运行MCP服务器
if __name__ == '__main__':
    mcp.run()

2.2 创建 MCP 客户端

MCP 客户端是用于从服务器获取上下文的程序。MCP 需要做的事情有:

  1. 连接 MCP 服务器
  2. 获取工具、资源、提示词
  3. 调用工具

FastMCP 提供了 Client 类用于创建 MCP 客户端,代码如下:

python 复制代码
import asyncio
from fastmcp import Client


async def run():
    # 连接 MCP 服务器
    client = Client('server.py')
    async with client:
        # 列出工具
        tools = await client.list_tools()

        tool = tools[0]
        # 调用工具
        tool_result = await client.call_tool(tool.name, {"city": "南昌"})
        print(tool_result)


if __name__ == '__main__':
    asyncio.run(run())

三、大语言模型调用MCP服务器

大语言模型调用 MCP 的原理就是,使用 MCP 客户端从 MCP 服务器拿到所有工具,在调用大语言模型时,以 function calling 的方式把工具传入,当大语言模型返回 tool_call 消息时,利用 MCP 客户端调用工具,并将调用结果传递给大语言模型。

3.1 OpenAI模块调用ollama中模型

首先看看如何调用 ollama 模型:

python 复制代码
from openai import OpenAI

# 创建OpenAI客户端
openai_client = OpenAI(
    base_url='http://127.0.0.1:11434/v1',
    api_key="None"
)

# 调用大语言模型
response = openai_client.chat.completions.create(
    model='qwen3:0.6b',
    messages=[
        {
            'role': 'user',
            'content': '今天北京天气怎么样?'
        }
    ]
)

这里我们做了两件事,分别是创建 OpenAI 客户端和调用大语言模型。在调用大语言模型时,我们可以传入工具列表。

3.2 大语言模型调用 MCP 服务器

大语言模型需要依赖 MCP 客户端调用服务器,因此还需要创建 MCP 客户端。具体代码如下:

python 复制代码
import asyncio
import json

from fastmcp import Client
from openai import OpenAI

# 创建MCP客户端
mcp_client = Client('server.py')
# 创建OpenAI客户端
openai_client = OpenAI(
    base_url='http://127.0.0.1:11434/v1',
    api_key="None"
)


async def main():
    async with mcp_client:
        # 获取工具列表,并转换格式
        tools = await mcp_client.list_tools()
        tools = [
            {
                "type": "function",
                "function": {
                    "name": tool.name,
                    "description": tool.description,
                    "input_schema": tool.inputSchema
                }
            }
            for tool in tools
        ]
        # 调用语言模型时,传入工具
        response = openai_client.chat.completions.create(
            model='qwen3:0.6b',
            messages=[
                {
                    'role': 'user',
                    'content': '今天北京天气怎么样?'
                }
            ],
            tools=tools
        )
        # 如果返回tool_calls,则调用工具,否则直接回答
        if response.choices[0].finish_reason != 'tool_calls':
            print(response)
        else:
            for tool_call in response.choices[0].message.tool_calls:
                # 调用工具,参数由大语言模型给出
                tool_result = await mcp_client.call_tool(tool_call.function.name, json.loads(tool_call.function.arguments))
                print(tool_result)


if __name__ == '__main__':
    asyncio.run(main())

这里有几点需要注意。

  1. 工具格式,MCP 客户端返回的工具格式不能直接使用,而是要转换成如下形式:
json 复制代码
{
    "type": "function",
    "function": {
        "name": "",
        "description": "",
        "input_schema": {}
    }
}
  1. 大语言模型的 tool_call 中会返回 arguments,表示调用工具时携带的参数,但是这个参数是字符串形式,而 call_tool 需要 json,因此需要转换成 json

这样,我们整个内容就完整了。

四、总结

FastMCP 是一个非常方便的 MCP 开发模块,我们上面开发的 MCP 服务器不止可以用客户端代码调用,也可以用 Cline 等客户端调用。

另外 FastMCP 还提供了 prompts、resources 等功能,感兴趣的读者可以查看官方文档。

相关推荐
1点东西2 天前
做了近两年的Agent开发,其实真正要学的就是这五件事
llm·agent·ai编程
程序猿编码2 天前
告别改源码适配模型:纯 C++ 可配置 LLM 推理引擎,全格式全结构兼容
c++·大模型·llm·推理引擎
小林ixn2 天前
从 LangChain 到 LangGraph:用「网状工作流」解锁多 Agent 协作的正确姿势
langchain·llm·agent
武子康2 天前
自己做一个 Mini Reviewer:让 AI 审到本次准备提交的代码
人工智能·llm·agent
CODER03042 天前
ubuntu22.04部署完整deepseek局域网web服务全过程(RTX5090安装黑屏+web端多人并发)
pytorch·webui·ubuntu22.04·ollama·deepseek·rtx5090·自然语言模型
武子康2 天前
GPU Pod 已经 Running,为什么扩容还没变成推理容量?
人工智能·llm·agent
为美好的生活献上中指2 天前
《Spring AI MCP 实战全景:AI 股票大师如何用模型上下文协议接入金融数据宇宙——从 JSON-RPC 握手到企业级部署与安全加固》
serverless·mcp·模型上下文协议·promptinjection·toolpoisoning·mcp生态
BlackStar_L2 天前
第二章 上下文工程
大模型·llm·agent
福大大架构师每日一题2 天前
agno v3.0.10发布:Azure OpenAI Responses、Elasticsearch、MCP 路由与一批关键稳定性修复全解析
ollama
吴佳浩3 天前
Tool 的安全性与执行沙箱:从 Docker 到 gVisor 的防御架构
agent·ai编程·mcp