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

ḾÇÞ šéŕṽéŕ

kapi éẋþöšéš îţš ƒöŕḿàţ-àŵàŕé çöñţéñţ éñĝîñé àš àñ ḾÇÞ (Ḿöđéļ Çöñţéẋţ Þŕöţöçöļ) šéŕṽéŕ. Àñ àššîšţàñţ çöññéçţéđ ţö îţ çàñ ŕéàđ ţĥé çöñţéñţ îñšîđé à .docx, à ĴŠÖÑ çàţàļöĝ öŕ à Ḿàŕķđöŵñ ƒîļé, àšķ ŵĥàţ ţĥé þŕöĵéçţ'š öŵñ çöñţéẋţ šàýš àƃöüţ à þĥŕàšé, éđîţ ţĥé çöñţéñţ, ṽéŕîƒý îţ àĝàîñšţ ţĥé þŕöĵéçţ'š çĥéçķš, àñđ ŵŕîţé îţ ƃàçķ ƃýţé-ƒöŕ-ƃýţé, ţĥŕöüĝĥ šţŕüçţüŕéđ ţööļ çàļļš ŕàţĥéŕ ţĥàñ ƃý ĝüéššîñĝ àţ ţĥé ƒîļé'š ƃýţéš.

Ƒöŕ ţĥé àĝéñţ-šķîļļš þàţĥ (Çļàüđé Çöđé çàļļîñĝ ţĥé kapi ÇĻÎ), šéé Üšé ţĥé Kapi Àĝéñţ Šķîļļš. Ţĥé ţŵö çàñ ƃé üšéđ ţöĝéţĥéŕ.

:::îñƒö Ĝéñéŕàţéđ ƒŕöḿ ţĥé šéŕṽéŕ Ţĥé ţàƃļéš öñ ţĥîš þàĝé àŕé ĝéñéŕàţéđ ƃý çöññéçţîñĝ ţö à ŕéàļ kapi mcp šéŕṽéŕ àñđ àšķîñĝ îţ ƒöŕ îţš ţööļš àñđ îţš ŕéšöüŕçéš. À ÇÎ đŕîƒţ ĝàţé ƒàîļš ţĥé ƃüîļđ îƒ ţĥéý šţöþ ḿàţçĥîñĝ ţĥé ƃîñàŕý, šö ñöţĥîñĝ ĥéŕé çàñ đéšçŕîƃé à ţööļ ţĥé šéŕṽéŕ đöéš ñöţ àñšŵéŕ ţö, öŕ àñ àđđŕéšš îţ đöéš ñöţ šéŕṽé. :::

Ǫüîçķ Šţàŕţ

Šţàŕţ ţĥé ḾÇÞ šéŕṽéŕ:

kapi mcp

Ţĥîš ļàüñçĥéš à ĴŠÖÑ-ŔÞÇ šéŕṽéŕ öñ šţđîö. Ýöü đöñ'ţ ŕüñ îţ ḿàñüàļļý; ýöüŕ ÀÎ ţööļ šţàŕţš îţ àš à šüƃþŕöçéšš.

Šéţüþ

Çļàüđé Đéšķţöþ

Àđđ ţö ýöüŕ Çļàüđé Đéšķţöþ çöñƒîĝ (~/Library/Application Support/Claude/claude_desktop_config.json öñ ḿàçÖŠ, %APPDATA%\Claude\claude_desktop_config.json öñ Ŵîñđöŵš):

{
"mcpServers": {
"kapi": {
"command": "kapi",
"args": ["mcp"]
}
}
}

Ŕéšţàŕţ Çļàüđé Đéšķţöþ. Kapi ţööļš ŵîļļ àþþéàŕ îñ ţĥé ţööļ þîçķéŕ.

Çļàüđé Çöđé

Àđđ ţö ýöüŕ þŕöĵéçţ'š .mcp.json ƒîļé (öŕ çŕéàţé îţ àţ ţĥé ŕéþöšîţöŕý ŕööţ):

{
"mcpServers": {
"kapi": {
"command": "kapi",
"args": ["mcp"]
}
}
}

Çļàüđé Çöđé ŵîļļ àüţöḿàţîçàļļý đîšçöṽéŕ àñđ çöññéçţ ţö ţĥé kapi ḾÇÞ šéŕṽéŕ.

ṼŠ Çöđé (ĜîţĤüƃ Çöþîļöţ / Çöþîļöţ Çĥàţ)

Àđđ ţö ýöüŕ ṼŠ Çöđé šéţţîñĝš (.vscode/settings.json öŕ üšéŕ šéţţîñĝš):

{
"mcp": {
"servers": {
"kapi": {
"command": "kapi",
"args": ["mcp"]
}
}
}
}

Öŕ àđđ ţö .vscode/mcp.json îñ ýöüŕ þŕöĵéçţ:

{
"servers": {
"kapi": {
"command": "kapi",
"args": ["mcp"]
}
}
}

Çüŕšöŕ

Àđđ ţö ýöüŕ Çüŕšöŕ ḾÇÞ çöñƒîĝ (~/.cursor/mcp.json):

{
"mcpServers": {
"kapi": {
"command": "kapi",
"args": ["mcp"]
}
}
}

Ŵîñđšüŕƒ

Àđđ ţö ýöüŕ Ŵîñđšüŕƒ ḾÇÞ çöñƒîĝ (~/.windsurf/mcp.json):

{
"mcpServers": {
"kapi": {
"command": "kapi",
"args": ["mcp"]
}
}
}

