add_link
ChatGPTCreate a cross-link between two topics of the same map (beyond the parent/child tree). A pair of topics can be linked at most once, regardless of direction.
add_node
ChatGPTAdd ONE child topic under an existing parent topic, optionally with notes, style and a pinned x/y position. Adding more than one? Use add_subtree — it takes flat siblings as readily as nested ones, in one call and one undo step.
add_subtree
ChatGPTBulk-insert topics under an existing one: several flat siblings, a whole nested subtree, or both — nesting is optional, so this is also the right tool for adding two plain topics side by side, in place of two add_node calls. Each topic takes a title and optional fields/notes/style/x/y, imageFrom to copy an existing topic's image, and children to go deeper. One call, one undo step. Max 500 topics, 20 levels.
create_map
ChatGPTCreate a new map with a root topic of the same title. Blank by default (titles only, no per-topic fields) — pass fieldSchema to give every node a set of writing fields, or templateId to start from a built-in template (list_templates): its fields AND its starter branches. Pass both to keep the template's branches while defining the fields yourself. Returns the map's url — give it to the user — and its first-level topics with ids.
delete_link
ChatGPTDelete a cross-link by its id (see get_context → linked, or get_map → links).
delete_map
ChatGPTPermanently delete a map and all its topics, links, images and share links. Irreversible.
delete_node
ChatGPTDelete a topic and its entire subtree, including any cross-links touching it and any topic images in it. The root topic cannot be deleted.
export_map
ChatGPTExport a map. json (default) is the canonical versioned document (schema v2, same as the web UI export); the others are the same text renditions the web export offers. Fidelity — json: lossless — the full document: notes, fields, cross-links, styles, positions, images; md: structure + notes + fields (as "Label: value" lines); txt: structure (titles) only; TSV import columns become fields; opml: structure + notes + fields (in the _note attribute); xmindmark: structure + cross-links (XMind relationship markers); notes and fields are dropped. Node image binaries are NOT embedded over MCP (multi-MB base64 blobs break tool results) — download the JSON export from the web UI for a document with images. The interactive web-page (html) and OpenDeck (deck) renditions are web/REST only.
get_context
ChatGPTThe context around ONE topic instead of the whole map — use this, not get_map, whenever you are working on a single topic. Returns the map's field schema, the ancestor path from the root (what tells "Scale" under Pricing apart from "Scale" under Infrastructure), the topic itself in full, its siblings and direct children as titles (what already exists next door and below, so you do not propose a duplicate), and any cross-linked topics with their own paths and link ids. Name the topic by id or by title — an exact title wins, then a title that STARTS with what you gave, then a substring. A name that still fits several topics is answered, not refused: you get { candidates: [{id, title, path}], hint } in place of the context, so call again with the id you meant. The topic's style comes back whole because update_node REPLACES style — send it back with your change or you will drop its colour. Typically 20-50x smaller than get_map. Call get_map only for genuinely map-wide work: restructuring, dedupe across branches, or finding contradictions. The result's addChildren.parentId is the id to pass to add_subtree/add_node to add topics UNDER this one.
get_image
ChatGPTRead the image attached to a topic. Small images come back as an MCP image content block (your client decodes it — no base64 in your context); larger ones return a one-time download URL to fetch with curl. Pass as:"url" if you want the file on disk regardless of size, or as:"inline" to force the content block.
get_map
ChatGPTFetch a full map: title, field schema, every topic (flat list; parentId links form the tree, root has parentId null; topics carry x/y, notes, style and image metadata when set) and the map's cross-links. This is the WHOLE map and it grows without bound — a 129-topic map is about 185,000 characters. For anything about a single topic call get_context instead; for an overview of a large map, export_map with format "txt" is the outline at 3% of the size.
import_map
ChatGPTImport a document as a brand-new map. format json (default): document is a previously exported map document — schema v2 (with optional per-topic x/y, notes, style, image and map-level links) or v1 (a v2 document with no optionals). format md/txt/opml/yaml/mm/xmindmark: document is the raw text in that format (md: heading = map title, bullets = topics, continuation lines = notes; txt: tab/space-indented outline, titles only; opml: text/_note attributes; yaml: {title, fields, children} structure; mm: FreeMind/Freeplane XML; xmindmark: first line = central topic, "- " bullets = topics, trailing [n]/[^n](label) relationship markers = cross-links) — same conversion as the web import and POST /maps/import?format=. Fidelity — json: lossless — the full document: notes, fields, cross-links, styles, positions, images; md: structure + notes + fields (as "Label: value" lines); txt: structure (titles) only; TSV import columns become fields; opml: structure + notes + fields (in the _note attribute); yaml: structure + fields ({title, fields, children}); mm: structure + notes + cross-links (FreeMind/Freeplane XML; import only); xmindmark: structure + cross-links (XMind relationship markers); notes and fields are dropped. Returns the new map's url — give it to the user — and its first-level topics with ids.
list_maps
ChatGPTList all of the user's mind maps with ids, titles, urls, topic counts and timestamps.
list_templates
ChatGPTList the built-in map templates. Each has fields (the per-topic writing fields it sets up — a plain label, or a typed { label, type, options } entry: select with coloured options, number, date), may declare colorField (the "Style by" lens a map created from it opens with) and may have starter branches — top-level nodes, with their colour and emoji, created with the map. Pass a template id to create_map to start from it, or to update_schema to move an existing map onto its fields.
redo
ChatGPTRedo the most recently undone change to a map.
remove_image
ChatGPTRemove the image attached to a topic. Idempotent: returns removed:false when the topic has no image. Undoable like other edits.
rename_map
ChatGPTChange a map title.
replace_subtree
ChatGPTSwap everything under a topic for a new subtree, atomically — ONE undo step. Optionally rewrite the topic itself (title/notes/fields), and fold other topics into it (absorbIds: their subtrees are removed in the same step). This is the structural half of the app's AI restructure commands: you write the new subtree yourself from what get_map already gave you, so no model is called and no credits are spent. Every replaced topic gets a new id, so cross-links whose endpoints were inside the replaced branch are dropped. The topic named by nodeId keeps its id, its position, its image and its inbound links. Max 500 topics, 20 levels.
reply_feedback
ChatGPTAdd a follow-up to feedback this account already sent — answer a question from the Atlas Red team, add details, or report the outcome of a test — so it lands on that ticket instead of opening a new one. The ticket number (ATLAS-123) is in the reply email and in the send_feedback result. Not for map content.
send_feedback
ChatGPTSend feedback about Atlas Red itself — a bug report, an idea, or anything else — to the people building it. The submission lands in the same triage queue as the in-app Feedback panel; replies and status changes appear there (and by email for the big moments). Returns the ticket number (ATLAS-123) — to add to it later, use reply_feedback rather than sending it again. Not for map content.
set_image
ChatGPTAttach (or replace) an image on a topic. Returns a one-time upload URL — POST the raw file bytes to it (e.g. with curl). Never try to pass image bytes through a tool call: base64 costs ~1 token per character, so even a small photo stalls for minutes. Replaces any existing image; undoable like other edits.
set_map_settings
ChatGPTSet a map's layout, its card-text field, its colour-by field and/or whether it is favourited. Layout, cardField and colorField apply on devices that have not opened the map yet — a device that already picked keeps its own choice. Pass only what you want to change.
undo
ChatGPTUndo the most recent change to a map (shared 50-step history across web UI and MCP).
update_link
ChatGPTChange a cross-link's label. Pass label: null (or "") to clear it.
update_node
ChatGPTUpdate a topic: title, field values, parent (re-parent), sort order (reorder among siblings), notes, style, pinned x/y position and/or linked map. Fields are merged key-by-key, keyed by the fieldSchema key (not its label); pass an empty string to clear one. A name that is no field of the map is refused, and so is a select value outside ITS OWN options (get_context or get_map returns them; matched ignoring case). Pass notes: "" to clear notes, style: null to clear the style, x/y: null to unpin, linkMapId: null to unlink the map.
update_schema
ChatGPTReplace a map's field schema — the author-defined per-topic fields shared by every topic. Full replacement (max 20 fields); pass [] for a map with no per-topic fields. Without mapping, values stored under keys that leave the schema are kept but no longer shown. With mapping, every topic's data is migrated (undoable as one step): each {from, to} entry appends the old field's content to the new field — several entries may target the same field to merge them sequentially in array order — and old-schema fields without an entry keep their value when their key survives, or are dropped otherwise. Give either fieldSchema or templateId to move the map onto a built-in template's fields. The map's "Style by" lens is deliberately NOT changed here (nor applied from a template) — after typing a field as select, activate it with set_map_settings {colorField}.