Reference

MCP

TextText speaks MCP in both directions. A bearer-authenticated client can work on your documents through the hosted server, and your own assistant can use tools from servers you connect to it.

The endpoint

One address, Streamable HTTP, and a workspace token you create and save in the client's protected bearer-credential field.

https://texttext.app/api/mcp

Create a token at Connect, and revoke it there. The hosted endpoint does not currently provide the OAuth authorization flow required by some connector galleries.

Connect a client

Use the hosted endpoint only when the client accepts a bearer token. For local Claude or Codex, the recommended path is the token-free TextText plugin described in the connection guide.

Codex

  1. Create a revocable workspace token at Connect.
  2. Provide it to the Codex process as TEXTTEXT_WORKSPACE_TOKEN through your credential or environment manager. Do not put the token in this command.
  3. Run the copyable command below. It saves the endpoint and only the environment variable name.
  4. Start a new Codex task and run the shared connection proof below.

Codex command

codex mcp add texttext --url https://texttext.app/api/mcp --bearer-token-env-var TEXTTEXT_WORKSPACE_TOKEN

Claude Code

  1. Create a revocable workspace token at Connect.
  2. Put the configuration below in .mcp.json for a project. Keep the token itself out of the file.
  3. Provide TEXTTEXT_WORKSPACE_TOKEN through the environment that launches Claude Code, approve the project server, and check /mcp.
  4. Start a new Claude Code session and run the shared connection proof below.

.mcp.json

{
  "mcpServers": {
    "texttext": {
      "type": "http",
      "url": "https://texttext.app/api/mcp",
      "headers": {
        "Authorization": "Bearer ${TEXTTEXT_WORKSPACE_TOKEN}"
      }
    }
  }
}

Cursor

  1. Create a revocable workspace token at Connect.
  2. Put the configuration below in ~/.cursor/mcp.json for every project, or .cursor/mcp.json for one project.
  3. Provide TEXTTEXT_WORKSPACE_TOKEN through the environment that launches Cursor, then enable the TextText server.
  4. Start a new Cursor conversation and run the shared connection proof below.

Cursor mcp.json

{
  "mcpServers": {
    "texttext": {
      "url": "https://texttext.app/api/mcp",
      "headers": {
        "Authorization": "Bearer ${env:TEXTTEXT_WORKSPACE_TOKEN}"
      }
    }
  }
}

VS Code

  1. Create a revocable workspace token at Connect.
  2. Open MCP: Open User Configuration and paste the configuration below.
  3. Start the TextText server. VS Code asks for the token once as a masked input and keeps it in secure storage.
  4. Start a new agent conversation and run the shared connection proof below.

VS Code mcp.json

{
  "inputs": [
    {
      "type": "promptString",
      "id": "texttext-token",
      "description": "TextText workspace token",
      "password": true
    }
  ],
  "servers": {
    "texttext": {
      "type": "http",
      "url": "https://texttext.app/api/mcp",
      "headers": {
        "Authorization": "Bearer ${input:texttext-token}"
      }
    }
  }
}

Claude and Claude Desktop connectors

  1. Claude and Claude Desktop remote connectors currently accept authless or OAuth servers, not a manually supplied bearer token.
  2. TextText does not currently provide an OAuth authorization server, so do not add the hosted endpoint there and expect it to authenticate.
  3. On this Mac, use the token-free TextText plugin in Claude Code. Otherwise use Codex, Cursor, VS Code, or another client with protected bearer headers.

Another bearer-authenticated MCP client

  1. Create a revocable workspace token at Connect.
  2. Add the endpoint below only in a client that provides a protected bearer-credential or Authorization-header field.
  3. Save the token in that protected field, enable the server, and run the shared connection proof below.
  4. If the client is OAuth-only, it is not compatible with this endpoint today.

MCP endpoint

https://texttext.app/api/mcp

Check that it worked

Ask your agent, in its own words:

Use TextText to capture this private note with a stable idempotency key: Agent connection check, then a new line, then Connected through [your agent name], replacing the brackets with your name. Report the exact receipt title, item id, and saved location. Read that exact item id back, confirm the saved line, and do not publish or share it.