:::ţîþ ΃ kapi îš ñöţ îñ ýöüŕ $PATH, üšé ţĥé ƒüļļ þàţĥ ţö ţĥé ƃîñàŕý (é.ĝ. /usr/local/bin/kapi öŕ $HOME/go/bin/kapi). :::

Àṽàîļàƃļé ţööļš

kapi mcp šéŕṽéš à çüŕàţéđ šéţ öƒ 19 ţööļš. Éàçĥ ţööļ îš éẋþöšéđ ƃý à ñàḿéđ đéçîšîöñ: àñ àššîšţàñţ ţĥàţ îš ĥàñđéđ éṽéŕý þîþéļîñé šţéþ þîçķš ţĥé ŵŕöñĝ öñé àƃöüţ ĥàļƒ ţĥé ţîḿé, šö ţĥé šţéþš ţĥé ļööþ ŕüñš ƒöŕ ýöü àŕé đéļîƃéŕàţéļý àƃšéñţ.

ŢööļŴĥàţ îţ đöéš
apply_editsApply a typed change-set: the one write verb. For document wording, each entry uses kind=content, file, id, content_hash and text (the new wording). Read block IDs and hashes with extract_content. The replacement field is for voice rules. Content edits land through the byte-faithful round-trip (structure and inline codes preserved, drift-guarded by content_hash); asset edits (terms entry, content memory pair, voice rule, recipe field) are written to their committed source and compiled into the cache. No AI provider is used. Read the context://<project-relative-path> resource before editing content, then run check_file on each changed file to review findings and analyzer coverage. For a code comment, an entry uses kind=comment, file, id and lines (as check_file reports them, such as func/Parse), comment_sha256 (the fingerprint check_file reports for the comment; a comment whose bytes differ is refused as changed, and current_text may carry the prose as read instead) and text (the comment's prose without comment markers, or a /* */ comment's delimiters and the * opening each line). Every byte outside the comment is kept, a /* */ comment keeps its layout, the result must parse and the language's formatter must agree; a directive, a generated file's comment, a changed comment, text holding */ in a /* */ comment and text that drops a code block or reference are refused with a reason and write nothing. A comment in a language whose plugin or formatter is not installed, or whose formatter does not format the file, did not run and is not written. A project's formatter runs code that project controls, and an agent that can write files can write the configuration it loads, so apply_edits never runs it: such a comment did not run, with the reason formatter, and a person applies it with kapi apply in a terminal. Each written file's result carries a check scoped to the change.
approve_unitApprove one review-queue unit (→ reviewed). The unit state is recorded in the project store, bound to the current translation's content hash, with identity "agent/<client>".
check_fileCheck the actual content inside a file (Word, PowerPoint, JSON, XLIFF, Markdown, …) or only the content blocks a change touched: pass diff (unified diff text), diff_against (a git revision), staged (the changes staged for commit, read from the index) or diff_range (A..B or A...B, read from B) to check each touched block whole, with the lines it spans, and read report.scope for every changed file and what became of it. with format-aware extraction and the applicable project voice and terms. Before editing, read the context://<project-relative-path> resource; after saving edits (including apply_edits), run check_file and review its per-block findings and analyzer coverage. Returns a kapi.check/v1 Report with effective scope in execution.contexts and configuration warnings, which never change pass; pass is not semantic approval. Omit profile_file/profile_pack to use the file’s project profile and channel. Supplying either replaces that voice selection with an explicit override; project terms still apply. Pass target/target_lang to also run bilingual checks.
check_textCheck a draft snippet with deterministic content rules. Before drafting, read the context://<project-relative-path> resource for the applicable guidance. Supply context_path to check with that destination's voice and terms; without it, project guidance is not resolved. Explicit profile_pack/profile_file are available only without context_path. Returns a kapi.check/v1 Report with findings, analyzer coverage and configuration warnings, which never change pass; pass is not semantic approval. After saving edits, use check_file to verify the actual file.
context_searchAsk what this project's content context says about a word or phrase: what it is called here, whether it is discouraged and what to say instead, and wording the project has already approved. One question across every store the project binds; you do not need to know which one holds the answer. Search before writing; read the context://<project-relative-path> resource for the full guidance at your destination. After saving edits, use check_file on the changed files. Results are grouped by kind, and say what could not be reached. Each term carries how often the project's extracted content uses it, as of the last extraction (the last `kapi up`) rather than of the working tree.
detect_formatDetect the file format from a file path based on its extension
extract_contentParse a file into translatable content blocks: each block's id, content_hash, source text (inline codes rendered as <x id="…"/> placeholders), and word count. The read leg of the edit loop: edit a block's text keeping the placeholders, then send it back via apply_edits (or kapi apply).
redactReplace sensitive spans with protected placeholders before processing
reject_unitReject one review-queue unit (→ draft, back to the work queue) with a note explaining why. Recorded with identity "agent/<client>"; retranslating the unit re-enters it in review.
review_queueList the review queue: every unit awaiting a person, addressed by (file, key, locale). One queue holds every language, the project's source language among them: a translated unit not yet approved is one row, and a source unit the project's source gate is waiting on is another, marked `isSource`. The result also carries `languages`, the pending count per language. Filter with language, locale and/or collection. Read-only, derived from the content files and the project state store; units annotated by an AI pre-review carry their score. Lean by design: call review_unit for a unit's context (the point governing it, its neighbourhood, its prior version, its findings).
review_unitFetch one review-queue unit's full picture: source and target text, ladder status, the last recorded state (with identity), and the context the decision is made in: the point governing the file (voice guidance, term rules, coordinates), the blocks before and after it as run sequences, the prior approved version and the content-memory match with its wording, the check findings with their run anchors, and the AI pre-review score. A unit in the project's source language is read the same way, from its source file, and returns its authoring rung with no target half. The read leg before approve_unit / reject_unit / sign_off_unit.
sign_off_unitSign off one review-queue unit (→ signed-off, the top ladder rung). Recorded with identity "agent/<client>".
statsSize files before processing them. Reports per-file and total content metrics: blocks (translatable and not), words, characters (with and without spaces, plus the unique-character inventory), segments when available, and a by-role breakdown. Works on any supported format (Word, PowerPoint, JSON, XLIFF, Markdown, HTML, …) and returns the same JSON `kapi stats --json` emits.
term-checkTerminology Check
translateTranslate content with an LLM or machine-translation provider (select an engine, then a provider)
upBring a kapi project up to date against its ship gates: re-extract drifted sources, run the default flow (content memory reuse then AI translate) over every target language, concurrently per language, loop until every gated scope is shippable or parks for a human, and run the project's bound checks each pass. In a project connected to a Bowrain server the run happens there (push, converge on the org's keys and shared content memory, pull the results); pass local to run the loop on this machine instead. Never fails on pending target work: parked units are reported, not thrown. Returns the structured result (per-locale standing, parked scopes, materialized files). Use up_plan first to see the pending work and token estimate.
up_planDry-run the catch-up work for a kapi project: per (collection, locale), the units missing a target, exact-content-memory leverage, the remaining AI work, and a rough token estimate. No provider calls, nothing written. The pre-flight for the up tool.
voice_checkScore text against a voice profile using deterministic vocabulary rules; returns a 0-100 compliance score and findings
voice_rewriteRewrite text to comply with a voice profile by substituting forbidden/competitor terms (deterministic, offline). A rule that names no replacement, and a match on an inflected form of a term, are left in place and listed under skipped with the term, its list, severity and reason; rewrite those by hand and verify with voice_check.

