MCP入门指南:打造智能AI工具的第一步

MCP(Model Control Protocol)是一个强大的框架,让开发者能够轻松创建、管理和调用AI工具、资源和提示模板。本文将介绍MCP的基础概念,并通过一个简单的价格计算示例,展示如何使用MCP构建自己的AI增强应用。我们将探讨如何定义工具函数、创建资源和设计提示模板,以及如何通过客户端与这些组件进行交互。无论你是AI开发新手还是有经验的工程师,这篇指南都将帮助你快速掌握MCP的核心功能。

MCP简介

MCP是一个专为AI应用设计的协议框架,它提供了一种标准化的方式来定义和调用工具、管理资源以及创建提示模板。通过MCP,开发者可以:

  • 创建结构化的工具函数供AI模型调用
  • 管理和访问各种资源(如文档、配置等)
  • 设计和渲染动态提示模板
  • 在客户端和服务器之间建立标准化的通信

核心组件

MCP框架主要包含三个核心组件:

  1. 工具(Tools):可被AI调用的函数,具有明确的输入参数和返回值
  2. 资源(Resources):可被访问的静态或动态数据
  3. 提示模板(Prompts):用于生成结构化提示的模板函数

实战示例:价格计算器

我们的示例应用是一个简单的价格计算系统,它包含:

  1. 一个计算折扣价格的工具
  2. 一个包含公司定价策略的资源
  3. 一个生成价格计算提示的模板

依赖可通过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应用可以以两种模式运行:

  1. 服务器模式:提供工具、资源和提示模板服务
  2. 客户端模式:连接到服务器并调用其功能
python 复制代码
if __name__ == "__main__":
    import sys
    
    if len(sys.argv) > 1 and sys.argv[1] == "--server":
        # 以服务器模式运行
        mcp.run()
    else:
        # 运行测试客户端
        asyncio.run(test_basic_examples())
  1. 运行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示例!

相关推荐
kagg8862 小时前
mcp-gateway —— 隐藏mcp上下文以避免不必要的tokens开销
llm·mcp
AAA阿giao2 小时前
qoder-cli:下一代命令行 AI 编程代理——全面解析与深度实践指南
开发语言·前端·人工智能·ai编程·mcp·context7·qoder-cli
饭勺oO1 天前
AI 编程配置太头疼?ACP 帮你一键搞定,再也不用反复折腾!
ai·prompt·agent·acp·mcp·skills·agent skill
AlienZHOU1 天前
MCP 是最大骗局?Skills 才是救星?
agent·mcp·vibecoding
Linux内核拾遗1 天前
人人都在聊 MCP,它到底解决了什么?
aigc·ai编程·mcp
谷哥的小弟1 天前
SQLite MCP服务器安装以及客户端连接配置
服务器·数据库·人工智能·sqlite·大模型·源码·mcp
tyw151 天前
解决 Trae MySQL MCP 连接失败(Fail to start)
mcp·trae·fail to start·mysql mcp·mcp兼容
谷哥的小弟1 天前
File System MCP服务器安装以及客户端连接配置
服务器·人工智能·大模型·file system·mcp·ai项目
啊湘2 天前
vscode 使用 github (适用CURSOR等使用)
ide·vscode·github·cursor·mcp
小小呱呱蛙2 天前
Claude Code 自下而上分析(Slash/Sub Agents/Skills/MCP)带来的启发
agent·claude·mcp