mcp服务开发
开发和调试
参考资料:
基于python fastmcp库进行开发,文档可以看这里。 根据文档可以很快开发一个mcp服务。
调试有两种方法
启动一个调试服务,在inspect页面上进行调试
mcp dev .\\web_search.py
注意command可能需要填写完整的路径
连接后点击tool-》list tools可以看到我们的mcp提供的所有服务
写一个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