mcp服务开发

1

开发和调试

参考资料:

  1. https://zhuanlan.zhihu.com/p/1892944764120310978

  2. https://www.cnblogs.com/yupi/p/18814281

  3. https://github.com/liaokongVFX/MCP-Chinese-Getting-Started-Guide

  4. https://blog.csdn.net/kunhe0512/article/details/148032112

  5. https://zhuanlan.zhihu.com/p/1892944764120310978

基于python fastmcp库进行开发,文档可以看这里。 根据文档可以很快开发一个mcp服务。

调试有两种方法

  1. 启动一个调试服务,在inspect页面上进行调试

mcp dev .\\web_search.py

  • 注意command可能需要填写完整的路径

  • 连接后点击tool-》list tools可以看到我们的mcp提供的所有服务

  1. 写一个mcp的客户端来调用自己的写的mcp服务

import asyncio
from fastmcp import Client

from web_search import mcp

client = Client("web_search.py")

async def call_tool(name: str):
    async with client:
        result = await client.call_tool("list_desktop_files", {"name": name})
        print(result)

asyncio.run(call_tool("Ford"))

添加到cherry studio                                                                                                                                              

通过json添加到cherry的服务中

json内容:

{
  "mcpServers": {
    "rHlIpITumEJwpsYJAm8fP": {
      "name": "notionApi",
      "type": "stdio",
      "description": "",
      "isActive": true,
      "registryUrl": "",
      "command": "C:\\\\Program Files\\\\nodejs\\\\npx.cmd",
      "args": [
        "-y",
        "@notionhq/notion-mcp-server"
      ],
      "env": {
        "OPENAPI_MCP_HEADERS": "{\\"Authorization\\": \\"Bearer 这里的密钥需要到notion创建\\", \\"Notion-Version\\": \\"2022-06-28\\" }"
      }
    },
    "list_desktop_files": {
      "name": "list_desktop_files",
      "type": "stdio",
      "isActive": true,
      "registryUrl": "",
      "command": "D:\\\\software\\\\uv-x86_64-pc-windows-msvc\\\\uv.exe",
      "args": [
        "--directory",
        "D:\\\\app\\\\self_mcp_test",
        "run",
        "web_search.py"
      ]
    }
  }
}
  • 这里是mcp配置的标准格式,包含了我们自己开发的mcp服务,以及notion官方提供的一个服务;

  • 如果配置没问题,就可以直接启动,否则会有相关的报错

Q&A

问题1:

如何启动?

mcp host里面包含mcp client 会自己去启动。

问题2:

端口?? 要用端口,不用自己指定。 不要把mcp服务视作一个web服务

问题3:启动失败

解决: 改一下命令,改到uv命令的绝对路径

实践:Notion MCP +cherry studio+ Deepseek

参考:https://www.youtube.com/watch?v=g3yWIOr7zz4

我的一些错误理解

mcp是网络服务吗?

否。

mcp是一个协议标准,定义了大模型如何与外部信息源进行交互的规范。

可以是网络服务,也可以是本地服务,也可以是进程间通信等等。

大模型怎么用mcp server的?

  • 配置mcp server到mcphost(大模型)上

  • mcp host里面有mcp client,可以与mcp server通信

工作描述(from gemini)

  • 步骤 1:用户提问 / 任务触发 用户向 MCP Host(即 AI 应用程序)输入一个请求,例如:“帮我在 Notion 里找找所有关于 Model Context Protocol 的文档。”

  • 步骤 2:LLM 思考并决定调用工具 MCP Host 收到用户请求后,会将请求连同已配置的 MCP Server 提供的所有工具的描述一起发送给 LLM。 LLM 接收到这些信息后,会进行推理:

    • “用户需要从 Notion 获取信息。”

    • “我有一个名为 notion.search_pages 的工具,可以搜索 Notion 页面。”

    • “要使用这个工具,我需要一个 query 参数,值为‘Model Context Protocol’。” LLM 不会直接执行工具,它只会生成一个工具调用请求(Function Call Request),其中包含要调用的工具名称和相应的参数。

  • 步骤 3:MCP Host 执行工具调用 MCP Host 收到 LLM 生成的工具调用请求后,它不会将这个请求直接返回给用户。相反,它会:

    • 识别出需要调用的工具对应的 MCP Server。

    • 将这个工具调用请求(notion.search_pages,参数 query="Model Context Protocol")发送给相应的 MCP Server。

  • 步骤 4:MCP Server 执行外部操作 MCP Server 接收到来自 MCP Host 的工具调用请求:

    • 它解析请求,确定要执行的操作。

    • 如果需要,它会使用预配置的凭据(如 Notion API Token)去调用实际的外部 API(例如 Notion 的 Web API)。

    • 它等待外部 API 的响应。

  • 步骤 5:MCP Server 返回结果给 MCP Host MCP Server 收到外部 API 的响应后,会对其进行处理(可能进行格式转换、过滤等),然后将结果封装成 MCP 协议规定的格式,返回给 MCP Host。

  • 步骤 6:MCP Host 将结果提供给 LLM (作为上下文) MCP Host 收到 MCP Server 返回的结果后,它会将这个结果作为新的上下文信息,再次发送给 LLM。 这次,LLM 不再是接收原始的用户请求,而是接收:

    • 原始的用户请求。

    • 以及工具调用产生的结果(例如,Notion 中关于“Model Context Protocol”的文档列表和摘要)。

  • 步骤 7:LLM 生成最终响应 LLM 结合这些额外的上下文信息,生成一个更准确、更相关、更全面的响应,并将其返回给用户。例如:“我在 Notion 中找到了以下关于 Model Context Protocol 的文档: [文档标题 1], [文档标题 2]...它们主要涵盖了 MCP 的定义、用途和集成方式。”

mcp有啥类型?

  • resource: 只返回数据,不执行操作

  • tools 工具类,可以做一些计算,或者进行一些请求

  • prompts 提示词骨架,包含一些占位符,可以由用户定义,

prompt mcp服务工作流程

发现提供的模板

Notion mcp是怎么做的

提供了一个mcp server

https://github.com/makenotion/notion-mcp-server

将webapi统一转换为tools

// Convert OpenAPI spec to MCP tools
    const converter = new OpenAPIToMCPConverter(openApiSpec)
    const { tools, openApiLookup } = converter.convertToMCPTools()
    this.tools = tools
    this.openApiLookup = openApiLookup