本文来源公众号“AI算法与图像处理”,仅用于学术分享,侵权删,干货满满。
原文链接:从零搭建智能体!构建第一个MCP
大家好,这是从零搭建智能体第二篇,本文将介绍MCP的一些核心概念,并根据官方例子,搭建一个用关键词查询arxiv上最新论文的MCP
MCP简介:
Anthropic提出的Model Context Protocol(MCP) 是一种开放协议,它标准化了应用程序如何为大型语言模型 (LLM) 提供上下文。它如同一个专门为AI 应用设计的 USB-C 端口。让大模型非常轻易地调用外部工具。

MCP架构组成:

MCP 架构的主要参与者是:
- MCP Host
协调和管理一个或多个 MCP 客户端的 AI 应用程序
- MCP Client
维护与 MCP 服务器的连接并从 MCP 服务器获取上下文供 MCP 主机使用的组件
- MCP Server
向 MCP 客户端提供上下文的程序
MCP 支持两种传输机制:
- Stdio transport
使用标准输入/输出流在同一台机器上的本地进程之间进行直接进程通信,提供最佳性能,没有网络开销。
-
HTTP with Server-Sent Events(SSE) 或Streamable HTTP transport
将 HTTP POST 用于客户端到服务器消息,并使用可选的服务器发送事件来实现流式处理功能。
MCP 定义了server可以公开的三个核心基本操作:
- Tools
AI 应用程序可以调用action的可执行函数(例如,文件作、API 调用、数据库查询)
- Resources
向 AI 应用程序提供上下文信息的数据源(例如,文件内容、数据库记录、API 响应)
- Prompts
可重用的模板,有助于构建与语言模型的交互(例如,系统提示、少量示例)
实现一个MCP
基于了解上面的一些概念,以及参考官方例子:https://github.com/modelcontextprotocol/python-sdk
我们用两个任务理解一下,一个是官方例子,采用stdio本地调试,另一个构建自己的MCP,采用sse的通信方式,用代码实现本地调用
任务一:创建一个简单的 MCP server,功能是暴露出计算器工具和数据
# fastmcp_demo.py
"""
FastMCP quickstart example.
cd to the `examples/snippets/clients` directory and run:
uv run server fastmcp_quickstart stdio
"""
from mcp.server.fastmcp import FastMCP
# Create an MCP server
mcp = FastMCP("Demo")
# Add an addition tool
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
# Add a dynamic greeting resource
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
returnf"Hello, {name}!"
# Add a prompt
@mcp.prompt()
def greet_user(name: str, style: str = "friendly") -> str:
"""Generate a greeting prompt"""
styles = {
"friendly": "Please write a warm, friendly greeting",
"formal": "Please write a formal, professional greeting",
"casual": "Please write a casual, relaxed greeting",
}
returnf"{styles.get(style, styles['friendly'])} for someone named {name}."
if __name__ == "__main__":
mcp.run(transport='stdio')
这里在本地使用 inspector 来测试,在终端中运行下面的代码,会自动打开一个浏览器:
npx -y @modelcontextprotocol/inspector python fastmcp_demo.py
1、先链接server,点击 connect

2、查看Resource功能

返回结果
{"contents": [{"uri": "greeting://Tony","mimeType": "text/plain","text": "Hello, Tony!"}]}
3、查看Prompts功能

返回结果

4、查看Tools功能

返回结果

任务二:定义一个帮忙查询arxiv最新论文的MCP
pip install arixv
功能说明:
通过输入查询的关键词,获取arxiv上最新的论文,例如这里搜索关键词为“qwen”
代码:
# sse_arxiv_search.py
import httpx
import arxiv
import json
from mcp.server import FastMCP
app = FastMCP('arxiv-search', port=9000)
@app.tool()
async def arxiv_search(query: str) -> str:
"""
{
"name": "arxiv_search",
"description": "根据需要搜索的关键词,返回arxiv上相关的最新论文",
"inputSchema":
{
"type": "object",
"properties":
{
"query":
{
"description": "论文搜索关键词",
"type": "string"
}
},
"required":
[
"query"
]
},
}
"""
client = arxiv.Client()
search = arxiv.Search(
query=query,
max_results=2,
sort_by=arxiv.SortCriterion.SubmittedDate
)
search_results = []
for result in client.results(search): # 用新的调用方式
single_result = {
'url': result.entry_id,
'title': result.title,
# 'summary': result.summary
}
search_results.append(single_result)
return json.dumps(search_results)
if __name__ == "__main__":
app.run(transport='sse')
采用sse启动,按照下面调整
app.run(transport='stdio')
调整为
app.run(transport='sse')
启动server
python sse_arxiv_search.py
client代码:
import asyncio
from mcp.client.sse import sse_client
from mcp import ClientSession
import json
asyncdef main():
asyncwith sse_client('http://localhost:9000/sse') as streams:
asyncwith ClientSession(*streams) as session:
await session.initialize()
tools = await session.list_tools()
print(tools)
res = await session.call_tool('arxiv_search', {'query': 'qwen'})
print(res)
if __name__ == '__main__':
asyncio.run(main())
使用client调用,返回结果如下

参考资料
https://modelcontextprotocol.io/docs/getting-started/intro
https://zhuanlan.zhihu.com/p/1891971357694219896
https://github.com/liaokongVFX/MCP-Chinese-Getting-Started-Guide
https://levelup.gitconnected.com/mcp-server-and-client-with-sse-the-new-streamable-http-d860850d9d9d
THE END !
文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

2万+

被折叠的 条评论
为什么被折叠?



