Šķîþ ţö ḿàîñ çöñţéñţ

ḾÇÞ Ţööļš Ŕéƒéŕéñçé

Îḿþļéḿéñţàţîöñ đéţàîļ ƒöŕ Š-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_planhost/mcp_up.go
check_text, check_filehost/mcp_check.go
apply_editshost/mcp_edit.go (çĥàñĝé-šéţ ķîñđš îñ host/apply.go)
statshost/mcp_stats.go
voice_check, voice_rewritehost/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_contentmcptools.ExtractContentOutput
detect_formatmcptools.DetectFormatOutput
run_flow, pseudo_translatemcptools.RunFlowOutput
list_formats, list_flows, list_toolsmcptools.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 àñđ ŕéçöŕđ îţ îñ ţĥé ÇĻÎ çöñţŕàçţ.