本文章记录下个人学习MCP(# Model Context Protocol)协议的一些心得。
一、MCP协议的描述参见官方文档:Specification (Latest) – Model Context Protocol Specification 本文档使用的是python作为开发语言, python sdk地址: github.com/modelcontex…
二、安装python sdk 首先需要将python升级到3.10.x以上版本,然后使用pip3 install mcp
我使用的是linux开发环境,直接从python官网下载了Python-3.13.2.tgz(网址: www.python.org/downloads/r…) 安装到本地环境。linux支持多个python版本,所以我的环境就变成这样
三、客户端代码
import asyncio
from mcp.client.stdio import stdio_client
from mcp import ClientSession, StdioServerParameters
# 为 stdio 连接创建服务器参数
server_params = StdioServerParameters(
# 服务器执行的命令,这里我们使用 uv 来运行 web_search.py
command='python3.13',
# 运行的参数
args=['web_search.py'],
# 环境变量,默认为 None,表示使用当前环境变量
# env=None
)
async def main():
# 创建 stdio 客户端
async with stdio_client(server_params) as (stdio, write):
# 创建 ClientSession 对象
async with ClientSession(stdio, write) as session:
# 初始化 ClientSession
await session.initialize()
# 列出可用的工具
response = await session.list_tools()
print("tools=============: ", response)
# 调用工具
# response = await session.call_tool('web_search', {'query': '今天南京天气'})
response = await session.call_tool('get_tool_list', {})
print(response)
if __name__ == '__main__':
asyncio.run(main())
四、服务端代码
import httpx
from mcp.server import FastMCP
from mcp.server.fastmcp import FastMCP
from dataclasses import dataclass
# # 初始化 FastMCP 服务器
app = FastMCP('web-search')
@dataclass
class FieldDescription:
name: str
data_type: str
description: str
@dataclass
class Field:
name: str
value: any
@dataclass
class ToolDescription:
name: str
description: str
params: [FieldDescription]
result: [FieldDescription]
@app.tool()
async def get_tool_list() -> [ToolDescription]:
"""
Methond: get speed
Args:
None
Returns:
world
"""
return [{
"name": "get_vehicle_speed",
"description": "vehicle speed",
"params": None,
"result": [
{
"name": "speed",
"data_type": "float",
"description": "current speed"
}
]
}]
@app.tool()
async def web_search(query: str) -> str:
"""
搜索互联网内容
Args:
query: 要搜索内容
Returns:
搜索结果的总结
"""
async with httpx.AsyncClient() as client:
print("call server web_search")
response = await client.post(
'https://open.bigmodel.cn/api/paas/v4/tools',
headers={'Authorization': '6c79b711c21c4c48adc00b4899b9a8e6.xeqkK7lzETMC0btK'},
json={
'tool': 'web-search-pro',
'messages': [
{'role': 'user', 'content': query}
],
'stream': False
}
)
res_data = []
for choice in response.json()['choices']:
for message in choice['message']['tool_calls']:
search_results = message.get('search_result')
if not search_results:
continue
for result in search_results:
res_data.append(result['content'])
return '\n\n\n'.join(res_data)
if __name__ == "__main__":
app.run(transport='stdio')
五、运行结果