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).

ParameterTypeRequiredDescription
anchorstringnoAn optional locator within the target (e.g. a quoted snippet).
authorstringnoThe display author; defaults to "Claude".
bodystringyesThe comment text.
targetstringyesThe annotated object's title or name.
target_idstringnoThe 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.

ParameterTypeRequiredDescription
categorystringyesThe category to add the field to (by name).
descriptionstringnoOptional help text for the field.
fixedbooleannoThe category supplies the value; entities show it read-only.
fixed_valuestringnoThe value a fixed field supplies to everything beneath it.
labelstringyesThe field's display label, e.g. "Eye Color".
optionsarraynoAllowed values (choice fields only).
reference_categorystringnoReference fields only: the category (by name) its values may point into, with everything beneath it. Anything, when omitted.
requiredbooleannoWhether entities must supply a value.
typestringnotext | 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.

ParameterTypeRequiredDescription
max_distanceintegernoHow many edits still counts as confusable (default 2).
namestringyesThe 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.

ParameterTypeRequiredDescription
categorystringyesThe category whose field to convert (by name).
fieldstringyesThe field's label or key (must be the category's own field).
optionsarraynoAllowed values when converting to a choice field.
typestringyesThe 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.

ParameterTypeRequiredDescription
namestringyesThe new category's name.
parentstringnoOptional parent category to nest it under (by name).
parent_entitystringnoOptional 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.

ParameterTypeRequiredDescription
aliasesarraynoAlternate names/nicknames.
bornstringnoBirth date in the project calendar.
categorystringyesThe category to file it under.
diedstringnoDeath date in the project calendar.
fieldsobjectnoCUSTOM 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").
namestringyesThe new entity's name (must not exist yet).
referencesobjectnoReference field values as label -> target entity name (the target must already exist).
summarystringnoA one-paragraph summary.
tagsarraynoCross-cutting tags.
timed_valuesarraynoState-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.

ParameterTypeRequiredDescription
idstringnoThe object's id, when the name is ambiguous.
namestringyesThe 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.

ParameterTypeRequiredDescription
actionstringnoadd (default) | remove | promote.
descriptionstringnoOptional help text.
entitystringyesThe entity's name or alias.
fieldstringnoThe property's label or key when removing or promoting.
idstringnoThe entity's id, when the name is ambiguous.
labelstringnoThe property's display label when adding, e.g. "Noble Houses".
optionsarraynoAllowed values (choice properties only).
requiredbooleannoWhether a value must be supplied.
typestringnotext | 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.

ParameterTypeRequiredDescription
categorystringyesThe 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.

ParameterTypeRequiredDescription
fullbooleannoReturn complete field values, complete state-over-time values, and every mention, with nothing shortened.
idstringnoThe entity's id, when the name is ambiguous.
namestringyesThe 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".

ParameterTypeRequiredDescription
depthintegernoHops from the focus to include (default 2; 0 = all).
directionstringnoboth (default), outgoing, or incoming.
entitystringnoOptional focus entity (name or alias); omit for the whole graph.
idstringnoThe 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.

ParameterTypeRequiredDescription
categorystringyesThe 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.

ParameterTypeRequiredDescription
include_resolvedbooleannoInclude fully resolved threads too.
targetstringnoLimit to one object's comments (title or name).
target_idstringnoThe 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.

ParameterTypeRequiredDescription
sourcestringyesThe entity to merge away.
source_idstringnoThe source's id, when its name is ambiguous.
targetstringyesThe entity that survives.
target_idstringnoThe 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.

ParameterTypeRequiredDescription
categorystringnoThe category to edit (by name).
entitystringnoThe entity whose own properties to reorder, instead of a category.
fieldstringyesThe field's label or key.
idstringnoThe entity's id, when its name is ambiguous.
positionintegeryesThe 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.

ParameterTypeRequiredDescription
categorystringyesThe category to edit (by name).
demotebooleannoGive it to the entities that hold values instead of dropping it.
dry_runbooleannoWith demote: report who would receive it, changing nothing.
fieldstringyesThe 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.

ParameterTypeRequiredDescription
dry_runbooleannoReport what would change without changing anything.
namestringyesThe existing name to replace.
new_namestringnoWhat 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.

ParameterTypeRequiredDescription
authorstringnoThe display author; defaults to "Claude".
bodystringyesThe reply text.
commentstringyesThe 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.

ParameterTypeRequiredDescription
commentstringyesThe id of the comment to resolve.
resolvedbooleannotrue (default) to resolve, false to reopen.

Example call

{
  "name": "resolve_comment",
  "arguments": {
    "comment": "<comment>"
  }
}

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.

ParameterTypeRequiredDescription
excludedbooleanyestrue to hide it from AI, false to include it again.
idstringnoThe object's id, when the name is ambiguous.
namestringyesThe 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.

ParameterTypeRequiredDescription
audiencesarrayyesThe audiences that may see the object; empty means everyone.
idstringnoThe object's id, when the name is ambiguous.
namestringyesThe 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.

ParameterTypeRequiredDescription
copy_lifespanbooleannoAlso copy the source's birth/death instants.
fieldsarraynoField labels/keys to copy into the new entity (omit to copy none).
new_namestringyesThe new entity's name (must not collide with an existing one).
sourcestringyesThe entity to split (name or alias).
source_idstringnoThe 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.

ParameterTypeRequiredDescription
categorystringyesThe category to change (by name).
deletebooleannoDelete the category (promotes its contents to its parent).
excludedarraynoThe inherited properties it drops (replaces the whole list).
inherit_allbooleannoTake everything reachable through the parent entity.
inheritedarraynoThe properties it takes through its parent entity (replaces the whole list; empty takes nothing).
new_namestringnoA new name for the category.
parentstringnoMove it under this category (empty = top-level).
parent_entitystringnoHang 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.

ParameterTypeRequiredDescription
aliasesarraynoThe replacement alias set.
bornstringnoBirth date in the project calendar; "" clears it.
categorystringnoMove the entity into this category (created when absent).
diedstringnoDeath date in the project calendar; "" clears it.
entitystringyesThe entity's name or alias.
fieldsobjectnoCUSTOM text field values as label -> value.
idstringnoThe entity's id, when the name is ambiguous.
new_namestringnoRename the entity to this (must not collide with another entity).
referencesobjectnoReference field values as label -> target entity name.
tagsarraynoThe replacement tag set.
timed_valuesarraynoThe 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>"
  }
}