World & codex
26 MCP tools. Each applies to the one project the server was launched with; every mutating call is one undo step and saves immediately.
add_comment
Adds a review comment on a named object (Markdown body permitted).
| Parameter | Type | Required | Description |
|---|---|---|---|
anchor | string | no | An optional locator within the target (e.g. a quoted snippet). |
author | string | no | The display author; defaults to "Claude". |
body | string | yes | The comment text. |
target | string | yes | The annotated object's title or name. |
target_id | string | no | The annotated object's id, when the name is ambiguous. |
Example call
{
"name": "add_comment",
"arguments": {
"target": "<target>",
"body": "<body>"
}
}
add_field
Defines a typed field on a codex category's schema (or replaces the same-named field already on it). "type" is text (default), number, boolean, date, reference, choice, or url; a choice field needs an "options" list. The field then applies to every entity in the category and its subcategories. A FIXED field is different in kind: the category supplies one "fixed_value" that every entity beneath shows read-only and none can change or shadow -- the way to say "every city here is in Vaertis" once instead of storing a copy on each city. Fixed and required are mutually exclusive. A reference field takes "reference_category": the only category its values may point into, with everything beneath it -- without one it offers every entity in the project, which on a large codex is not a choice. To give a property to ONE entity, use entity_property instead.
| Parameter | Type | Required | Description |
|---|---|---|---|
category | string | yes | The category to add the field to (by name). |
description | string | no | Optional help text for the field. |
fixed | boolean | no | The category supplies the value; entities show it read-only. |
fixed_value | string | no | The value a fixed field supplies to everything beneath it. |
label | string | yes | The field's display label, e.g. "Eye Color". |
options | array | no | Allowed values (choice fields only). |
reference_category | string | no | Reference fields only: the category (by name) its values may point into, with everything beneath it. Anything, when omitted. |
required | boolean | no | Whether entities must supply a value. |
type | string | no | text | number | boolean | date | reference | choice | url. |
Example call
{
"name": "add_field",
"arguments": {
"category": "<category>",
"label": "<label>"
}
}
check_name
Near-matches for a proposed name across every object title and entity alias, by edit distance. Catches the collision a text search cannot: 'Marda' and 'Martha' share no searchable substring, so without this the second gets coined while the first is already canon. Call it BEFORE using a new name.
| Parameter | Type | Required | Description |
|---|---|---|---|
max_distance | integer | no | How many edits still counts as confusable (default 2). |
name | string | yes | The name you are about to use. |
Example call
{
"name": "check_name",
"arguments": {
"name": "<name>"
}
}
convert_field
Changes a category's OWN field to a new type (text/number/boolean/date/reference/choice/url) -- the way to make a field created as text (e.g. "Father") into a Reference. Entity values migrate where safe: text->reference resolves each value that names a unique entity to that entity (values naming no entity are kept as text and reported); reference->text replaces each id with its target's name. One undo step.
| Parameter | Type | Required | Description |
|---|---|---|---|
category | string | yes | The category whose field to convert (by name). |
field | string | yes | The field's label or key (must be the category's own field). |
options | array | no | Allowed values when converting to a choice field. |
type | string | yes | The new type: text, number, boolean, date, reference, choice, or url. |
Example call
{
"name": "convert_field",
"arguments": {
"category": "<category>",
"field": "<field>",
"type": "<type>"
}
}
create_category
Creates a codex category (with a standard Summary field). Pass "parent" to nest it under another category (the parent is created when absent), or "parent_entity" to hang it under one ENTITY -- the cities of one kingdom, say, rather than cities in general. The two are alternatives; a category has one parent. A category nested under an entity starts with NO inherited properties, because nothing crosses an entity boundary by default: name what it should take with update_category's "inherited". A category that already exists is a valid no-op.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes | The new category's name. |
parent | string | no | Optional parent category to nest it under (by name). |
parent_entity | string | no | Optional parent ENTITY to hang it under (by name or alias). |
Example call
{
"name": "create_category",
"arguments": {
"name": "<name>"
}
}
create_entity
Creates a codex entity, optionally with its aliases, tags, lifespan, and references in the SAME call (one undo step) -- no follow-up update_entity needed. The category is created when absent; "fields" values are created as text fields on it (a built-in property named there is refused -- use its own key). References target existing entities by name.
| Parameter | Type | Required | Description |
|---|---|---|---|
aliases | array | no | Alternate names/nicknames. |
born | string | no | Birth date in the project calendar. |
category | string | yes | The category to file it under. |
died | string | no | Death date in the project calendar. |
fields | object | no | CUSTOM field values as label -> value. A bare value sets a text field (or an existing field's own type). To create and set a typed field in one call, use an object {"value", "type", "options"} -- type is number/boolean/date/choice/url/text (a Reference field goes through "references"; a Choice needs "options"). |
name | string | yes | The new entity's name (must not exist yet). |
references | object | no | Reference field values as label -> target entity name (the target must already exist). |
summary | string | no | A one-paragraph summary. |
tags | array | no | Cross-cutting tags. |
timed_values | array | no | State-over-time: objects of {field, when, value}, dates in the project calendar. |
Example call
{
"name": "create_entity",
"arguments": {
"name": "<name>",
"category": "<category>"
}
}
delete_object
Deletes any titled object (entity, document, map, spreadsheet, timeline event, ...) by name and states what type it deleted. One undo step.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | no | The object's id, when the name is ambiguous. |
name | string | yes | The object's title or name. |
Example call
{
"name": "delete_object",
"arguments": {
"name": "<name>"
}
}
entity_property
A property that belongs to ONE entity -- Vaertis's noble houses, not every kingdom's. No sibling in its category ever sees it, which is what makes this the tool for a fact about a particular thing; add_field is for a property the whole category shares. "action": add (default) declares it, giving "label" and optionally "type" (text default, or number/boolean/date/reference/choice/url) with "options" for a choice -- re-adding the same label replaces it in place, and a property the entity inherits as FIXED cannot be shadowed; remove drops it, keeping the value so undo restores both; promote sends it UP to the category, where every sibling gains the slot and none gains a value, for when it turns out to be shared after all. The reverse of promote is remove_field with "demote": true.
| Parameter | Type | Required | Description |
|---|---|---|---|
action | string | no | add (default) | remove | promote. |
description | string | no | Optional help text. |
entity | string | yes | The entity's name or alias. |
field | string | no | The property's label or key when removing or promoting. |
id | string | no | The entity's id, when the name is ambiguous. |
label | string | no | The property's display label when adding, e.g. "Noble Houses". |
options | array | no | Allowed values (choice properties only). |
required | boolean | no | Whether a value must be supplied. |
type | string | no | text | number | boolean | date | reference | choice | url. |
Example call
{
"name": "entity_property",
"arguments": {
"entity": "<entity>"
}
}
get_category
Shows a category's parent, subcategories, entity count, and its full field schema (each field's type, options, whether required, and own vs inherited) -- the read side of add_field / remove_field / move_field.
| Parameter | Type | Required | Description |
|---|---|---|---|
category | string | yes | The category's name. |
Example call
{
"name": "get_category",
"arguments": {
"category": "<category>"
}
}
get_entity
One entity: category, aliases, tags, lifespan in the project calendar, field values (references resolved to names), state over time, gallery size, and where it is mentioned. Long field values and the mention list are shortened unless "full" is true; ALWAYS pass full:true before rewriting a field, or the part you were not shown is lost when you write it back.
| Parameter | Type | Required | Description |
|---|---|---|---|
full | boolean | no | Return complete field values, complete state-over-time values, and every mention, with nothing shortened. |
id | string | no | The entity's id, when the name is ambiguous. |
name | string | yes | The entity's name or alias. |
Example call
{
"name": "get_entity",
"arguments": {
"name": "<name>"
}
}
get_project_overview
The project at a glance: object counts per content type, the category tree with entity counts, the calendar, the audience registry, and the mounted libraries with their permissions.
No parameters.
Example call
{
"name": "get_project_overview",
"arguments": {}
}
get_relationships
The codex relationship graph as text: the Reference-field links between entities (spanning mounted libraries). With no "entity", lists every relationship; with an "entity", lists its neighborhood within "depth" hops (default 2, 0 = all) in "direction" both/outgoing/incoming (default both). Each line reads "Source --[label]--> Target".
| Parameter | Type | Required | Description |
|---|---|---|---|
depth | integer | no | Hops from the focus to include (default 2; 0 = all). |
direction | string | no | both (default), outgoing, or incoming. |
entity | string | no | Optional focus entity (name or alias); omit for the whole graph. |
id | string | no | The focus entity's id, when its name is ambiguous. |
Example call
{
"name": "get_relationships",
"arguments": {
"depth": 0,
"direction": "<direction>"
}
}
list_category
Lists the entities of a named codex category with one-line summaries.
| Parameter | Type | Required | Description |
|---|---|---|---|
category | string | yes | The category's name. |
Example call
{
"name": "list_category",
"arguments": {
"category": "<category>"
}
}
list_comments
Lists comment threads: for one target, or grouped by target across the whole project. Only threads with open work unless include_resolved is true.
| Parameter | Type | Required | Description |
|---|---|---|---|
include_resolved | boolean | no | Include fully resolved threads too. |
target | string | no | Limit to one object's comments (title or name). |
target_id | string | no | The target's id, when the name is ambiguous. |
Example call
{
"name": "list_comments",
"arguments": {
"include_resolved": true,
"target": "<target>"
}
}
merge_entities
Merges the source entity into the target: fills gaps in the target, re-points every reference from the source, then removes the source. One undo step.
| Parameter | Type | Required | Description |
|---|---|---|---|
source | string | yes | The entity to merge away. |
source_id | string | no | The source's id, when its name is ambiguous. |
target | string | yes | The entity that survives. |
target_id | string | no | The target's id, when its name is ambiguous. |
Example call
{
"name": "merge_entities",
"arguments": {
"source": "<source>",
"target": "<target>"
}
}
move_field
Reorders a field within a codex category's own schema, changing the order fields are shown. "position" is a 0-based index (clamped to the valid range). Pass "entity" instead of "category" to reorder one entity's OWN properties among themselves -- the same list entity_property adds to.
| Parameter | Type | Required | Description |
|---|---|---|---|
category | string | no | The category to edit (by name). |
entity | string | no | The entity whose own properties to reorder, instead of a category. |
field | string | yes | The field's label or key. |
id | string | no | The entity's id, when its name is ambiguous. |
position | integer | yes | The 0-based index to move it to. |
Example call
{
"name": "move_field",
"arguments": {
"field": "<field>",
"position": 0
}
}
remove_field
Removes a field from a codex category's own schema. Existing entity values under the field are kept (so the removal is reversible) but stop being visible anywhere. Pass "demote": true when some entities are actually using it: the property comes off the category and lands on each entity that holds a value, so those values stay reachable while the rest of the category loses the empty slot -- the cleanup for a property that turned out to be about one or two things rather than the whole category. "dry_run": true with it names exactly who would receive it. An inherited field must be removed from the parent category that defines it.
| Parameter | Type | Required | Description |
|---|---|---|---|
category | string | yes | The category to edit (by name). |
demote | boolean | no | Give it to the entities that hold values instead of dropping it. |
dry_run | boolean | no | With demote: report who would receive it, changing nothing. |
field | string | yes | The field's label or key. |
Example call
{
"name": "remove_field",
"arguments": {
"category": "<category>",
"field": "<field>"
}
}
rename_object
Renames every textual occurrence of a name across the whole project -- object names and aliases, document bodies, synopses, points of view and statuses, entity field values and state-over-time values, task and timeline-event descriptions, comment text, and plot-thread names and descriptions. Matching is whole-word and case-sensitive, so renaming 'Marda' never touches 'Mardana'. Pass "dry_run": true FIRST to see exactly what would change and where; the whole rename is one undo step.
| Parameter | Type | Required | Description |
|---|---|---|---|
dry_run | boolean | no | Report what would change without changing anything. |
name | string | yes | The existing name to replace. |
new_name | string | no | What to replace it with (omit with dry_run to just survey). |
Example call
{
"name": "rename_object",
"arguments": {
"name": "<name>"
}
}
reply_comment
Posts a threaded reply to an existing comment (address it by the id list_comments prints). The reply shares the original's target and joins its thread.
| Parameter | Type | Required | Description |
|---|---|---|---|
author | string | no | The display author; defaults to "Claude". |
body | string | yes | The reply text. |
comment | string | yes | The id of the comment to reply to. |
Example call
{
"name": "reply_comment",
"arguments": {
"comment": "<comment>",
"body": "<body>"
}
}
resolve_comment
Marks a comment resolved (or reopens it with resolved: false). Address it by the id list_comments prints.
| Parameter | Type | Required | Description |
|---|---|---|---|
comment | string | yes | The id of the comment to resolve. |
resolved | boolean | no | true (default) to resolve, false to reopen. |
Example call
{
"name": "resolve_comment",
"arguments": {
"comment": "<comment>"
}
}
search
Full-text search across the project and its mounted libraries. Covers names, titles and entity aliases; entity FIELD VALUES and state-over-time values (where the codex keeps its canon); document body, synopsis, point_of_view and status; task and timeline-event descriptions; comment text; and plot-thread descriptions. Each match names WHERE it was found -- e.g. 'Urlings (entity) > field "Faith And Devotion"' -- so a stale reference can be fixed without hunting for it. Returns up to 50 matches and says so honestly when capped.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | yes | What to find; matched case-insensitively. |
Example call
{
"name": "search",
"arguments": {
"query": "<query>"
}
}
set_ai_exclusion
Toggles whether an object is excluded from AI features (per-object privacy). When excluded, its content is withheld from the agent's world snapshot, the semantic/RAG index, and canon-consistency checks. Pass "excluded": false to include it again.
| Parameter | Type | Required | Description |
|---|---|---|---|
excluded | boolean | yes | true to hide it from AI, false to include it again. |
id | string | no | The object's id, when the name is ambiguous. |
name | string | yes | The object's title or name. |
Example call
{
"name": "set_ai_exclusion",
"arguments": {
"name": "<name>",
"excluded": true
}
}
set_visibility
Restricts an object to the named audiences (an empty array makes it visible to everyone). Audience names the project has not seen yet are added to its registry.
| Parameter | Type | Required | Description |
|---|---|---|---|
audiences | array | yes | The audiences that may see the object; empty means everyone. |
id | string | no | The object's id, when the name is ambiguous. |
name | string | yes | The object's title or name. |
Example call
{
"name": "set_visibility",
"arguments": {
"name": "<name>",
"audiences": []
}
}
split_entity
Carves a new entity off an existing one (the inverse of merge_entities): the new entity is created in the source's category, copying the chosen fields (and optionally the lifespan). The source is left intact -- you then divide the references between the two by hand.
| Parameter | Type | Required | Description |
|---|---|---|---|
copy_lifespan | boolean | no | Also copy the source's birth/death instants. |
fields | array | no | Field labels/keys to copy into the new entity (omit to copy none). |
new_name | string | yes | The new entity's name (must not collide with an existing one). |
source | string | yes | The entity to split (name or alias). |
source_id | string | no | The source's id, when its name is ambiguous. |
Example call
{
"name": "split_entity",
"arguments": {
"source": "<source>",
"new_name": "<new_name>"
}
}
update_category
Renames, moves, or deletes a codex category. Provide "category" (the one to change) and one of: "new_name" to rename; "parent" to move it under another category (an empty string makes it top-level; the parent is created when absent); "parent_entity" to hang it under one ENTITY instead; "inherited" (or "inherit_all": true) to say which properties it TAKES through its parent entity -- nothing crosses an entity boundary until it asks; "excluded" to say which inherited properties it DROPS, which hides them and never deletes a value; or "delete": true to remove it, promoting its subcategories and entities to its parent. A move that would nest a category inside its own subcategory, or hang it from an entity already beneath it, is refused.
| Parameter | Type | Required | Description |
|---|---|---|---|
category | string | yes | The category to change (by name). |
delete | boolean | no | Delete the category (promotes its contents to its parent). |
excluded | array | no | The inherited properties it drops (replaces the whole list). |
inherit_all | boolean | no | Take everything reachable through the parent entity. |
inherited | array | no | The properties it takes through its parent entity (replaces the whole list; empty takes nothing). |
new_name | string | no | A new name for the category. |
parent | string | no | Move it under this category (empty = top-level). |
parent_entity | string | no | Hang it under this entity (by name or alias). |
Example call
{
"name": "update_category",
"arguments": {
"category": "<category>"
}
}
update_entity
Sparse update of one entity: only the provided keys change, absent keys leave the entity untouched. "new_name" renames it; "category" moves it to another category (created when absent). "aliases" and "tags" replace their whole set; an empty "born"/"died" string clears that date. "fields" is for CUSTOM fields only -- a built-in property named there is refused.
| Parameter | Type | Required | Description |
|---|---|---|---|
aliases | array | no | The replacement alias set. |
born | string | no | Birth date in the project calendar; "" clears it. |
category | string | no | Move the entity into this category (created when absent). |
died | string | no | Death date in the project calendar; "" clears it. |
entity | string | yes | The entity's name or alias. |
fields | object | no | CUSTOM text field values as label -> value. |
id | string | no | The entity's id, when the name is ambiguous. |
new_name | string | no | Rename the entity to this (must not collide with another entity). |
references | object | no | Reference field values as label -> target entity name. |
tags | array | no | The replacement tag set. |
timed_values | array | no | The replacement state-over-time set: objects of {field, when, value}, dates in the project calendar; [] clears it. |
Example call
{
"name": "update_entity",
"arguments": {
"entity": "<entity>"
}
}