RPC and API
ã³ãŒãã¢ãŒã
ã³ãŒãã¢ãŒãã¯ãå®éšçãªãªããã€ã³ã® OpenClaw ãšãŒãžã§ã³ãã©ã³ã¿ã€ã æ©èœã§ããæå¹ã«ãããšãã¢ãã«ã¯æå¹åããããã¹ãŠã®ããŒã«ã¹ããŒããèŠãã®ã§ã¯ãªãããã®å®è¡ã§ã¯ exec ãš wait ã® 2 ã€ã®ããŒã«ã ããèŠãŸããã¢ãã«ã¯ãé ãããããŒã«ã«ã¿ãã°ãæ€çŽ¢ãèšè¿°ãåŒã³åºãå°ã㪠JavaScript ãŸã㯠TypeScript ããã°ã©ã ãæžããŸãã
ãã®ããŒãžã§ã¯ãCodex Code Mode ã§ã¯ãªã OpenClaw ã³ãŒãã¢ãŒãã«ã€ããŠèª¬æããŸãããã® 2 ã€ã®æ©èœã¯ååãšãã¢ãã«ããèŠããåãããŒã«åïŒexecãwaitïŒãå
±æããŠããŸãããå¥ã
ã®å®è£
ã§ãã
- Codex Code Mode 㯠Codex ã³ãŒãã£ã³ã°ããŒãã¹å
ã§å®è¡ãããŸãããã®
execããŒã«ã¯ freeform-grammar ããŒã«ã§ããã¢ãã«ã¯çã® JavaScript ãœãŒã¹ïŒä»»æã§å®è¡ãªãã·ã§ã³çšã®// @exec: {...}ãã©ã°ãè¡ãå眮ïŒãæžããããã Deno/V8 ã©ã³ã¿ã€ã ã§å®è¡ãããŸãã - OpenClaw ã³ãŒãã¢ãŒãã¯æ±çš OpenClaw ãšãŒãžã§ã³ãã©ã³ã¿ã€ã ã§å®è¡ããã
tools.codeMode.enabled: trueãèšå®ãããŠããªãéãç¡å¹ã§ãããã®execããŒã«ã¯ JSON ã®{ code, language }ãã€ããŒããåãåããQuickJS-WASI ã¯ãŒã«ãŒã§å®è¡ãããŸãã
ã©ã¡ããã·ã§ã«ã³ãã³ãã®ãµãŒãã§ã¹ã§ã¯ãªããJavaScript å®è¡ãµãŒãã§ã¹ã§ããåãååã® exec/wait ããŒã«ãå
¬éããŠããã ãã®ãç¬ç«ããç°ãªãå®è£
ã®æ©èœãšããŠæ±ã£ãŠãã ããã
äœãããã
- ã¢ãã«ããèŠããããŒã«äžèЧã¯ãæ£ç¢ºã«
execãšwaitã«ãªããŸãã execã¯ãã¢ãã«ãçæãã JavaScript ãŸã㯠TypeScript ããéé¢ããã QuickJS-WASI ã¯ãŒã«ãŒã¹ã¬ããå ã§è©äŸ¡ããŸãã- ãã以å€ã®æå¹åããããã¹ãŠã®ããŒã«ïŒOpenClaw ã³ã¢ãPluginãMCPãã¯ã©ã€ã¢ã³ãïŒã¯ã¢ãã«ããã³ããããé ãããã²ã¹ãããã°ã©ã å
ã§ã¯
ALL_TOOLSãštoolsãéããŠå ¬éãããŸãã - ã²ã¹ãã³ãŒãã¯é ãããã«ã¿ãã°ãæ€çŽ¢ããããŒã«ã®ã¹ããŒããèšè¿°ããéåžžã®ãšãŒãžã§ã³ãã¿ãŒã³ã§äœ¿ããããã®ãšåãå®è¡çµè·¯ïŒããªã·ãŒãæ¿èªãããã¯ããã¬ã¡ããªã¯ãã¹ãŠåŒãç¶ãé©çšïŒãéããŠããŒã«ãåŒã³åºããŸãã
- MCP ããŒã«ã¯
MCPåå空éã®äžã«ã°ã«ãŒãåãããŸããã³ãŒãã¢ãŒãã§ã¯ããããããããåŒã³åºãå¯äžã®ãµããŒããããæ¹æ³ã§ãã - ãã¹ããããããŒã«åŒã³åºãããŸã ä¿çäžã®å Žåã
waitã¯äžæåæ¢ãããã³ãŒãã¢ãŒãå®è¡ãåéããŸãã
ã³ãŒãã¢ãŒãã倿Žããã®ã¯ãã¢ãã«åãã®ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ãµãŒãã§ã¹ã ãã§ããããŒã«ãPlugin ããŒã«ãMCP ããŒã«ãèªèšŒãæ¿èªããªã·ãŒããã£ãã«åäœãã¢ãã«éžæã眮ãæãããã®ã§ã¯ãããŸããã
䜿çšããçç±
- å°ããªããã³ãããµãŒãã§ã¹: ãããã€ããŒã¯ãæ°åãŸãã¯æ°çŸã®å®å šãªããŒã«ã¹ããŒãã§ã¯ãªãã2 ã€ã®å¶åŸ¡ããŒã«ãåãåããŸãã
- ãããããªãŒã±ã¹ãã¬ãŒã·ã§ã³: ã¢ãã«ã¯ 1 ã€ã®ã³ãŒãã»ã«å ã§ãã«ãŒããçµåãå°ããªå€æãæ¡ä»¶ããžãã¯ã䞊åã®ãã¹ããããããŒã«åŒã³åºãã䜿çšã§ããŸãã
- ãããã€ããŒäžç«: ãããã€ããŒåºæã®ã³ãŒãå®è¡ã«äŸåãããOpenClawãPluginãMCPãã¯ã©ã€ã¢ã³ãããŒã«ã§åäœããŸãã
- ãã§ã€ã«ã¯ããŒãº: ã³ãŒãã¢ãŒããæå¹ã§ã QuickJS-WASI ã©ã³ã¿ã€ã ãå©çšã§ããªãå ŽåãåºãçŽæ¥ããŒã«å ¬éãžæé»ã«ãã©ãŒã«ããã¯ããã®ã§ã¯ãªããå®è¡ã¯å€±æããŸãã
æå¹åãããããŒã«ã«ã¿ãã°ã倧ãããšãŒãžã§ã³ãããŸãã¯åçåã«ã¢ãã«ãè€æ°ã®ããŒã«ãæ€çŽ¢ãçµåãåŒã³åºãå¿ èŠãããã¯ãŒã¯ãããŒã§æãæçšã§ãã
æå¹åãã
{ tools: { codeMode: { enabled: true, }, },}çç¥åœ¢:
{ tools: { codeMode: true, },}tools.codeMode ãçç¥ãããŠããå Žåãfalse ã®å ŽåããŸã㯠enabled: true ã®ãªããªããžã§ã¯ãã®å Žåãã³ãŒãã¢ãŒãã¯ãªãã®ãŸãŸã§ãã
èšå®æžã¿ã® MCP ãµãŒããŒãæã€ãµã³ãããã¯ã¹åãšãŒãžã§ã³ãã䜿çšããå Žåã¯ããµã³ãããã¯ã¹ããŒã«ããªã·ãŒã§ãã³ãã«ããã MCP Plugin ãèš±å¯ããŠãã ãããäŸ: tools.sandbox.tools.alsoAllow: ["bundle-mcp"]ãèšå® - ããŒã«ãšã«ã¹ã¿ã ãããã€ããŒãåç
§ããŠãã ããã
ããå³å¯ãªå¢çã«ã¯æç€ºçãªå¶éãèšå®ããŸãã
{ tools: { codeMode: { enabled: true, timeoutMs: 10000, memoryLimitBytes: 67108864, maxOutputBytes: 65536, maxSnapshotBytes: 10485760, maxPendingToolCalls: 16, snapshotTtlSeconds: 900, searchDefaultLimit: 8, maxSearchLimit: 50, }, },}ãããã°äžã«ã¢ãã«ãã€ããŒãã®åœ¢ã確èªããã«ã¯ã察象ãçµã£ããã°ã䜿ã£ãŠ Gateway ãå®è¡ããŸãã
OPENCLAW_DEBUG_CODE_MODE=1 \OPENCLAW_DEBUG_MODEL_TRANSPORT=1 \OPENCLAW_DEBUG_MODEL_PAYLOAD=tools \openclaw gatewayã³ãŒãã¢ãŒããæå¹ãªå Žåããã°ã«èšé²ãããã¢ãã«åãããŒã«å㯠exec ãš wait ã§ããå¿
èŠããããŸããçããããã°ã»ãã·ã§ã³ã§å®å
šãªç·šéæžã¿ãããã€ããŒãã€ããŒãã確èªããã«ã¯ãOPENCLAW_DEBUG_MODEL_PAYLOAD=full-redacted ã远å ããŸãã
æè¡ãã¢ãŒ
ãã®ããŒãžã®æ®ãã§ã¯ãã¡ã³ãããŒãããŒã«å ¬éããããã°ãã Plugin äœè ãé«ãªã¹ã¯ã®ãããã€ãæ€èšŒããéçšè åãã«ãã©ã³ã¿ã€ã å¥çŽãšå®è£ ã®è©³çŽ°ãæ±ããŸãã
ã©ã³ã¿ã€ã ç¶æ
| ã©ã³ã¿ã€ã | quickjs-wasi |
| ããã©ã«ãç¶æ | ç¡å¹ |
| å®å®æ§ | å®éšç㪠OpenClaw ãµãŒãã§ã¹ïŒCodex Code Mode ã¯å¥åã®å®å®ãã Codex ããŒãã¹ãµãŒãã§ã¹ïŒ |
| ã¿ãŒã²ãããµãŒãã§ã¹ | æ±çš OpenClaw ãšãŒãžã§ã³ãå®è¡ |
| ã»ãã¥ãªãã£å§¿å¢ | ã¢ãã«ã³ãŒãã¯æµå¯Ÿç |
| ãŠãŒã¶ãŒåãã®çŽæ | ã³ãŒãã¢ãŒããæå¹ã«ããŠããåºãçŽæ¥ããŒã«å ¬éãžæé»ã«ãã©ãŒã«ããã¯ããããšã¯ãããŸãã |
ã¹ã³ãŒã
ã³ãŒãã¢ãŒãã¯ãæºåæžã¿å®è¡ã«å¯Ÿããã¢ãã«åããªãŒã±ã¹ãã¬ãŒã·ã§ã³åœ¢ç¶ãææããŸããã¢ãã«éžæããã£ãã«åäœãèªèšŒãããŒã«ããªã·ãŒãããŒã«å®è£ ã¯ææããŸããã
ã¹ã³ãŒãå
: ã¢ãã«ããèŠãã exec/wait å®çŸ©ãé ãããããŒã«ã«ã¿ãã°ã®æ§ç¯ãJavaScript/TypeScript ã²ã¹ãå®è¡ãQuickJS-WASI ã¯ãŒã«ãŒã©ã³ã¿ã€ã ãæ€çŽ¢/èšè¿°/åŒã³åºãçšã®ãã¹ãã³ãŒã«ããã¯ãäžæåæ¢ãããã²ã¹ãããã°ã©ã ã®åéå¯èœç¶æ
ãåºå/ã¿ã€ã ã¢ãŠã/ã¡ã¢ãª/ä¿çåŒã³åºã/ã¹ãããã·ã§ããå¶éããã¹ããããããŒã«åŒã³åºãã®ãã¬ã¡ããª/è»è·¡æåœ±ã
ã¹ã³ãŒãå€: ãããã€ããŒåºæã®ãªã¢ãŒãã³ãŒãå®è¡ãã·ã§ã«å®è¡ã»ãã³ãã£ã¯ã¹ãæ¢åã®ããŒã«èªå¯ã®å€æŽãæ°žç¶çãªãŠãŒã¶ãŒäœæã¹ã¯ãªãããã²ã¹ãã³ãŒãå ã§ã®ããã±ãŒãžãããŒãžã£ãŒ/ãã¡ã€ã«/ãããã¯ãŒã¯/ã¢ãžã¥ãŒã«ã¢ã¯ã»ã¹ãCodex Code Mode å éšã®çŽæ¥åå©çšã
ãªã¢ãŒã Python ãµã³ãããã¯ã¹ãªã©ã®ãããã€ããŒææããŒã«ã¯å¥ã®ããŒã«ã§ããã³ãŒãå®è¡ãåç §ããŠãã ããã
çšèª
- ã³ãŒãã¢ãŒã: éåžžã®ã¢ãã«ããŒã«ãé ãã
execãšwaitã ããå ¬éãã OpenClaw ã©ã³ã¿ã€ã ã¢ãŒãã - ã²ã¹ãã©ã³ã¿ã€ã : ã¢ãã«ã³ãŒããè©äŸ¡ãã QuickJS-WASI JavaScript VMã
- ãã¹ãããªããž: ã²ã¹ãã³ãŒããã OpenClaw ãžæ»ããçã JSON äºæã®ã³ãŒã«ããã¯ãµãŒãã§ã¹ã
- ã«ã¿ãã°: éåžžã®ããŒã«ããªã·ãŒãPluginãMCPãã¯ã©ã€ã¢ã³ãããŒã«ã®è§£æ±ºåŸã«æå¹ãšãªããå®è¡ã¹ã³ãŒãã®ããŒã«äžèЧã
- ãã¹ããããããŒã«åŒã³åºã: ãã¹ãããªããžãéããŠã²ã¹ãã³ãŒãããè¡ãããããŒã«åŒã³åºãã
- ã¹ãããã·ã§ãã:
waitãäžæåæ¢ãããã³ãŒãã¢ãŒãå®è¡ãç¶ç¶ã§ããããã«ä¿åããããã·ãªã¢ã©ã€ãºæžã¿ QuickJS-WASI VM ç¶æ ã
èšå®
tools.codeMode.enabled ã¯æå¹åã²ãŒãã§ããä»ã®ãã£ãŒã«ããèšå®ããŠããããã ãã§ã¯æ©èœã¯æå¹ã«ãªããŸããã
| ãã£ãŒã«ã | ããã©ã«ã | ã¯ã©ã³ã |
|---|---|---|
enabled |
false |
booleanãtrue ã®ã¿ãã³ãŒãã¢ãŒããæå¹å |
runtime |
"quickjs-wasi" |
ãµããŒããããå¯äžã®å€ |
mode |
"only" |
exec/wait ãå
¬éããéåžžã®ã¢ãã«ããŒã«ãé ã |
languages |
["javascript", "typescript"] |
2 ã€ã®ä»»æã®ãµãã»ãã |
timeoutMs |
10000 |
100-60000 |
memoryLimitBytes |
67108864 |
1048576-1073741824 |
maxOutputBytes |
65536 |
1024-10485760 |
maxSnapshotBytes |
10485760 |
1024-268435456 |
maxPendingToolCalls |
16 |
1-128 |
snapshotTtlSeconds |
900 |
1-86400 |
searchDefaultLimit |
8 |
maxSearchLimit ã«ã¯ã©ã³ã |
maxSearchLimit |
50 |
1-50 |
ã³ãŒãã¢ãŒããæå¹ã§ã QuickJS-WASI ãããŒãã§ããªãå ŽåãOpenClaw ã¯ãã®å®è¡ã«ã€ããŠãã§ã€ã«ã¯ããŒãºããŸãããã©ãŒã«ããã¯ãšããŠéåžžã®ããŒã«ãæé»ã«å ¬éããããšã¯ãããŸããã
ã¢ã¯ãã£ããŒã·ã§ã³
ã³ãŒãã¢ãŒãã¯ãæå¹ãªããŒã«ããªã·ãŒã倿ããåŸãæçµçãªã¢ãã«ãªã¯ãšã¹ããçµã¿ç«ãŠãããåã«è©äŸ¡ãããŸãã
- ãšãŒãžã§ã³ããã¢ãã«ããããã€ããŒããµã³ãããã¯ã¹ããã£ãã«ãéä¿¡è ãå®è¡ããªã·ãŒã解決ããŸãã
- 察象ãšãªã PluginãMCPãã¯ã©ã€ã¢ã³ãããŒã«ã远å ããŠãæå¹ãª OpenClaw ããŒã«äžèŠ§ãæ§ç¯ããŸãã
- èš±å¯/æåŠããªã·ãŒãé©çšããŸãã
tools.codeMode.enabledã false ã®å Žåãéåžžã®ããŒã«å ¬éãç¶è¡ããŸãã- æå¹ã§ãå®è¡ã§ããŒã«ãã¢ã¯ãã£ããªå Žåãæå¹ãªããŒã«ãã³ãŒãã¢ãŒãã«ã¿ãã°ã«ç»é²ããŸãã
- ã¢ãã«ããèŠããäžèЧãããã¹ãŠã®éåžžããŒã«ãåé€ãã
execãšwaitã远å ããŸãã
æå³çã«ããŒã«ãæããªãå®è¡ïŒçã®ã¢ãã«åŒã³åºããdisableTools: trueããŸãã¯ç©ºã® tools.allow äžèЧïŒã¯ãtools.codeMode.enabled: true ãèšå®ãããŠããŠãã³ãŒãã¢ãŒããµãŒãã§ã¹ãæå¹åããŸãããã³ãŒãã¢ãŒããš OpenClaw Tool Search ã¯ã1 ã€ã®å®è¡ã§ã¯çžäºæä»çã§ããã³ãŒãã¢ãŒããæå¹åããããšãTool Search ã® Compaction ã¯è¡ãããŸããã
ã³ãŒãã¢ãŒãã«ã¿ãã°ã¯å®è¡ã¹ã³ãŒãã§ãããå¥ã®ãšãŒãžã§ã³ããã»ãã·ã§ã³ãéä¿¡è ãå®è¡ããããŒã«ãæŒããŠã¯ãªããŸããã
ã¢ãã«ããèŠããããŒã«
ã³ãŒãã¢ãŒããæå¹ãªå Žåãã¢ãã«ã¯æ£ç¢ºã« exec ãš wait ãèŠãŸãããã以å€ã®ãã¹ãŠã®æå¹åãããããŒã«ã¯ãã¢ãã«åãããŒã«äžèЧããé ãããã³ãŒãã¢ãŒãã«ã¿ãã°ã«ç»é²ãããŸãã
ããŒã«ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ãããŒã¿çµåãã«ãŒãã䞊åã®ãã¹ããããåŒã³åºããæ§é å倿ã«ã¯ exec ã䜿çšããŸããwait ã¯ãexec ãåéå¯èœãª waiting çµæãè¿ããå Žåã«ã®ã¿äœ¿çšããŸãã
exec
exec ã¯ã³ãŒãã¢ãŒãã»ã«ãéå§ãã1 ã€ã®çµæãè¿ããŸããå
¥åã³ãŒãã¯ã¢ãã«ãçæãããã®ã§ãããæµå¯Ÿçãªãã®ãšããŠæ±ãå¿
èŠããããŸãã
å ¥å:
type CodeModeExecInput = { code?: string; command?: string; language?: "javascript" | "typescript";};ã«ãŒã«:
codeãŸãã¯commandã®ã©ã¡ããäžæ¹ã¯ç©ºã§ãªãå¿ èŠããããŸããcodeã¯ããã¥ã¡ã³ãåãããã¢ãã«åããã£ãŒã«ãã§ããcommandã¯ãããã¯ããªã·ãŒãšä¿¡é Œæžã¿ã®æžãæãçšã« exec äºæã®ãšã€ãªã¢ã¹ãšããŠåãå ¥ããããŸãïŒéåžžã® OpenClaw ã·ã§ã« exec ããŒã«ãcommandãã£ãŒã«ãã䜿çšããŸãïŒãäž¡æ¹ãååšããå Žåãå€ã¯äžèŽããŠããå¿ èŠããããŸããlanguageã®ããã©ã«ãã¯"javascript"ã§ããäžéšã®ãããã€ããŒã¯ãããã®åœ¢ç¶ãæåŠãããããã¹ããŒãã§ã¯oneOf/anyOfãŠããªã³ã§ã¯ãªãããã©ãããªæåå enumïŒ"javascript" | "typescript"ïŒãšããŠå ¬éãããŸããlanguageã"typescript"ã®å ŽåãOpenClaw ã¯è©äŸ¡åã«ãã©ã³ã¹ãã€ã«ããŸããexecã¯importãrequireãåç importãã¢ãžã¥ãŒã«ããŒããŒãã¿ãŒã³ãæåŠããŸããexecã¯éåžžã®ã·ã§ã«execå®è£ ãååž°çã«å ¬éããããšã¯ãããŸããã- å€åŽã®ã³ãŒãã¢ãŒã
execããã¯ã€ãã³ãã¯toolKind: "code_mode_exec"ãštoolInputKind: "javascript" | "typescript"ïŒæ¢ç¥ã®å ŽåïŒãæã€ãããããªã·ãŒã¯åãããŒã«åãå ±æããã·ã§ã«åœ¢åŒã®execåŒã³åºããšã³ãŒãã¢ãŒãã»ã«ãåºå¥ã§ããŸãã
çµæ:
type CodeModeResult = CodeModeCompletedResult | CodeModeWaitingResult | CodeModeFailedResult; type CodeModeCompletedResult = { status: "completed"; value: unknown; output?: CodeModeOutput[]; telemetry: CodeModeTelemetry;}; type CodeModeWaitingResult = { status: "waiting"; runId: string; reason: "pending_tools" | "yield"; pendingToolCalls?: CodeModePendingToolCall[]; output?: CodeModeOutput[]; telemetry: CodeModeTelemetry;}; type CodeModeFailedResult = { status: "failed"; error: string; code?: CodeModeErrorCode; output?: CodeModeOutput[]; telemetry: CodeModeTelemetry;};exec ã¯ãQuickJS VM ãåéå¯èœãªç¶æ
ã§äžæããã¢ãã«ã«èŠããç¶ç¶ããŸã å¿
èŠãªå Žåã« waiting ãè¿ããŸããçµæã«ã¯ wait çšã® runId ãå«ãŸããŸããMCP åå空éåŒã³åºããå«ãåå空éããªããžåŒã³åºãã¯ãæºåãã§ããŠããéãåã exec/wait åŒã³åºãå
ã§èªåçã«ãã¬ã€ã³ããããããã³ã³ãã¯ããªã³ãŒããããã¯ã¯ãåå空éã® await ããšã«ã¢ãã«ããŒã«åŒã³åºãã 1 å匷å¶ããããšãªã MCP ããŒã«ãåŒã³åºããŸãã
exec ã¯ãã²ã¹ã VM ã«ä¿çäžã®äœæ¥ããªããOpenClaw ã®åºåã¢ããã¿ãŒãå®è¡ãããåŸã®æçµå€ã JSON äºæã§ããå Žåã«ã®ã¿ completed ãè¿ããŸãã
wait
wait ã¯ãäžæãããã³ãŒãã¢ãŒã VM ãç¶ç¶ããŸãã
å ¥å:
type CodeModeWaitInput = { runId: string;};åºå㯠exec ãè¿ãåã CodeModeResult ãŠããªã³ã§ãã
wait ãååšããã®ã¯ããã¹ãããã OpenClaw ããŒã«ãäœéã察話åŒãæ¿èªã²ãŒãä»ãããŸãã¯éšåçãªæŽæ°ãã¹ããªãŒã ããå¯èœæ§ãããããã¹ããå€éšäœæ¥ãåŸ
ã€éãã¢ãã«ã 1 ã€ã®é·ã exec åŒã³åºããéãããŸãŸã«ããå¿
èŠããªãããã«ããããã§ãã
QuickJS-WASI ã®ã¹ãããã·ã§ãã/埩å ãåéã¡ã«ããºã ã§ãã
execã¯ãå®äºã倱æããŸãã¯äžæãŸã§ã³ãŒããè©äŸ¡ããŸãã- äžææã«ãOpenClaw 㯠QuickJS VM ã®ã¹ãããã·ã§ãããååŸããä¿çäžã®ãã¹ãäœæ¥ãèšé²ããŸãã
- ä¿çäžã®äœæ¥ã確å®ãããšã
wait㯠VM ã¹ãããã·ã§ããã埩å ããå®å®ããååã§ãã¹ãã³ãŒã«ããã¯ãåç»é²ããŸãã - OpenClaw ã¯ãã¹ããããããŒã«çµæã埩å ããã VM ã«å±ããQuickJS ã®ä¿çäžãžã§ãããã¬ã€ã³ããŸãã
waitã¯completedãfailedããŸãã¯å¥ã®waitingçµæãè¿ããŸãã
ã¹ãããã·ã§ããã¯ã©ã³ã¿ã€ã ç¶æ ã§ããããŠãŒã¶ãŒã®ææç©ã§ã¯ãããŸãããããã»ã¹å ãããã«ã®ã¿ååšã (ããŒã¿ããŒã¹ããã£ã¹ã¯ãžã®æžã蟌ã¿ã¯ãããŸãã)ããµã€ãºå¶éããããæéåãã«ãªããäœæå ã®å®è¡ãšã»ãã·ã§ã³ã«ã¹ã³ãŒããããŸãã
wait ã¯æ¬¡ã®å Žåã« (failed çµæãšããŠ) 倱æããŸãã
runIdãäžæããŸãã¯ãã®ã¹ãããã·ã§ããããã§ã«æéåãã§ããã- åŒã³åºãå ããäžæãããå®è¡ãšåãå®è¡/ã»ãã·ã§ã³ã¹ã³ãŒãå ã«ããªãã
- ãã®
runIdã«å¯ŸããŠwaitããã§ã«å®è¡äžã§ããã - QuickJS-WASI ã®åŸ©å ã«å€±æããã
- åéãããš
maxOutputBytesãŸãã¯maxSnapshotBytesãè¶ ããã
ã²ã¹ãã©ã³ã¿ã€ã API
declare const ALL_TOOLS: ToolCatalogEntry[];declare const tools: ToolCatalog;declare const MCP: Record<string, unknown>;declare const namespaces: Record<string, unknown>; declare function text(value: unknown): void;declare function json(value: unknown): void;declare function yield_control(reason?: string): Promise<void>;ALL_TOOLS ã¯ãå®è¡ã¹ã³ãŒãã®ã«ã¿ãã°çšã®ã³ã³ãã¯ããªã¡ã¿ããŒã¿ã§ããããã©ã«ãã§ã¯å®å
šãªã¹ããŒããå«ã¿ãŸããã
type ToolCatalogEntry = { id: string; name: string; label?: string; description: string; source: "openclaw" | "mcp" | "client"; sourceName?: string;};Plugin ããŒã«ã¯ source: "openclaw" ã䜿çšããææãã Plugin id ã sourceName ã«èšå®ããŸããå¥åã® "plugin" ãœãŒã¹å€ã¯ãããŸãããsource: "mcp" ã¯ãsourceName/mcp ã¡ã¿ããŒã¿å
ã® MCP ãšã³ããªã«ã®ã¿äœ¿çšãããŸã (ãŸããALL_TOOLS/tools.* ãããã£ã«ã¿ãŒãããŸãã以äžãåç
§)ã
å®å šãªã¹ããŒãã¯å¿ èŠæã«ã®ã¿èªã¿èŸŒãŸããŸãã
type ToolCatalogEntryWithSchema = ToolCatalogEntry & { parameters: unknown;};ã«ã¿ãã°ãã«ããŒ:
type ToolCatalog = { search(query: string, options?: { limit?: number }): Promise<ToolCatalogEntry[]>; describe(id: string): Promise<ToolCatalogEntryWithSchema>; call(id: string, input?: unknown): Promise<unknown>; [safeToolName: string]: unknown;};䟿å©ãªããŒã«é¢æ°ã¯ãææ§ãã®ãªãå®å šãªååã«å¯ŸããŠã®ã¿ã€ã³ã¹ããŒã«ãããŸãã
const files = await tools.search("read local file");const fileRead = await tools.describe(files[0].id);const content = await tools.call(fileRead.id, { path: "README.md" }); // If the hidden catalog has an unambiguous `web_search` entry:const hits = await tools.web_search({ query: "OpenClaw code mode" });MCP ã«ã¿ãã°ãšã³ããªã¯ãã³ãŒãã¢ãŒãã§ã¯ tools.call(...) ã䟿å©é¢æ°ããåŒã³åºãããšã¯ã§ããŸãããçæããã MCP åå空éãéããŠã®ã¿å
¬éãããŸããTypeScript 圢åŒã®å®£èšãã¡ã€ã«ã¯èªã¿åãå°çšã® API ä»®æ³ãã¡ã€ã«ãµãŒãã§ã¹ããå©çšã§ããããããšãŒãžã§ã³ã㯠MCP ã¹ããŒããããã³ããã«è¿œå ããã« MCP ã·ã°ããã£ã調ã¹ãããŸãã
const files = await API.list("mcp");const githubApi = await API.read("mcp/github.d.ts"); const issue = await MCP.github.createIssue({ owner: "openclaw", repo: "openclaw", title: "Investigate gateway logs",}); const snapshot = await MCP.chromeDevtools.takeSnapshot({ output: "markdown" });const resource = await MCP.docs.resources.read({ uri: "memo://one" });const prompt = await MCP.docs.prompts.get({ name: "brief", arguments: { topic: "release" },});API.read("mcp/<server>.d.ts") ã¯ãMCP ããŒã«ã¡ã¿ããŒã¿ããæšè«ãããã³ã³ãã¯ããªå®£èšãè¿ããŸãã
type McpToolResult = { content?: unknown[]; structuredContent?: unknown; isError?: boolean; [key: string]: unknown;}; declare namespace MCP.github { /** Return this TypeScript-style API header. */ function $api(toolName?: string, options?: { schema?: boolean }): Promise<McpApiHeader>; /** * Create a GitHub issue. * @param owner Repository owner * @param repo Repository name * @param title Issue title */ function createIssue(input: { owner: string; repo: string; title: string; body?: string; }): Promise<McpToolResult>;}宣èšãã¡ã€ã«ã¯ä»®æ³ã§ãããã¯ãŒã¯ã¹ããŒã¹ãç¶æ
ãã£ã¬ã¯ããªã«ã¯æžã蟌ãŸããŸãããã³ãŒãã¢ãŒãã®å exec åŒã³åºãã«ã€ããŠãOpenClaw ã¯å®è¡ã¹ã³ãŒãã®ããŒã«ã«ã¿ãã°ãæ§ç¯ãã衚瀺å¯èœãª MCP ãšã³ããªãä¿æãã衚瀺å¯èœãªãµãŒããŒããšã« mcp/index.d.ts ãš 1 ã€ã® mcp/<server>.d.ts ãã¬ã³ããŒãããã®å°ããªèªã¿åãå°çšããŒãã«ã QuickJS ã¯ãŒã«ãŒã«æ³šå
¥ããŸããã²ã¹ãã³ãŒãã«èŠããã®ã¯ API ãªããžã§ã¯ãã®ã¿ã§ããAPI.list(prefix?) ã¯ãã¡ã€ã«ã¡ã¿ããŒã¿ãè¿ããAPI.read(path) ã¯éžæããã宣èšã³ã³ãã³ããè¿ããŸããäžæãªãã¹ããã³ ./.. ã»ã°ã¡ã³ãã¯æåŠãããŸãã
ããã«ããã倧ã㪠MCP ã¹ããŒããã¢ãã«ããã³ããããé€å€ã§ããŸãããšãŒãžã§ã³ã㯠exec ããŒã«ã®èª¬æããä»®æ³ API ãååšããããšãç¥ããå¿
èŠãªå®£èšãã¡ã€ã«ã ããèªã¿åãããã®åŸ 1 ã€ã®ãªããžã§ã¯ãåŒæ°ã§ MCP.<server>.<tool>() ãåŒã³åºããŸããMCP.<server>.$api() ã¯ãããã°ã©ã å
ã§åäžããŒã«ã®ã¹ããŒãå¿çãåŸãããã®ã€ã³ã©ã€ã³ãã©ãŒã«ããã¯ãšããŠåŒãç¶ãå©çšã§ããŸãã
ã²ã¹ãã©ã³ã¿ã€ã ããã¹ããªããžã§ã¯ããçŽæ¥èŠãããšã¯ãããŸãããå ¥åãšåºåã¯ãæç€ºçãªãµã€ãºäžéä»ãã® JSON äºæå€ãšããŠããªããžãè¶ããŸãã
å éšåå空é
å
éšåå空éã¯ãã¢ãã«ã«èŠããããŒã«ãå¢ãããã«ãã³ãŒãã¢ãŒããžç°¡æœãªãã¡ã€ã³ API ãæäŸããŸããããŒããŒææã®ã€ã³ãã°ã¬ãŒã·ã§ã³ã Issues ã Calendar ãªã©ã®åå空éãç»é²ããŸãããã®åŸã²ã¹ãã³ãŒã㯠QuickJS ããã°ã©ã å
ã§ãã®åå空éãåŒã³åºããã¢ãã«ã«ã¯åŒãç¶ã exec ãš wait ã ããèŠããŸãã
åå空éã¯çŸæç¹ã§ã¯å éšçšã§ããå ¬é Plugin SDK åå空é API ã¯ãããŸãããå€éš Plugin åå空éã«ã¯ãPlugin ã®ã¢ã€ãã³ãã£ãã£ãã€ã³ã¹ããŒã«æžã¿ãããã§ã¹ããèªèšŒç¶æ ããã£ãã·ã¥ãããã«ã¿ãã°èšè¿°åãããã®åå空éãæ¯ãã Plugin ããŒã«ãããããªãããã«ãããããããŒããŒææã®å¥çŽãå¿ èŠã§ããã³ã¢ã³ãŒãã¢ãŒããææããã®ã¯ããµã³ãããã¯ã¹ãã·ãªã¢ã©ã€ãºãã«ã¿ãã°ã²ãŒããããªããžãã£ã¹ãããã®ã¿ã§ãã
ã²ã¹ãã³ãŒãã¯ãçŽæ¥ã®ã°ããŒãã«ãŸã㯠namespaces ãããã®ã©ã¡ãã䜿çšã§ããŸãã
const open = await Issues.list({ state: "open" });const alsoOpen = await namespaces.Issues.list({ state: "open" });return { count: open.length, alsoCount: alsoOpen.length };ã¬ãžã¹ããªã©ã€ããµã€ã¯ã«
åå空éã¬ãžã¹ããªã¯ããã»ã¹ããŒã«ã«ã§ãåå空é id ãããŒã«ããŸãã
- ä¿¡é Œæžã¿ããŒããŒã
registerCodeModeNamespaceForPlugin(pluginId, registration)ãåŒã³åºããŸãã - ã³ãŒãã¢ãŒãã¯ãå®è¡çšã®é ã
ToolSearchRuntimeãäœæãããã®å®è¡ã¹ã³ãŒãã®ã«ã¿ãã°ãèªã¿åããŸãã createCodeModeNamespaceRuntime(ctx, catalog)ã¯ãrequiredToolNamesããã¹ãŠè¡šç€ºå¯èœã§ãåãpluginIdã«ææãããŠããç»é²ã ããä¿æããŸãã- 衚瀺å¯èœãªååå空éã¯ãçŸåšã®å®è¡ã«å¯ŸããŠ
createScope(ctx)ãåŒã³åºããagentIdãsessionKeyãsessionIdãrunIdãconfigãäžæ¢ç¶æ ãªã©ã®å®è¡ã³ã³ããã¹ããåãåããŸãã - ã¹ã³ãŒãããŒã¿ã¯ãã¬ãŒã³ãªèšè¿°åã«ã·ãªã¢ã©ã€ãºãããçŽæ¥ã®ã°ããŒãã«ããã³
namespaces.<globalName>ãšã㊠QuickJS ã«æ³šå ¥ãããŸãã - ã²ã¹ãåŒã³åºãã¯ã¯ãŒã«ãŒããªããžãéããŠäžæãããã¹ãäžã§åå空éãã¹ã解決ãããã®åŒã³åºããå®£èšæžã¿ã® Plugin ææã«ã¿ãã°ããŒã«ã«ããããã
ToolSearchRuntime.callExactIdãéããŠãã®ããŒã«ãå®è¡ããŸãã - æºåãã§ããŠããåå空éããªããžåŒã³åºãã¯ãã¢ã¯ãã£ããª
exec/waitåŒã³åºãå ã§èªåçã«ãã¬ã€ã³ãããŸããã¿ã€ã ã¢ãŠãæã«åå空éäœæ¥ããŸã ä¿çäžã®å ŽåããŸãã¯ã²ã¹ããæç€ºçã« yield ããå ŽåãwaitãåŸã§åãåå空éã©ã³ã¿ã€ã ãåéããŸãã - Plugin ã®ããŒã«ããã¯ãŸãã¯ã¢ã³ã€ã³ã¹ããŒã«ã¯
clearCodeModeNamespacesForPlugin(pluginId)ãåŒã³åºãã倱æãã Plugin ããŒãåŸã«å€ãã°ããŒãã«ãæ®ããªãããã«ããŸãã
åå空éåŒã³åºãã¯ã«ã¿ãã°ããŒã«åŒã³åºãã§ããtools.call(...) ãšåãããªã·ãŒããã¯ãæ¿èªãäžæ¢åŠçããã¬ã¡ããªããã©ã³ã¹ã¯ãªããæåœ±ãäžæ/åéåäœã䜿çšããŸãã
ç»é²åœ¢ç¶
ãããã³ã°ããŒã«ãææããã€ã³ãã°ã¬ãŒã·ã§ã³ããåå空éãç»é²ããŸããã¹ã³ãŒãã¯å°ããä¿ã¡ãå®£èšæžã¿ã«ã¿ãã°ããŒã«ã«ããããããã¡ã€ã³åè©ã ããå ¬éããŠãã ããã
createCodeModeNamespaceTool, registerCodeModeNamespaceForPlugin,} from "../agents/code-mode-namespaces.js"; const pluginId = "github"; registerCodeModeNamespaceForPlugin(pluginId, { id: "github-issues", globalName: "Issues", description: "GitHub issue helpers for the current repository.", requiredToolNames: ["github_list_issues", "github_update_issue"], prompt: "Use Issues.list(params) and Issues.update(number, patch).", createScope: (ctx) => ({ repository: ctx.config, list: createCodeModeNamespaceTool("github_list_issues", ([params]) => params ?? {}), update: createCodeModeNamespaceTool("github_update_issue", ([number, patch]) => ({ number, patch, })), }),});createCodeModeNamespaceTool(toolName, inputMapper) ã¯ãã¹ã³ãŒãã¡ã³ããŒãåŒã³åºãå¯èœãªåå空é颿°ãšããŠããŒã¯ããŸããä»»æã® inputMapper ã¯ã²ã¹ãåŒæ°ãåãåãããããã³ã°ã«ã¿ãã°ããŒã«çšã®å
¥åãªããžã§ã¯ããè¿ããŸããæå®ããªãå Žåã¯ãæåã®ã²ã¹ãåŒæ°ã䜿çšãããæªæå®æã¯ {} ã«ãªããŸãã
çã®ãã¹ã颿°ã¯ãã²ã¹ãã³ãŒããå®è¡ãããåã«æåŠãããŸãã
createScope: () => ({ // Wrong: this bypasses the catalog tool lifecycle and will be rejected. list: async () => githubClient.listIssues(),});æææš©ãšå¯èŠæ§
åå空éã®æææš©ã¯ãç»é²åŒã³åºãå
ã® pluginId ã«çµã³ä»ããããŸããrequiredToolNames ã¯å¯èŠæ§ã²ãŒãã§ãããšåæã«æææš©ãã§ãã¯ã§ããããŸãã
- å¿ é ããŒã«ã¯ãã¹ãŠå®è¡ã«ã¿ãã°å ã«ååšããªããã°ãªããªã
- å¿
é ããŒã«ã¯ãã¹ãŠ
sourceName === pluginIdã§ãªããã°ãªããªã - å¿ é ããŒã«ãååšããªãããŸãã¯å¥ã® Plugin ã«ææãããŠããå Žåãåå空éã¯é衚瀺ã«ãªã
- ååŒã³åºãå¯èœãã¹ã¯ã
requiredToolNamesã«å«ãŸããååã®ããŒã«ã®ã¿ã察象ã«ã§ãã
ããã«ãããå¥ã® Plugin ãååããŒã«ãç»é²ããŠåå空éãå ¬éããããšãé²ããåå空éãéåžžã®ãšãŒãžã§ã³ãããªã·ãŒãšæŽåãããŸããå®è¡ããããã³ã°ããŒã«ãèŠãããªãå Žåããã®åå空éãèŠãããŸããã
ããšãã°ãGitHub åå空éã¯ãGitHub èªèšŒãREST/GraphQL ã¯ã©ã€ã¢ã³ããã¬ãŒãå¶éãæžãèŸŒã¿æ¿èªããã¹ããææãã GitHub ææã® Plugin ã®èåŸã«çœ®ãã¹ãã§ããã³ã¢ã³ãŒãã¢ãŒãã¯ãGitHub åºæã® APIãããŒã¯ã³åŠçããããã€ããŒããªã·ãŒãåã蟌ãã¹ãã§ã¯ãããŸããã
ã¹ã³ãŒãã·ãªã¢ã©ã€ãºã«ãŒã«
createScope(ctx) ã¯ãJSON äºæå€ãé
åããã¹ãããããªããžã§ã¯ããcreateCodeModeNamespaceTool(...) åŒã³åºãããŒã«ãŒãå«ããã¬ãŒã³ãªããžã§ã¯ããè¿ããŸãããã¹ããªããžã§ã¯ãã QuickJS ã«çŽæ¥å
¥ãããšã¯ãããŸããã
ã·ãªã¢ã©ã€ã¶ãŒã¯æ¬¡ãæåŠããŸãã
- çã®é¢æ°
- 埪ç°ãªããžã§ã¯ãã°ã©ã
- å®å
šã§ãªããã¹ã»ã°ã¡ã³ã:
__proto__ãconstructorãprototypeã空ããŒããŸãã¯å éšãã¹åºåãæåãå«ãã㌠- JavaScript èå¥åã§ã¯ãªã
globalNameå€ toolsãnamespacesãtextãjsonãyield_controlãMCPãAPIãALL_TOOLSã__openclaw*ãªã©ã®çµã¿èŸŒã¿ã³ãŒãã¢ãŒãã°ããŒãã«ãšã®globalNameè¡çª
JSON ã«ã·ãªã¢ã©ã€ãºã§ããªãå€ã¯ãããªããžãè¶ããåã« JSON ã»ãŒããªãã©ãŒã«ããã¯å€ãžå€æãããŸãããã€ããªããŒã¿ããã³ãã«ããœã±ãããã¯ã©ã€ã¢ã³ããã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ã¯ãéåžžã®ã«ã¿ãã°ããŒã«ã®èåŸã«çããŠãã ããã
ããã³ãã
åå空éã® description ãšä»»æã® prompt ã¯ããã®å®è¡ã§åå空éã衚瀺ãããå Žåã«ã®ã¿ãã¢ãã«ã«è¡šç€ºããã exec ã¹ããŒããžè¿œå ãããŸããæå°éã§æçšãªãµãŒãã§ã¹ãæããããã«äœ¿ããŸãã
{ description: "Fiction production service helpers.", prompt: "Use Fictions.riskAudit(), Fictions.promoteIfReady(id, status), and Fictions.unpaidOver(amount).",}ããã³ããã¯ãèªèšŒã»ããã¢ãããå®è£ å±¥æŽãç¡é¢ä¿ãªPluginåäœã§ã¯ãªããåå空éã®å¥çŽã«é¢ãããã®ã«ããŠãã ããã
ã¯ãªãŒã³ã¢ãã
åå空éã¯ããã»ã¹ããŒã«ã«ãªç»é²ã§ããææå ã®Pluginãç¡å¹åãã¢ã³ã€ã³ã¹ããŒã«ããŸãã¯ããŒã«ããã¯ããããåé€ããŸãã
clearCodeModeNamespacesForPlugin(pluginId);ã³ãŒãã¢ãŒãã®ã¯ãªãŒã³ã¢ããã¯PluginãææããŸããåå空éããšã®ãã£ã¢ããŠã³ãã³ãã«ãä¿æããã®ã§ã¯ãªããã©ã€ããµã€ã¯ã«ãçµäºãããšãã«ãã®Pluginã®åå空éç»é²ãã¯ãªã¢ããŠãã ããããã¹ãã§ã¯ clearCodeModeNamespacesForTest() ãåŒã³åºããŠãã±ãŒã¹éã§ç»é²ãæŒããã®ãé¿ããããŸãã
ãã¹ããã§ãã¯ãªã¹ã
åå空éã®å€æŽã§ã¯ãã»ãã¥ãªãã£å¢çãšã²ã¹ãã®åäœãã«ããŒããå¿ èŠããããŸãã
- åå空éã®ããã³ããããã¹ãã¯ãè£ä»ããšãªãããŒã«ã衚瀺ãããŠããå Žåã«ã®ã¿çŸãã
- å¥ã®
sourceNameã«ããååããŒã«ã¯åå空éãå ¬éããªã - çã®ã¹ã³ãŒã颿°ã¯æåŠããã
- åœé ãããåå空é ID ãšåœé ããããã¹ã¯æåŠããã
- åŒã³åºãå¯èœãªãã¹ã¯æªå®£èšã®ããŒã«ã察象ã«ã§ããªã
- ãã¹ãããããªããžã§ã¯ããšå ±æåç §ãæ£ããã·ãªã¢ã©ã€ãºããã
- åå空éåŒã³åºãã¯ã«ã¿ãã°ããŒã«ãéããŠå®è¡ãããJSON ã»ãŒããªè©³çްãè¿ã
- 倱æã¯ã²ã¹ãã³ãŒãã§ææã§ãã
- äžæãããåå空éåŒã³åºãã¯
waitãéããŠåéããã - Pluginã®ããŒã«ããã¯ã¯ææå ã®åå空éç»é²ãã¯ãªã¢ãã
åå空éã¯æ±çšã® tools.search/tools.call ã«ã¿ãã°ãè£å®ããŸããä»»æã®æå¹åæžã¿OpenClawãPluginãã¯ã©ã€ã¢ã³ãããŒã«ã«ã¯ã«ã¿ãã°ã䜿ããMCP ããŒã«ã«ã¯ MCP ã䜿ããç¹°ãè¿ãã¹ããŒããæ€çŽ¢ããããç°¡æœãªã³ãŒãã®ã»ããä¿¡é Œã§ãããPluginææã®ææžåããããã¡ã€ã³ API ã«ã¯ä»ã®åå空éã䜿ããŸãã
åºå API
text(value)ã¯äººéãèªããåºåãoutputé åã«è¿œå ããŸããjson(value)㯠JSON äºæã®ã·ãªã¢ã©ã€ãºåŸã«æ§é åãããåºåé ç®ã远å ããŸãã- ã²ã¹ãã³ãŒãã®æçµæ»ãå€ã¯ã
completedçµæå ã®valueã«ãªããŸãã
type CodeModeOutput = { type: "text"; text: string } | { type: "json"; value: unknown };ã«ãŒã«: åºåé ã¯ã²ã¹ãã®åŒã³åºããšäžèŽããŸããåºå㯠maxOutputBytes ã§äžéèšå®ãããŸããã·ãªã¢ã©ã€ãºã§ããªãå€ã¯ãã¬ãŒã³æååãŸãã¯ãšã©ãŒã«å€æãããŸãããã€ããªå€ã¯ãµããŒããããŸãããç»åãšãã¡ã€ã«ã¯éåžžã®OpenClawããŒã«ãéããŠæž¡ãããã³ãŒãã¢ãŒãããªããžã¯éããŸããã
ããŒã«ã«ã¿ãã°
é ãã«ã¿ãã°ã«ã¯ãæå¹ãªããªã·ãŒãã£ã«ã¿ãªã³ã°åŸã®ããŒã«ã次ã®é åºã§å«ãŸããŸããOpenClawã³ã¢ããŒã«ããã³ãã«PluginããŒã«ãå€éšPluginããŒã«ãMCP ããŒã«ããã®åŸã«çŸåšã®å®è¡åãã®ã¯ã©ã€ã¢ã³ãæäŸããŒã«ã§ãã
ã«ã¿ãã° ID 㯠1 åã®å®è¡å ã§å®å®ããŠãããå¯èœãªå Žåã¯åçã®ããŒã«ã»ããéã§æ±ºå®çã§ããå®éã®åœ¢ç¶:
<source>:<owner>:<tool-name>ããã§ <source> 㯠openclawãmcpããŸã㯠client ã§ãïŒPluginããŒã«ã¯ <owner> ãšããŠPlugin ID ãæã€ openclaw ã䜿ããã³ã¢ããŒã«ã¯ openclaw:core:* ã䜿ããŸãïŒãäŸ:
openclaw:core:messageopenclaw:browser:browser_requestmcp:github:create_issueclient:app:select_fileã«ã¿ãã°ã¯ã³ãŒãã¢ãŒãå¶åŸ¡ããŒã«ãçç¥ããŸã: execãwaitãtool_search_codeãtool_searchãtool_describeãtool_callãããã«ããååž°ãé²ããã¢ãã«åãã®å¥çŽãçãä¿ã¡ãŸãã
MCP ãšã³ããªã¯å®è¡ã¹ã³ãŒãã®ã«ã¿ãã°ã«æ®ããããããªã·ãŒãæ¿èªãããã¯ããã¬ã¡ããªããã©ã³ã¹ã¯ãªããæåœ±ãæ£ç¢ºãªããŒã« ID ãéåžžã®ããŒã«å®è¡ãšå
±æãããŸããã²ã¹ãåãã® ALL_TOOLSãtools.search(...)ãtools.describe(...)ãtools.call(...) ãã¥ãŒã§ã¯ MCP ãšã³ããªãçç¥ããŸããçæããã MCP.<server>.<tool>({ ...input }) åå空éã¯æ£ç¢ºãªã«ã¿ãã° ID ã«è§£æ±ºãããåããšã°ãŒãã¥ãŒã¿ãã¹ãéããŠãã£ã¹ããããããŸãã
ããŒã«æ€çŽ¢ãšã®çžäºäœçš
ã³ãŒãã¢ãŒãã¯ãæå¹ãªå®è¡ã§ã¯OpenClawã®ããŒã«æ€çŽ¢ã¢ãã«ãµãŒãã§ã¹ã«åã£ãŠä»£ãããŸãã
tools.codeMode.enabled ã true ã§ã³ãŒãã¢ãŒããã¢ã¯ãã£ãåããããš:
- OpenClaw ã¯
tool_search_codeãtool_searchãtool_describeããŸãã¯tool_callãã¢ãã«ã«è¡šç€ºãããããŒã«ãšããŠå ¬éããªãã - åãã«ã¿ãã°åã®èãæ¹ãã²ã¹ãã©ã³ã¿ã€ã å ãžç§»ãã
- ã²ã¹ãã©ã³ã¿ã€ã ã¯ãé MCP ããŒã«åãã«ã³ã³ãã¯ããª
ALL_TOOLSã¡ã¿ããŒã¿ãšæ€çŽ¢/説æ/åŒã³åºããã«ããŒãåãåãã - MCP åŒã³åºãã¯ã
tools.call(...)ã§ã¯ãªããçæãããMCPåå空éãšãã®$api()ããããŒã䜿ãã - ãã¹ããããåŒã³åºãã¯ãããŒã«æ€çŽ¢ã䜿ãã®ãšåãOpenClawãšã°ãŒãã¥ãŒã¿ãã¹ãéããŠãã£ã¹ããããããã
æå¹ãªå®è¡ã§ã³ãŒãã¢ãŒããåã£ãŠä»£ããOpenClawã®ã³ã³ãã¯ãã«ã¿ãã°ããªããžã«ã€ããŠã¯ãããŒã«æ€çŽ¢ãåç §ããŠãã ããã
ããŒã«åãšè¡çª
ã¢ãã«ã«è¡šç€ºããã exec ããŒã«ã¯ã³ãŒãã¢ãŒãããŒã«ã§ããéåžžã®OpenClawã·ã§ã« exec ããŒã«ãæå¹ãªå Žåãããã¯ã¢ãã«ããé ãããä»ã®ããŒã«ãšåæ§ã«ã«ã¿ãã°åãããŸãã
ã²ã¹ãã©ã³ã¿ã€ã å ã§ã¯:
- ããªã·ãŒã§èš±å¯ãããŠããã°ã
tools.call("openclaw:core:exec", input)ã¯ã·ã§ã« exec ããŒã«ãåŒã³åºããã tools.exec(...)ã¯ãã·ã§ã« exec ã«ã¿ãã°ãšã³ããªã«ææ§ã§ãªãå®å šãªååãããå Žåã«ã®ã¿ã€ã³ã¹ããŒã«ãããã- ã³ãŒãã¢ãŒãã®
execããŒã«ã¯ãtoolsãéããŠååž°çã«å©çšã§ããªãã
2 ã€ã®ããŒã«ãåãå®å
šãªå©äŸ¿åã«æ£èŠåãããå ŽåãOpenClaw ã¯å©äŸ¿é¢æ°ãçç¥ããtools.call(id, input) ãèŠæ±ããŸãã
ãã¹ããããããŒã«å®è¡
ãã¹ãŠã®ãã¹ããããããŒã«åŒã³åºãã¯ãã¹ãããªããžãè¶ããŠOpenClawã«åå
¥ããæ¬¡ãä¿æããŸã: ã¢ã¯ãã£ããªãšãŒãžã§ã³ã IDãã»ãã·ã§ã³ ID ãšããŒãéä¿¡è
ãšãã£ãã«ã®ã³ã³ããã¹ãããµã³ãããã¯ã¹ããªã·ãŒãæ¿èªããªã·ãŒãPlugin before_tool_call ããã¯ãäžæ¢ã·ã°ãã«ãå©çšå¯èœãªå Žåã®ã¹ããªãŒãã³ã°æŽæ°ãè»è·¡/ç£æ»ã€ãã³ãã
ãã¹ããããåŒã³åºãã¯å®éã®ããŒã«åŒã³åºããšããŠãã©ã³ã¹ã¯ãªããã«æåœ±ãããããããµããŒããã³ãã«ã¯äœãèµ·ãããã瀺ããŸãããã®æåœ±ã§ã¯ã芪ã®ã³ãŒãã¢ãŒãããŒã«åŒã³åºããšãã¹ããããããŒã« ID ãèå¥ãããŸãã
䞊åã®ãã¹ããããåŒã³åºãã¯ãmaxPendingToolCalls ãŸã§èš±å¯ãããŸãã
å®è¡ãšã¹ãããã·ã§ããã®ã©ã€ããµã€ã¯ã«
åã³ãŒãã¢ãŒãå®è¡ã¯ãrunId ãããŒãšããããã»ã¹å
ãããã§è¿œè·¡ãããŸãïŒãã£ã¹ã¯ãããŒã¿ããŒã¹ã«ã¯æ°žç¶åãããŸããïŒãexec/wait ã¯ãcompletedãwaitingãfailed ã® 3 ã€ã®çµæã¹ããŒã¿ã¹ã®ãããããè¿ããŸãã
waitingçµæã¯ãwaitãåéãããæéåãã«ãªããŸã§ãQuickJS ã¹ãããã·ã§ãããä¿çäžã®ããªããžãªã¯ãšã¹ããã¹ã³ãŒãã¡ã¿ããŒã¿ïŒãšãŒãžã§ã³ãå®è¡ IDãã»ãã·ã§ã³ ID/ããŒïŒãä¿åããã- æéåããã»ãã·ã§ã³éããå®è¡éããäžæ/ãã§ã«åéäžã®
runIdå€ã¯ãåå¥ã®çµç«¯ã¹ããŒã¿ã¹ãçæããªããcode mode run is unavailable or expired.ãcode mode run belongs to a different session.ã®ãããªã¡ãã»ãŒãžã䌎ãfailedçµæïŒcode: "invalid_input"ïŒãšããŠè¡šé¢åããã - å®è¡ã®ã¹ãããã·ã§ããã¯ã
completedãŸãã¯failedã«èœã¡çããæç¹ã§ãããããåé€ãããããGateway ã·ã£ããããŠã³æã«ç Žæ£ãããïŒåèµ·ååŸã«ã¯èšèšäžäœãæ®ããªããããã¯äžæçãªã©ã³ã¿ã€ã ç¶æ ïŒã - OpenClaw ã¯ããã»ã¹ããšã®åæäžæå®è¡æ°ã 64 ã«å¶éãããã®äžéãè¶
ããæ°ããäžæã
too many suspended code mode runs.ã§æåŠããã
ã¹ãããã·ã§ããã¹ãã¬ãŒãžã¯ãå®è¡ããšã® maxSnapshotBytesãäžèšã®ããã»ã¹ããšã®äžæå®è¡æ°äžéãsnapshotTtlSeconds ã«ãã£ãŠå¶éãããŸãã
QuickJS-WASI ã©ã³ã¿ã€ã
OpenClaw ã¯ææããã±ãŒãžã®çŽæ¥äŸåé¢ä¿ãšã㊠quickjs-wasi ãèªã¿èŸŒã¿ãŸããç¡é¢ä¿ãªäŸåé¢ä¿ã®ããã«ã€ã³ã¹ããŒã«ãããæšç§»çã³ããŒã«ã¯äŸåããŸããã
ã©ã³ã¿ã€ã ã®è²¬å: QuickJS-WASI WebAssembly ã¢ãžã¥ãŒã«ãã³ã³ãã€ã«/èªã¿èŸŒã¿ãããã³ãŒãã¢ãŒãå®è¡ãŸãã¯åéããšã« 1 ã€ã®åé¢ VM ãäœæãããå®å®ããååã§ãã¹ãã³ãŒã«ããã¯ãç»é²ãããã¡ã¢ãªå¶éãšå²ã蟌ã¿å¶éãèšå®ãããJavaScript ãè©äŸ¡ãããä¿çäžã®ãžã§ããæåºãããäžæããã VM ç¶æ
ãã¹ãããã·ã§ããåãããwait çšã«ã¹ãããã·ã§ããã埩å
ãããçµç«¯ç¶æ
åŸã« VM ãã³ãã«ãšã¹ãããã·ã§ãããç Žæ£ããã
ã©ã³ã¿ã€ã ã¯OpenClawã®ã¡ã€ã³ã€ãã³ãã«ãŒãã®å€åŽãNode.js ã¯ãŒã«ãŒã¹ã¬ããå ã§å®è¡ãããŸããã²ã¹ãã®ç¡éã«ãŒãã Gateway ããã»ã¹ãç¡æéã«ãããã¯ããŠã¯ãªããŸãããã¯ãŒã«ãŒã®å²ã蟌ã¿ãã³ãã©ãŒã¯ãã²ã¹ãã³ãŒãã®å調ãšã¯ç¬ç«ããŠã宿éã¿ã€ã ã¢ãŠãã匷å¶ããŸãã
TypeScript
TypeScript ãµããŒãã¯ãœãŒã¹å€æã®ã¿ã§ããåãä»ããå
¥å㯠1 ã€ã®TypeScriptã³ãŒãæååã§ãåºå㯠QuickJS-WASI ã«ãã£ãŠè©äŸ¡ãããJavaScriptæååã§ããåãã§ãã¯ãã¢ãžã¥ãŒã«è§£æ±ºãimport/require ã¯ãããŸããã蚺æã¯ failed çµæãšããŠè¿ãããŸãã
TypeScript ã³ã³ãã€ã©ã¯TypeScriptã»ã«ã«å¯ŸããŠã®ã¿é å»¶èªã¿èŸŒã¿ãããŸãããã¬ãŒã³JavaScriptã»ã«ãšç¡å¹åãããã³ãŒãã¢ãŒãã§ã¯èªã¿èŸŒãŸããŸããã
ã»ãã¥ãªãã£å¢ç
ã¢ãã«ã³ãŒãã¯æµå¯Ÿçã§ããã©ã³ã¿ã€ã ã¯å€å±€é²åŸ¡ã䜿ããŸãã
- ã¡ã€ã³ã€ãã³ãã«ãŒãã®å€åŽãã¯ãŒã«ãŒã¹ã¬ããå ã§ QuickJS-WASI ãå®è¡ãã
- Codex ãæšç§»çããã±ãŒãžçµç±ã§ã¯ãªããçŽæ¥äŸåé¢ä¿ãšããŠ
quickjs-wasiãèªã¿èŸŒã - ã²ã¹ãå ã«ãã¡ã€ã«ã·ã¹ãã ããããã¯ãŒã¯ããµãããã»ã¹ãã¢ãžã¥ãŒã« importãç°å¢å€æ°ããã¹ãã°ããŒãã«ãªããžã§ã¯ãã¯ãªã
- QuickJS ã®ã¡ã¢ãªå¶éãšå²ã蟌ã¿å¶éã«å ãã芪ããã»ã¹ã®å®æéã¿ã€ã ã¢ãŠãã䜿ã
- åºåãã¹ãããã·ã§ããããã°ãä¿çäžåŒã³åºãã®äžéã匷å¶ãã
- çã JSON ã¢ããã¿ãŒãéããŠãã¹ãããªããžå€ãã·ãªã¢ã©ã€ãºãã
- ãã¹ããšã©ãŒããã¬ãŒã³ãªã²ã¹ããšã©ãŒã«å€æãããã¹ãã¬ã«ã ã®ãªããžã§ã¯ãã¯æž¡ããªã
- ã¿ã€ã ã¢ãŠããäžæ¢ãã»ãã·ã§ã³çµäºãæéåãæã«ã¹ãããã·ã§ãããç Žæ£ãã
execãwaitãããŒã«æ€çŽ¢å¶åŸ¡ããŒã«ãžã®ååž°ã¢ã¯ã»ã¹ãæåŠãã- å©äŸ¿åã®è¡çªãã«ã¿ãã°ãã«ããŒãã·ã£ããŒã€ã³ã°ããã®ãé²ã
ãµã³ãããã¯ã¹ã¯ 1 ã€ã®ã»ãã¥ãªãã£å±€ã§ããé«ãªã¹ã¯ã®ãããã€ã§ã¯ãéçšè ã OS ã¬ãã«ã®åŒ·åãå¿ èŠãšããå ŽåããããŸãã
ãšã©ãŒã³ãŒã
type CodeModeErrorCode = | "invalid_input" | "runtime_unavailable" | "timeout" | "output_limit_exceeded" | "snapshot_limit_exceeded" | "internal_error";invalid_input ã¯ãäžæ£ãª exec/wait åŒæ°ãç¡å¹åãããèšèªãæåŠãããã¢ãžã¥ãŒã«ã¢ã¯ã»ã¹ãTypeScript 倿倱æãäžæ/æéåã/ã¹ã³ãŒãéãã® runId å€ãéå°ãªäžæå®è¡ãã«ããŒããŸããruntime_unavailable ã¯ãQuickJS ã¯ãŒã«ãŒãèµ·åã«å€±æããããéãŒãã§çµäºããå Žåãã«ããŒããŸãã
ã²ã¹ãã«è¿ããããšã©ãŒã¯ãã¬ãŒã³ããŒã¿ã§ãããã¹ãã® Error ã€ã³ã¹ã¿ã³ã¹ãã¹ã¿ãã¯ãªããžã§ã¯ãããããã¿ã€ãããã¹ã颿°ã¯ QuickJS ã«å
¥ããŸããã
ãã¬ã¡ããª
åçµæã® telemetry ãã£ãŒã«ãã¯ãé ãã«ã¿ãã°ãµã€ãºãšãœãŒã¹å¥å
èš³ïŒopenclaw/mcp/client ã®ä»¶æ°ïŒãå®è¡ã«ã¿ãã°ã«å¯Ÿãã环ç©ã®æ€çŽ¢/説æ/åŒã³åºãä»¶æ°ãã¢ãã«ã«è¡šç€ºãããããŒã«åïŒexecãwaitïŒãå ±åããŸãã
ãã¬ã¡ããªã«ã¯ãæ¢åã®OpenClawè»è·¡ããªã·ãŒãè¶ ããç§å¯æ å ±ãçã®ç°å¢å€ãæªç·šéã®ããŒã«å ¥åãå«ããŠã¯ãªããŸããã
ãããã°
ã³ãŒãã¢ãŒããéåžžã®ããŒã«å®è¡ãšç°ãªãåäœãããå Žåã¯ã察象ãçµã£ãã¢ãã«è»¢éãã°ã䜿ããŸãã
OPENCLAW_DEBUG_CODE_MODE=1 \OPENCLAW_DEBUG_MODEL_TRANSPORT=1 \OPENCLAW_DEBUG_MODEL_PAYLOAD=tools \OPENCLAW_DEBUG_SSE=events \openclaw gatewayãã€ããŒã圢ç¶ã®ãããã°ã«ã¯ãOPENCLAW_DEBUG_MODEL_PAYLOAD=full-redacted ã䜿ããŸããããã¯ãã¢ãã«ãªã¯ãšã¹ãã®äžéä»ãã§ç·šéæžã¿ã® JSON ã¹ãããã·ã§ããããã°ã«èšé²ããŸããããã³ãããã¡ãã»ãŒãžããã¹ãããŸã çŸããå¯èœæ§ãããããããããã°äžã®ã¿äœ¿ã£ãŠãã ããã
ã¹ããªãŒã ã®ãããã°ã«ã¯ãOPENCLAW_DEBUG_SSE=peek ã䜿ã£ãŠæåã® 5 ä»¶ã®ç·šéæžã¿ SSE ã€ãã³ãããã°ã«èšé²ããŸããã³ãŒãã¢ãŒãã®ãµãŒãã§ã¹ãã¢ã¯ãã£ãåãããåŸãæçµçãªãããã€ããŒãã€ããŒãã« exec ãš wait ãæ£ç¢ºã«å«ãŸããŠããªãå Žåãã³ãŒãã¢ãŒãããã§ã€ã«ã¯ããŒãºããŸãã
å®è£ ã¬ã€ã¢ãŠã
- config å¥çŽ:
tools.codeMode - ã«ã¿ãã°ãã«ããŒ: æå¹ãªããŒã«ãã³ã³ãã¯ããšã³ããªãš ID ããããž
- ã¢ãã«ãµãŒãã§ã¹ã¢ããã¿ãŒ: 衚瀺ããŒã«ã
execãšwaitã«çœ®ãæãã - QuickJS-WASI ã©ã³ã¿ã€ã ã¢ããã¿ãŒ: èªã¿èŸŒã¿ãevalãã¹ãããã·ã§ããã埩å ãç Žæ£
- ã¯ãŒã«ãŒã¹ãŒããŒãã€ã¶ãŒ: ã¿ã€ã ã¢ãŠããäžæ¢ãã¯ã©ãã·ã¥åé¢
- ããªããžã¢ããã¿ãŒ: JSON ã»ãŒããªãã¹ãã³ãŒã«ããã¯ãšçµæé ä¿¡
- TypeScript 倿ã¢ããã¿ãŒ
- ã¹ãããã·ã§ããã¹ãã¢: TTLããµã€ãºäžéãå®è¡/ã»ãã·ã§ã³ã¹ã³ãŒã
- ãã¹ããããããŒã«åŒã³åºãã®è»è·¡æåœ±
- ãã¬ã¡ããªã«ãŠã³ã¿ãŒãšèšºæ
å®è£
ã¯ããŒã«æ€çŽ¢ã®ã«ã¿ãã°ãšãšã°ãŒãã¥ãŒã¿ã®æŠå¿µãåå©çšããŸããããµã³ãããã¯ã¹ãšã㊠node:vm åããã»ã¹ã¯äœ¿ããŸããã
æ€èšŒãã§ãã¯ãªã¹ã
ã³ãŒãã¢ãŒãã®ã«ãã¬ããžã§ã¯ã次ã蚌æããå¿ èŠããããŸãã
- ç¡å¹ãªèšå®ã§ã¯ãæ¢åã®ããŒã«å ¬éã¯å€æŽãããªã
enabled: trueã®ãªããªããžã§ã¯ãèšå®ã§ã¯ãã³ãŒãã¢ãŒãã¯ç¡å¹ã®ãŸãŸã«ãªã- æå¹ãªèšå®ã§ã¯ãå®è¡äžã«ããŒã«ãã¢ã¯ãã£ããªå Žåãã¢ãã«ã«ã¯
execãšwaitã®ã¿ãå ¬éããã - çã®ããŒã«ãªãå®è¡ã
disableToolsã空ã®èš±å¯ãªã¹ãã¯ãã³ãŒãã¢ãŒãã®ãã€ããŒã匷å¶ãããªã¬ãŒããªã - æå¹ãªé MCP ããŒã«ã¯ãã¹ãŠ
ALL_TOOLSã«è¡šç€ºããã - æåŠãããããŒã«ã¯
ALL_TOOLSã«è¡šç€ºãããªã tools.searchãtools.describeãtools.call㯠OpenClaw ããŒã«ã§åäœããAPI.list("mcp")ãšAPI.read("mcp/<server>.d.ts")ã¯ãããªããžãããŒã«åŒã³åºããªãã§ TypeScript 圢åŒã® MCP 宣èšãå ¬éãã- MCP åå空é
$api()ã¯ãã¹ããŒãçšã®ã€ã³ã©ã€ã³ãã©ãŒã«ããã¯ãšããŠåŒãç¶ãå©çšã§ãã - MCP åå空éåŒã³åºãã¯ã1 ã€ã®ãªããžã§ã¯ãå
¥åãæã€å¯èŠ MCP ããŒã«ã§åäœããäžæ¹ãçŽæ¥ã® MCP ã«ã¿ãã°ãšã³ããªã¯
tools.*ã«ã¯ååšããªã - ããŒã«æ€çŽ¢ã®å¶åŸ¡ããŒã«ã¯ãã¢ãã«ãµãŒãã§ã¹ãšé衚瀺ã«ã¿ãã°ã®äž¡æ¹ããé ããã
- ãã¹ããããåŒã³åºãã¯æ¿èªãšããã¯ã®åäœãä¿æãã
- ã·ã§ã«
execã¯ã¢ãã«ããã¯é ãããããèš±å¯ãããŠããå Žåã¯ã«ã¿ãã° ID ã§åŒã³åºãã - ååž°çãªã³ãŒãã¢ãŒãã®
execãšwaitã¯ã²ã¹ãã³ãŒãããåŒã³åºããªã - TypeScript å ¥åã¯ãç¡å¹ãªãã¹ãŸã㯠JavaScript ã®ã¿ã®ãã¹ã§ TypeScript ãèªã¿èŸŒãŸãã«å€æããã³è©äŸ¡ããã
importãrequireããã¡ã€ã«ã·ã¹ãã ããããã¯ãŒã¯ãç°å¢ãžã®ã¢ã¯ã»ã¹ã¯å€±æãã- ç¡éã«ãŒãã¯ã¿ã€ã ã¢ãŠãããGateway ããããã¯ã§ããªã
- ã¡ã¢ãªäžéã®å€±æã¯ã²ã¹ã VM ãçµäºãã
- å®äºããåŒã³åºããšäžæåæ¢ãããåŒã³åºãã®äž¡æ¹ã§ãåºåãšã¹ãããã·ã§ããã®äžéã匷å¶ããã
waitã¯äžæåæ¢ãããã¹ãããã·ã§ãããåéããæçµå€ãè¿ã- æéåããäžæ¢æžã¿ãã»ãã·ã§ã³éããäžæãª
runIdå€ã¯å€±æãã - ãã©ã³ã¹ã¯ãªããã®ãªãã¬ã€ãšæ°žç¶åã¯ãã³ãŒãã¢ãŒãã®å¶åŸ¡åŒã³åºããä¿æãã
- ãã©ã³ã¹ã¯ãªãããšãã¬ã¡ããªã«ã¯ããã¹ããããããŒã«åŒã³åºããæç¢ºã«è¡šç€ºããã
E2E ãã¹ãèšç»
ã©ã³ã¿ã€ã ã倿Žãããšãã¯ãããããçµ±åãã¹ããŸãã¯ãšã³ãããŒãšã³ããã¹ããšããŠå®è¡ãã:
tools.codeMode.enabled: falseã§ Gateway ãèµ·åããã- å°ããªçŽæ¥ããŒã«ã»ãããå«ããšãŒãžã§ã³ãã¿ãŒã³ãéä¿¡ããã
- ã¢ãã«ã«è¡šç€ºãããããŒã«ã倿ŽãããŠããªãããšãã¢ãµãŒãããã
tools.codeMode.enabled: trueã§åèµ·åããã- OpenClawãPluginãMCPãã¯ã©ã€ã¢ã³ããã¹ãããŒã«ãå«ããšãŒãžã§ã³ãã¿ãŒã³ãéä¿¡ããã
- ã¢ãã«ã«è¡šç€ºãããããŒã«ãªã¹ããæ£ç¢ºã«
execãwaitã§ããããšãã¢ãµãŒãããã execå ã§ALL_TOOLSãèªã¿åããæå¹ãªãã¹ãããŒã«ãååšããããšãã¢ãµãŒããããexecå ã§ãtools.searchãtools.describeãtools.callãéã㊠OpenClaw/Plugin/ã¯ã©ã€ã¢ã³ãããŒã«ãåŒã³åºããexecå ã§API.list("mcp")ãšAPI.read("mcp/<server>.d.ts")ãåŒã³åºãã宣èšãã¡ã€ã«ãå¯èŠ MCP ããŒã«ãèšè¿°ããŠããããšãã¢ãµãŒããããexecå ã§MCP.<server>.<tool>({ ...input })ãéã㊠MCP ããŒã«ãåŒã³åºããçŽæ¥ã® MCP ã«ã¿ãã°ãšã³ããªãALL_TOOLSãštools.*ã«ååšããªãããšãã¢ãµãŒãããã- æåŠãããããŒã«ãååšãããæšæž¬ãã ID ã§ã¯åŒã³åºããªãããšãã¢ãµãŒãããã
execãwaitingãè¿ããåŸã«è§£æ±ºããããã¹ããããããŒã«åŒã³åºããéå§ãããwaitãåŒã³åºãã埩å ããã VM ãããŒã«çµæãåãåãããšãã¢ãµãŒãããã- æçµåçã«ã埩å åŸã«çæãããåºåãå«ãŸããããšãã¢ãµãŒãããã
- ã¿ã€ã ã¢ãŠããäžæ¢ãã¹ãããã·ã§ããæéåããã©ã³ã¿ã€ã ç¶æ ãã¯ãªãŒã³ã¢ããããããšãã¢ãµãŒãããã
- è»è·¡ããšã¯ã¹ããŒããããã¹ããããåŒã³åºãã芪ã®ã³ãŒãã¢ãŒãåŒã³åºãã®äžã«è¡šç€ºãããããšãã¢ãµãŒãããã
ãã®ããŒãžãžã®ããã¥ã¡ã³ãã®ã¿ã®å€æŽã§ããpnpm check:docs ãå®è¡ããå¿
èŠãããã