mcpbeat

OnlyWorlds MCP Server

com.onlyworlds/mcp
answering

OnlyWorlds is answering right now. Last checked 12 min ago. It exposes 11 tools.

Read and write typed fictional worlds (22 linked element types) via the OnlyWorlds open standard.

Uptime history 40 hours of history
40 hours agonow
100.0%
Uptime 24h
91 of 91 checks
11
Tools
read from the server
213 ms
Response time
average over 24h
open, no key
Access
streamable-http

Connect this server

Endpoint below is the one we actually reach during checks — not the one copied from a README. Last verified 12 min ago.

run in your terminal
claude mcp add mcp --transport http https://www.onlyworlds.com/mcp
~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "mcp": {
      "url": "https://www.onlyworlds.com/mcp"
    }
  }
}
~/.codex/config.toml
[mcp_servers.mcp]
url = "https://www.onlyworlds.com/mcp"
.cursor/mcp.json
{
  "mcpServers": {
    "mcp": {
      "url": "https://www.onlyworlds.com/mcp"
    }
  }
}
.vscode/mcp.json
{
  "mcpServers": {
    "mcp": {
      "url": "https://www.onlyworlds.com/mcp"
    }
  }
}

Available tools 11

Read directly from the server with tools/list, grouped by what they act on. If a tool disappears, we record the date.

element
create_element
Create one new element of `type` in the world named by your API-Key header. `type` is a slug from `list_element_types` (e.g. "character"). `element` is the field payload: `name` plus any scalar, link, or extension fields for that type (call `get_element_schema(type)` for the field structure). Link fields are UUID arrays (multi) or a single UUID (single); every linked id must already exist in the world. Supply your own `id` (a UUID) to mint the element at that id, or omit `id` and the server mints a uuid7. Requires a WRITE API-Key. Returns the full created element in the v2 wire shape. Errors (naming the offending field) on an unknown field, a bad link target, or an id that already exists.
get_element
Fetch one element by `type` and `id` (a UUID) from the world named by your API-Key header. `type` is a slug from `list_element_types`. Returns the full v2 wire shape (the same body as `GET /api/v2/{type}/{id}`): `type`, `id`, `name`, scalar fields, link fields as UUID arrays, and any extension fields inline. Requires a READ or WRITE API-Key. Errors if no element of that type with that id exists in the world.
get_element_schema
Return the field structure of one OnlyWorlds element `type` (a slug from `list_element_types`, e.g. "character"). The result groups the type's writable fields by kind so a caller knows how to read and write them: `text` (strings), `integer`, `single_link` (one UUID), `multi_link` (an array of UUIDs), and `generic` (a type+id pair pointing at any element type). For every link field the target element type is given under `link_targets`. All link values are element UUIDs. Unauthenticated. Errors if `type` is not one of the 22 types.
list_element_types
List all 22 OnlyWorlds element types with a one-line shape summary of each. Every world is built from these types; each element has a stable UUID `id`, a `name`, and a `type`. Use `get_element_schema(type)` for a type's full field list. Unauthenticated — schema is public reference. Returns a mapping of the 22 type slugs (the value you pass as `type` to the data tools) to a summary string.
update_element
Update an existing element by `type` and `id`, changing ONLY the fields you pass — omitted fields are preserved. This is a server-side read-merge: the current element is loaded and only the keys in `fields` are applied, so it is safe against the raw-HTTP-PATCH hazard where sending a partial link array replaces the whole array. Semantics per field kind: a text field you pass is set (pass an empty string `""` to clear it); a multi-link field you pass REPLACES that field's array wholesale (pass an empty array `[]` to clear it) — for additive/subtractive link edits that leave the rest of the array intact, use `edit_links` instead. `type` is a slug from `list_element_types`; `id` is the element's UUID. Requires a WRITE API-Key. Returns the full updated element in the v2 wire shape. Errors if the element does not exist, or (naming the field) on an unknown field or a bad link target.
elements
list_elements
List elements of one `type` in the world named by your API-Key header, newest-created first. `type` is a slug from `list_element_types` (e.g. "character"). Optional `name_contains` filters by case-insensitive name substring; `supertype` filters exactly. `limit` (default 100, max 1000) and `offset` page the result. Requires a READ or WRITE API-Key. Returns `{data: [element, ...], limit, offset, has_more}` where each element is the full v2 wire shape and `id` is a UUID. Use `get_element(type, id)` for a single element.
search_elements
Search elements by name across ALL 22 types in the world named by your API-Key header (case-insensitive substring match). Use this when you know part of a name but not the element's type. Bounded to at most 50 matches per type. Returns `{query, results: [{type, id, name, supertype, subtype}, ...]}` — `id` is a UUID; call `get_element(type, id)` for the full body. Requires a READ or WRITE API-Key.
bulk
bulk_apply
Create and/or update many elements across any of the 22 types in one call. Each entry in `items` is `{"type": <slug>, "element": <payload>}` with the same payload shape `create_element` takes: an `element` with an `id` UPDATES that id (creating it if absent), an `element` without an `id` CREATES a new element. Items may reference each other by id, including a forward reference to a sibling later in the list. There is NO delete: bulk_apply never removes an element. When `atomic` is false (default), items succeed or fail independently and the response reports each outcome; when `atomic` is true, ANY item failure rolls the whole batch back and nothing is committed. Up to 1000 items. Requires a WRITE API-Key. Returns the batch response verbatim: `{errors, items: [{status, id, created_at, updated_at} | {status, id, error}, ...]}` — `errors` true means at least one item failed (and, under `atomic`, that nothing committed).
changes
get_changes
Return the delta feed for the world named by your API-Key header: every element created/updated (`op: "upsert"`, full body) or deleted (`op: "delete"`) since `since_cursor`, in apply order, in pages of `limit` (default 25, max 1000). Entries carry FULL element bodies — a default page stays inside any client's token budget; measured worlds ran ~1.5-2k chars PER ENTRY, so raise `limit` only if you truly need bigger pages, and prefer paging with the cursor. Omit `since_cursor` (or pass "") to start from the beginning of the feed — for a big world that is a multi-page walk, not one response. Pass the returned `cursor` back as `since_cursor` to get the next page (or, later, only what changed since); treat the cursor as OPAQUE. `has_more` true means page again with the new cursor. Requires a READ or WRITE API-Key. This mirrors `GET /api/v2/changes`.
edit
edit_links
Add and/or remove links on ONE multi-link `field` of an element, leaving the rest of that field's array untouched. Use this for additive/subtractive link edits (unlike `update_element`, which REPLACES a link array). `type` is a slug from `list_element_types`; `id` is the element's UUID; `field` must be a multi-link field on that type (see `get_element_schema(type)`). `add` is a list of UUIDs to link (each must already exist in the world; adding an already-linked id is a no-op) and `remove` is a list of UUIDs to unlink (removing an absent id is tolerated). Requires a WRITE API-Key. Returns `{type, id, field, values}` where `values` is the field's full UUID array after the edit. Errors (naming `field`) if it is not a multi-link field of this type, if the element does not exist, or if an added target id is absent.
schema
search_schema
Search every element type's fields for `query` (case-insensitive substring), across all 22 types. Useful for "which types have a `location` field?" or finding where a concept lives in the schema. Returns a mapping of type slug -> the matching field names in that type (types with no match are omitted); a `query` that also matches a type slug lists that type with an empty field list so the type-name hit is not lost. Unauthenticated.

