ḾÇÞ šéŕṽéŕ
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_edits | Apply 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_unit | Approve 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_file | Check 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_text | Check 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_search | Ask 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_format | Detect the file format from a file path based on its extension |
extract_content | Parse 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). |
redact | Replace sensitive spans with protected placeholders before processing |
reject_unit | Reject 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_queue | List 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_unit | Fetch 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_unit | Sign off one review-queue unit (→ signed-off, the top ladder rung). Recorded with identity "agent/<client>". |
stats | Size 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-check | Terminology Check |
translate | Translate content with an LLM or machine-translation provider (select an engine, then a provider) |
up | Bring 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_plan | Dry-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_check | Score text against a voice profile using deterministic vocabulary rules; returns a 0-100 compliance score and findings |
voice_rewrite | Rewrite 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/markdown | What 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/markdown | What 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 ŕéàđš à šöüŕçé-ļàñĝüàĝé üñîţ ţĥé šàḿé ŵàý îţ
ŕéàđš à ţŕàñšļàţîöñ, ƒŕöḿ ţĥé šöüŕçé ƒîļé, àñđ ŕéţüŕñš îţš þöîñţ àñđ
ñéîĝĥƃöüŕĥööđ ŵîţĥ ñö ţàŕĝéţ ĥàļƒ. Ţĥé ţĥŕéé đéçîšîöñ ţööļš ŕéçöŕđ
ţàŕĝéţ-ļàñĝüàĝé đéçîšîöñš.
Ţööļ ŕéƒéŕéñçé
çöñţéẋţ_šéàŕçĥ
| Þàŕàḿéţéŕ | Ţýþé | Ŕéǫüîŕéđ | Đéšçŕîþţîöñ |
|---|---|---|---|
query | string | ýéš | the word or phrase to ask about |
limit | integer | ñö | max results per group (default 10) |
locale | string | ñö | narrow results to one language (e.g. en, fr) |
memory | string | ñö | path to a standalone content memory (default: the project's own store) |
project | string | ñö | 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) |
terms | string | ñö | path to a standalone terms store (default: the project's own store) |
éẋţŕàçţ_çöñţéñţ
| Þàŕàḿéţéŕ | Ţýþé | Ŕéǫüîŕéđ | Đéšçŕîþţîöñ |
|---|---|---|---|
path | string | ýéš | File path to extract content from |
format | string | ñö | Override format detection |
project | string | ñö | 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_lang | string | ñö | Source language (default: en) |
àþþļý_éđîţš
Ţĥé šîñĝļé ŵŕîţé ṽéŕƃ. Öñé éñţŕý öƒ ţĥé çĥàñĝé-šéţ îš öñé đéļîƃéŕàţé çĥàñĝé: à çöñţéñţ éđîţ, öŕ àñ éđîţ ţö àñ àššéţ ţĥé þŕöĵéçţ öŵñš.
| Þàŕàḿéţéŕ | Ţýþé | Ŕéǫüîŕéđ | Đéšçŕîþţîöñ |
|---|---|---|---|
changeset | array | ýéš | the typed change-set entries to apply |
project | string | ñö | 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"}'
çĥéçķ_ƒîļé
| Þàŕàḿéţéŕ | Ţýþé | Ŕéǫüîŕéđ | Đéšçŕîþţîöñ |
|---|---|---|---|
diff | string | ñö | unified diff text (git diff output); only the content blocks it touches are checked |
diff_against | string | ñö | git revision to diff the working tree against, read-only, with untracked files as added; only the content blocks changed are checked |
diff_range | string | ñö | 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 |
dnt | array | ñö | do-not-translate terms that must survive verbatim into the target |
file | string | ñö | 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 |
forbid | array | ñö | regex that must NOT appear in the content |
max_chars | integer | ñö | flag content longer than this many characters (0 = off) |
max_words | integer | ñö | flag content with more than this many words (0 = off) |
profile_file | string | ñö | explicit voice override loaded from YAML; bypasses the file-scoped project voice and channel; omit to use project guidance |
profile_pack | string | ñö | explicit voice override; omitting profile_pack and profile_file preserves the file-scoped project voice and channel |
project | string | ñö | 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) |
require | array | ñö | regex that MUST appear in the content |
staged | boolean | ñö | 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 |
target | string | ñö | translated target file to check against the source (enables the bilingual source-against-target checks) |
target_lang | string | ñö | locale of the target file (e.g. de) |
validate | string | ñö | 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. |
çĥéçķ_ţéẋţ
| Þàŕàḿéţéŕ | Ţýþé | Ŕéǫüîŕéđ | Đéšçŕîþţîöñ |
|---|---|---|---|
text | string | ýéš | the text to verify |
context_path | string | ñö | 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 |
forbid | array | ñö | regex that must NOT appear in the content |
max_chars | integer | ñö | flag content longer than this many characters (0 = off) |
max_words | integer | ñö | flag content with more than this many words (0 = off) |
profile_file | string | ñö | path to a voice profile YAML |
profile_pack | string | ñö | built-in profile pack to check vocabulary against (e.g. marketing-blog) |
project | string | ñö | 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) |
require | array | ñö | regex that MUST appear in the content |
šţàţš
| Þàŕàḿéţéŕ | Ţýþé | Ŕéǫüîŕéđ | Đéšçŕîþţîöñ |
|---|---|---|---|
files | array | ýéš | paths of the files to summarize |
format | string | ñö | input format override applied to every file (default: auto-detect by extension/content) |
üþ_þļàñ
| Þàŕàḿéţéŕ | Ţýþé | Ŕéǫüîŕéđ | Đéšçŕîþţîöñ |
|---|---|---|---|
project | string | ñö | 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) |
üþ
| Þàŕàḿéţéŕ | Ţýþé | Ŕéǫüîŕéđ | Đéšçŕîþţîöñ |
|---|---|---|---|
jobs | integer | ñö | how many languages to catch up concurrently per pass (0 = project default, else 4) |
local | boolean | ñö | in a server-connected project, run the loop on this machine and push the results, instead of running it on the server |
materialize | boolean | ñö | after the loop, write the target-language files for every shippable locale (overrides the recipe's materialize policy) |
no_checks | boolean | ñö | skip the project's bound checks inside the loop (failing units then count as translated) |
passes | integer | ñö | maximum reconciliation passes (0 = loop until up to date or parked; 1 = single pass) |
project | string | ñö | 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) |
đéţéçţ_ƒöŕḿàţ
| Þàŕàḿéţéŕ | Ţýþé | Ŕéǫüîŕéđ | Đéšçŕîþţîöñ |
|---|---|---|---|
path | string | ýéš | 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).
:::
Ŕéļàţéđ
- Üšé ţĥé Kapi Àĝéñţ Šķîļļš: ţĥé àĝéñţ-šķîļļš þàţĥ.
- Kapi ÇĻÎ ĝüîđéš
- Çöñţéẋţ ŕéţŕîéṽàļ: ŵĥý öñé ǫüéšţîöñ ŕéàçĥéš éṽéŕý šţöŕé.
- Çöḿḿàñđ ŕéƒéŕéñçé