之前的文章讲了MCP是什么,以及怎么用。光会用不行,还得研究研究怎么去开发MCP服务。
开发准备
关于MCP Server的开发,这里找到了官方文档
https://modelcontextprotocol.io/introduction
其架构如上图所示,比较直观,不再赘述。
我们这次写的是MCP服务,客户端就用之前文章中的Cherry Studio代替,就不单独开发客户端了。
从官方文档中我们可以看到,MCP是支持多个语言的
这里我选择python
UV工具
windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
linux
curl -LsSf https://astral.sh/uv/install.sh | sh
我这里是用的windows,然后将该路径配置到环境变量中
重启终端,就可以使用uv命令了
如果根据之前的文章,我们其实已经通过Cherry Studio上安装uv工具了,并且后续我们也是通过Cherry Studio进行本地 MCP Server 调用的,所以这一步不需要也行。
MCP Server
我大概看了一下文档中给的示例代码,是获取美国天气的,大概看了一下架构,总结出3个要点
-
需要通过mcp库进行服务创建和启动
pip install mcp
-
MCP 全程需要通过 asyncio 进行异步调用 -
尽可能的声明参数类型,返回类型,以及加上方法的注释,来让大模型明白怎么使用一个MCP服务的代码架构基本如下
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("server name")
# 工具声明 需用异步
async def tool_name(param: int) -> []:
"""
注释描述
参数描述
返回描述
"""
data = []
return data
# 运行服务
if __name__ == "__main__":
mcp.run()
示例开发
这里我不用官方给的示例,我写了一个用来获取掘金热榜文章的MCP服务,直接贴上代码,大家可以参考学习,写的比较简单
import httpx
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("hot articles")
JUEJIN_BASE_URL = "https://api.juejin.cn/content_api/v1/content/article_rank?category_id=1&type=hot"
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36"
ARTICLE_BASE_URL = "https://juejin.cn/post/"
async def get_juejin_articles_rank():
headers = {
"User-Agent": USER_AGENT,
}
async with httpx.AsyncClient() as client:
try:
response = await client.get(JUEJIN_BASE_URL, headers=headers)
response.raise_for_status()
return response.json()["data"]
except Exception as e:
return None
def data_format(data):
article_list = []
for content in data:
article = {
"title": content["content"]["title"],
"url": ARTICLE_BASE_URL + content["content"]["content_id"],
"author": content["author"]["name"]
}
article_list.append(article)
return article_list
async def mcp_tool_get_juejin_articles_rank(count: int):
"""
获取掘金文章
:param count: 控制获取的文章数量
:return: 文章列表
"""
data = await get_juejin_articles_rank()
if not data:
return []
data = data_format(data)
if count > len(data):
count = len(data)
return data[:count]
if __name__ == "__main__":
mcp.run()
MCP使用
接下来,我们继续在Cherry Studio中使用
先在MCP服务器里配置,因为这次是咱们自己本地开发的,所以通过绝对路径的方式进行服务执行就行,让Cherry Studio帮我们执行服务
uv run 绝对路径Pathmcp_server.py
然后我们回到对话框中
选择启动该MCP服务
然后进行对话
可以看到成功执行!
原文始发于微信公众号(飞羽技术工坊):【实战】手把手学习写一个MCP服务,获取热榜文章
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论