旧扩展 @iflow-mcp/harady-cocos-creator-mcp(164 个细粒度工具 + stdio-bridge
转发)整个删除, 换成 cocos-mcp-server v1.7.9(16 个聚合工具, 靠 action 分派)。
新扩展自身起 streamable-http 服务, 不再需要 stdio 桥, 故 .mcp.json 从
node + stdio-bridge.js 改为 { type: "http", url: "http://127.0.0.1:3000/mcp" }。
原配置指向的 client/stdio-bridge.js 已随旧扩展删除, MCP 因此加载失败。
服务器名保留 cocos-creator-mcp(而非 INSTALL.md 建议的 cocos-creator), 以免
打断 CLAUDE.md、cocos-mcp 技能与 settings.local.json 里的
mcp__cocos-creator-mcp__* 允许规则。
gitignore: 新扩展是商业付费产品(vberai), 非 npm 可重装, dist/sidecar/static
共约 16M 发行产物+加密载荷+平台二进制不入库; 顺带忽略 Claude Code 个人本地
配置与编辑器运行时端口文件。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
95 lines
3.7 KiB
JavaScript
95 lines
3.7 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Batch auto_knowledge via MCP HTTP — gets runtime defaults from editor
|
|
* Requires: editor running with MCP on port 3000
|
|
*/
|
|
|
|
import http from 'http';
|
|
|
|
const MCP_URL = 'http://127.0.0.1:3000/mcp';
|
|
const ALL = [
|
|
'cc.Label','cc.Sprite','cc.Button','cc.Widget','cc.Layout',
|
|
'cc.UITransform','cc.RichText','cc.ScrollView','cc.Toggle',
|
|
'cc.ToggleContainer','cc.ProgressBar','cc.Slider','cc.PageView',
|
|
'cc.Mask','cc.Graphics','cc.UIOpacity','cc.SafeArea',
|
|
'cc.BlockInputEvents','cc.LabelOutline','cc.LabelShadow',
|
|
'cc.PageViewIndicator','cc.EditBox',
|
|
'cc.AudioSource','cc.VideoPlayer','cc.WebView',
|
|
'cc.ParticleSystem2D',
|
|
'cc.Camera','cc.Canvas','cc.Animation','cc.SkeletalAnimation',
|
|
'cc.MeshRenderer','cc.SkinnedMeshRenderer',
|
|
'cc.DirectionalLight','cc.PointLight','cc.SpotLight','cc.SphereLight',
|
|
'cc.RigidBody2D','cc.BoxCollider2D','cc.CircleCollider2D','cc.PolygonCollider2D',
|
|
'cc.RigidBody','cc.BoxCollider','cc.SphereCollider','cc.CapsuleCollider','cc.MeshCollider',
|
|
'cc.MotionStreak','cc.Billboard','cc.Line',
|
|
'cc.TiledMap','cc.TiledLayer',
|
|
'cc.HingeJoint2D','cc.DistanceJoint2D','cc.SpringJoint2D',
|
|
'cc.FixedJoint2D','cc.WheelJoint2D','cc.SliderJoint2D',
|
|
'cc.RelativeJoint2D','cc.MouseJoint2D',
|
|
'cc.HingeConstraint','cc.FixedConstraint','cc.PointToPointConstraint',
|
|
'cc.Terrain','cc.LODGroup','cc.ReflectionProbe',
|
|
'sp.Skeleton','dragonBones.ArmatureDisplay',
|
|
];
|
|
|
|
function callMcp(toolName, args) {
|
|
return new Promise((resolve, reject) => {
|
|
const body = JSON.stringify({
|
|
jsonrpc: '2.0', id: Date.now(), method: 'tools/call',
|
|
params: { name: toolName, arguments: args }
|
|
});
|
|
const req = http.request(MCP_URL, {
|
|
method: 'POST', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body) },
|
|
timeout: 30000,
|
|
}, (res) => {
|
|
const chunks = [];
|
|
res.on('data', c => chunks.push(c));
|
|
res.on('end', () => {
|
|
try {
|
|
const data = JSON.parse(Buffer.concat(chunks).toString());
|
|
const content = data.result?.content || [];
|
|
const text = content.find(c => c.type === 'text')?.text;
|
|
resolve(text ? JSON.parse(text) : {});
|
|
} catch (e) { reject(e); }
|
|
});
|
|
});
|
|
req.on('error', reject);
|
|
req.on('timeout', () => { req.destroy(); reject(new Error('timeout')); });
|
|
req.write(body);
|
|
req.end();
|
|
});
|
|
}
|
|
|
|
// Check connectivity
|
|
try {
|
|
await callMcp('cocos_editor', { action: 'project_info' });
|
|
} catch {
|
|
console.error('❌ Cannot connect to MCP at', MCP_URL);
|
|
console.error(' Make sure editor is running and plugin is loaded.');
|
|
process.exit(1);
|
|
}
|
|
|
|
console.log(`Connected. Running auto_knowledge(save:true) for ${ALL.length} components...\n`);
|
|
|
|
let ok = 0, fail = 0, withDefaults = 0;
|
|
|
|
for (const comp of ALL) {
|
|
try {
|
|
const r = await callMcp('cocos_devtools', { action: 'auto_knowledge', componentType: comp, save: true });
|
|
if (r.success) {
|
|
ok++;
|
|
const hasRuntime = r.data?.hasRuntimeDefaults;
|
|
if (hasRuntime) withDefaults++;
|
|
const propCount = Object.keys(r.data?.recommendedKnowledge?.properties || {}).length;
|
|
console.log(` ✅ ${comp.padEnd(35)} ${propCount} props ${hasRuntime ? '(+defaults)' : '(dts only)'}`);
|
|
} else {
|
|
fail++;
|
|
console.log(` ❌ ${comp}: ${r.error}`);
|
|
}
|
|
} catch (e) {
|
|
fail++;
|
|
console.log(` ❌ ${comp}: ${e.message}`);
|
|
}
|
|
}
|
|
|
|
console.log(`\nDone: ${ok} ok, ${fail} fail, ${withDefaults} with runtime defaults`);
|