上篇文章实现了function_call,但是相同的功能可能被开发无数遍,不能共享使用。于是出现了MCP,以server-client形式让功能的实现可以共享。让大模型知道服务端实现了什么功能和什么参数,需要的时候以json-rpc传送数据包到服务端,获取相应的结果。

本篇讲述MCP Server的简单实现,后面会介绍MCP Client的简单实现简单容易理解的MCP client实现-CSDN博客

MCP的简单介绍

Model Context Protocol (MCP) 是一个专门为 LLM(大语言模型)应用设计的协议,它允许你构建服务器以安全、标准化的方式向 LLM 应用程序公开数据和功能。MCP Server 提供了 3 种核心原语,每种原语都有其特定的用途和特点:

1. Tool(工具)

  • Tool 允许服务器公开可执行的函数,这些函数可由客户端调用并由 LLM 使用来执行操作。Tool 不仅人让 LLM 能从外部获取信息,还能执行写入或操作,为 LLM 提供真正的行动力。

  • 模型控制:Tool 直接暴露给 LLM 可执行函数,让模型可以主动调用。

2. Resource(资源)

  • Resource 表示服务器希望提供给客户端的任何类型的只读数据。这可能包括:文件内容、数据库记录、图片、日志等等。

  • 应用控制:Resource 由客户端或应用管理,用于为 LLM 提供上下文内容。

3. Prompt(提示模板) :

  • Prompt 是由服务器定义的可重用的模板,用户可以选择这些模板来引导或标准化与 LLM 的交互过程。例如,Git MCP Server 可以提供一个“生成提交信息”的提示模板,用户可以用它来创建标准化的提交消息。

  • 用户控制:Prompt 通常由用户自行选择。

我们这里只实现tool。MCP支持的stdio和sse(http上的协议),stdio支持调用本地的function,sse支持远程和本地调用(rpc)。

MCP Server的sse简单实现

MCP SSE (Server-Sent Events)是一种基于 HTTP 的长连接协议,用于实现服务器向客户端推送实时数据。‌ MCP SSE主要用于 MCP服务器 与客户端之间的通信,特别是在远程MCP调用中,SSE协议扮演着关键角色。下面链接是网友抓包sse的整个过程,感兴趣可以看看

【MCP】了解远程MCP调用背后使用的SSE协议-CSDN博客

from mcp.server.fastmcp import FastMCP

MCP_SERVER_NAME = "search-mcp-server"
mcp = FastMCP(MCP_SERVER_NAME)


@mcp.tool(name='search_tool', description='搜索互联网上的内容')
def search_tool(query: str) -> str:
    """
    搜索互联网上的内容
    :param query:需要搜索的内容或者关键词
    :return: 返回搜索结果
    """
    print(f"======query:{query}")
    return f"搜索:{query}, 结果:太多了。。。"

@mcp.tool()
def get_weather(address: str) -> str:
    """
    获取一个地方的天气信息
    :param address: 地名.
    :return:返回查询的天气信息
    """
    print(f"===地名:{address}")
    return f"{address}天气:晴空万里。"

if __name__ == '__main__':
    mcp.run(transport="sse")

它的实现和function-call非常相似,用装饰器进行装饰,对函数进行描述。两种写法见示例,不再赘述。若此大模型可以获取服务器端支持的功能。

已经封装了fastapi和uvicorn,此脚本直接运行即可

MCP Server的stdio简单实现

from mcp.server.fastmcp import FastMCP

MCP_SERVER_NAME = "math-mcp-server"
mcp = FastMCP(MCP_SERVER_NAME)


@mcp.tool()
def mi(a: int, b: int) -> int:
    """计算两个数字的密集"""
    print(f"a:{a}, b:{b}")
    return a * b + 1

@mcp.tool()
def multiply(a: int, b: int) -> int:
    """计算两个数字相乘"""
    print(f"a:{a}, b:{b}")
    return a * b + 10

if __name__ == '__main__':
    mcp.run(transport="stdio")

实现和sse差不多一样,只是最后一句不同。大模型是通过cmd命令行直接运行该文件,所以不需要提前运行该文件

为了确保的确调用了这里的函数,我对函数描述和返回结果进行修改

至此,简单易懂的MCP server已经实现了。MCP client可以查看下篇文字。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