Success is one private note, an exact receipt with title, item id, and saved location, followed by a read of that same item id. Retry the prompt with the same idempotency key to confirm that it does not create a duplicate.

If the tools do not appear, the client is usually still holding an older tool list. Restart it, then reconnect.

Tool reference: 41 tools

13 of them only read. This list is generated from the server's own registry, so it is what your client will actually receive.

Reading 13

Never mutate anything and need only read access. Safe to call without confirmation.

get_workspace
Return this workspace's handle, name, your effective access, and server capabilities.
list_folders
List every folder you can see with its id, path, mode, and item count.
list_items
List the live items in one folder with their ids, titles, tags, status, and content hash.
read_item
Read one item's markdown, metadata, tags, outbound links, backlinks, and assets by id.
review_brief_sources
Compare a Living brief's captured workspace-source versions with the current documents.
What the agent is also told

Return changed or missing sources and the exact claim ids that need review. Read-only.

open_item
Open one exact item in TextText for the user and join its live collaboration session.
search
Search item titles, excerpts, and bodies you can access, and return matches with snippets.
list_trash
List soft-deleted items and folder restore-units.
What the agent is also told

Nothing here is permanently deleted.

list_comments
List comment threads on one item, with anchored quotes and resolution state.
list_responses
List reader responses to one item's poll nodes: per-option tallies plus individual responses.
What the agent is also told

Responder identity is a name only when the reader was signed in.

list_access
List who can access the workspace, one folder, or one item, and their role.
list_document_templates
List the kinds of item this workspace has: the built-in ones and any designed here.
What the agent is also told

Each entry says what it is for, what fields it holds, and how a folder of them is laid out. Types under `editable` were designed from a blueprint and can be CHANGED with update_item_type: send that blueprint back with your edit, and the version shown. `needsMigration` and `unreadable` were designed here too but cannot be reopened by this build. Anything in none of those lists was assembled rather than designed - built-ins, imports, duplicates, and looks saved from a document - and has no blueprint to edit. Call this first whenever someone wants a kind of item to be different.

list_agent_changes
List durable agent text changes for an item.
What the agent is also told

Only item editors can read removed text. Returns up to 50 records, newest first.

Writing 17

Create and change documents. Every call writes an audit row. A client can supply the current content hash to refuse a stale write.

create_item_type
Create one reusable item type from a complete blueprint.
What the agent is also told

The blueprint defines the fields, the item page, the folder layout, example content, and safe theme tokens together. Use this when someone asks for a new kind of thing, such as a Medium-like blog, a Notion-like task board, or Apple Notes-like notes. If folder_path is supplied, the new type becomes that folder's look and existing items are restyled by default. Every type needs fields a person will actually fill in. This is the shape to aim for, from the built-in Tasks type: {"name":"Tasks","description":"A focused list of things to finish.","fields":[{"id":"area","label":"Area","type":"enum","options":[{"value":"work"},{"value":"personal"}]},{"id":"items","label":"Items","type":"rows","fields":[{"id":"task","type":"text"},{"id":"done","type":"boolean"},{"id":"when","type":"date"},{"id":"priority","type":"enum"}]}],"collection":{"layout":"list"}} Three to seven fields. A board needs a single-select enum to group by, and a calendar or heatmap needs a date field to place items on: declare that field, or choose a layout the fields you have can support. Never return a type with no fields.

update_item_type
Change an item type that already exists, by editing the blueprint it was built from.
What the agent is also told

Use this when someone wants their existing kind of thing to be different: another field, a different folder view, a bigger title, a new accent. list_document_templates returns the blueprint and the version for every type that can be changed this way. Send the WHOLE blueprint, not only the part you changed: it replaces the old one. Send base_version exactly as list_document_templates reported it, so an edit made against a stale copy is refused instead of quietly overwriting someone else's. The old version is kept and the items already using it keep rendering as they were. Use save_scope to name the selected folder or the exact listed usages, or to save only a version. Legacy calls without save_scope apply to folders on the base version. Only items pinned to that exact base reference are restyled. Existing field ids, storage kinds and enum values must stay compatible; change enum labels to rename options. Built-in types cannot be changed. Neither can a look that was saved from a document, imported, or duplicated: those were assembled rather than designed, so they have no blueprint to edit and list_document_templates will not list them as changeable.

