每天10分钟轻松掌握MCP - 第4天
MCP核心组件体系与功能边界(一)
大家好!欢迎来到第4天的MCP学习之旅!今天我们要揭开MCP的"神秘面纱",深入了解它的三大核心组件。如果说MCP是一座豪华别墅,那么今天我们就要参观它的客厅、厨房和书房——也就是工具、资源和提示模板这三大功能区域。
第一部分:MCP三大核心组件全景图
1.1 MCP核心组件概览
想象一下,你正在建造一个超级智能的机器人助手。这个助手需要三种基本能力:
- 工具(Tools):就像助手的"双手",能够执行各种操作
- 资源(Resources):就像助手的"眼睛",能够获取和查看信息
- 提示模板(Prompts):就像助手的"大脑指令",告诉它如何思考和回应
让我们用一个表格来快速了解这三兄弟:
组件类型 | 主要功能 | 类比说明 | 典型应用场景 |
---|---|---|---|
工具(Tools) | 执行操作和动作 | 机器人的双手 | 发送邮件、计算数据、创建文件 |
资源(Resources) | 获取和访问信息 | 机器人的眼睛 | 读取文档、查询数据库、浏览网页 |
提示模板(Prompts) | 提供指导和上下文 | 机器人的大脑指令 | 任务模板、对话引导、专业建议 |
1.2 工具组件:MCP的"瑞士军刀"
工具组件就像是程序员的瑞士军刀,什么都能干!它的设计理念非常简单却强大:
核心设计理念:
- 封装外部功能:把复杂的操作包装成简单的接口
- 标准化输入输出:所有工具都说同一种"语言"
- 提供执行能力:不只是查看,还能真正做事情
让我们看一个简单的文件操作工具示例:
# 文件操作工具示例
import json
from typing import Dict, Any
class FileOperationTool:
def __init__(self):
self.name = "file_operations"
self.description = "执行基本的文件操作,如创建、读取、写入文件"
def get_schema(self) -> Dict[str, Any]:
"""定义工具的输入参数格式"""
return {
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": ["create", "read", "write", "delete"],
"description": "要执行的文件操作类型"
},
"filename": {
"type": "string",
"description": "目标文件名"
},
"content": {
"type": "string",
"description": "文件内容(写入操作时使用)"
}
},
"required": ["action", "filename"]
}
def execute(self, params: Dict[str, Any]) -> Dict[str, Any]:
"""执行工具操作"""
action = params.get("action")
filename = params.get("filename")
content = params.get("content", "")
try:
if action == "create":
with open(filename, 'w', encoding='utf-8') as f:
f.write(content)
return {"success": True, "message": f"文件 {filename} 创建成功"}
elif action == "read":
with open(filename, 'r', encoding='utf-8') as f:
file_content = f.read()
return {"success": True, "content": file_content}
elif action == "write":
with open(filename, 'w', encoding='utf-8') as f:
f.write(content)
return {"success": True, "message": f"文件 {filename} 写入成功"}
elif action == "delete":
import os
os.remove(filename)
return {"success": True, "message": f"文件 {filename} 删除成功"}
except Exception as e:
return {"success": False, "error": str(e)}
# 使用示例
tool = FileOperationTool()
# 创建一个新文件
result = tool.execute({
"action": "create",
"filename": "hello_mcp.txt",
"content": "Hello, MCP World!"
})
print(result)
# 输出: {'success': True, 'message': '文件 hello_mcp.txt 创建成功'}
# 读取文件内容
result = tool.execute({
"action": "read",
"filename": "hello_mcp.txt"
})
print(result)
# 输出: {'success': True, 'content': 'Hello, MCP World!'}
1.3 工具执行流程可视化
让我们通过一个SVG流程图来看看工具是如何工作的:
1.4 典型工具类型深度解析
MCP的工具就像是一个功能强大的工具箱,里面有各种各样的"神器":
1. 文件操作工具
- 就像是一个超级文件管理器,能创建、读取、修改、删除文件
- 实际价值:让AI助手能够直接操作你的文档和数据
2. API调用工具
import requests
from typing import Dict, Any
class APICallTool:
def __init__(self):
self.name = "api_caller"
self.description = "调用外部API接口获取数据"
def execute(self, params: Dict[str, Any]) -> Dict[str, Any]:
"""执行API调用"""
url = params.get("url")
method = params.get("method", "GET")
headers = params.get("headers", {})
data = params.get("data", {})
try:
if method.upper() == "GET":
response = requests.get(url, headers=headers, params=data)
elif method.upper() == "POST":
response = requests.post(url, headers=headers, json=data)
return {
"success": True,
"status_code": response.status_code,
"data": response.json() if response.headers.get('content-type', '').startswith('application/json') else response.text
}
except Exception as e:
return {"success": False, "error": str(e)}
# 使用示例 - 获取天气信息
api_tool = APICallTool()
weather_result = api_tool.execute({
"url": "https://api.openweathermap.org/data/2.5/weather",
"method": "GET",
"data": {
"q": "Beijing",
"appid": "your_api_key",
"units": "metric"
}
})
3. 计算处理工具
import math
from typing import Dict, Any
class CalculatorTool:
def __init__(self):
self.name = "calculator"
self.description = "执行数学计算和数据处理"
def execute(self, params: Dict[str, Any]) -> Dict[str, Any]:
"""执行计算操作"""
operation = params.get("operation")
numbers = params.get("numbers", [])
try:
if operation == "add":
result = sum(numbers)
elif operation == "multiply":
result = 1
for num in numbers:
result *= num
elif operation == "average":
result = sum(numbers) / len(numbers) if numbers else 0
elif operation == "sqrt":
result = math.sqrt(numbers[0]) if numbers else 0
else:
return {"success": False, "error": "不支持的操作"}
return {"success": True, "result": result}
except Exception as e:
return {"success": False, "error": str(e)}
# 使用示例
calc_tool = CalculatorTool()
# 计算平均值
avg_result = calc_tool.execute({
"operation": "average",
"numbers": [10, 20, 30, 40, 50]
})
print(f"平均值: {avg_result['result']}") # 输出: 平均值: 30.0
# 计算平方根
sqrt_result = calc_tool.execute({
"operation": "sqrt",
"numbers": [16]
})
print(f"平方根: {sqrt_result['result']}") # 输出: 平方根: 4.0
看到这里,你可能会想:"哇,这些工具确实很强大!但是它们怎么知道什么时候该做什么呢?"别着急,这就是我们下一部分要讲的资源组件和提示模板的神奇之处了!
欢迎大家关注同名公众号《凡人的工具箱》:关注就送学习大礼包