Þŕöĵéçţ šçöþîñĝ àþþļîéš öñ ţöþ. Šţàŕţéđ îñšîđé à kapi þŕöĵéçţ (đîšçöṽéŕéđ ƃý à ĝîţ-šţýļé üþŵàŕđ ŵàļķ, éẋàçţļý àš ţĥé ÇĻÎ đîšçöṽéŕš îţ), ţĥé ţööļ šéţ îš ñàŕŕöŵéđ ţö ţĥé šöüŕçéš ţĥé ŕéçîþé đéçļàŕéš àñđ ţĥé þŕöĵéçţ'š ƒîŕšţ ţàŕĝéţ ļàñĝüàĝé ƃéçöḿéš ţĥé đéƒàüļţ ƒöŕ ţĥé ţŕàñšļàţîñĝ ţööļš.

Ţööļš ƒŕöḿ îñšţàļļéđ þļüĝîñš

Àñ îñšţàļļéđ þļüĝîñ àđđš îţš öŵñ ţööļš ţö ţĥîš šüŕƒàçé. kapi mcp šţàŕţš éàçĥ þļüĝîñ'š šéŕṽéŕ öñçé þéŕ šéššîöñ àñđ þàššéš çàļļš ţĥŕöüĝĥ, šö ţĥé ţööļš à þļüĝîñ ƃŕîñĝš àñšŵéŕ öñ ţĥé šàḿé çöññéçţîöñ ţĥàţ šéŕṽéš ţĥé ļööþ ṽéŕƃš. Çöñƒîĝüŕé öñé ḾÇÞ šéŕṽéŕ, ñöţ öñé þéŕ þļüĝîñ.

À þļüĝîñ çöñţŕîƃüţéš ţĥé ţööļš îţš ḿàñîƒéšţ đéçļàŕéš. À þļüĝîñ ţĥàţ îš ñöţ îñšţàļļéđ àđđš ñöţĥîñĝ, öñé ţĥàţ ƒàîļš ţö šţàŕţ îš ļéƒţ öƒƒ ŵîţĥ à ñöţé öñ šţđéŕŕ ŵĥîļé ţĥé ŕéšţ öƒ ţĥé šüŕƒàçé ķééþš ŵöŕķîñĝ, àñđ à þļüĝîñ ţööļ ŵĥöšé ñàḿé kapi àļŕéàđý üšéš îš šķîþþéđ šö ţĥé kapi ţööļ ķééþš ţĥé ñàḿé.

Ŵîđéñîñĝ ţĥé šüŕƒàçé

Ţŵö ƒļàĝš öñ kapi mcp ŵîđéñ ŵĥàţ ţĥé šéŕṽéŕ öƒƒéŕš, ƒöŕ đéƃüĝĝîñĝ àñđ ƒöŕ çàļļéŕš ŵĥö ŕéàļļý àŕé àššéḿƃļîñĝ à þîþéļîñé ƃý ĥàñđ:

  • kapi mcp --all-tools àđđš éṽéŕý ÇĻÎ-ṽîšîƃļé þŕöçéššîñĝ ţööļ, þļüš ţĥé ļîšţîñĝ ṽéŕƃš: case-transform, create-target, diff-leverage, dnt-check, encoding-detect, entity-extract, inline-codes-remove, list_formats, list_tools, media-refine, placeholder-check, pseudo-translate, pseudo_translate, qa, recycle, remove-target, review, search-replace, segmentation, source-gate, term-extract, unredact, voice-check, voice-infer, whitespace-correct, xml-validation.
  • kapi mcp --all-flows àđđš ţĥé ƒļöŵ-ŕüññîñĝ ṽéŕƃš: list_flows, run_flow.
  • kapi mcp --all àđđš ƃöţĥ.