save_item_as_look
Take the way one item currently renders and save it as a reusable look, under a name.
What the agent is also told

The look then appears in the look pickers and can be applied to other items or given to a folder with set_folder_template. This replaced an operations-based authoring API: shape a document the ordinary way, with update_item and the item's own theme, then save what you made. It never changes the item.

set_folder_template
Give a folder a look, and by default restyle everything already in it.
What the agent is also told

The template becomes what the folder's index page renders from, what new items are created with, and what the items already there use. This is how a request like 'make this folder a magazine' actually lands. Pass apply_to_existing false only if the person asked for the change to affect new items alone: leaving old items behind means the index changes and not one article does, which reads as nothing having happened.

set_item_template
Apply one document template to an item without changing its content or audience.
What the agent is also told

Omit template_version to use the look's current version, which is almost always what you want.

revert_agent_change
Undo one agent text change, preserving unrelated later edits.
What the agent is also told

Overlapping changes return a comparison without changing the document. Does not alter human undo history or visibility.

create_item
Save something to TextText.
What the agent is also told

For quick capture, pass capture alone: text becomes a private Note and a URL becomes a Bookmark, with a receipt in the result. For precise creation, pass fields or a full markdown file and choose a folder. New items are never published or pinned. Automated clients should pass a stable idempotency_key so retries cannot create duplicates.

update_item
Update one item's content or metadata: title, body, excerpt, tags, slug, cover, pin, publication date, and custom template fields via the fields map.
What the agent is also told

A full body or markdown replacement requires if_match_hash from read_item. Targeted text_edit and section edits use their own expected-content guards. text_edit.source_precondition optionally guards a separate source passage in the same item at commit time, using the selection envelope format. Cannot publish, unpublish, or move an item. To highlight a passage, wrap it in double equals signs: ==like this==. It renders as a real highlight. Bold and italic still mean bold and italic. Use a highlight when someone asks for the important parts to stand out, and mark the few that matter rather than most of the paragraph.

append_to_item
Append a markdown block to the end of one item's body without touching its metadata.
What the agent is also told

Pass the text as `markdown`. Automated clients should pass an idempotency_key derived from the source event or commit.

move_item
Move one item to another folder of the same mode.
organize_items
Tag or move several items in one go.
What the agent is also told

Say what to do once and name the items it applies to. Use this instead of repeating update_item when the same change goes to more than one thing: 'tag all of these review', 'move these into Ideas'. A turn has a limited number of steps, so doing twenty items one at a time runs out before it finishes and leaves the job half done. This changes how items are filed and labelled. It never touches what they say, so it needs no content hash. For a change that differs per item - a different sentence in each - read and update them one at a time. Each item is handled on its own and the answer says what happened to each.

add_item_asset
Import one public image or video URL into TextText and attach it as cover, body, or gallery.
recapture_bookmark
Re-fetch one bookmark from its saved URL.
What the agent is also told

The current capture stays visible until the new one lands.

add_comment
Add a comment or reply on one item, optionally anchored to an exact quote.
set_comment_resolved
Resolve or reopen one comment thread.
create_folder
Create a subfolder under an existing folder path; it inherits the parent's mode and privacy.
rename_folder
Rename one folder.
What the agent is also told

Its id and path do not change.

Audience and access 5

Change who can see something. These ask for confirmation first, and the web assistant is not given them at all.

set_item_status
Publish or unpublish one blog item.
What the agent is also told

Notes and bookmarks can never be published. This can change what readers can see. Obtain explicit human confirmation immediately before calling it.

restore_item
Restore one item from Trash with its previous status.
What the agent is also told

This can change what readers can see. Obtain explicit human confirmation immediately before calling it.

restore_folder
Restore one folder subtree from Trash.
What the agent is also told

This can change what readers can see. Obtain explicit human confirmation immediately before calling it.

