基于MCP的AI Agent应用开发——Datawhale春训营第三期Task2
本文介绍了如何搭建一个基于Python的MCP服务器。首先,通过安装MCP Python SDK和fastmcp库,创建了一个本地运行的ModelContextProtocol (MCP)服务。该服务定义了一个名为“chat”的工具,供其他遵循MCP协议的大语言模型调用。文章详细分析了代码的各个部分,包括如何导入FastMCP类、创建服务实例、使用装饰器注册工具、定义函数参数和返回值类型,以及启动
搭建项目名称:Python课程项目导师
Task2下面尝试进行了自建MCP服务器

https://www.datawhale.cn/activity/227/39/171?rankingPage=1
首先,我按照Datawhale_Tutorial安装了MCP Python SDK
pip install mcp[cli]
下面我在本地首次尝试使用 fastmcp 库来创建一个本地运行的 Model Context Protocol (MCP) 服务。
具体来说,它定义了一个简单的服务,该服务提供一个名为 chat 的工具(tool),供其他遵循 MCP 协议的大语言模型(AI Agent)调用。
下面进行详细分析:
-
from mcp.server.fastmcp import FastMCP: 这一行导入了FastMCP类。
FastMCP 是 mcp 库提供的一个用于快速构建 MCP 服务器的类,它简化了将 Python 函数注册为可供 AI 调用的工具的过程。(1)
-
mcp = FastMCP("Demo"): 这一行创建了一个FastMCP服务的实例。 -
"Demo"是服务的名称。这个实例 (mcp) 将用于注册和管理服务的工具。(1) -
@mcp.tool(description="这是一个超级聪明的AI,能回答我的一切问题"): 这是一个装饰器(decorator),它用于将紧随其后的函数注册为 MCP 服务的一个工具。-
@mcp.tool告诉FastMCP实例 (mcp) 将chat函数作为其一个可用的外部工具暴露出去。 -
description="这是一个超级聪明的AI,能回答我的一切问题"为这个工具提供了描述信息。这个描述对于调用该工具的 AI 模型至关重要,它帮助 AI 理解这个工具的功能是什么,以便在需要时正确地选择和使用它。一个好的描述能够显著提高 AI 使用外部工具的效率和准确性。
-
-
def chat(message: str) -> str:: 这定义了一个名为chat的 Python 函数。这个函数就是通过@mcp.tool装饰器暴露出去的工具的实际实现。-
message: str: 定义了函数接收一个名为message的参数,并使用类型提示 (: str) 指明其类型应该是一个字符串。这同样是为了帮助 AI 模型理解调用这个工具时需要提供什么类型的输入。 -
-> str: 使用类型提示指明函数返回值的类型是一个字符串。这告诉 AI 模型调用这个工具后会得到什么类型的输出。 -
函数的 docstring (
"""输入一个问题,返回一个回答""") 也提供了关于函数功能和输入输出的额外说明,这同样有助于 AI 的理解。 -
函数体:
replies = [...]定义了一些预设的回复。return random.choice(replies)使得这个chat工具实际上只是从预设的回复中随机选择一个返回,而并没有真正实现一个智能的聊天功能。这只是一个简单的示例实现。——所以后续我们需要单独进行改进!
-
-
if name == "__main__":: 这是 Python 中常见的用法,确保只有当脚本作为主程序直接运行时,里面的代码块才会被执行,而不是在被导入为模块时执行。 -
mcp.run(transport='sse'): 这一行启动了FastMCP服务。-
mcp.run()是启动服务器的方法。(1) -
transport='sse'指定了服务使用的传输协议为 Server-Sent Events (SSE)。SSE 是一种允许服务器单向向客户端推送更新的技术,常用于流式数据。在这个上下文中,它可能被用于通过 HTTP 在一个特定的端点(例如host:port/sse)上暴露 MCP 服务。 -
被注释掉的
mcp.run(transport="streamable-http")提供了另一种传输协议选项,但注释说明它可能“过于先进”或兼容性有限。 -
被注释掉的
mcp.run()是不指定传输协议的默认启动方式,可能适用于特定的本地测试环境。
-
总的来说,我们这个服务定义了一个名为 "chat" 的外部工具,该工具接受一个字符串作为输入(代表一个消息),并返回一个字符串作为输出(一个随机的预设回复)。通过运行 mcp.run(),这个服务在本地的一个特定地址和端口上启动,并使用 SSE 协议监听来自 AI 模型(或其他 MCP 客户端)的调用请求。当一个 AI 模型决定使用这个 "chat" 工具时,它会通过 MCP 协议向这个本地服务发送一个包含消息的请求,服务会执行 chat 函数并返回结果给 AI。
这是一个 MCP 服务端最简单的实现示例,用于演示如何将 Python 函数注册为 AI 可调用的工具。
下面我们尝试我们自己在这个基础上进行创作:
-
添加新的工具(函数): 这是最主要的优化方式。为我的 Agent 需要的每个特定能力(如访问文档、搜索代码、管理数据等)定义一个独立的 Python 函数,并使用
@mcp.tool装饰器将其暴露为 MCP 工具。 -
改进现有工具的实现: 如果需要,可以替换
chat函数内部的简单随机回复逻辑,接入一个真正的聊天模型或更复杂的文本生成逻辑。
下面是我开始围绕我的项目:Python项目指导老师。搭建了下面的 MCP 工具:



代码优化和新增功能说明:
-
服务名称优化: 将
FastMCP("Demo")改为FastMCP("TeachingAssistant"),使服务名称更能体现其功能。 -
chat工具优化:-
修改了
description,使其更具体。 -
在函数内部添加了
print语句用于调试,可以看到 Agent 调用工具时传入的参数。 -
添加了一个简单的逻辑,如果消息包含“项目”关键词,返回一个更相关的回复,使其比纯随机更智能一点点。
-
-
新增
read_document工具:-
使用
@mcp.tool装饰器注册。 -
提供了详细的
description和docstring。 -
定义了一个
filepath: str参数和一个-> str返回值类型提示。 -
内部逻辑(模拟):尝试打开并读取指定路径的文件。包含简单的文件存在检查和安全限制(只读取当前目录及子目录)。请注意,实际生产环境中处理文件读取需要更严格的安全措施和权限控制。
-
-
新增
search_code_repo工具:-
使用
@mcp.tool装饰器注册。 -
提供了详细的
description和docstring。 -
定义了一个
query: str参数和一个-> str返回值类型提示。 -
内部逻辑(模拟):使用一个简单的字典作为模拟的代码库。根据输入的查询关键词,查找字典中是否有匹配的键,并返回预设的模拟结果。实际应用中,这里应该调用 GitHub API、搜索本地代码索引或查询向量数据库。
-
-
新增
get_student_project_status工具:-
使用
@mcp.tool装饰器注册。 -
提供了详细的
description和docstring。 -
定义了一个
student_name: str参数和一个-> str返回值类型提示。 -
内部逻辑(模拟):使用一个字典模拟学生及其项目信息。根据输入的学生姓名查找并返回预设的状态信息。实际应用中,这里应该查询一个真实的数据库(如SQLite, PostgreSQL等)。
-
-
运行部分:
if name == "__main__": mcp.run(transport='sse')这一部分无需修改。当您运行这个脚本时,FastMCP会自动发现所有用@mcp.tool装饰的函数,并将它们全部注册为服务提供的工具。然后服务会启动,等待 AI 客户端调用这些工具。
上面大部份需要进一步开展的地方,由于时间原因,我都选择进行了模拟数据——后面尝试链接多个端口进行下一步计划。
更多推荐


所有评论(0)