Cline 官方提供了 MCP 插件开发权威指南,本文系统阐述如何通过模型上下文协议(MCP)为 Cline 构建功能强大的插件生态。作为 Cline 官方核心开发指南,内容涵盖:
- 协议核心:通过 .clinerules 文件实现结构化开发流程,强制规划、实现、测试三阶段管控,内置安全机制防止未经验证的功能发布;
- 能力突破:详解插件如何使 AI 助手突破文本交互局限,实现 API 调用、实时数据获取、系统控制等扩展功能;
- 实战案例:以 AlphaAdvantage 金融插件为例,完整演示从 API 集成、速率限制处理、Markdown 数据格式化到全链路测试的工业级开发实践;
- 最佳实践:提炼日志规范、类型安全、智能缓存等关键编码原则,提供应对 API 限流、认证复杂性的标准化解决方案。
附官方协议文档、SDK 资源及示例代码库,助力开发者快速构建符合企业级标准的 AI 增强工具。
以下是对 MCP 插件开发协议的翻译部分,内容比较多,含代码,建议电脑上阅读
MCP 插件开发协议 | Cline
本协议旨在规范使用 Cline 构建 MCP 插件的开发流程。
什么是 MCP 插件?
模型上下文协议(MCP)插件通过以下方式扩展 Cline 等 AI 助手的能力:
- 访问外部 API 和服务
- 获取实时数据
- 控制应用程序和本地系统
- 执行超越纯文本提示的操作
没有 MCP 的 AI 助手虽然强大但孤立。通过 MCP,它们获得了与几乎所有数字系统交互的能力。
开发协议
有效的 MCP 插件开发核心在于遵循结构化协议。该协议通过放置在 MCP 工作目录根目录(/Users/your-name/Documents/Cline/MCP)的 .clinerules 文件实现。
使用.clinerules文件
.clinerules 是 Cline 在所在目录自动读取的特殊配置文件。这些文件:
- 配置 Cline 行为并实施最佳实践
- 将 Cline 切换至专用 MCP 开发模式
- 提供分步插件构建指南
- 实施安全措施(如防止过早完成)
- 指导规划、实现和测试阶段
以下是应放入 .clinerules 文件的完整协议:
# MCP Plugin Development Protocol
⚠️ CRITICAL: DO NOT USE attempt_completion BEFORE TESTING ⚠️
## Step 1: Planning (PLAN MODE)
- What problem does this tool solve?
- What API/service will it use?
- What are the authentication requirements?
□ Standard API key
□ OAuth (requires separate setup script)
□ Other credentials
## Step 2: Implementation (ACT MODE)
1. Bootstrap
- For web services, JavaScript integration, or Node.js environments:
---
npx @modelcontextprotocol/create-server my-server
cd my-server
npm install
---
- For data science, ML workflows, or Python environments:
---
pip install mcp
# Or with uv (recommended)
uv add "mcp[cli]"
---
2. Core Implementation
- Use MCP SDK
- Implement comprehensive logging
- TypeScript (for web/JS projects):
---
console.error('[Setup] Initializing server...');
console.error('[API] Request to endpoint:', endpoint);
console.error('[Error] Failed with:', error);
---
- Python (for data science/ML projects):
---
import logging
logging.error('[Setup] Initializing server...')
logging.error(f'[API] Request to endpoint: {endpoint}')
logging.error(f'[Error] Failed with: {str(error)}')
---
- Add type definitions
- Handle errors with context
- Implement rate limiting if needed
3. Configuration
- Get credentials from user if needed
- Add to MCP settings:
- For TypeScript projects:
---
{
"mcpServers": {
"my-server": {
"command": "node",
"args": ["path/to/build/index.js"],
"env": {
"API_KEY": "key"
},
"disabled": false,
"autoApprove": []
}
}
}
---
- For Python projects:
---
# Directly with command line
mcp install server.py -v API_KEY=key
# Or in settings.json
{
"mcpServers": {
"my-server": {
"command": "python",
"args": ["server.py"],
"env": {
"API_KEY": "key"
},
"disabled": false,
"autoApprove": []
}
}
}
---
## Step 3: Testing (BLOCKER ⛔️)
<thinking>
BEFORE using attempt_completion, I MUST verify:
□ Have I tested EVERY tool?
□ Have I confirmed success from the user for each test?
□ Have I documented the test results?
If ANY answer is "no", I MUST NOT use attempt_completion.
</thinking>
1. Test Each Tool (REQUIRED)
□ Test each tool with valid inputs
□ Verify output format is correct
⚠️ DO NOT PROCEED UNTIL ALL TOOLS TESTED
## Step 4: Completion
❗ STOP AND VERIFY:
□ Every tool has been tested with valid inputs
□ Output format is correct for each tool
Only after ALL tools have been tested can attempt_completion be used.
## Key Requirements
- ✓ Must use MCP SDK
- ✓ Must have comprehensive logging
- ✓ Must test each tool individually
- ✓ Must handle errors gracefully
- ⛔️ NEVER skip testing before completion
当工作目录存在此 .clinerules 文件时,Cline 将:
- 启动规划模式进行设计
- 在执行模式强制正确实现
- 要求完成所有测试
- 指导完整开发生命周期
入门指南
创建 MCP 插件只需简单几步:
- 创建 .clinerules 文件(🚨 重要)
首先按上述协议在 MCP 工作目录创建。clinerules 文件,该文件配置 Cline 在此目录使用 MCP 开发协议。
- 开启清晰描述的对话
通过明确描述开始对话:
- 插件目的
- 集成的 API/服务
- 所需工具/功能
示例:
I want to build an MCP plugin for the AlphaAdvantage financial API.
It should allow me to get real-time stock data, perform technical
analysis, and retrieve company financial information.
- 遵循协议流程
Cline 将自动进入规划模式,指导您:
- 讨论问题范围
- 审查 API 文档
- 规划认证方式
- 设计工具接口
- 确定数据格式
准备就绪后,可通过聊天底部切换至执行模式开始实现。
4. 提前提供 API 文档
最有效的方式是在开始时分享官方 API 文档:
Here's the API documentation for the service:
[Paste API documentation here]
提供完整 API 细节(端点、认证、数据结构)可显著提升 Cline 的实现能力。
理解两种模式
规划模式
协作设计阶段:
- 定义问题范围
- 选择合适 API
- 规划认证方式
- 设计工具接口
- 确定数据格式
执行模式
完成规划后进入实现阶段:
- 建立项目结构
- 编写实现代码
- 配置设置
- 全面测试组件
- 完成文档
案例研究:AlphaAdvantage 股票分析插件
演示 AlphaAdvantage MCP 服务开发流程,该服务提供股票数据分析和报告功能。
规划阶段
经过规划阶段,我们将:
-
定义问题:用户需通过 AI 助手直接获取金融数据和分析
-
选择 API:AlphaAdvantage 金融数据 API
• 标准 API 密钥认证
• 免费版 5 次/分钟速率限制
• 多种金融数据端点
- 设计工具:• 股票概览(现价、公司详情)
• 技术分析(RSI、MACD 等指标)
• 基本面分析(财务报表、比率)
• 财报数据
• 新闻与情绪分析
- 数据格式规划:
• 整洁的 Markdown 输出
• 结构化数据表格
• 趋势视觉指标(↑/↓)
• 财务数字规范格式
实现
项目初始化:
npx @modelcontextprotocol/create-server alphaadvantage-mcp
cd alphaadvantage-mcp
npm install axios node-cache
项目结构:
src/
├── api/
│ └── alphaAdvantageClient.ts # 含速率限制和缓存的API客户端
├── formatters/
│ └── markdownFormatter.ts # Markdown格式化工具
└── index.ts # 主服务实现
API 客户端实现
包含:
- 速率限制:5 次/分钟
- 缓存:策略性缓存减少调用
- 错误处理:健壮的错误检测
- 类型接口:明确的 TypeScript 类型
关键实现细节:
/** 基于免费版实施速率限制 */
private async enforceRateLimit() {
if (this.requestsThisMinute >= 5) {
console.error("[速率限制] 已达限制,等待下一分钟...");
return new Promise<void>((resolve) => {
const remainingMs = 60 * 1000 - (Date.now() % (60 * 1000));
setTimeout(resolve, remainingMs + 100); // 100毫秒缓冲
});
}
this.requestsThisMinute++;
return Promise.resolve();
}
Markdown 格式化
实现美观的财务数据显示:
/** 将公司概览格式化为Markdown */
export function formatStockOverview(overviewData: any, quoteData: any): string {
// 提取数据
const overview = overviewData;
const quote = quoteData["Global Quote"];
// 计算价格变化
const currentPrice = parseFloat(quote["05. price"] || "0");
const priceChange = parseFloat(quote["09. change"] || "0");
const changePercent = parseFloat(quote["10. change percent"]?.replace("%", "") || "0");
// 格式化Markdown
let markdown = `# ${overview.Symbol} (${overview.Name}) - ${formatCurrency(currentPrice)} ${addTrendIndicator(priceChange)}${changePercent > 0 ? '+' : ''}${changePercent.toFixed(2)}%\n\n`;
// 添加更多细节...
return markdown;
}
工具实现
定义五个清晰接口的工具:
server.setRequestHandler(ListToolsRequestSchema, async () => {
console.error("[初始化] 列出可用工具");
return {
tools: [
{
name: "get_stock_overview",
description: "获取股票代码的基本信息和当前报价",
inputSchema: {
type: "object",
properties: {
symbol: {
type: "string",
description: "股票代码(如'AAPL')"
},
market: {
type: "string",
description: "可选市场(如'US')"
},
default: "US"
},
required: ["symbol"]
}
},
// 其他工具定义...
];
};
});
每个工具处理包含:
- 输入验证
- 带错误处理的 API 调用
- 响应 Markdown 格式化
- 完整日志记录
测试阶段
关键测试流程:
- 配置 MCP 服务:
{
"mcpServers": {
"alphaadvantage-mcp": {
"command": "node",
"args": ["/path/to/alphaadvantage-mcp/build/index.js"],
"env": {
"ALPHAVANTAGE_API_KEY": "YOUR_API_KEY"
},
"disabled": false,
"autoApprove": []
}
}
}
- 逐项测试工具:
- get_stock_overview:获取 AAPL 股票概览
# AAPL (Apple Inc) - $241.84 ↑+1.91%
**Sector:** TECHNOLOGY
**Industry:** ELECTRONIC COMPUTERS
**Market Cap:** 3.63T
**P/E Ratio:** 38.26
...
- get_technical_analysis:获取价格走势和 RSI 数据
# Technical Analysis: AAPL
## Daily Price Action
Current Price: $241.84 (↑$4.54, +1.91%)
### Recent Daily Prices
| Date | Open | High | Low | Close | Volume |
|------|------|------|-----|-------|--------|
| 2025-02-28 | $236.95 | $242.09 | $230.20 | $241.84 | 56.83M |
...
- get_earnings_report:检索 MSFT 财报历史并格式化
# Earnings Report: MSFT (Microsoft Corporation)
**Sector:** TECHNOLOGY
**Industry:** SERVICES-PREPACKAGED SOFTWARE
**Current EPS:** $12.43
## Recent Quarterly Earnings
| Quarter | Date | EPS Estimate | EPS Actual | Surprise % |
|---------|------|-------------|------------|------------|
| 2024-12-31 | 2025-01-29 | $3.11 | $3.23 | ↑4.01% |
...
挑战与解决方案
开发中的挑战及应对:
- API 速率限制:免费版 5 次/分钟限制 → 实施队列管理、速率限制和缓存
- 数据格式化:原始 API 数据不友好 → 创建格式化工具统一显示
- 超时问题:复杂工具可能超时 → 建议拆分工具,优化缓存
经验总结
AlphaAdvantage 案例的核心经验:
- 预先规划 API 限制
- 策略性缓存提升性能
- 投资数据可读性
- 逐项测试所有路径
- 简化多 API 调用工具设计
核心实现最佳实践
- 完整日志记录:
// 启动日志
console.error('[初始化] 启动AlphaAdvantage MCP服务...');
// API请求日志
console.error(`[API] 获取${symbol}股票概览`);
// 带上下文的错误处理
console.error(`[错误] 工具执行失败: ${error.message}`);
// 缓存操作
console.error(`[缓存] 使用缓存数据: ${cacheKey}`);
- 强类型定义:
export interface AlphaAdvantageConfig {
apiKey: string;
cacheTTL?: Partial<typeof DEFAULT_CACHE_TTL>;
baseURL?: string;
}
/**
* Validate that a stock symbol is provided and looks valid
*/
function validateSymbol(symbol: unknown): asserts symbol is string {
if (typeof symbol !== "string" || symbol.trim() === "") {
throw new McpError(ErrorCode.InvalidParams, "A valid stock symbol is required");
}
// Basic symbol validation (letters, numbers, dots)
const symbolRegex = /^[A-Za-z0-9.]+$/;
if (!symbolRegex.test(symbol)) {
throw new McpError(ErrorCode.InvalidParams, `Invalid stock symbol: ${symbol}`);
}
}
- 智能缓存:
// 默认缓存时间(秒)
const DEFAULT_CACHE_TTL = {
STOCK_OVERVIEW: 3600, // 1小时
TECHNICAL_ANALYSIS: 1800, // 30分钟
FUNDAMENTAL_ANALYSIS: 86400, // 24小时
EARNINGS_REPORT: 86400,
NEWS: 900, // 15分钟
};
// 优先读取缓存
const cachedData = this.cache.get<T>(cacheKey);
if (cachedData) {
console.error(`[缓存] 使用缓存数据: ${cacheKey}`);
return cachedData;
}
// 缓存成功响应
this.cache.set(cacheKey, response.data, cacheTTL);
- 优雅错误处理:
try {
switch (request.params.name) {
case "get_stock_overview":
// 实现...
break;
// 其他情况...
default:
throw new McpError(ErrorCode.MethodNotFound, `未知工具: ${request.params.name}`);
}
} catch (error) {
console.error(`[错误] 工具执行失败: ${error instanceof Error ? error.message : String(error)}`);
if (error instanceof McpError) {
throw error;
}
return {
content: [{ type: "text", text: `错误: ${error instanceof Error ? error.message : String(error)}` }],
isError: true
};
}
常见挑战与解决方案
- API 认证复杂性:不同认证方式 → API 密钥使用环境变量,OAuth 使用独立脚本获取刷新令牌
// Authenticate using API key from environment
const API_KEY = process.env.ALPHAVANTAGE_API_KEY;
if (!API_KEY) {
console.error("[Error] Missing ALPHAVANTAGE_API_KEY environment variable");
process.exit(1);
}
// Initialize API client
const apiClient = new AlphaAdvantageClient({
apiKey: API_KEY
});
- API 功能缺失:端点功能不足 → 使用现有端点实现回退,必要时模拟功能
- API 速率限制:多数 API 存在限制 → 实施速率限制、智能缓存和优雅降级
if (this.requestsThisMinute >= 5) {
console.error("[Rate Limit] Rate limit reached. Waiting for next minute...");
return new Promise<void>((resolve) => {
const remainingMs = 60 * 1000 - (Date.now() % (60 * 1000));
setTimeout(resolve, remainingMs + 100); // Add 100ms buffer
});
}
资源
- MCP 协议文档:https://github.com/modelcontextprotocol/mcp
- MCP SDK 文档:https://github.com/modelcontextprotocol/sdk-js
- AlphaAdvantage API 文档:https://www.alphavantage.co/documentation/
- MCP 插件示例:https://github.com/modelcontextprotocol/servers
- MCP 插件开发协议|Cline:https://docs.cline.bot/mcp-servers/mcp-server-from-scratch