set_access
Grant or change one person's role by email: member or guest on a workspace; editor, commenter, or viewer on a folder or item.
What the agent is also told

Item and workspace invitations report email delivery status. This can change what readers can see. Obtain explicit human confirmation immediately before calling it.

revoke_access
Revoke one person's access to the workspace, a folder, or an item.
What the agent is also told

This can change what readers can see. Obtain explicit human confirmation immediately before calling it.

Destructive 6

Remove or replace. These ask for confirmation first, and the web assistant is not given them at all.

retire_document_template
Stop offering one workspace look.
What the agent is also told

It disappears from the look pickers and from list_document_templates, and every document and folder already using it keeps rendering exactly as it does now, because template versions are immutable and nothing is deleted. Built-in looks cannot be retired. Use this when someone says a look they made is no longer wanted, rather than leaving a picker full of abandoned experiments. This changes or removes existing workspace state. Obtain explicit human confirmation immediately before calling it.

delete_item
Move one item to Trash.
What the agent is also told

It stays restorable; this never permanently deletes. This changes or removes existing workspace state. Obtain explicit human confirmation immediately before calling it.

delete_items
Move several items to Trash in one go.
What the agent is also told

They stay restorable; this never permanently deletes. Use this when someone asks to get rid of more than one thing. Name every item explicitly by id: there is no "everything matching" form, because a request to delete has to say what it is deleting. Each item is handled on its own. One that has changed since you read it, or that has already gone, is reported and the rest still go. The answer says what happened to each. This changes or removes existing workspace state. Obtain explicit human confirmation immediately before calling it.

empty_trash
Permanently delete every item and folder currently in Trash.
What the agent is also told

This cannot be undone and always requires owner approval. This changes or removes existing workspace state. Obtain explicit human confirmation immediately before calling it.

remove_item_asset
Remove references to one asset URL from an item's cover, body, and gallery.
What the agent is also told

This changes or removes existing workspace state. Obtain explicit human confirmation immediately before calling it.

delete_folder
Move one folder subtree to Trash.
What the agent is also told

Restorable; never permanently deleted. This changes or removes existing workspace state. Obtain explicit human confirmation immediately before calling it.

The other direction: connect a server to TextText

Your assistant can also be a client. Connect an MCP server in Workspace Settings and its tools join the ones your assistant already has, so "put this spec in Figma" and "write up what you did in TextText" are the same conversation from either end.

  1. Workspace Settings, then Connected MCP servers, then Add server.
  2. Give it a name and its https address, and an access token if that server needs one. TextText connects once to see what it offers.
  3. It is saved switched OFF. Turn on Allow when you want your assistant to use it. Name this connection in the request when you want TextText to discover its tools; unrelated turns do not contact it.

The name becomes the namespace: a tool called create_frame on a connection named Figma reaches your assistant as figma__create_frame, so a connected server can never shadow one of TextText's own tools.

Servers on your own machine

Paper, pen.dev, and Figma can expose desktop MCP servers tied to the app's current file or selection. TextText does not execute local MCP tools in this release because that path cannot yet use the same durable exact-argument review as a hosted connection. Workspace Settings accepts public https connections, not loopback endpoints.

TextText's local Claude and Codex integration is different: the standalone Mac app bundles a signed-in CLI for working on TextText documents. It does not turn TextText into a client for another app's loopback MCP server.

What holds in both directions

  • Every request is scoped to one workspace, and visibility fails closed. Notes and bookmarks stay unlisted.
  • TextText workspace mutations write an audit row with the authenticated account. Every connected-server tool call waits for review of its exact arguments and stays named in the assistant conversation.
  • A write that supplies the current content hash refuses a stale read instead of overwriting newer content. The guarded local CLI supplies that hash for edits.
  • A connected server's tool names, descriptions and results are treated as untrusted data. Read-only and destructive annotations are server claims, not permission. Approval also compares the current tool definition, endpoint, and protected connection configuration with what you reviewed.
  • A remote connected server's address is re-checked before every connection and must resolve to a public host. Its access token is encrypted at rest and never shown back to any browser.

Security and privacy covers what stays on your machine and how to revoke access.