Endpoints

URLTransportStateLatencyChecked
https://www.onlyworlds.com/mcp streamable-http answering 150 ms 12 min ago

OnlyWorlds — questions

Answers built from our own checks of this server.

What can OnlyWorlds do?
It exposes 11 tools, read directly from the server on our last check. Among them: bulk_apply, create_element, edit_links, get_changes, get_element, get_element_schema and 5 more. The full list with descriptions is on this page — we take it from the server itself via tools/list, not from a README. How MCP servers expose tools in the first place →
What is OnlyWorlds mostly used for?
Its tools cluster around element and elements. That is what this server is built to work with — the grouping comes from the actual tool names, not from a category we assigned.
Is OnlyWorlds working right now?
We send a real MCP handshake every 15 minutes. Over the last 24 hours 91 of 91 checks got a reply (100.0%), average response time 213 ms. The bar chart above shows every period we have measured.
How do I connect OnlyWorlds?
Copy the ready config from this page — we generate it for Claude Code, Claude Desktop, Codex, Cursor and VS Code, each with the file path that client actually reads. It is a remote server, so there is nothing to install — the client connects to the address.
Does OnlyWorlds need an API key?
No. OnlyWorlds completed a full MCP handshake with us as an anonymous client and listed its tools without asking for anything. All 11 of them are readable on this page. This is what we observed, not what the docs claim.
How fast is OnlyWorlds?
It answers our handshake in 213 ms on average, which is faster than 60% of all working MCP servers we measure. The comparison comes from our own checks across the whole registry, every 15 minutes.