简单容易理解的MCP server实现
上篇文章实现了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可以查看下篇文字。
更多推荐
所有评论(0)