
sidebar.wechat

sidebar.feishu
sidebar.chooseYourWayToJoin

sidebar.scanToAddConsultant
理解 MCP 的技术架构和工作原理,可以帮助你更好地使用和优化 MCP 服务。本文将深入剖析 MCP 的核心技术。
应用层:
协议层:
服务层:
MCP 基于 JSON-RPC 2.0 协议,这是一个轻量级的远程过程调用协议。
请求格式:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "query",
"arguments": {
"question": "查询订单总额",
"role_id": null,
"role_variables": null
}
}
}
响应格式:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "{\"status\": \"success\", \"data\": \"订单总额为 ¥123,456\"}"
}
]
}
}
工作原理:
特点:
启动流程:
# AI 应用启动 MCP Server
$ uvx asktable-mcp-server@latest
# 环境变量
API_KEY=xxx
DATASOURCE_ID=yyy
# 通信
stdin ← JSON-RPC 请求
stdout → JSON-RPC 响应
stderr → 日志输出
优势:
劣势:
工作原理:
特点:
连接流程:
SSE 事件格式:
event: message
data: {"jsonrpc":"2.0","id":1,"result":{...}}
event: endpoint
data: http://localhost:8095/messages/
优势:
劣势:
API Key 认证:
认证流程:
SSE 模式的凭证传递:
在 SSE 模式中,API Key 通过两种方式传递:
方式 1:URL 参数(推荐):
GET /sse/?api_key=xxx&datasource_id=yyy
方式 2:Session 存储:
# 连接时存储凭证
pending_credentials[f"{client_ip}_{timestamp}"] = {
"api_key": api_key,
"datasource_id": datasource_id
}
# 首次请求时关联到 session
session_credentials[session_id] = pending_credentials[key]
# 后续请求从 session 读取
credentials = session_credentials[session_id]
行级权限:
# 用户查询
query(
question="查询订单",
role_id="role_sales",
role_variables={"region": "华东"}
)
# 实际执行的 SQL
SELECT * FROM orders
WHERE region = '华东' -- 自动注入权限条件
权限注入流程:
权限规则示例:
# 角色定义
role = {
"id": "role_sales",
"rules": [
"orders.region = {{region}}",
"orders.status IN ('approved', 'completed')"
]
}
# 变量替换
variables = {"region": "华东"}
# 最终 SQL
SELECT * FROM orders
WHERE region = '华东'
AND status IN ('approved', 'completed')
只读访问:
SQL 注入防护:
敏感数据脱敏:
智能 Schema Linking:
优化策略:
示例:
# 用户问题
"查询学生姓名"
# 优化前
SELECT * FROM students
# 优化后
SELECT name FROM students LIMIT 1000
多层缓存:
缓存类型:
缓存策略:
数据库连接池:
# 连接池配置
pool = create_pool(
min_size=5, # 最小连接数
max_size=20, # 最大连接数
timeout=30, # 获取连接超时
recycle=3600 # 连接回收时间
)
优势:
异步查询:
async def query(question: str):
# 异步生成 SQL
sql = await generate_sql(question)
# 异步执行查询
result = await execute_query(sql)
# 异步格式化结果
formatted = await format_result(result)
return formatted
优势:
# server.py
from fastmcp import FastMCP
mcp = FastMCP(name="Asktable MCP Server")
@mcp.tool(name='使用 AskTable 查询数据')
async def query(
question: str,
role_id: str = None,
role_variables: dict = None
) -> dict:
# 调用 AskTable API
result = await get_asktable_answer(
api_key=os.getenv("API_KEY"),
datasource_id=os.getenv("DATASOURCE_ID"),
question=question,
role_id=role_id,
role_variables=role_variables
)
return result
# at_apis.py
from asktable import Asktable
async def get_asktable_answer(
api_key, datasource_id, question,
base_url=None, role_id=None, role_variables=None
) -> dict:
# 创建客户端
client = Asktable(api_key=api_key, base_url=base_url)
# 调用 API
response = client.answers.create(
datasource_id=datasource_id,
question=question,
role_id=role_id,
role_variables=role_variables
)
# 返回结果
return {
"status": "success" if response.answer else "failure",
"data": response.answer.text if response.answer else None
}
# sse_server.py
from fastapi import FastAPI
from fastmcp.server import FastMCPServer
app = FastAPI()
# 创建 MCP Server
mcp_server = FastMCPServer(mcp)
# SSE 端点
@app.get("/sse/")
async def sse_endpoint(
api_key: str,
datasource_id: str
):
# 存储凭证
store_credentials(api_key, datasource_id)
# 返回 SSE 流
return mcp_server.sse_handler()
# 消息端点
@app.post("/messages/")
async def messages_endpoint(
session_id: str,
request: dict
):
# 获取凭证
credentials = get_credentials(session_id)
# 处理请求
return await mcp_server.handle_request(request, credentials)
日志级别:
import logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
关键日志:
日志示例:
2026-03-08 10:30:15 - INFO - Received query: 查询订单总额
2026-03-08 10:30:16 - INFO - Generated SQL: SELECT SUM(amount) FROM orders
2026-03-08 10:30:17 - INFO - Query completed in 1.2s
关键指标:
监控工具:
Stdio 模式调试:
# 手动运行 MCP Server
$ uvx asktable-mcp-server@latest
# 输入 JSON-RPC 请求
{"jsonrpc":"2.0","id":1,"method":"tools/list"}
# 查看响应
{"jsonrpc":"2.0","id":1,"result":{...}}
SSE 模式调试:
# 测试 SSE 连接
$ curl -N http://localhost:8095/sse/?api_key=xxx&datasource_id=yyy
# 测试消息端点
$ curl -X POST http://localhost:8095/messages/?session_id=abc \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
@mcp.tool(name='自定义工具')
async def custom_tool(param: str) -> dict:
# 实现自定义逻辑
result = await do_something(param)
return {"status": "success", "data": result}
@mcp.resource("config://settings")
async def get_settings() -> str:
# 返回配置信息
return json.dumps({"key": "value"})
@mcp.prompt(name="数据分析模板")
async def analysis_prompt(topic: str) -> str:
return f"请分析 {topic} 的数据,包括趋势、异常和建议"
MCP 的技术架构体现了以下设计理念:
简单性:
安全性:
性能:
可扩展性:
下一步:
相关阅读:
技术交流:
sidebar.noProgrammingNeeded
sidebar.startFreeTrial