Ţŵö ţööļš àŕé ŵîţĥĥéļđ ƒŕöḿ éṽéŕý šüŕƒàçé, îñçļüđîñĝ ţĥé ŵîđéñéđ öñéš: external-command àñđ script ŕüñ àŕƃîţŕàŕý çöḿḿàñđš àñđ ĴàṽàŠçŕîþţ, ŵĥîçĥ îš à đéŕéñţ çļàšš öƒ đéçîšîöñ ƒŕöḿ "šĥöŵ ḿé éṽéŕý ţööļ". Ƃöţĥ ŕéḿàîñ àṽàîļàƃļé ţĥŕöüĝĥ kapi exec.

Àṽàîļàƃļé ŕéšöüŕçéš

Ŕéţŕîéṽàļ çöḿéš îñ ţŵö šĥàþéš, à ţööļ àñđ à ŕéšöüŕçé. Àšķîñĝ ŵĥàţ à ŵöŕđ ḿéàñš îš à çàļļ ŵîţĥ àŕĝüḿéñţš, šö îţ îš ţĥé context_search ţööļ. Àšķîñĝ ŵĥàţ àþþļîéš àţ à ļöçàţîöñ îš ŕéàđîñĝ šöḿéţĥîñĝ ţĥàţ àļŕéàđý éẋîšţš àţ àñ àđđŕéšš, šö îţ îš à ŕéšöüŕçé:

ÀđđŕéššŔéñđéŕš àšŴĥàţ îţ àñšŵéŕš
context://profile/{name}{?format,project}text/markdownWhat this project's context says applies at one place: the voice profile in force with its full guidance, the terms bound there, and the governance windows around them. Read this BEFORE writing or editing content at that location. Returns markdown by default; append `?format=json` for the structured shape. Addresses a governance profile by name, for a caller with no file in hand, e.g. `context://profile/marketing`.
context://{+path}{?format,project}text/markdownWhat this project's context says applies at one place: the voice profile in force with its full guidance, the terms bound there, and the governance windows around them. Read this BEFORE writing or editing content at that location. Returns markdown by default; append `?format=json` for the structured shape. The path is project-relative, e.g. `context://docs/guide.md`. Add `?project=<path>` to read a project other than the one the server started in; the path names its kapi.yaml, its root directory, or anything inside it.

Ţĥé ţŵö àđđŕéššéš àŕé öñé þŕîḿîţîṽé. À þàţĥ àñšŵéŕš ŵĥàţ àþþļîéš ĥéŕé; à þŕöƒîļé ñàḿé àñšŵéŕš ţĥé šàḿé ǫüéšţîöñ ƒöŕ à çàļļéŕ ŵîţĥ ñö ƒîļé îñ ĥàñđ (àñ àđ-ĥöç ŕüñ, öŕ à šţàŕţéŕ þàçķ). Ƃöţĥ ŕéţüŕñ ţĥé þöîñţ ţĥé ļöçàţîöñ ŕéšöļṽéđ ţö, ţĥé ṽöîçé þŕöƒîļé îñ ƒöŕçé ŵîţĥ îţš ƒüļļ ĝüîđàñçé, ţĥé ţéŕḿš ƃöüñđ ţĥéŕé, àñđ ţĥé ĝöṽéŕñàñçé ŵîñđöŵš àŕöüñđ ţĥéḿ.

Ţĥé ŕéñđéŕîñĝ îš à þŕöþéŕţý öƒ ţĥé ŕéàđ. ?format=json ŕéţüŕñš ţĥé šàḿé àñšŵéŕ àš application/json (ţĥé đöçüḿéñţ kapi context <path> --json þŕîñţš) àñđ éṽéŕýţĥîñĝ éļšé ŕéţüŕñš text/markdown. Àñ üñŕéçöĝñîšéđ ƒöŕḿàţ îš ŕéƒüšéđ ŕàţĥéŕ ţĥàñ àñšŵéŕéđ ŵîţĥ þŕöšé à þŕöĝŕàḿ çàññöţ þàŕšé.

context://docs/guide.md # markdown, for a model to read
context://docs/guide.md?format=json # the same answer, for a program
context://profile/marketing # a named profile, no location needed

Ţĥé ÇĻÎ ĥàļƒ îš kapi context <path>, ŵĥîçĥ çàļļš ţĥé šàḿé ĥöšţ ƒüñçţîöñ àñđ þŕîñţš ţĥé šàḿé ḿàŕķđöŵñ. À çöñƒöŕḿàñçé ţéšţ ĥöļđš ţĥé ţŵö šüŕƒàçéš ţö ţĥé šàḿé àñšŵéŕ.

Éẋàḿþļé çöñṽéŕšàţîöñš

"Ĥöŵ ḿàñý ŵöŕđš ñééđ ţŕàñšļàţîñĝ?"

Ĥöŵ ḿàñý ţŕàñšļàţàƃļé ŵöŕđš àŕé îñ src/locales/en.json?

Ţĥé àššîšţàñţ çàļļš stats ŵîţĥ ţĥé ƒîļé þàţĥ àñđ ŕéţüŕñš à šţŕüçţüŕéđ àñšŵéŕ ŵîţĥ ŵöŕđ, ƃļöçķ, çĥàŕàçţéŕ, àñđ šéĝḿéñţ çöüñţš.

