World & codex

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

ParameterTypeRequiredDescription
categorystringyesThe category to add the field to (by name).
descriptionstringnoOptional help text for the field.
labelstringyesThe field's display label, e.g. "Eye Color".
optionsarraynoAllowed values (choice fields only).
requiredbooleannoWhether entities must supply a value.
typestringnotext | number | boolean | date | reference | choice | url.

Example call

{
  "name": "add_field",
  "arguments": {
    "category": "<category>",
    "label": "<label>"
  }
}

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

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>"
  }
}

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 in full: category, aliases, tags, lifespan in the project calendar, field values (references resolved to names), state over time, gallery size, and where it is mentioned.

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

ParameterTypeRequiredDescription
categorystringyesThe category to edit (by name).
fieldstringyesThe field's label or key.
positionintegeryesThe 0-based index to move it to.

Example call

{
  "name": "move_field",
  "arguments": {
    "category": "<category>",
    "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). An inherited field must be removed from the parent category that defines it.

ParameterTypeRequiredDescription
categorystringyesThe category to edit (by name).
fieldstringyesThe field's label or key.

Example call

{
  "name": "remove_field",
  "arguments": {
    "category": "<category>",
    "field": "<field>"
  }
}

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); 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 is refused.

ParameterTypeRequiredDescription
categorystringyesThe category to change (by name).
deletebooleannoDelete the category (promotes its contents to its parent).
new_namestringnoA new name for the category.
parentstringnoMove it under this category (empty = top-level).

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>"
  }
}