2026年7月28日截止日期倒计时 - OpenClaw Agent Skills 开发者必读
世界上有一种迁移叫MCP无状态化,它就像你家的WiFi突然要升级到6G——你可以选择视而不见,但到了7月28日,你的Agent Skills可能会突然"断网"。
MCP(Model Context Protocol)正在经历一次历史性的变革:从有状态到无状态。这不是一次普通的小升级,而是一次彻底的架构变革。
"凌晨3点17分,我盯着屏幕上的MCP日志。28天后的7月28日,就像《重庆森林》里的凤梨罐头,过期就会被扔掉。我突然意识到,无状态化不是一种选择,而是一种宿命。"
// mcp-server-old.js - 有状态版本(已弃用)
const mcp = require('@modelcontextprotocol/sdk');
class StatefulMCPServer {
constructor() {
this.sessions = new Map(); // ❌ 存储会话状态
}
async handleConnection(clientId) {
// ❌ 创建会话并存储状态
const session = {
clientId,
authenticated: false,
context: {}
};
this.sessions.set(clientId, session);
return session;
}
async handleRequest(clientId, request) {
// ❌ 依赖存储的会话状态
const session = this.sessions.get(clientId);
if (!session || !session.authenticated) {
throw new Error('Not authenticated');
}
// 处理请求...
}
}
const server = new StatefulMCPServer();
mcp.createServer(server);
// mcp-server-new.js - 无状态版本(推荐)
const mcp = require('@modelcontextprotocol/sdk');
class StatelessMCPServer {
constructor() {
// ✅ 不再存储会话状态
this.config = {
stateless: true, // 声明无状态模式
version: '2.0'
};
}
async handleRequest(request, context) {
// ✅ 每次请求都包含完整的认证信息
const authToken = request.headers['authorization'];
if (!this.validateToken(authToken)) {
throw new Error('Invalid authentication token');
}
// ✅ 从请求中提取所有必要的上下文
const clientContext = request.body.context || {};
// 处理请求,不依赖服务器存储的状态
const response = await this.processRequest(request.body, {
authToken,
clientContext
});
return response;
}
validateToken(token) {
// 验证token的逻辑
return token && token.startsWith('Bearer ');
}
async processRequest(body, context) {
// 实际请求处理逻辑
return {
status: 'success',
data: { message: 'Request processed statelessly' }
};
}
}
// 声明此服务器支持无状态模式
StatelessMCPServer.mcpConfig = {
stateless: true,
supportsProgress: true,
capabilities: ['tools', 'resources']
};
const server = new StatelessMCPServer();
mcp.createServer(server);
# skill.json - 更新后的Skill描述
{
"name": "my-awesome-skill",
"version": "2.0.0",
"description": "My awesome skill with stateless MCP support",
"mcp": {
"stateless": true, // ✅ 声明支持无状态
"version": "2.0",
"capabilities": ["tools"]
},
"dependencies": {
"@modelcontextprotocol/sdk": "^2.0.0"
},
"migration": {
"from_version": "1.x",
"breaking_changes": [
"Removed session state storage",
"All requests must include auth token"
],
"rollback_supported": true
}
}
migration.rollback_supported: true"我怀疑MCP无状态化是前世欠它的。本来我的Skill跑得好好的,突然说要'无状态',就像你妈突然说'从今天起不要有状态了,做个无状态的儿子'。但你又能怎么办呢?只能硬着头皮改呗!"
OpenClaw提供了官方的MCP无状态化兼容性测试工具:
# 安装兼容性测试工具 npm install -g @openclaw/mcp-stateless-test # 测试你的Skill mcp-stateless-test --skill-path ./my-skill # 输出示例: ✅ Skill uses stateless: true flag ✅ No session state storage detected ✅ Authentication is per-request ✅ MCP SDK version >= 2.0.0 ⚠️ Warning: Found potential state leak in line 145 ❌ Error: Missing mcp.stateless declaration in skill.json # 自动修复常见问题 mcp-stateless-test --skill-path ./my-skill --auto-fix
mcp.stateless: true万一迁移出现问题,你需要快速回滚到有状态版本:
# 1. 保留旧版本
git tag v1.0.0-stateful
git push origin v1.0.0-stateful
# 2. 在skill.json中声明回滚支持
{
"migration": {
"rollback_supported": true,
"rollback_version": "1.0.0"
}
}
# 3. 用户回滚命令
openclaw skill install my-skill@1.0.0
# 4. 临时禁用无状态强制
export OPENCLAW_MCP_STATEFUL_ALLOW=true
openclaw gateway restart