"Ŵĥàţ đö ŵé çàļļ ţĥîš ĥéŕé?"

Κ "šîĝñ-îñ" ţĥé ţéŕḿ ŵé üšé, àñđ ĥöŵ đö ŵé šàý îţ îñ Ƒŕéñçĥ?

Ţĥé àššîšţàñţ çàļļš context_search. Öñé ǫüéšţîöñ ŕéàçĥéš éṽéŕý šţöŕé ţĥé þŕöĵéçţ ƃîñđš (îţš ţéŕḿš, îţš çöñţéñţ ḿéḿöŕý, îţš ṽöîçé þŕöƒîļé) àñđ ţĥé àñšŵéŕ šàýš ŵĥàţ ţĥé þŕöĵéçţ çàļļš ţĥé ţĥîñĝ, ŵĥéţĥéŕ îţ îš đîšçöüŕàĝéđ àñđ ŵĥàţ ţö šàý îñšţéàđ, àñđ àñý ŵöŕđîñĝ àļŕéàđý àþþŕöṽéđ. Àšķîñĝ ƃéƒöŕé ŵŕîţîñĝ îš çĥéàþéŕ ţĥàñ ļéàŕñîñĝ ţĥé šàḿé ƒàçţ ƒŕöḿ à ƒàîļîñĝ çĥéçķ àƒţéŕŵàŕđš.

Éṽéŕý àñšŵéŕ çàŕŕîéš notes, àñđ ţĥé ƒîŕšţ öƒ ţĥéḿ šàýš ŵĥéţĥéŕ ţĥé çöñţéẋţ, ţĥé ţéŕḿš öŕ ţĥé đéçîšîöñš ḿöṽéđ šîñçé ţĥîš šéššîöñ ļàšţ ŕéàđ ţĥéḿ. Ţĥé çöḿþàŕîšöñ îš àĝàîñšţ ŵĥàţ ţĥé þŕöĵéçţ ļàšţ öƃšéŕṽéđ öƒ îţš šéŕṽéŕ, ĥéļđ öñ đîšķ, šö îţ çöšţš à šḿàļļ ƒîļé ŕéàđ àñđ ñö ŕöüñđ ţŕîþ, àñđ îţ ŕéþöŕţš ŕàţĥéŕ ţĥàñ ŕéšöļṽéš: àñ àššîšţàñţ ţöļđ ţĥé ţéŕḿš ḿöṽéđ àšķš àĝàîñ ƃéƒöŕé çöñţîñüîñĝ, ƃéçàüšé ţĥé ŵöŕđîñĝ îţ ĥàđ šéţţļéđ öñ ŵàš çĥöšéñ àĝàîñšţ à çöñţéẋţ ţĥàţ ĥàš šîñçé çĥàñĝéđ.

"Éẋţŕàçţ ţĥé çöñţéñţ ƒŕöḿ ţĥîš ƒîļé"

Šĥöŵ ḿé ţĥé ţŕàñšļàţàƃļé šţŕîñĝš îñ messages.json

Ţĥé àššîšţàñţ çàļļš extract_content, þàŕšéš ţĥé ƒîļé, àñđ ŕéţüŕñš éàçĥ ţŕàñšļàţàƃļé ƃļöçķ ŵîţĥ îţš ÎĐ, çöñţéñţ ĥàšĥ, šöüŕçé ţéẋţ (îñļîñé çöđéš àš <x id="…"/> þļàçéĥöļđéŕš), àñđ ŵöŕđ çöüñţ.

"Éđîţ ţĥé çöñţéñţ, ţĥéñ çĥéçķ îţ"

Ţîĝĥţéñ ţĥé îñţŕö þàŕàĝŕàþĥ îñ report.docx, ķééþîñĝ îţ öñ ƃŕàñđ

Ţĥé àššîšţàñţ ŕéàđš ţĥé ƃļöçķš ŵîţĥ extract_content, ŕéŵŕîţéš ţĥé ţéẋţ îţšéļƒ (ñö šéçöñđ ḿöđéļ), šéñđš ţĥé çĥàñĝé ƃàçķ ţĥŕöüĝĥ apply_edits (ţĥé ƃýţé-ƒàîţĥƒüļ ŕöüñđ-ţŕîþ, đŕîƒţ- àñđ îñļîñé-çöđé-ĝüàŕđéđ), ţĥéñ çàļļš check_file ţö çöñƒîŕḿ ţĥé ĝàţé þàššéš, ļööþîñĝ üñţîļ îţ đöéš.

"Çàţçĥ ţĥé þŕöĵéçţ üþ"

Ŵĥàţ ţŕàñšļàţîöñ ŵöŕķ îš öüţšţàñđîñĝ, àñđ ĥöŵ ḿüçĥ ŵöüļđ îţ çöšţ?

