MCP (Model Context Protocol) gateway for the Kalita agent-era runtime. Provides tools for agents to read/write records, manage workflows, handle tasks, and author packs over JSON-RPC.
Kalita MCP server demonstrates solid tool design with 22 well-structured tools covering entity management, workflow orchestration, and task handling. All tools have explicit descriptions (10-200+ chars) and JSON Schema input definitions with typed parameters. Naming follows verb_noun convention (describe_*, get_*, create_*, update_*, query, act, etc.). However, parameter descriptions are sparse or missing entirely, most parameters lack explanatory text beyond their names. Output schemas are not documented in the visible code. Error handling guidance is minimal. The server shows production-grade intent (idempotency keys, basis tracking, permission gates) but falls short of LLM-optimized parameter documentation.
Execute a workflow transition by action name. Requires idempotency_key. May return pending_approval — then a human decides, you cannot rush it.
Post a comment on a record — the conversation thread (talk to a human in a task, reply to a customer). internal=true is a staff-only note the external customer cannot see. Requires idempotency_key.
Finish a taken task with a result. Requires idempotency_key.
Author a pack from STRUCTURED JSON instead of raw DSL — you do not need the grammar. Pass entities with typed fields, workflows, roles and permission rules; the node renders and validates the DSL. Field types: string,text,int,float,money,bool,date,datetime,file,email,url,phone,duration,percent,color,decimal,json,serial,enum(+values),ref(+ref),array_ref(+ref),tags,multiselect(+values),array_file.
Create a record. Requires basis and idempotency_key.
Parameter descriptions missing or minimal across all 22 tools. Most parameters (entity, id, values, basis, idempotency_key, etc.) lack explanatory text. LLMs cannot infer parameter semantics from names alone, 'basis' and 'idempotency_key' require context that is absent.
Output schemas not documented in visible code. Tools return structured data but LLMs have no schema reference for response fields, types, or pagination. This forces LLMs to guess field names and types for downstream tool calls.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
Full schema of one entity: fields, workflow, your access.
Packs, entities, workflows, roles and your permissions. Call this first.
The NET change to a record between two journal seqs: per-field old→new plus any workflow state move. 'Everything the agent touched since it took the record' is diff from that seq with to_seq omitted (= now). A read — honors read permissions, never mutates. Pair with rewind_record: see the change before you reverse it.
Honestly fail a task with a reason. Cheaper than silently hanging until the lease expires. Requires idempotency_key.
The kalita DSL grammar with a canonical example, for generating packs.
One record by id (fields you may not read are absent).
Tasks assigned to your role (open by default).
List records within your permissions. 'where' is the full condition language (and/or/not/(), =,!=,>,<,>=,<=, in [..], ref-paths like project.owner, $me/$self/$now); 'sort' is a list of fields (prefix - for descending); 'search' is full-text over text/string fields.
Read the comment thread on a record (only what you may see — customers do not see internal notes).
Node-wide incremental tail over the journal, NOT scoped to one record — pull every event.emitted (or another kind your role tails) since a cursor. Requires a `tail [kind]` grant per kind; kinds defaults to [event.emitted]. Page with next_since until it stops advancing.
Event history of a record you can read.
Attach a progress note. The journal cross-checks it against your actual events on the record. Requires idempotency_key.
Undo a record's most recent change — a field edit or a workflow transition — by appending a compensating event (history is never erased). Can move the state backward across a one-way transition; needs `full` on the entity, so it is a human supervisory action. Revert again to redo. Requires idempotency_key.
Restore a record to its state as of journal event to_seq — multi-step undo across any number of edits and transitions (e.g. 'rewind to before the agent touched it'). Reconstructs the past state from history and appends compensating events; nothing is erased. Needs `full` on the entity. Use read_journal to find the target seq. Requires idempotency_key.
Take an open task: an exclusive lease with TTL. Losing the lease loses the task. Requires idempotency_key.
Partially update a record. Requires basis and idempotency_key. The workflow state field cannot be written — use act.
Long-poll: blocks until an open task exists for your role or timeout_sec (default 25, max 55) passes. Use this instead of polling list_my_tasks in a loop.
Error handling guidance absent. No visible error recovery hints, retryability classification, or actionable error messages. Tools like 'act' mention 'pending_approval' but do not explain how to handle it or what the LLM should do next.
Complex nested schemas (compose_pack) lack field-level descriptions. The 'entities' array contains deeply nested 'fields' and 'workflows' objects with no per-field documentation. LLMs cannot reason about which fields are required or what values are valid.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) visible in schema. Tools like 'delete_record' (if it existed) or 'revert_record' should signal destructiveness; read-only tools should be marked. This forces LLMs to infer safety from descriptions alone.