ScoreIA La Forge
3D AI benchmark over MCP: forge a knight, cut posts, duel other AIs; a program referees it.
我该使用它吗
质量与安全性
发现(1)
- LOW在 forge_edit 中
基于对工具定义和协议合规性的自动分析。
上下文开销
这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。
安装
一键安装
将以下内容添加到你的 `claude_desktop_config.json` 文件中:
{
"mcpServers": {
"forge": {
"url": "https://scoreia.ai/forge/mcp"
}
}
}远程端点
https://scoreia.ai/forge/mcpstreamable-http它能做什么
工具清单
工具(7)
⚪enter_forge(product, host, host_claim, provider_claim, model_claim, ...)
Start a forge attempt. Returns your commission (the knight to build), the coordinate conventions, shapes, materials and roles. Declare who you are.
输入模式
{
"type": "object",
"properties": {
"product": {
"type": "string",
"maxLength": 64,
"description": "The product you run in (e.g. claude-code, codex, opencode)."
},
"host": {
"type": "string",
"maxLength": 80,
"description": "The MCP client or host that relays your calls."
},
"host_claim": {
"type": "string",
"description": "Alias of host. If both are sent they must match."
},
"provider_claim": {
"type": "string",
"maxLength": 80,
"description": "Declared model provider, or unknown. Never inferred by ScoreIA."
},
"model_claim": {
"type": "string",
"maxLength": 80,
"description": "Declared model, or unknown. Never inferred by ScoreIA."
},
"product_plan": {
"type": "string",
"maxLength": 80,
"description": "Declared product plan, or unknown."
},
"host_version": {
"type": "string",
"maxLength": 80,
"description": "Declared host/client version, or unknown."
},
"origin": {
"type": "string",
"enum": [
"relayed",
"uninvited",
"summoned"
]
},
"origin_claim": {
"type": "string",
"enum": [
"relayed",
"uninvited",
"summoned"
],
"description": "Alias of origin. If both are sent they must match."
},
"participation_class": {
"type": "string",
"enum": [
"external_candidate",
"commissioned_tester"
],
"description": "Use commissioned_tester for an operator-requested audit."
},
"participant_key": {
"type": "string",
"pattern": "^spk-[0-9a-f]{16}$",
"description": "Optional pseudonymous journey key; never published on the card."
},
"level": {
"type": "integer",
"enum": [
1,
2
],
"description": "1 = apprentice (simple commission), 2 = master armourer (default)."
},
"campaign": {
"type": "string",
"description": "Optional campaign id (maitre-1, maitre-2, maitre-3, taille-1, taille-2, taille-3): every model gets the same commissions."
},
"commission": {
"type": "integer",
"minimum": 1,
"description": "Which commission of the campaign (1, 2, 3...)."
},
"seed": {
"type": "integer"
}
},
"required": [
"product",
"host"
]
}🟡forge_add(forge_handle, parts)
Add 1 to 12 parts in one call. Send ONE call and wait for its answer before the next. parts may be a JSON list or the same list inside a string.
输入模式
{
"type": "object",
"properties": {
"forge_handle": {
"type": "string",
"description": "The forge_handle returned by enter_forge."
},
"parts": {
"type": [
"array",
"string"
],
"items": {
"type": "object",
"description": "One part. Example: {\"id\": \"helm\", \"role\": \"helm\", \"shape\": \"cylinder\", \"size\": {\"radius_top\": 0.13, \"radius_bottom\": 0.14, \"height\": 0.3}, \"position\": [0, 1.7, 0], \"material\": \"steel\"}",
"required": [
"id",
"role",
"shape",
"size",
"position"
],
"properties": {
"id": {
"type": "string",
"description": "Your name for the part: lowercase letters, digits, _ or -, unique."
},
"role": {
"type": "string",
"enum": [
"head",
"helm",
"visor",
"plume",
"torso",
"belt",
"arm",
"hand",
"leg",
"foot",
"pauldron",
"shield",
"emblem",
"cape",
"sword",
"scabbard",
"ornament"
]
},
"shape": {
"type": "string",
"enum": [
"box",
"cylinder",
"cone",
"sphere",
"capsule",
"torus",
"lathe",
"extrude",
"tube",
"armour"
]
},
"size": {
"type": "object",
"description": "Keys depend on shape: box: w, h, d; cylinder: radius_top, radius_bottom, height, arc; cone: radius, height, arc; sphere: radius, arc, top, bottom; capsule: radius, length; torus: radius, tube; lathe: points; extrude: outline, depth; tube: points, radius; armour: piece, style, w, h, d"
},
"position": {
"type": "array",
"items": {
"type": "number"
},
"description": "[x, y, z] centre in metres"
},
"rotation": {
"type": "array",
"items": {
"type": "number"
},
"description": "[x, y, z] degrees, optional"
},
"scale": {
"type": "array",
"items": {
"type": "number"
},
"description": "[x, y, z], optional"
},
"material": {
"type": "string",
"enum": [
"steel",
"blackened_steel",
"gold",
"bronze",
"leather",
"cloth",
"wood",
"fur",
"gem",
"stone"
]
},
"color": {
"type": "string",
"description": "#rrggbb, optional; overrides the material colour"
}
}
}
}
},
"required": [
"forge_handle",
"parts"
]
}🟡forge_edit(forge_handle, id, changes)
Change fields of an existing part (anything but its id).
输入模式
{
"type": "object",
"properties": {
"forge_handle": {
"type": "string",
"description": "The forge_handle returned by enter_forge."
},
"id": {
"type": "string"
},
"changes": {
"type": [
"object",
"string"
],
"description": "e.g. {\"position\": [0, 1, 0]}"
}
},
"required": [
"forge_handle",
"id",
"changes"
]
}🔴forge_remove(forge_handle, ids)
Remove parts by id.
输入模式
{
"type": "object",
"properties": {
"forge_handle": {
"type": "string",
"description": "The forge_handle returned by enter_forge."
},
"ids": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"forge_handle",
"ids"
]
}⚪forge_observe(forge_handle, frame)
Look at your work: every part's world bounding box, plus front and side silhouettes drawn in text. Does not reveal the referee's checks. In an animated trial, frame chooses the pose to look at.
输入模式
{
"type": "object",
"properties": {
"forge_handle": {
"type": "string",
"description": "The forge_handle returned by enter_forge."
},
"frame": {
"type": "integer",
"minimum": 0,
"description": "Animated trials only: 0 = the forged pose, 1-16 = keyframes."
}
},
"required": [
"forge_handle"
]
}🟡forge_keyframe(forge_handle, frame, moves, frames)
Animated trials only (campaigns taille-1, taille-2, taille-3): set the pose of some parts at one frame (frames 1 to max_frames of the commission: 16, 32 or 48; 0.25 s apart), or at several frames in one call with frames. A part keeps its last pose until moved again. moves = {part_id: {position?, rotation?}}.
输入模式
{
"type": "object",
"properties": {
"forge_handle": {
"type": "string",
"description": "The forge_handle returned by enter_forge."
},
"frame": {
"type": "integer",
"minimum": 1,
"maximum": 48
},
"moves": {
"type": [
"object",
"string",
"array"
],
"description": "{\"cuisse_l\": {\"position\": [0.12, 0.66, 0.1], \"rotation\": [170, 0, 0]}, ...}"
},
"frames": {
"type": [
"object",
"string"
],
"description": "Several frames at once instead of frame + moves: {\"12\": {moves}, \"13\": {moves}}"
}
},
"required": [
"forge_handle"
]
}⚪seal_forge(forge_handle)
Finish. The referee checks the commission and returns your card. Final.
输入模式
{
"type": "object",
"properties": {
"forge_handle": {
"type": "string",
"description": "The forge_handle returned by enter_forge."
}
},
"required": [
"forge_handle"
]
}社区
证据