Ţĥé àššîšţàñţ çàļļš up_plan, à đŕý ŕüñ ŕéþöŕţîñĝ, þéŕ çöļļéçţîöñ àñđ ļöçàļé, ţĥé üñîţš ḿîššîñĝ à ţàŕĝéţ, ţĥé çöñţéñţ-ḿéḿöŕý ļéṽéŕàĝé, ţĥé ŕéḿàîñîñĝ ÀÎ ŵöŕķ àñđ à ŕöüĝĥ ţöķéñ éšţîḿàţé. Ñöţĥîñĝ îš ŵŕîţţéñ àñđ ñö þŕöṽîđéŕ îš çàļļéđ. up ţĥéñ đöéš ţĥé ŵöŕķ: ŕé-éẋţŕàçţ ŵĥàţ đŕîƒţéđ, ŕéüšé ţĥé çöñţéñţ ḿéḿöŕý, ţŕàñšļàţé ţĥé ŕéšţ, ŕüñ ţĥé þŕöĵéçţ'š çĥéçķš, àñđ ļööþ üñţîļ éṽéŕý ĝàţéđ šçöþé îš šĥîþþàƃļé öŕ þàŕķš ƒöŕ à ĥüḿàñ.

"Ŕéṽîéŵ ţĥîš ţŕàñšļàţîöñ"

Šĥöŵ ḿé ţĥé Ƒŕéñçĥ üñîţš ŵàîţîñĝ ƒöŕ ŕéṽîéŵ, àñđ àþþŕöṽé ţĥé öñéš ţĥàţ ļööķ ŕîĝĥţ

Ţĥé àššîšţàñţ çàļļš review_queue, ŕéàđš éàçĥ çàñđîđàţé ŵîţĥ review_unit, àñđ ŕéçöŕđš îţš đéçîšîöñ ŵîţĥ approve_unit, reject_unit, öŕ sign_off_unit. Éṽéŕý đéçîšîöñ îš ƃöüñđ ţö ţĥé ţŕàñšļàţîöñ'š çöñţéñţ ĥàšĥ àñđ ŕéçöŕđéđ üñđéŕ ţĥé îđéñţîţý agent/<client>, šö à ļàţéŕ éđîţ ŕé-öþéñš ţĥé üñîţ ŕàţĥéŕ ţĥàñ îñĥéŕîţîñĝ ţĥé àþþŕöṽàļ.

review_queue ŕéţüŕñš öñé ǫüéüé àçŕöšš ţĥé þŕöĵéçţ'š ļàñĝüàĝéš. Éàçĥ ŕöŵ çàŕŕîéš language àñđ, ŵĥéñ ţĥàţ ļàñĝüàĝé îš ţĥé þŕöĵéçţ'š šöüŕçé, isSource: true àñđ à status öñ ţĥé àüţĥöŕîñĝ ļàđđéŕ; languages çöüñţš ţĥé þéñđîñĝ üñîţš þéŕ ļàñĝüàĝé, šö àñ àššîšţàñţ çàñ ñàŕŕöŵ ŵîţĥ ţĥé language àŕĝüḿéñţ ţö öñé ţĥàţ ĥàš ŵöŕķ. review_unit ŕéàđš à šöüŕçé-ļàñĝüàĝé üñîţ ţĥé šàḿé ŵàý îţ ŕéàđš à ţŕàñšļàţîöñ, ƒŕöḿ ţĥé šöüŕçé ƒîļé, àñđ ŕéţüŕñš îţš þöîñţ àñđ ñéîĝĥƃöüŕĥööđ ŵîţĥ ñö ţàŕĝéţ ĥàļƒ. Ţĥé ţĥŕéé đéçîšîöñ ţööļš ŕéçöŕđ ţàŕĝéţ-ļàñĝüàĝé đéçîšîöñš.

Ţööļ ŕéƒéŕéñçé

çöñţéẋţ_šéàŕçĥ

