Keel
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Subjects are ':'. Kinds: document (document:LIC-D118, document:POL-7731), driver (driver:D-118), inspection (inspection:INS-4821-10), ticket (ticket:TK-3608), tire (tire:T-9001), unit (unit:MXK-4821), workshop (workshop:WS-02).
Relations: assigned_to (driver->unit), covers_driver (document->driver), covers_unit (document->unit), found_in (ticket->inspection), has_inspection (unit->inspection), has_ticket (unit->ticket), in_workshop (unit->workshop), mounted_on (tire->unit).
Rules (context's evaluation; search(rule=) lists where one holds; trust them):
document_critical (document): A document is critical when it expires within 15 days; expired when the date has passed.
fuel_anomaly (unit): A fuel load is anomalous when liters exceed the tank capacity or consumption per km deviates more than 30% from the unit's 30-day average.
ticket_stale (ticket): A ticket is stale when its status has not changed for 7 days.
tire_critical (tire): A tire is critical when tread depth is below 3 mm.
unit_grounded (unit): A unit is grounded when any tire mounted on it is critical. Lists of records come as tables: {"all": {fields every record shares}, "cols": [...], "rows": [[...]]}, a row holding a record's values in the order of cols, and a last object with its other fields when it has some;
a.bis field b of a. Times are UTC.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| contextB | What is true about a subject (':' or a list) now or at as_of: facts with |
| historyB | Facts over time of a subject, oldest first; no subject + since/until: every change in the tenant then (predicate: one field). |
| searchB | Find subjects. kind lists a kind; rule, where a rule holds; text matches keys and values; where={name: value or [any of]}: attribute, fact or neighbour ({relation or kind: key}); hits say |
| annotateC | Record what you learned (value: any JSON). scope tenant or global needs evidence; key: an idempotent retry; status="proposed": awaits review. |
| relatedB | Neighbours of a subject by relation, now or at as_of; depth 2-3 walks further. At most limit (0: all); a cut list starts with {"more": ...}. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 5 tools
The core split (context = current facts, history = facts over time, search = find subjects, annotate = write, related = neighbours) is mostly clear, but the boundaries blur: `search` with related_to/via and `context` with depth=1 both do what `related` does, and `context` vs `history` differ only by temporal framing. The descriptions do enough to steer an agent, but these are real overlaps rather than clean separations.
All names are single lowercase tokens, which is tidy, but the grammatical convention is mixed: `search` and `annotate` are verbs while `context`, `history`, and `related` are nouns/adjectives. `context` in particular is a vague name for a read operation, so the set is readable but not predictable from a pattern.
Five tools is well within the healthy range and each maps to a distinct capability of a temporal fact store: point-in-time read, timeline read, discovery, neighbourhood traversal, and write. Nothing feels padded or missing at the count level.
Read coverage is strong (current, historical, search, relations) and `annotate` covers ingestion, but there is no way to retract, correct, or supersede a fact, and no tool for managing the rules that `context` and `search` evaluate against. Agents hitting bad data or needing rule definitions will dead-end.