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

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

Îḿþļéḿéñţàţîöñ đéţàîļ ƒöŕ Š-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_summaryhost/mcp_grow.go (éàçĥ ŵŕàþš ĥöšţ çàļļš îñ host/contextops.go)
up, up_planhost/mcp_up.go
check_text, check_filehost/mcp_check.go
read_blocks, apply_edits, describe_formathost/mcp_edit.go, öṽéŕ ţĥé çĥàñĝé šéŕṽîçé App.ChangeService ƃüîļđš (host/changes.go)
statshost/mcp_stats.go
voice_check, voice_rewritehost/mcp_voice.go
Çüŕàţéđ ƒŕàḿéŵöŕķ ţööļš (translate, term-check, redact)host/mcp_tools.go
detect_format, ţĥé ļîšţîñĝ àñđ ƒļöŵ ṽéŕƃškapi/mcptools/tools.go
review_queue, review_blockkapi/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_blockschange.Page
apply_editschange.Result, à kapi.change-result/v1 đöçüḿéñţ
describe_formatchange.Description
detect_formatmcptools.DetectFormatOutput
run_flow, pseudo_translatemcptools.RunFlowOutput
list_formats, list_flows, list_toolsmcptools.ListFormatsOutput, ListFlowsOutput, ListToolsOutput
Ŕéṽîéŵ ţööļšmcptools.ReviewQueueOutput (éàçĥ ŕöŵ ŵîţĥ ţĥé ref ŕéṽîéŵ_ƃļöçķ ţàķéš), mcptools.ReviewBlockOutput (ţĥé ref àñđ rev öƒ ţĥé éđîţîöñ üñđéŕ ŕéṽîéŵ àñđ, üñđéŕ block, ţĥé host.ReviewUnitInfo ŵîţĥ îţš ŕéṽîéŵ çöñţéẋţ)
check_text, check_fileà kapi.check/v2 Ŕéþöŕţ; šéé ţĥé ĴŠÖÑ çöñţŕàçţ
context_notehost.contextRecordOutput: ţĥé öþéŕàţîöñ îđ, îţš ķîñđ (observe, correct öŕ withdraw) àñđ šţàţüš (suggested öŕ contested, ŵîţĥ contested_by ñàḿîñĝ ţĥé öţĥéŕ šîđé), ţĥé šéššîöñ, ŵĥàţ ŵàš ŕéçöŕđéđ, ţĥé çöḿḿàñđ ţĥàţ ŕéṽîéŵš îţ, àñđ ŵĥàţ ĥàþþéñš ţö îţ ñéẋţ
context_session_summaryhost.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 ƒöŕ à ŕéļéàšé àñđ ñéṽéŕ ŕéĝéñéŕàţéđ: à ţööļ ḿàý ƃé àđđéđ àñđ àñ îñþüţ šçĥéḿà éẋţéñđéđ, àñđ à ŕéḿöṽéđ öŕ ŕéñàḿéđ ţööļ öŕ ƒîéļđ, à çĥàñĝéđ ţýþé öŕ à ñéŵļý ŕéǫüîŕéđ ƒîéļđ ƒàîļš.