ḾÇÞ Ţööļš Ŕéƒéŕéñçé
Îḿþļéḿéñţàţîöñ đéţàîļ ƒöŕ Š-03: Àĝéñţ šüŕƒàçéš, ţĥé đéçîšîöñ ţĥàţ ḿàķéš ḾÇÞ öñé öƒ ţĥé ţŵö ŵàýš àñ àššîšţàñţ ŕéàçĥéš ķàþî.
Ţĥé ţööļ ļîšţ îš ĝéñéŕàţéđ. Ţööļ ñàḿéš, đéšçŕîþţîöñš, îñþüţ šçĥéḿàš, ţĥé šüŕƒàçé éàçĥ ƃéļöñĝš ţö, àñđ ţĥé ŕéšöüŕçé àđđŕéššéš ţĥé šéŕṽéŕ àñšŵéŕš ŕéàđš àţ àŕé ĝéñéŕàţéđ ƒŕöḿ à ŕüññîñĝ šéŕṽéŕ öñţö ţĥé ḾÇÞ ŕéƒéŕéñçé þàĝé, ŵîţĥ à ÇÎ đŕîƒţ ĝàţé, šö ñö ĥàñđ-ḿàîñţàîñéđ çöþý çàñ đŕîƒţ ƒŕöḿ ţĥé šéŕṽéŕ. Ţĥîš ñöţé çöṽéŕš ŵĥàţ à ĝéñéŕàţéđ ţàƃļé çàññöţ: ŵĥéŕé ţĥé ĥàñđļéŕš ļîṽé àñđ ĥöŵ à ţööļ ĝéţš ŕéĝîšţéŕéđ.
Ĥöŵ à ţööļ ŕéàçĥéš ţĥé šéŕṽéŕ
kapi mcp (cli/mcp.go) šţàŕţš àñ mcp.Server öṽéŕ šţđîö àñđ çàļļš
host.ApplyMCPToolFactories. Éṽéŕý ƒàçţöŕý ŕéĝîšţéŕéđ ţĥŕöüĝĥ
host.RegisterMCPToolFactory (host/mcpregistry.go) îš îñṽöķéđ ŵîţĥ ţĥé
šéŕṽéŕ àñđ ţĥé *host.App, àñđ àđđš îţš ţööļš. Ŕéĝîšţŕàţîöñ ĥàþþéñš îñ
init(), šö ļîñķîñĝ à þàçķàĝé îš ŵĥàţ éẋþöšéš îţš ţööļš, ŵĥîçĥ îš ŵĥý ţĥé
ķàþî þöŕçéļàîñ ļîṽéš îñ àñ îḿþöŕţàƃļé þàçķàĝé ŕàţĥéŕ ţĥàñ îñ package main.
App.MCPSurface îš šéţ ƒŕöḿ ţĥé --tools, --all-tools, --all-flows àñđ
--all ƒļàĝš àñđ ñéṽéŕ ƒŕöḿ ţĥé éñṽîŕöñḿéñţ, ƃéçàüšé ţĥé šüŕƒàçé îš à þŕöþéŕţý
öƒ ĥöŵ ţĥé šéŕṽéŕ ŵàš šţàŕţéđ. Ţĥé ƒàçţöŕîéš ŕéàđ AllTools àñđ AllFlows ţö
đéçîđé ŵĥàţ ţö àđđ. Sets îš ţĥé ţööļ-šéţ šéļéçţîöñ: öñçé éṽéŕý ƒàçţöŕý ĥàš
ŕüñ, ApplyMCPToolFactories ŕéḿöṽéš éàçĥ ţööļ àñđ ŕéšöüŕçé ţéḿþļàţé ŵĥöšé šéţ
îš ñöţ šéļéçţéđ. Ţĥé šéţš àŕé öñé ţàƃļé, mcpToolSets îñ host/mcp_sets.go,
àñđ à ţööļ öñ ñö ļîšţ (à ŵîđéñéđ ŕéĝîšţŕý ţööļ, à ƒļöŵ ṽéŕƃ, à þļüĝîñ'š ţööļ)
îš šéŕṽéđ ŵĥàţéṽéŕ šéţš àŕé ñàḿéđ. ParseMCPToolSets ŕéàđš ţĥé ƒļàĝ, šéŕṽîñĝ
writing ŵĥéñ îţ îš àƃšéñţ, àñđ MCPInstructionsFor šéñđš ţĥé šéŕṽéŕ'š
îñšţŕüçţîöñš öñļý ŵĥéñ ţĥé ŵŕîţîñĝ šéţ îš šéŕṽéđ, ƃéçàüšé ţĥéý ñàḿé îţš ţööļš.
Ţĥé šüŕƒàçé šñàþšĥöţ ţéšţ (kapi/cmd/kapi/mcp_snapshot_test.go) ƒàîļš ŵĥéñ à
ţööļ öñ ţĥé đéƒàüļţ šéŕṽéŕ ƃéļöñĝš ţö ñö šéţ.
App.ResolveMCPProject àççéþţš -p / --project ţĥŕöüĝĥ ţĥé ÇĻÎ'š þŕöĵéçţ
ƒļàĝ çöñṽéñţîöñ àñđ öţĥéŕŵîšé ŕüñš ţĥé šĥàŕéđ üþŵàŕđ ŵàļķ. KAPI_NO_PROJECT=1
đîšàƃļéš îḿþļîçîţ đîšçöṽéŕý; àñ éẋþļîçîţ ŕéçîþé šţîļļ ŵîñš. Ţĥé ŕéšöļṽéŕ ŕéţàîñš
ţĥé éẋàçţ ŕéçîþé þàţĥ àñđ šöüŕçé ļàñĝüàĝé ƃéƒöŕé šéŕṽîñĝ ţööļš. Îñṽàļîđ þŕöĵéçţ
ļöàđîñĝ ŕéţüŕñš àñ éŕŕöŕ. check_file àñđ à šçöþéđ check_text ţĥŕéàđ ţĥàţ þàţĥ
îñţö ţĥéîŕ šýñţĥéţîç ĥöšţ çöḿḿàñđš, šö þŕöƒîļé àñđ ţéŕḿš ŕéšöļüţîöñ üšéš ţĥé
ƃöüñđ þŕöĵéçţ éṽéñ ŵĥéñ îḿþļîçîţ đîšçöṽéŕý îš đîšàƃļéđ. Çüšţöḿ ŕéçîþé ƒîļéñàḿéš
ŕéḿàîñ îñţàçţ.
Ţĥé context:// ŕéšöüŕçéš, context_read àñđ 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_read, ţĥé context:// ŕéšöüŕçéš | host/mcp_context.go |
context_note, context_session_summary | host/mcp_grow.go (éàçĥ ŵŕàþš ĥöšţ çàļļš îñ host/contextops.go) |
up, up_plan | host/mcp_up.go |
check_text, check_file | host/mcp_check.go |
read_blocks, apply_edits, describe_format | host/mcp_edit.go, öṽéŕ ţĥé çĥàñĝé šéŕṽîçé App.ChangeService ƃüîļđš (host/changes.go) |
stats | host/mcp_stats.go |
voice_check, voice_rewrite | host/mcp_voice.go |
Çüŕàţéđ ƒŕàḿéŵöŕķ ţööļš (translate, term-check, redact) | host/mcp_tools.go |
detect_format, ţĥé ļîšţîñĝ àñđ ƒļöŵ ṽéŕƃš | kapi/mcptools/tools.go |
review_queue, review_block | kapi/mcptools/review.go, ŵîţĥ ţĥé ŕéàđ îñ host/reviewblock.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, ŵĥîçĥ
ŵöüļđ öţĥéŕŵîšé ƃé à çöîñ ţöšš.
À çļîéñţ ļîšţš ñö ŕéšöüŕçéš ƒŕöḿ à ţéḿþļàţé, šö àñ àĝéñţ ŵöŕķîñĝ ƒŕöḿ îţš ţööļ
ļîšţ ñéṽéŕ ƒîñđš ţĥéšé àđđŕéššéš. context_read îš ţĥé šàḿé ŕéàđ àš à ţööļ: îţš
ĥàñđļéŕ ƃüîļđš ţĥé context://<path> ÜŔÎ ƒŕöḿ path, format àñđ project
àñđ ŕéţüŕñš éẋàçţļý ţĥé ţéẋţ ţĥé ŕéšöüŕçé ŕéţüŕñš.
Ţĥé ÜŔÎ îš šþļîţ ƃý ĥàñđ ŕàţĥéŕ ţĥàñ ţĥŕöüĝĥ url.Parse. Üñđéŕ context:// ţĥé
ƒîŕšţ þàţĥ šéĝḿéñţ ŵöüļđ ƃé ŕéàđ àš àñ àüţĥöŕîţý àñđ ļöŵéŕçàšéđ, šîļéñţļý
ŕéñàḿîñĝ à ļöçàţîöñ öñ à çàšé-šéñšîţîṽé ƒîļéšýšţéḿ.
Šüŕƒàçé ŵîđéñîñĝ đöéš ñöţ àþþļý ĥéŕé: --all-tools àñđ --all-flows ĝöṽéŕñ
ŵĥîçĥ ţööļš à çàļļéŕ ḿàý ŕüñ, ñöţ ŵĥàţ îţ ḿàý ŕéàđ. Ţĥé ţööļ šéţš đö: ţĥé
ţŵö ţéḿþļàţéš ƃéļöñĝ ţö ţĥé ŵŕîţîñĝ šéţ, šö à šéŕṽéŕ ţĥàţ đöéš ñöţ šéŕṽé îţ
àñšŵéŕš ñö context:// ŕéàđ.
Ŕéšüļţ šĥàþéš
Ĥàñđļéŕš ŕéţüŕñ ţýþéđ Ĝö šţŕüçţš, ŵĥîçĥ ţĥé ŠĐĶ šéŕîàļîžéš îñţö ţĥé ŕéšüļţ'š
structuredContent àñđ ḿîŕŕöŕš àš ĴŠÖÑ ţéẋţ çöñţéñţ. Ţĥé šţŕüçţ îš ţĥé šçĥéḿà:
ŕéàđ îţ ŕàţĥéŕ ţĥàñ à þŕöšé çöþý.
| Ŕéšüļţ | Ţýþé |
|---|---|
read_blocks | change.Page |
apply_edits | change.Result, à kapi.change-result/v1 đöçüḿéñţ |
describe_format | change.Description |
detect_format | mcptools.DetectFormatOutput |
run_flow, pseudo_translate | mcptools.RunFlowOutput |
list_formats, list_flows, list_tools | mcptools.ListFormatsOutput, ListFlowsOutput, ListToolsOutput |
| Ŕéṽîéŵ ţööļš | mcptools.ReviewQueueOutput (éàçĥ ŕöŵ ŵîţĥ ţĥé ref ŕéṽîéŵ_ƃļöçķ ţàķéš), mcptools.ReviewBlockOutput (ţĥé ref àñđ rev öƒ ţĥé éđîţîöñ üñđéŕ ŕéṽîéŵ àñđ, üñđéŕ block, ţĥé host.ReviewUnitInfo ŵîţĥ îţš ŕéṽîéŵ çöñţéẋţ) |
check_text, check_file | à kapi.check/v2 Ŕéþöŕţ; šéé ţĥé ĴŠÖÑ çöñţŕàçţ |
context_note | host.contextRecordOutput: ţĥé öþéŕàţîöñ îđ, îţš ķîñđ (observe, correct öŕ withdraw) àñđ šţàţüš (suggested öŕ contested, ŵîţĥ contested_by ñàḿîñĝ ţĥé öţĥéŕ šîđé), ţĥé šéššîöñ, ŵĥàţ ŵàš ŕéçöŕđéđ, ţĥé çöḿḿàñđ ţĥàţ ŕéṽîéŵš îţ, àñđ ŵĥàţ ĥàþþéñš ţö îţ ñéẋţ |
context_session_summary | host.contextSessionOutput: ţĥé çöüñţš observed, corrected, suggested, contested, established, withdrawn, dropped àñđ reset; ţĥé Šţöþ ĥööķ'š öüţçöḿéš checked, failing, caught àñđ files, ŕéàđ ţĥŕöüĝĥ host.SessionOutcomes àñđ þŕéšéñţ àţ žéŕö; ţĥé šéñţéñçé ţö éñđ à ŕéþöŕţ öñ; àñđ ţĥé kapi context review --session <id> çöḿḿàñđ à þéŕšöñ ŕéṽîéŵš ţĥé šéššîöñ'š šüĝĝéšţîöñš ŵîţĥ. Ŵîţĥ ñö session, host.App.LatestContextSession þîçķš ţĥé šéššîöñ ŵîţĥ ţĥé þŕöĵéçţ'š ļàţéšţ çĥéçķ ŕüñ (contextop.KindCheck), ƒàļļîñĝ ƃàçķ ţö ţĥé šéššîöñ ţĥàţ ŕéçöŕđéđ ļàšţ îñ àñý öþéŕàţîöñ, àñđ chosen ñàḿéš îţ, ţĥé ŕüļé ţĥàţ àþþļîéđ àñđ ŵĥéñ îţ ļàšţ ŕéçöŕđéđ; à ļöĝ ŵîţĥ ñöñé àñšŵéŕš ŵîţĥ report àļöñé |
stats | ţĥé šàḿé đöçüḿéñţ kapi stats --json éḿîţš |
| À çüŕàţéđ ƒŕàḿéŵöŕķ ţööļ | host.frameworkToolOutput: ţàŕĝéţ ţŕàñšļàţîöñš, ŕéŵŕîţţéñ šöüŕçé, þŕöþéŕţîéš, öṽéŕļàýš, àñđ àññöţàţîöñš ƒöŕ ţĥé öñé þŕöçéššéđ ƃļöçķ |
read_blocks, apply_edits àñđ describe_format ƃüîļđ ţĥéîŕ ŕéšüļţš
ţĥéḿšéļṽéš ŕàţĥéŕ ţĥàñ ţĥŕöüĝĥ ţĥé ŠĐĶ'š ţýþéđ þàţĥ: éàçĥ ŕéšüļţ îš éñçöđéđ öñçé
ŵîţĥ ĤŢḾĻ éšçàþîñĝ öƒƒ àñđ šéţ àš ƃöţĥ ţĥé šţŕüçţüŕéđ çöñţéñţ àñđ ţĥé ţéẋţ
çöñţéñţ, šö ţĥé <x id="…"/> þļàçéĥöļđéŕš à ƃļöçķ'š ţéẋţ ĥöļđš ŕéàçĥ ţĥé çļîéñţ
àš ŵŕîţţéñ. read_blocks àñđ describe_format đéçļàŕé ţĥéîŕ öüţþüţ šçĥéḿàš
àš éñṽéļöþéš (readBlocksOutputSchema, describeFormatOutputSchema), ƃéçàüšé
ţĥé ŕüñ ḿöđéļ ñéšţš àñđ ţĥé ţööļ đéšçŕîþţîöñš ñàḿé à þàĝé'š ƒîéļđš;
apply_edits đéçļàŕéš ţĥé ĝéñéŕàţéđ ŕéšüļţ šçĥéḿà,
changeschema.ResultSchema().
apply_edits ŕéĝîšţéŕš ţĥŕöüĝĥ Server.AddTool àñđ ŕéàđš ţĥé ŕàŵ àŕĝüḿéñţš.
Îţš îñþüţ šçĥéḿà îš changeschema.Schema() ŵîţĥ project àđđéđ; ţĥé ĥàñđļéŕ
ŕéḿöṽéš project àñđ đéçöđéš ţĥé ŕéšţ ŵîţĥ change.Decode, šö à çĥàñĝé šéţ
ţĥàţ đöéš ñöţ đéçöđé îš ŕéƒüšéđ ŵîţĥ ţĥé çöñţŕàçţ'š invalid çöđé àñđ ţĥé ĴŠÖÑ
þöîñţéŕ öƒ ŵĥàţ ŵàš ŵŕöñĝ ŕàţĥéŕ ţĥàñ ŵîţĥ ţĥé ŠĐĶ'š ṽàļîđàţîöñ ḿéššàĝé. Ţĥé
àçţöŕ îš ţĥé çàļļîñĝ àĝéñţ: ķîñđ agent, ţĥé çļîéñţ'š initialize ñàḿé, àñđ
MCPSessionID(). À ŕéƒüšéđ öŕ þàŕţîàļ çĥàñĝé šéţ îš àñ éŕŕöŕ ŕéšüļţ çàŕŕýîñĝ
ţĥé kapi.change-result/v1 ŕéšüļţ. À ŕéƒüšàļ ŵîţĥ ñö öþéŕàţîöñ ţö àţţàçĥ îţ ţö
(à çĥàñĝé šéţ ţĥàţ đöéš ñöţ đéçöđé, à ŕéàđ ţĥé šéŕṽîçé ŕéƒüšéš) îš àñ éŕŕöŕ
ŕéšüļţ çàŕŕýîñĝ change.ErrorResult: ţĥé šàḿé ŕéšüļţ ŵîţĥ status: "refused",
record: null, éḿþţý docs àñđ ops, àñđ error šàýîñĝ ŵĥý. Àƒţéŕ à çĥàñĝé šéţ
ļàñđš, ţĥé ĥàñđļéŕ çöļļéçţš ţĥé ŵöŕđîñĝ éàçĥ àþþļîéđ set_content àñđ
replace_text ŵŕöţé îñţö à đöçüḿéñţ'š öŵñ éđîţîöñ, üñđéŕ ţĥé çàñöñîçàļ
ŕéƒéŕéñçé ţĥé ŕéšüļţ ñàḿéš, àñđ þàššéš îţ ţö noteAgentEdits
(host/contextusage.go). À ţŕàñšļàţîöñ'š ŵöŕđîñĝ îš ļéƒţ öüţ, ƃéçàüšé à
šüĝĝéšţîöñ'š þŕéƒéŕŕéđ ƒöŕḿ îš šöüŕçé-ļàñĝüàĝé ŵöŕđîñĝ.
Éàçĥ çàļļ ƃüîļđš ţĥé çĥàñĝé šéŕṽîçé ƒöŕ îţš þŕöĵéçţ (mcpChangeService): ţĥé
ŕéçîþé ţĥé project àŕĝüḿéñţ ŕéšöļṽéš, éļšé ţĥé öñé ţĥé šéŕṽéŕ šţàŕţéđ ŵîţĥ,
éļšé ñöñé, àñđ ţĥéñ ţĥé đöçüḿéñţš àŕé ţĥöšé üñđéŕ ţĥé šéŕṽéŕ'š ŵöŕķîñĝ
đîŕéçţöŕý. Ţĥé šéŕṽîçé ţàķéš ţĥé çàļļ'š šöüŕçé ļàñĝüàĝé ƒŕöḿ
mcpCallSourceLocale, ŵĥîçĥ ļöàđš ţĥé ŕéçîþé àñđ ŕàñķš îţ àĝàîñšţ ţĥé ļàñĝüàĝé
ñàḿéđ ŵĥéñ ţĥé šéŕṽéŕ šţàŕţéđ, šö App.SourceLang, ŵĥîçĥ éṽéŕý ĥöšţ ƒüñçţîöñ
ţĥàţ ŕéšöļṽéš à þŕöĵéçţ ŕéŵŕîţéš, þļàýš ñö þàŕţ. Ƃüîļđîñĝ ţĥé šéŕṽîçé ŕéàđš ţĥé
ŕéçîþé àñđ ŵŕîţéš ñöţĥîñĝ: à ŕéƒéŕéñçé ţö à šöüŕçé ƒîļé ŕéšöļṽéš ţĥŕöüĝĥ
ProjectContext.ResolvePaths àļöñé, ţĥé çöñţéñţ þàţţéŕñš àŕé éẋþàñđéđ öñļý ƒöŕ
à ŕéƒéŕéñçé ţĥàţ ñàḿéš ñö šöüŕçé ƒîļé (ţĥé ƒîļé öƒ à ţŕàñšļàţîöñ), àñđ ţĥé
þŕöĵéçţ'š šţàţé đîŕéçţöŕý îš çŕéàţéđ àţ ţĥé ƒîŕšţ çöḿḿîţ. review_block ŕéàđš
ţĥé ƃļöçķ ţĥŕöüĝĥ ţĥé šàḿé šéŕṽîçé, îñ ţĥé þŕöĵéçţ'š öŵñ šöüŕçé ļàñĝüàĝé, ţö
ŕéþöŕţ ţĥé çàñöñîçàļ ŕéƒéŕéñçé àñđ ţĥé ŕéṽîšîöñ öƒ ţĥé éđîţîöñ üñđéŕ ŕéṽîéŵ,
ţĥéñ àñšŵéŕš ŵîţĥ ReviewUnitWithContext, àđđŕéššîñĝ ţĥé ƃļöçķ ƃý ţĥé ƒîļé ţĥé
ŕéçîþé ŵŕîţéš ţĥàţ éđîţîöñ ţö.
Àñ àđṽîšé ļàñđš ţĥŕöüĝĥ RecordAIReviews, üñđéŕ agent/<client>. Îţ ñééđš à
šçöŕé, àñđ öñé ţĥé ŕéṽîéŵ ǫüéüé ĥàš ñö ŕöŵ ƒöŕ îš ŕéƒüšéđ àš not_found öñçé
ţĥé çöñţéñţ ƃéšîđé îţ ŵàš ŵŕîţţéñ, ŵĥîçĥ ḿàķéš ţĥé çĥàñĝé šéţ partial.
Ţĥé ţööļ šéţš àŕé mcpToolSets îñ host/mcp_sets.go. pruneMCPToolSets
ŕéḿöṽéš éàçĥ ţööļ ţĥàţ ñö šéļéçţéđ šéţ ļîšţš, šö apply_edits, ŵĥîçĥ ţĥé
ŵŕîţîñĝ àñđ ŕéṽîéŵ šéţš ƃöţĥ ļîšţ, îš šéŕṽéđ ŵĥéñ éîţĥéŕ îš.
Ţĥé šüŕƒàçé îš à çöñţŕàçţ
kapi/cmd/kapi/mcp_snapshot_test.go šñàþšĥöţš éṽéŕý ţööļ ñàḿé àñđ îñþüţ šçĥéḿà
ţö testdata/mcp_tools.golden.json, àñđ éṽéŕý ŕéšöüŕçé àđđŕéšš àñđ ḿîḿé ţýþé ţö
testdata/mcp_resources.golden.json. Đéšçŕîþţîöñš ḿàý éṽöļṽé ƒŕééļý; ñàḿéš,
îñþüţ šçĥéḿàš àñđ àđđŕéššéš ḿàý öñļý ƃé éẋţéñđéđ. Ŕéñàḿîñĝ à ţööļ, ŕéḿöṽîñĝ öñé,
çĥàñĝîñĝ à ƒîéļđ'š ţýþé, öŕ ḿöṽîñĝ àñ àđđŕéšš ƃŕéàķš àĝéñţ îñţéĝŕàţîöñš àļŕéàđý
îñ ţĥé ƒîéļđ àñđ ñééđš àñ éẋþļîçîţ đéçîšîöñ: ŕéĝéñéŕàţé ŵîţĥ
KAPI_UPDATE_GOLDEN=1 àñđ ŕéçöŕđ îţ îñ
ţĥé ÇĻÎ çöñţŕàçţ. À šéçöñđ ţéšţ,
TestMCPToolSurfaceExtendsFrozen, ĥöļđš ţĥé ţööļš ţö
testdata/mcp_tools.frozen.json, ƒŕöžéñ ŵîţĥ ķàþî.çĥàñĝé/ṽ1 ƒöŕ à ŕéļéàšé àñđ
ñéṽéŕ ŕéĝéñéŕàţéđ: à ţööļ ḿàý ƃé àđđéđ àñđ àñ îñþüţ šçĥéḿà éẋţéñđéđ, àñđ à
ŕéḿöṽéđ öŕ ŕéñàḿéđ ţööļ öŕ ƒîéļđ, à çĥàñĝéđ ţýþé öŕ à ñéŵļý ŕéǫüîŕéđ ƒîéļđ
ƒàîļš.