MCP(Model Control Protocol)是一个强大的框架,让开发者能够轻松创建、管理和调用AI工具、资源和提示模板。本文将介绍MCP的基础概念,并通过一个简单的价格计算示例,展示如何使用MCP构建自己的AI增强应用。我们将探讨如何定义工具函数、创建资源和设计提示模板,以及如何通过客户端与这些组件进行交互。无论你是AI开发新手还是有经验的工程师,这篇指南都将帮助你快速掌握MCP的核心功能。
MCP简介
MCP是一个专为AI应用设计的协议框架,它提供了一种标准化的方式来定义和调用工具、管理资源以及创建提示模板。通过MCP,开发者可以:
- 创建结构化的工具函数供AI模型调用
- 管理和访问各种资源(如文档、配置等)
- 设计和渲染动态提示模板
- 在客户端和服务器之间建立标准化的通信
核心组件
MCP框架主要包含三个核心组件:
- 工具(Tools):可被AI调用的函数,具有明确的输入参数和返回值
- 资源(Resources):可被访问的静态或动态数据
- 提示模板(Prompts):用于生成结构化提示的模板函数
实战示例:价格计算器
我们的示例应用是一个简单的价格计算系统,它包含:
- 一个计算折扣价格的工具
- 一个包含公司定价策略的资源
- 一个生成价格计算提示的模板
依赖可通过
pip install mcp
命令来安装
1. 创建MCP实例
python
from mcp.server.fastmcp import FastMCP
# 创建FastMCP实例
mcp = FastMCP(name="MCP基础示例")
2. 定义工具函数
python
@mcp.tool()
def calculate_price(base_price: float, discount_percent: float = 0) -> Dict:
"""计算折扣后的价格"""
discount = base_price * (discount_percent / 100)
final_price = base_price - discount
return {
"original_price": base_price,
"discount_amount": discount,
"final_price": final_price
}
3. 添加资源
python
@mcp.resource(uri="data://pricing-policy", name="定价策略")
def pricing_policy_resource():
"""返回公司的定价策略信息"""
return """
# 公司定价策略
## 基本规则
- 标准商品折扣不超过30%
- VIP客户可享受额外5%折扣
- 季节性促销商品最高折扣50%
## 特殊情况
- 清仓商品可享受高达70%的折扣
- 新品上市30天内不参与任何折扣活动
"""
4. 创建提示模板
python
@mcp.prompt(name="价格计算器")
def price_calculator_prompt(item_name: str, base_price: float, customer_type: str = "普通客户") -> str:
"""生成价格计算的提示模板"""
vip_text = ",并考虑VIP额外5%折扣" if customer_type == "VIP客户" else ""
return f"""请为以下商品计算最终价格{vip_text}:
商品: {item_name}
基础价格: {base_price}元
客户类型: {customer_type}
请考虑公司定价策略,提供一个合理的折扣建议和最终价格。
"""
客户端调用
MCP框架同时提供了客户端接口,使我们能够轻松地与服务器端定义的工具、资源和提示模板进行交互:
python
async def test_basic_examples():
# 创建服务器参数
server_params = StdioServerParameters(
command="python",
args=["mcp/01_hello_world_tool.py", "--server"],
env=None
)
async with stdio_client(server_params) as stream:
async with ClientSession(*stream) as session:
# 初始化连接
await session.initialize()
# 调用工具
result = await session.call_tool("calculate_price", {
"base_price": 100,
"discount_percent": 20
})
# 访问资源
content = await session.read_resource("data://pricing-policy")
# 获取渲染后的提示模板
prompt_text = await session.get_prompt("价格计算器", {
"item_name": "高级笔记本电脑",
"base_price": "5999",
"customer_type": "VIP客户"
})
运行方式
MCP应用可以以两种模式运行:
- 服务器模式:提供工具、资源和提示模板服务
- 客户端模式:连接到服务器并调用其功能
python
if __name__ == "__main__":
import sys
if len(sys.argv) > 1 and sys.argv[1] == "--server":
# 以服务器模式运行
mcp.run()
else:
# 运行测试客户端
asyncio.run(test_basic_examples())
- 运行
python .\mcp\01_hello_world_tool.py
可看到输出的结果
bash
python .\mcp\01_hello_world_tool.py
=== 测试工具 ===
价格计算结果: meta=None content=[TextContent(type='text', text='{\n "original_price": 100.0,\n "discount_amount": 20.0,\n "final_price": 80.0\n}', annotations=None)] isError=False
=== 测试资源 ===
可用资源: [('meta', None), ('nextCursor', None), ('resources', [Resource(uri=AnyUrl('data://pricing-policy'), name='定价策略', description='返回公司的定价策略信息', mimeType='text/plain', size=None, annotations=None)])]
资源内容:
meta=None contents=[TextResourceContents(uri=AnyUrl('data://pricing-policy'), mimeType='text/plain', text='\n# 公司定价策略\n\n## 基本规则\n- 标准商品折扣不超过30%\n- VIP客户可享受额外5%折扣\n- 季节
性促销商品最高折扣50%\n\n## 特殊情况\n- 清仓商品可享受高达70%的折扣\n- 新品上市30天内不参与任何折扣
活动\n ')]
=== 测试提示模板 ===
可用提示模板: [('meta', None), ('nextCursor', None), ('prompts', [Prompt(name='价格计算器', description='生成价格计算的提示模板\n \n Args:\n item_name: 商品名称\n base_price: 基
础价格\n customer_type: 客户类型 (普通客户/VIP客户)\n \n Returns:\n 格式化的提
示模板\n ', arguments=[PromptArgument(name='item_name', description=None, required=True), PromptArgument(name='base_price', description=None, required=True), PromptArgument(name='customer_type',
description=None, required=False)])])]
渲染后的提示模板:
meta=None description=None messages=[PromptMessage(role='user', content=TextContent(type='text', text='请为以下商品计算最终价格,并考虑VIP额外5%折扣:\n \n商品: 高级笔记本电脑\n基础价格: 5999.0元
\n客户类型: VIP客户\n\n请考虑公司定价策略,提供一个合理的折扣建议和最终价格。\n', annotations=None))]
如果你看到如上的信息,恭喜你以及成功的使用modelcontextprotocol.io/ 的fastmcp运行一个helloworld示例!