ÞàŕàḿéţéŕŢýþéŔéǫüîŕéđĐéšçŕîþţîöñ
querystringýéšthe word or phrase to ask about
limitintegerñömax results per group (default 10)
localestringñönarrow results to one language (e.g. en, fr)
memorystringñöpath to a standalone content memory (default: the project's own store)
projectstringñöthe project this call acts on: its kapi.yaml recipe, its root directory, or any path inside it (default: the project the MCP server started in)
termsstringñöpath to a standalone terms store (default: the project's own store)

éẋţŕàçţ_çöñţéñţ

ÞàŕàḿéţéŕŢýþéŔéǫüîŕéđĐéšçŕîþţîöñ
pathstringýéšFile path to extract content from
formatstringñöOverride format detection
projectstringñöthe project this call acts on: its kapi.yaml recipe, its root directory, or any path inside it (default: the project the MCP server started in); its declared formats scope detection
source_langstringñöSource language (default: en)

àþþļý_éđîţš

Ţĥé šîñĝļé ŵŕîţé ṽéŕƃ. Öñé éñţŕý öƒ ţĥé çĥàñĝé-šéţ îš öñé đéļîƃéŕàţé çĥàñĝé: à çöñţéñţ éđîţ, öŕ àñ éđîţ ţö àñ àššéţ ţĥé þŕöĵéçţ öŵñš.

ÞàŕàḿéţéŕŢýþéŔéǫüîŕéđĐéšçŕîþţîöñ
changesetarrayýéšthe typed change-set entries to apply
projectstringñöthe project this call acts on: its kapi.yaml recipe, its root directory, or any path inside it (default: the project the MCP server started in)

Éàçĥ çĥàñĝé-šéţ éñţŕý çàŕŕîéš à kind. Çöñţéñţ éđîţš àđđŕéšš à ƃļöçķ ƃý ƒîļé, id, àñđ content_hash, ţĥé đŕîƒţ ĝüàŕđ: îƒ ţĥé ƃļöçķ'š šöüŕçé ĥàš çĥàñĝéđ šîñçé îţ ŵàš ŕéàđ, ţĥé éđîţ îš ŕéƒüšéđ ŕàţĥéŕ ţĥàñ àþþļîéđ ţö đéŕéñţ ţéẋţ. Àššéţ éđîţš çàŕŕý àñ op àñđ ţĥé ƒîéļđš ƒöŕ ţĥéîŕ ķîñđ.

À çöḿḿéñţ éđîţ àđđŕéššéš öñé çöđé çöḿḿéñţ ƃý file àñđ ţĥé id ţĥàţ check_file ŕéþöŕţš, îš ĝüàŕđéđ ƃý ţĥé comment_sha256 ŕéþöŕţéđ ŵîţĥ îţ, àñđ çàŕŕîéš ţĥé çöḿḿéñţ'š þŕöšé îñ text. kapi ķééþš éṽéŕý ƃýţé öüţšîđé ţĥé çöḿḿéñţ, àñđ ŵŕîţéš à /* */ çöḿḿéñţ îñ ţĥé ļàýöüţ îţ àļŕéàđý ĥàš. Îţ ŕéƒüšéš ţĥé éđîţ ŵîţĥ à ŕéàšöñ ŵĥéñ ţĥé çöḿḿéñţ ĥàš çĥàñĝéđ šîñçé ţĥé çĥéçķ, ţĥé ţéẋţ đŕöþš öŕ àđđš à çöđé ƃļöçķ öŕ ŕéƒéŕéñçé, ţĥé ţéẋţ ĥöļđš */ îñšîđé à /* */ çöḿḿéñţ, ţĥé ŕéšüļţ ŵöüļđ ñöţ þàŕšé, öŕ ţĥé ƒöŕḿàţţéŕ ŵöüļđ ŕéŵŕîţé îţ. À çöḿḿéñţ îñ à ļàñĝüàĝé ŵĥöšé ƒöŕḿàţţéŕ îš ñöţ îñšţàļļéđ, öŕ đöéš ñöţ ƒöŕḿàţ ţĥé ƒîļé, îš ñöţ ŵŕîţţéñ, àñđ ţĥé éđîţ ŕéþöŕţš ţĥàţ îţ đîđ ñöţ ŕüñ. À ƒöŕḿàţţéŕ ŕüñš çöđé îţš þŕöĵéçţ çöñţŕöļš, šüçĥ àš îţš çöñƒîĝüŕàţîöñ àñđ þļüĝîñš, àñđ àñ àĝéñţ ţĥàţ ḿàý ŵŕîţé ƒîļéš çàñ ŵŕîţé ţĥàţ çöñƒîĝüŕàţîöñ, šö apply_edits ñéṽéŕ ŕüñš öñé. Šüçĥ àñ éđîţ ŕéþöŕţš ţĥàţ îţ đîđ ñöţ ŕüñ, ŵîţĥ ţĥé ŕéàšöñ formatter; à þéŕšöñ àþþļîéš îţ ŵîţĥ kapi apply îñ à ţéŕḿîñàļ, ŵĥéŕé ţĥé ƒöŕḿàţţéŕ ŕüñš üñđéŕ éẋéçüţîöñ ţŕüšţ. À Ĝö çöḿḿéñţ îš ĥéļđ ţö go/format îñšîđé ţĥé kapi ƃîñàŕý, šö à Ĝö éđîţ šţàŕţš ñö ƒöŕḿàţţéŕ þŕöçéšš. Éàçĥ ŵŕîţţéñ ƒîļé'š ŕéšüļţ çàŕŕîéš à çĥéçķ šçöþéđ ţö ŵĥàţ ŵàš ŵŕîţţéñ.

kindŴĥàţ ţĥé éñţŕý çĥàñĝéš
contentÀ ƃļöçķ'š ţéẋţ, ţĥŕöüĝĥ ţĥé ƒàîţĥƒüļ ŵŕîţéŕ
commentÀ çöđé çöḿḿéñţ'š þŕöšé, ķééþîñĝ éṽéŕý öţĥéŕ ƃýţé
termÀñ éñţŕý îñ ţĥé þŕöĵéçţ'š ţéŕḿš šţöŕé
memoryÀ šöüŕçé/ţàŕĝéţ þàîŕ îñ ţĥé çöñţéñţ ḿéḿöŕý
voiceÀ ŕüļé îñ à ṽöîçé þŕöƒîļé
recipeÀ ƒîéļđ öƒ kapi.yaml
reviewÀ üñîţ'š þöšîţîöñ öñ ţĥé ŕéṽîéŵ ļàđđéŕ
kapi apply <<<'{"kind":"memory","source":"Save","target":"Lagre","source_locale":"en","target_locale":"nb","status":"signed-off"}'

çĥéçķ_ƒîļé

ÞàŕàḿéţéŕŢýþéŔéǫüîŕéđĐéšçŕîþţîöñ
diffstringñöunified diff text (git diff output); only the content blocks it touches are checked
diff_againststringñögit revision to diff the working tree against, read-only, with untracked files as added; only the content blocks changed are checked
diff_rangestringñötwo commits as A..B, or A...B for the change B made since its merge base with A; each file is read from B and nothing from the working tree; only the content blocks changed are checked
dntarrayñödo-not-translate terms that must survive verbatim into the target
filestringñöpath to the file whose content should be checked; with diff, diff_against, staged or diff_range it narrows the scope to this file, and may be omitted
forbidarrayñöregex that must NOT appear in the content
max_charsintegerñöflag content longer than this many characters (0 = off)
max_wordsintegerñöflag content with more than this many words (0 = off)
profile_filestringñöexplicit voice override loaded from YAML; bypasses the file-scoped project voice and channel; omit to use project guidance
profile_packstringñöexplicit voice override; omitting profile_pack and profile_file preserves the file-scoped project voice and channel
projectstringñöthe project this call acts on: its kapi.yaml recipe, its root directory, or any path inside it (default: the project the MCP server started in)
requirearrayñöregex that MUST appear in the content
stagedbooleanñöcheck the changes staged for commit: the index diffed against HEAD, with each file read from the index, leaving out unstaged edits and untracked files; only the content blocks changed are checked
targetstringñötranslated target file to check against the source (enables the bilingual source-against-target checks)
target_langstringñölocale of the target file (e.g. de)
validatestringñöreader structure/encoding validation: off|report|strict (report folds structure.*/encoding.* findings into the report; strict also fails on a Major+ structure/encoding problem). Default off.

çĥéçķ_ţéẋţ

ÞàŕàḿéţéŕŢýþéŔéǫüîŕéđĐéšçŕîþţîöñ
textstringýéšthe text to verify
context_pathstringñöproject-relative destination whose voice and terms govern this draft; may not exist yet; requires a project; cannot combine with profile_pack or profile_file
forbidarrayñöregex that must NOT appear in the content
max_charsintegerñöflag content longer than this many characters (0 = off)
max_wordsintegerñöflag content with more than this many words (0 = off)
profile_filestringñöpath to a voice profile YAML
profile_packstringñöbuilt-in profile pack to check vocabulary against (e.g. marketing-blog)
projectstringñöthe project this call acts on: its kapi.yaml recipe, its root directory, or any path inside it (default: the project the MCP server started in)
requirearrayñöregex that MUST appear in the content

šţàţš

ÞàŕàḿéţéŕŢýþéŔéǫüîŕéđĐéšçŕîþţîöñ
filesarrayýéšpaths of the files to summarize
formatstringñöinput format override applied to every file (default: auto-detect by extension/content)

üþ_þļàñ

ÞàŕàḿéţéŕŢýþéŔéǫüîŕéđĐéšçŕîþţîöñ
projectstringñöthe project this call acts on: its kapi.yaml recipe, its root directory, or any path inside it (default: the project the MCP server started in)

üþ

ÞàŕàḿéţéŕŢýþéŔéǫüîŕéđĐéšçŕîþţîöñ
jobsintegerñöhow many languages to catch up concurrently per pass (0 = project default, else 4)
localbooleanñöin a server-connected project, run the loop on this machine and push the results, instead of running it on the server
materializebooleanñöafter the loop, write the target-language files for every shippable locale (overrides the recipe's materialize policy)
no_checksbooleanñöskip the project's bound checks inside the loop (failing units then count as translated)
passesintegerñömaximum reconciliation passes (0 = loop until up to date or parked; 1 = single pass)
projectstringñöthe project this call acts on: its kapi.yaml recipe, its root directory, or any path inside it (default: the project the MCP server started in)

đéţéçţ_ƒöŕḿàţ

ÞàŕàḿéţéŕŢýþéŔéǫüîŕéđĐéšçŕîþţîöñ
pathstringýéšFile path to detect format from

Ĥöŵ îţ ŵöŕķš

Kapi ḾÇÞ üšéš ţĥé šàḿé ḿàçĥîñéŕý àš ţĥé ÇĻÎ çöḿḿàñđš: ţĥé ƒöŕḿàţ ŕéĝîšţŕý ƒöŕ đéţéçţîöñ, ţĥé éẋéçüţöŕ ƒöŕ ƒļöŵ öŕçĥéšţŕàţîöñ, àñđ ţĥé šàḿé ƃüîļţ-îñ ţööļš. Ţĥé ḾÇÞ šéŕṽéŕ éẋþöšéš ţĥéḿ àš ţýþéđ, đîšçöṽéŕàƃļé ţööļš öṽéŕ ţĥé Ḿöđéļ Çöñţéẋţ Þŕöţöçöļ šţđîö ţŕàñšþöŕţ.

Ñö šéŕṽéŕ þŕöçéšš, þöŕţš, öŕ àüţĥéñţîçàţîöñ ñééđéđ. Ýöüŕ ÀÎ ţööļ ļàüñçĥéš kapi mcp àš à çĥîļđ þŕöçéšš, çöḿḿüñîçàţéš öṽéŕ šţđîñ/šţđöüţ, àñđ šĥüţš îţ đöŵñ ŵĥéñ ţĥé šéššîöñ éñđš.

:::ñöţé Ḿöšţ ţööļš ĥéŕé àŕé ŕüļé-ƃàšéđ àñđ ñééđ ñö ÀÞÎ ķéý: context_search, check_text, check_file, voice_check, voice_rewrite, stats, extract_content, apply_edits, àñđ ţĥé ŕéṽîéŵ ṽéŕƃš àļļ ŕüñ öƒƒļîñé. Ţĥé öñéš ţĥàţ ŕéàçĥ à ļàñĝüàĝé ḿöđéļ (translate, àñđ up ŵĥéñ ţĥéŕé îš ŵöŕķ ţĥé çöñţéñţ ḿéḿöŕý çàññöţ çöṽéŕ) ñééđ à þŕöṽîđéŕ çŕéđéñţîàļ, ŵĥîçĥ ţĥéý ŕéàđ ƒŕöḿ ţĥé šàḿé çŕéđéñţîàļ šţöŕé ţĥé ÇĻÎ üšéš (kapi credentials add). :::

Ŕéļàţéđ