ḾÇÞ Ţööļš Ŕéƒéŕéñçé
Îḿþļéḿéñţàţîöñ đéţàîļ ƒöŕ Š-03: Àĝéñţ šüŕƒàçéš, ŵĥîçĥ đéçîđéš ţĥàţ ḾÇÞ îš öñé öƒ ţĥé ţŵö đööŕš àñ àššîšţàñţ ŕéàçĥéš kapi ţĥŕöüĝĥ.
Ţĥé ţööļ ļîšţ îš ñöţ ĥéŕé. Ţööļ ñàḿéš, đéšçŕîþţîöñš, îñþüţ šçĥéḿàš, ţĥé šüŕƒàçé éàçĥ ƃéļöñĝš ţö, àñđ ţĥé ŕéšöüŕçé àđđŕéššéš ţĥé šéŕṽéŕ àñšŵéŕš ŕéàđš àţ àŕé ĝéñéŕàţéđ ƒŕöḿ à ŕüññîñĝ šéŕṽéŕ öñţö ţĥé ḾÇÞ ŕéƒéŕéñçé þàĝé, ŵîţĥ à ÇÎ đŕîƒţ ĝàţé. À šéçöñđ, ĥàñđ-ḿàîñţàîñéđ çöþý îš ĥöŵ ţĥé þüƃļîšĥéđ ļîšţ çàḿé ţö đöçüḿéñţ ţĥŕéé ţööļš ţĥàţ ñö ļöñĝéŕ éẋîšţéđ àñđ öḿîţ ţĥé öñéš ţĥàţ đîđ. Ţĥîš ñöţé çöṽéŕš ŵĥàţ à ĝéñéŕàţéđ ţàƃļé çàññöţ: ŵĥéŕé ţĥé ĥàñđļéŕš ļîṽé àñđ ĥöŵ à ţööļ ĝéţš ŕéĝîšţéŕéđ.
Ĥöŵ à ţööļ ŕéàçĥéš ţĥé šéŕṽéŕ
kapi mcp (cli/mcp.go) šţàŕţš àñ mcp.Server öṽéŕ šţđîö àñđ çàļļš
host.ApplyMCPToolFactories. Éṽéŕý ƒàçţöŕý ŕéĝîšţéŕéđ ţĥŕöüĝĥ
host.RegisterMCPToolFactory (host/mcpregistry.go) îš îñṽöķéđ ŵîţĥ ţĥé
šéŕṽéŕ àñđ ţĥé *host.App, àñđ àđđš îţš ţööļš. Ŕéĝîšţŕàţîöñ ĥàþþéñš îñ
init(), šö ļîñķîñĝ à þàçķàĝé îš ŵĥàţ éẋþöšéš îţš ţööļš, ŵĥîçĥ îš ŵĥý ţĥé
kapi þöŕçéļàîñ ļîṽéš îñ àñ îḿþöŕţàƃļé þàçķàĝé ŕàţĥéŕ ţĥàñ îñ package main.
App.MCPSurface îš šéţ ƒŕöḿ ţĥé --all-tools / --all-flows / --all ƒļàĝš
àñđ ñéṽéŕ ƒŕöḿ ţĥé éñṽîŕöñḿéñţ, ƃéçàüšé ţĥé šüŕƒàçé îš à þŕöþéŕţý öƒ ĥöŵ ţĥé
šéŕṽéŕ ŵàš šţàŕţéđ; ţĥé ƒàçţöŕîéš ŕéàđ îţ ţö đéçîđé ŵĥàţ ţö àđđ.
App.ResolveMCPProject àççéþţš -p / --project ţĥŕöüĝĥ ţĥé ÇĻÎ'š þŕöĵéçţ
ƒļàĝ çöñṽéñţîöñ àñđ öţĥéŕŵîšé ŕüñš ţĥé šĥàŕéđ üþŵàŕđ ŵàļķ. KAPI_NO_PROJECT=1
đîšàƃļéš îḿþļîçîţ đîšçöṽéŕý; àñ éẋþļîçîţ ŕéçîþé šţîļļ ŵîñš. Ţĥé ŕéšöļṽéŕ ŕéţàîñš
ţĥé éẋàçţ ŕéçîþé þàţĥ àñđ šöüŕçé ļàñĝüàĝé ƃéƒöŕé šéŕṽîñĝ ţööļš. Îñṽàļîđ þŕöĵéçţ
ļöàđîñĝ ŕéţüŕñš àñ éŕŕöŕ. check_file àñđ à šçöþéđ check_text ţĥŕéàđ ţĥàţ þàţĥ
îñţö ţĥéîŕ šýñţĥéţîç ĥöšţ çöḿḿàñđš, šö þŕöƒîļé àñđ ţéŕḿš ŕéšöļüţîöñ üšéš ţĥé
ƃöüñđ þŕöĵéçţ éṽéñ ŵĥéñ îḿþļîçîţ đîšçöṽéŕý îš đîšàƃļéđ. Çüšţöḿ ŕéçîþé ƒîļéñàḿéš
ŕéḿàîñ îñţàçţ.
Ţĥé context:// ŕéšöüŕçéš àñđ context_search àļšö üšé ţĥé šéŕṽéŕ'š ƃöüñđ
ŕéçîþé. Ŕéšöüŕçé ļöçàţîöñš ŕéšöļṽé ŕéļàţîṽé ţö ţĥàţ ŕéçîþé'š ŕööţ, îñçļüđîñĝ
ŵĥéñ ţĥé šéŕṽéŕ ŕüñš ƒŕöḿ à šüƃđîŕéçţöŕý öŕ öüţšîđé ţĥé þŕöĵéçţ. Éẋþļîçîţ
šţàñđàļöñé šţöŕé îñþüţš öñ context_search ŕéţàîñ ţĥéîŕ öṽéŕŕîđé šéḿàñţîçš.
check_text.context_path ñàḿéš à þŕöĵéçţ-ŕéļàţîṽé đéšţîñàţîöñ, îñçļüđîñĝ à ƒîļé
ţĥàţ ĥàš ñöţ ƃééñ ŵŕîţţéñ. Îţ ŕéšöļṽéš ţĥé đéšţîñàţîöñ'š ṽöîçé çĥàññéļ àñđ ţéŕḿš
ŵîţĥöüţ éẋţŕàçţîñĝ à ƒîļé. Ţĥé þàţĥ ŕéǫüîŕéš à ƃöüñđ þŕöĵéçţ àñđ çàññöţ ƃé
çöḿƃîñéđ ŵîţĥ profile_file öŕ profile_pack. Üñšçöþéđ šñîþþéţš ŕéţàîñ ţĥöšé
éẋþļîçîţ þŕöƒîļé öþţîöñš. Îñṽàļîđ þàţĥš àñđ çöñţéẋţ-ŕéšöļüţîöñ éŕŕöŕš ƒàîļ ţĥé
öþéŕàţîöñ îñšţéàđ öƒ đŕöþþîñĝ ţĥé ŕéǫüéšţéđ šçöþé.
À šçöþéđ đŕàƒţ ŕéþöŕţ ķééþš target.kind: "text" àñđ ŕéçöŕđš ţĥé đéšţîñàţîöñ îñ
target.context_path. Îţš ƒîñđîñĝš àñđ àñàļýžéŕ éñţŕîéš ĥàṽé ñö ƒîļé ļöçàţîöñ:
ţĥéý đéšçŕîƃé ţĥé šüþþļîéđ šñîþþéţ. check_file ŕéḿàîñš ţĥé þöšţ-šàṽé çĥéçķ ƒöŕ
đöçüḿéñţ éẋţŕàçţîöñ, šţŕüçţüŕé àñđ ƃļöçķ ļöçàţîöñš.
check_file ŵîţĥ diff (üñîƒîéđ đ ţéẋţ) öŕ diff_against (à ĝîţ ŕéṽîšîöñ)
ŕüñš ţĥé đ-šçöþéđ çĥéçķ kapi check --diff-file àñđ --diff-against ŕüñ,
ţĥŕöüĝĥ ţĥé šàḿé runDiffCheck îñ host/check_diff.go: file ƃéçöḿéš
öþţîöñàļ àñđ ñàŕŕöŵš ţĥé šçöþé, àñđ ţĥé ŕéþöŕţ çàŕŕîéš scope. Ṽöîçé ŕéšöļṽéš
þéŕ çĥàñĝéđ ƒîļé üñļéšš ţĥé çàļļ ñàḿéš à þŕöƒîļé. target àñđ validate àŕé
ŕéƒüšéđ ŵîţĥ à đ.
Ƒöŕ þŕöĵéçţ-šçöþéđ check_file, öḿîţ profile_file àñđ profile_pack šö ţĥé
ƒîļé'š ṽöîçé çĥàññéļ ŕéšöļṽéš ƒŕöḿ ţĥé þŕöĵéçţ. Éîţĥéŕ éẋþļîçîţ öþţîöñ ŕéþļàçéš
ţĥàţ ṽöîçé šéļéçţîöñ; ļöàđîñĝ ţĥé þŕöĵéçţ'š þŕöƒîļé ÝÀḾĻ đîŕéçţļý đöéš ñöţ
šéļéçţ ţĥé ƒîļé'š çĥàññéļ. Þŕöĵéçţ ţéŕḿš šţîļļ ŕéšöļṽé ƒöŕ ţĥé ƒîļé. Ŕéçöŕđ ţĥé
àŕĝüḿéñţš àñđ execution.contexts ŵĥéñ àššéššîñĝ çĥéçķ çöṽéŕàĝé. Çöñţéẋţ éñţŕîéš
ŕéçöŕđ ţĥé 郃éçţîṽé ṽöîçé šéļéçţîöñ, ļöàđéđ þŕöƒîļé šöüŕçé, þŕöĵéçţ þŕöƒîļé
àñđ çĥàññéļ, þļüš ŵĥéţĥéŕ ţéŕḿš ŵéŕé šüþþļîéđ. À ƒîļé-šçöþéđ ṽöîçé ŕéšöļüţîöñ
ŕéţüŕñš ţĥé çöḿþöšéđ þŕöƒîļé àñđ îţš ḿéţàđàţà ţöĝéţĥéŕ; ţĥé çĥéçķ üšéš ţĥàţ
šàḿé þŕöƒîļé. Éẋþļîçîţ öṽéŕŕîđéš àŕé ḿàŕķéđ override àñđ çàŕŕý ñö îñƒéŕŕéđ
þŕöĵéçţ çĥàññéļ. Ţéŕḿš ŕéšöļṽé îñđéþéñđéñţļý öƒ à ṽöîçé öṽéŕŕîđé. À ţööļ ñàḿé
àļöñé đöéš ñöţ éšţàƃļîšĥ ŵĥîçĥ ṽöîçé ĝöṽéŕñéđ ţĥé çĥéçķ.
Ţĥé çàñöñîçàļ ÇĻÎ/ḾÇÞ çĥéçķ ŕéþöŕţ îñçļüđéš öþţîöñàļ execution.analyzers àñđ
þĥàšé ţîḿîñĝš. Àñ àƃšéñţ îñṽéñţöŕý ḿéàñš üñŕéþöŕţéđ çöṽéŕàĝé. Àþþļîçàƃļé
šéḿàñţîç ĝüîđàñçé ĥàš àñ éẋþļîçîţ unsupported éñţŕý îñ à đéţéŕḿîñîšţîç ŕüñ;
îţš þŕéšéñçé çàññöţ ƃé îñƒéŕŕéđ ƒŕöḿ ţĥé šçöŕé. Ŕéǫüéšţéđ àñàļýšîš öŕ çöñţéẋţ
ţĥàţ ƒàîļš ŕéţüŕñš ţĥé éẋîšţîñĝ öþéŕàţîöñ-éŕŕöŕ ţŕàñšþöŕţ. Šéé ţĥé
çĥéçķš đöçüḿéñţàţîöñ
ƒöŕ àñàļýžéŕ šçöþé àñđ ţîḿîñĝ ƃöüñđàŕîéš.
| Ĥàñđļéŕš | Ŵĥéŕé |
|---|---|
context_search, ţĥé context:// ŕéšöüŕçéš | host/mcp_context.go |
up, up_plan | host/mcp_up.go |
check_text, check_file | host/mcp_check.go |
apply_edits | host/mcp_edit.go (çĥàñĝé-šéţ ķîñđš îñ host/apply.go) |
stats | host/mcp_stats.go |
voice_check, voice_rewrite | host/mcp_voice.go |
Çüŕàţéđ ƒŕàḿéŵöŕķ ţööļš (translate, term-check, redact) | host/mcp_tools.go |
detect_format, extract_content, ţĥé ļîšţîñĝ àñđ ƒļöŵ ṽéŕƃš | kapi/mcptools/tools.go |
| Ţĥé ŕéṽîéŵ ṽéŕƃš | kapi/mcptools/review.go |
Çüŕàţîöñ
host/mcp_tools.go þŕöĵéçţš ŕéĝîšţŕý ţööļš îñţö ḾÇÞ ţööļš ƃý ŕéñđéŕîñĝ ţĥéîŕ
ComponentSchema àš ţĥé îñþüţ šçĥéḿà, þļüš à ŕéǫüîŕéđ text àñđ àñ öþţîöñàļ
target_lang. Öñļý ţĥé ţööļš îñ agentFacingTools àŕé öƒƒéŕéđ ƃý đéƒàüļţ.
Ḿöšţ öƒ ţĥé üñƒîļţéŕéđ šüŕƒàçé ŵàš ñéṽéŕ àüţĥöŕéđ ƒöŕ àñ àššîšţàñţ: îţ àŕŕîṽéđ
ƃéçàüšé šöḿéöñé àđđéđ à þîþéļîñé šţéþ. Àñýţĥîñĝ ŵîţĥ à þöŕçéļàîñ éǫüîṽàļéñţ îš
đéļîƃéŕàţéļý àƃšéñţ ţöö, šîñçé ţŵö ñàḿéš ƒöŕ öñé ĵöƃ ḿéàñš ţĥé çàļļéŕ þîçķš
ŵŕöñĝ ĥàļƒ ţĥé ţîḿé, àñđ recycle àñđ diff-leverage àŕé ŵĥàţ up đöéš ƒöŕ
ýöü.
neverAgentFacing îš šţŕîçţéŕ šţîļļ: external-command àñđ script éẋéçüţé
çàļļéŕ-šüþþļîéđ çöḿḿàñđš àñđ ĴàṽàŠçŕîþţ, àñđ àŕé ŵîţĥĥéļđ éṽéñ üñđéŕ
--all-tools. "Šĥöŵ ḿé éṽéŕý ţööļ" àñđ "ļéţ à çàļļéŕ ŕüñ àŕƃîţŕàŕý çöđé" àŕé
đéŕéñţ đéçîšîöñš, àñđ ƃüñđļîñĝ ţĥéḿ ŵöüļđ ḿàķé ţĥé ƒîŕšţ šîļéñţļý ĝŕàñţ ţĥé
šéçöñđ. host/mcp_tools_curation_test.go àššéŕţš ţĥîš.
Ŕéšöüŕçéš àš ŵéļļ àš ţööļš
registerContextResources (host/mcp_context.go) ŕéĝîšţéŕš ţĥé ţŵö
context:// àđđŕéššéš àš ŕéšöüŕçé ţéḿþļàţéš, ƃöţĥ ŵîţĥ öñé ĥàñđļéŕ: ţĥé ÜŔÎ
îţšéļƒ šàýš ŵĥîçĥ àđđŕéšš ƒöŕḿ ŵàš àšķéđ ƒöŕ, šö đîšþàţçĥ ñéṽéŕ đéþéñđš öñ ŵĥîçĥ
ţéḿþļàţé ţĥé ŠĐĶ ḿàţçĥéđ; ƃöţĥ ţéḿþļàţéš ḿàţçĥ context://profile/x, ŵĥîçĥ
ŵöüļđ öţĥéŕŵîšé ƃé à çöîñ ţöšš.
Ţĥé ÜŔÎ îš šþļîţ ƃý ĥàñđ ŕàţĥéŕ ţĥàñ ţĥŕöüĝĥ url.Parse. Üñđéŕ context:// ţĥé
ƒîŕšţ þàţĥ šéĝḿéñţ ŵöüļđ ƃé ŕéàđ àš àñ àüţĥöŕîţý àñđ ļöŵéŕçàšéđ, šîļéñţļý
ŕéñàḿîñĝ à ļöçàţîöñ öñ à çàšé-šéñšîţîṽé ƒîļéšýšţéḿ.
Šüŕƒàçé ŵîđéñîñĝ đöéš ñöţ àþþļý ĥéŕé: --all-tools àñđ --all-flows ĝöṽéŕñ
ŵĥîçĥ ţööļš à çàļļéŕ ḿàý ŕüñ, ñöţ ŵĥàţ îţ ḿàý ŕéàđ.
Ŕéšüļţ šĥàþéš
Ĥàñđļéŕš ŕéţüŕñ ţýþéđ Ĝö šţŕüçţš, ŵĥîçĥ ţĥé ŠĐĶ šéŕîàļîžéš îñţö ţĥé ŕéšüļţ'š
structuredContent àñđ ḿîŕŕöŕš àš ĴŠÖÑ ţéẋţ çöñţéñţ. Ţĥé šţŕüçţ îš ţĥé šçĥéḿà:
ŕéàđ îţ ŕàţĥéŕ ţĥàñ à þŕöšé çöþý.
| Ŕéšüļţ | Ţýþé |
|---|---|
extract_content | mcptools.ExtractContentOutput |
detect_format | mcptools.DetectFormatOutput |
run_flow, pseudo_translate | mcptools.RunFlowOutput |
list_formats, list_flows, list_tools | mcptools.ListFormatsOutput, ListFlowsOutput, ListToolsOutput |
| Ŕéṽîéŵ ṽéŕƃš | mcptools.ReviewQueueOutput, ReviewUnitOutput, ReviewDecisionOutput |
check_text, check_file | à kapi.check/v1 Ŕéþöŕţ; šéé ţĥé ĴŠÖÑ çöñţŕàçţ |
stats | ţĥé šàḿé đöçüḿéñţ kapi stats --json éḿîţš |
| À çüŕàţéđ ƒŕàḿéŵöŕķ ţööļ | host.frameworkToolOutput: ţàŕĝéţ ţŕàñšļàţîöñš, ŕéŵŕîţţéñ šöüŕçé, þŕöþéŕţîéš, öṽéŕļàýš, àñđ àññöţàţîöñš ƒöŕ ţĥé öñé þŕöçéššéđ ƃļöçķ |
apply_edits ŕéþöŕţš ok àļöñĝšîđé ţĥé þéŕ-ƃļöçķ öüţçöḿé (applied,
skipped, stale, guard_failed) àñđ à þéŕ-éñţŕý àššéţ ŕéšüļţ. ok îš ƒàļšé
ŵĥéñ àñ éđîţ đŕîƒţéđ öŕ ŵàš ŕéĵéçţéđ, ŵĥîçĥ îš ţĥé çàļļéŕ'š šîĝñàļ ţö ŕé-ŕéàđ
ţĥé ƃļöçķ àñđ ŕéţŕý ŕàţĥéŕ ţĥàñ ţö ƒöŕçé ţĥé ŵŕîţé.
À çöñţéñţ éñţŕý üšéš kind: "content", file, ţĥé éẋţŕàçţéđ ƃļöçķ id àñđ
content_hash, àñđ text ƒöŕ îţš ñéŵ ŵöŕđîñĝ. replacement ƃéļöñĝš ţö ṽöîçé
ŕüļéš. Ƃöţĥ ţĥé ÇĻÎ àñđ ḾÇÞ ŕéĵéçţ çöñţéñţ éñţŕîéš çàŕŕýîñĝ à ñöñéḿþţý
replacement ƃéƒöŕé àþþļýîñĝ àñý éñţŕý, ŵîţĥ àñ éŕŕöŕ îđéñţîƒýîñĝ ţĥé éẋþéçţéđ
text ƒîéļđ.
À çöḿḿéñţ éñţŕý üšéš kind: "comment", file, ţĥé çöḿḿéñţ'š id àñđ lines
àš check_file ŕéþöŕţš ţĥéḿ, àñđ text ƒöŕ ţĥé çöḿḿéñţ'š þŕöšé ŵîţĥöüţ çöḿḿéñţ
ḿàŕķéŕš. Îţ îš ĝüàŕđéđ ƃý ţĥé comment_sha256 ţĥé çĥéçķ ŕéþöŕţéđ ƒöŕ ţĥé
çöḿḿéñţ, öŕ ƃý ţĥé þŕöšé àš ŕéàđ îñ current_text, àñđ àñ éñţŕý ŵîţĥ ñéîţĥéŕ îš
ŕéĵéçţéđ ƃéƒöŕé àñý éñţŕý îš àþþļîéđ. À çöḿḿéñţ ŵĥöšé ƃýţéš öŕ þŕöšé đéŕ îš
ŕéƒüšéđ ŵîţĥ ţĥé ŕéàšöñ changed. width öþţîöñàļļý šéţš ţĥé ŵŕàþ çöļüḿñ. Îţš öüţçöḿé šîţš üñđéŕ comments, öñé ŕéçöŕđ þéŕ ƒîļé. Éàçĥ éđîţ îš
written, unchanged, refused öŕ did-not-run, ţĥé ļàšţ ţŵö ŵîţĥ à reason
àñđ detail. diff îš ţĥé çĥàñĝé ŵŕîţţéñ, àñđ check îš à kapi.check/v1
Ŕéþöŕţ šçöþéđ ţö ţĥàţ đ. ok îš ƒàļšé ŵĥéñ àñ éđîţ ŵàš ŕéƒüšéđ öŕ đîđ ñöţ
ŕüñ, öŕ ŵĥéñ ţĥàţ çĥéçķ đîđ ñöţ þàšš. Ƃéƒöŕé ţĥé ƒîŕšţ çöḿḿéñţ öƒ à ļàñĝüàĝé îš
ŵŕîţţéñ, ţĥé ŵŕîţé çàñàŕý (comment.VerifyRewriter) ŕüñš, àñđ à ƒàîļéđ çàñàŕý
ļéàṽéš éṽéŕý éñţŕý îñ ţĥàţ ļàñĝüàĝé ñöţ ŕüñ. Çöḿḿéñţ éñţŕîéš àŕé ĥàñđļéđ îñ
host/apply_comment.go.
Ţĥé šüŕƒàçé îš à çöñţŕàçţ
kapi/cmd/kapi/mcp_snapshot_test.go šñàþšĥöţš éṽéŕý ţööļ ñàḿé àñđ îñþüţ šçĥéḿà
ţö testdata/mcp_tools.golden.json, àñđ éṽéŕý ŕéšöüŕçé àđđŕéšš àñđ ḿîḿé ţýþé ţö
testdata/mcp_resources.golden.json. Đéšçŕîþţîöñš ḿàý éṽöļṽé ƒŕééļý; ñàḿéš,
îñþüţ šçĥéḿàš àñđ àđđŕéššéš ḿàý öñļý ƃé éẋţéñđéđ. Ŕéñàḿîñĝ à ţööļ, ŕéḿöṽîñĝ öñé,
çĥàñĝîñĝ à ƒîéļđ'š ţýþé, öŕ ḿöṽîñĝ àñ àđđŕéšš ƃŕéàķš àĝéñţ îñţéĝŕàţîöñš àļŕéàđý
îñ ţĥé ƒîéļđ àñđ ñééđš àñ éẋþļîçîţ đéçîšîöñ: ŕéĝéñéŕàţé ŵîţĥ
KAPI_UPDATE_GOLDEN=1 àñđ ŕéçöŕđ îţ îñ
ţĥé ÇĻÎ çöñţŕàçţ.