搭建项目名称: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)调用。

下面进行详细分析:

  1. from mcp.server.fastmcp import FastMCP: 这一行导入了 FastMCP 类。

FastMCPmcp 库提供的一个用于快速构建 MCP 服务器的类,它简化了将 Python 函数注册为可供 AI 调用的工具的过程。(1)

  1. mcp = FastMCP("Demo"): 这一行创建了一个 FastMCP 服务的实例。

  2. "Demo" 是服务的名称。这个实例 (mcp) 将用于注册和管理服务的工具。(1)

  3. @mcp.tool(description="这是一个超级聪明的AI,能回答我的一切问题"): 这是一个装饰器(decorator),它用于将紧随其后的函数注册为 MCP 服务的一个工具。

    1. @mcp.tool 告诉 FastMCP 实例 (mcp) 将 chat 函数作为其一个可用的外部工具暴露出去。

    2. description="这是一个超级聪明的AI,能回答我的一切问题" 为这个工具提供了描述信息。这个描述对于调用该工具的 AI 模型至关重要,它帮助 AI 理解这个工具的功能是什么,以便在需要时正确地选择和使用它。一个好的描述能够显著提高 AI 使用外部工具的效率和准确性。

  4. def chat(message: str) -> str:: 这定义了一个名为 chat 的 Python 函数。这个函数就是通过 @mcp.tool 装饰器暴露出去的工具的实际实现。

    1. message: str: 定义了函数接收一个名为 message 的参数,并使用类型提示 (: str) 指明其类型应该是一个字符串。这同样是为了帮助 AI 模型理解调用这个工具时需要提供什么类型的输入。

    2. -> str: 使用类型提示指明函数返回值的类型是一个字符串。这告诉 AI 模型调用这个工具后会得到什么类型的输出。

    3. 函数的 docstring ("""输入一个问题,返回一个回答""") 也提供了关于函数功能和输入输出的额外说明,这同样有助于 AI 的理解。

    4. 函数体: replies = [...] 定义了一些预设的回复。return random.choice(replies) 使得这个 chat 工具实际上只是从预设的回复中随机选择一个返回,而并没有真正实现一个智能的聊天功能。这只是一个简单的示例实现。——所以后续我们需要单独进行改进!

  5. if name == "__main__":: 这是 Python 中常见的用法,确保只有当脚本作为主程序直接运行时,里面的代码块才会被执行,而不是在被导入为模块时执行。

  6. mcp.run(transport='sse'): 这一行启动了 FastMCP 服务。

    1. mcp.run() 是启动服务器的方法。(1)

    2. transport='sse' 指定了服务使用的传输协议为 Server-Sent Events (SSE)。SSE 是一种允许服务器单向向客户端推送更新的技术,常用于流式数据。在这个上下文中,它可能被用于通过 HTTP 在一个特定的端点(例如 host:port/sse)上暴露 MCP 服务。

    3. 被注释掉的 mcp.run(transport="streamable-http") 提供了另一种传输协议选项,但注释说明它可能“过于先进”或兼容性有限。

    4. 被注释掉的 mcp.run() 是不指定传输协议的默认启动方式,可能适用于特定的本地测试环境。

总的来说,我们这个服务定义了一个名为 "chat" 的外部工具,该工具接受一个字符串作为输入(代表一个消息),并返回一个字符串作为输出(一个随机的预设回复)。通过运行 mcp.run(),这个服务在本地的一个特定地址和端口上启动,并使用 SSE 协议监听来自 AI 模型(或其他 MCP 客户端)的调用请求。当一个 AI 模型决定使用这个 "chat" 工具时,它会通过 MCP 协议向这个本地服务发送一个包含消息的请求,服务会执行 chat 函数并返回结果给 AI。

这是一个 MCP 服务端最简单的实现示例,用于演示如何将 Python 函数注册为 AI 可调用的工具。

下面我们尝试我们自己在这个基础上进行创作:

  1. 添加新的工具(函数): 这是最主要的优化方式。为我的 Agent 需要的每个特定能力(如访问文档、搜索代码、管理数据等)定义一个独立的 Python 函数,并使用 @mcp.tool 装饰器将其暴露为 MCP 工具。

  2. 改进现有工具的实现: 如果需要,可以替换 chat 函数内部的简单随机回复逻辑,接入一个真正的聊天模型或更复杂的文本生成逻辑。

下面是我开始围绕我的项目:Python项目指导老师。搭建了下面的 MCP 工具:

代码优化和新增功能说明:

  1. 服务名称优化:FastMCP("Demo") 改为 FastMCP("TeachingAssistant"),使服务名称更能体现其功能。

  2. chat 工具优化:

    1. 修改了 description,使其更具体。

    2. 在函数内部添加了 print 语句用于调试,可以看到 Agent 调用工具时传入的参数。

    3. 添加了一个简单的逻辑,如果消息包含“项目”关键词,返回一个更相关的回复,使其比纯随机更智能一点点。

  3. 新增 read_document 工具:

    1. 使用 @mcp.tool 装饰器注册。

    2. 提供了详细的 descriptiondocstring

    3. 定义了一个 filepath: str 参数和一个 -> str 返回值类型提示。

    4. 内部逻辑(模拟):尝试打开并读取指定路径的文件。包含简单的文件存在检查和安全限制(只读取当前目录及子目录)。请注意,实际生产环境中处理文件读取需要更严格的安全措施和权限控制。

  4. 新增 search_code_repo 工具:

    1. 使用 @mcp.tool 装饰器注册。

    2. 提供了详细的 descriptiondocstring

    3. 定义了一个 query: str 参数和一个 -> str 返回值类型提示。

    4. 内部逻辑(模拟):使用一个简单的字典作为模拟的代码库。根据输入的查询关键词,查找字典中是否有匹配的键,并返回预设的模拟结果。实际应用中,这里应该调用 GitHub API、搜索本地代码索引或查询向量数据库。

  5. 新增 get_student_project_status 工具:

    1. 使用 @mcp.tool 装饰器注册。

    2. 提供了详细的 descriptiondocstring

    3. 定义了一个 student_name: str 参数和一个 -> str 返回值类型提示。

    4. 内部逻辑(模拟):使用一个字典模拟学生及其项目信息。根据输入的学生姓名查找并返回预设的状态信息。实际应用中,这里应该查询一个真实的数据库(如SQLite, PostgreSQL等)。

  6. 运行部分: if name == "__main__": mcp.run(transport='sse') 这一部分无需修改。当您运行这个脚本时,FastMCP 会自动发现所有用 @mcp.tool 装饰的函数,并将它们全部注册为服务提供的工具。然后服务会启动,等待 AI 客户端调用这些工具。

上面大部份需要进一步开展的地方,由于时间原因,我都选择进行了模拟数据——后面尝试链接多个端口进行下一步计划。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