MCP代码的简单构建实验
基于mcp框架内容,的简单实验内容与代码层分析。
参考地址:面向服务器开发者 - MCP 中文文档
一、MCP原理
1.1 什么是MCP
Model Context Protocol (MCP) 是一个开放协议,旨在实现 LLM 应用与外部数据源和工具之间的无缝集成。无论您是构建 AI 驱动的 IDE、增强聊天界面,还是创建自定义 AI 工作流,MCP 都提供了一种标准化的方式来连接 LLM 与外部世界。
简单来说,MCP 是一种客户端-服务器架构的协议,允许 LLM 应用程序(如 Claude、各种 IDE 等)通过标准化的接口访问外部数据和功能。这解决了 LLM 在实际应用中常见的一些痛点:
- LLM 无法直接访问实时数据(如天气、股票行情等)
- LLM 无法执行外部操作(如发送邮件、控制设备等)
- LLM 无法访问用户的本地文件或其他私有数据
通过 MCP,这些限制得到了优雅的解决,同时保持了安全性和可扩展性。
1.2 MCP核心概念
MCP 服务器可以提供三种主要类型的功能:
- **资源(Resources):**客户端可以读取的文件类数据(如 API 响应或文件内容)
- **工具(Tools):**LLM 可以调用的函数(需要用户批准)
- **提示(Prompts):**帮助用户完成特定任务的预写模板

个人理解:
1、MCP是一种Agent调用远程工具的方法,主要打破了在Agent与Tool不再设置到同一位置的局限性
2、MCP的server 主要部署着大量注册的Tool,这些Tool可以被注册到MCP的对象中。
3、MCP的client是一个调用者,可以在MCP存储的session中取出关于tools中的所有信息。将该信息封装为一个function_calling 的结构数据,通过Agent的tool信息传入,让Agent自我判断该调用何种工具,并得到最终处理的方案(该调用哪个tool)
4、MCP的client 中使用call_tool 调用远程工具执行内容
二、实现代码
2.1 服务端设计
# 最小化服务端
import asyncio
"""
mcp 安装
pip install "mcp[cli]"
"""
from mcp.server import FastMCP
from mcp.types import TextContent
mcp = FastMCP("TestServer")
@mcp.tool(description="ping")
async def ping() -> str: return "pong"
@mcp.tool(description="文本反转工具")
async def reverse_text(text: str) -> TextContent:
return TextContent(type="text", text=text[::-1])
@mcp.tool(description="平方计算器")
async def square(num: int) -> int:
return num ** 2
asyncio.run(mcp.run('stdio'))
mcp.run("stdio")
2.2 客户端设计
import asyncio
from mcp.client.stdio import stdio_client, StdioServerParameters
from mcp import ClientSession
async def run_client():
server_params = StdioServerParameters(
command="python", # Executable
args=["server.py"], # Optional command line arguments
env=None, # Optional environment variables
)
async with stdio_client(server_params) as (reader, writer):
async with ClientSession(reader, writer) as session:
# 必须等待初始化完成
await session.initialize() # function_calling
# TODO 此处可以使用远程方式调用大语言模型
# 将tools信息绑定到 prompt中,然后让Agent分析该调用哪个tool
# 最终用 call_tool 进行调用执行。
response = await session.list_tools()
tools = response.tools
print("\n已连接到服务器,工具包括:", [tool.name for tool in tools])
# 调用文本反转工具
reversed_text = await session.call_tool(
"reverse_text",
{"text": "Hello MCP"}
)
print(f"反转结果: {reversed_text.content[0].text}")
# 调用数学计算工具
squared = await session.call_tool("square", {"num": 5})
print(f"平方结果: {squared.content[0].text}")
if __name__ == "__main__":
asyncio.run(run_client())
689

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



