Skip to main content
Glama

chat_async

Use instead of chat when (a) the edit is large or multi-step, (b) you need human approval on each proposed change before it applies (set approval_mode='ask_every_time'), or (c) you can't afford to block on a synchronous response. To replace the whole document with EXACT content you already hold, pass that content in document_html (a verbatim load — the AI never re-types it) or upload it via upload_document_base64; describing the content only in message makes the AI author it, which can drift from your text. Returns a job_id immediately. Poll get_job to track progress and retrieve the final document. Approve or deny pending changes via approve_change. Job state is durable and survives server restarts. Optional: model_tier (core/turbo/pro/max), thinking_depth (fast/balanced/deep), image_attachments for multimodal vision. RECOMMENDED for AI agents working with large documents (>20 pages): set response_mode='compact' so the job result skips the full HTML and surfaces only per-section diffs in chunk_diffs, saving thousands of tokens per poll. To read sections in compact mode, just send a natural-language chat request ('show me the pricing section') — the AI returns the content in the reply text. Always use natural language; the AI handles all internal section lookups. HITL workflow (approval_mode='ask_every_time'): 1) poll get_job until status=awaiting_approval, 2) read metadata.pending_changes for proposed edits, 3) call approve_change per change, 4) continue polling until status=completed.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "message": "<message>",
      "session_id": "<session_id>"
    },
    "name": "chat_async"
  }
}

Input Schema

NameRequiredDescriptionDefault
messageYesYour message to the AI assistant.
upload_idNoOptional upload_id from request_upload_url (after the PUT): the file is loaded into this session (replacing its focused document) before the turn, so one call loads and edits it. Needs upload_filename.
async_modeNoMust be true for async processing. Included for backward compatibility.
model_tierNoAI model to use: 'core' (default, fast), 'turbo' (fastest), 'pro' (advanced reasoning), 'max' (most capable).
session_idYesUnique session identifier. Reuse to continue a conversation.
document_idNoTarget a specific open document by id (ids come from /v1/sessions/{session_id}/documents). Omit to target the focused document (default — unchanged single-document behaviour). When set, that document becomes the focus for this turn.
approval_modeNoChange review mode: 'approve_all' (default, auto-applies changes) or 'ask_every_time' (pauses for your review).
document_htmlNoCurrent document HTML. OMIT this when the session already holds the document — the server persists it across turns, so you don't re-send it every turn; pass it only to load new content or replace the document wholesale (a verbatim load — the AI never re-types content passed here). Include data-chunk-id attributes on elements to enable targeted AI edits.
response_modeNoResponse shape control. 'full' (default) puts the complete updated document HTML in the job result — required by web app editors and recommended for small documents. 'compact' (recommended for AI agents editing large documents) suppresses the full HTML and stores only per-section diffs (chunk_diffs), saving thousands of tokens when polling get_job. To read sections in compact mode, send a natural-language request to chat ('show me the pricing section') — the AI returns the content in the reply text. 'summary' (agent jobs): no HTML or diffs, only the reply, change counts, ids of held changes and turn_index; its size does not grow with the document.full
thinking_depthNoReasoning depth: 'fast', 'balanced' (default), or 'deep'. Controls how much analysis the AI performs.
upload_filenameNoThe filename given to request_upload_url for upload_id.
image_attachmentsNoInline images for vision-based analysis (base64-encoded).
cross_session_scopeNoOptional list of session ids to restrict cross-session SEARCH to (e.g. one end-customer's sessions). Omit to search all of this account's sessions. Only narrows within the API-key owner; ignored unless cross_session_search is on.
cross_session_memoryNoWhen true, the AI carries a private rolling memory of context across THIS account's chats (off by default). Per-request override of your saved Settings default.
cross_session_searchNoWhen true, the AI may search your PAST chats and documents on demand to reuse prior work and open a found document (off by default). Per-request override of your saved Settings default; never affects the always-on search of the open document.
deleted_part_chunk_idsNoOptional list of chunk ids (data-chunk-id values) of OUT-OF-FLOW part sections (page headers/footers, footnote/endnote bodies, comments) to delete explicitly, sent alongside document_html. Out-of-flow parts absent from document_html are always KEPT — an editor view not containing them is their normal state, never a deletion — so removing one requires naming its id here. Ids that are not stored out-of-flow parts are ignored (in-flow content keeps the default behavior). Omit when deleting nothing.
cross_session_memory_keyNoOptional per-request id of YOUR end-customer so the cross-session memory note is kept in a separate file per end-customer. Omit for one account-level note (the default / B2C).

Output Schema

NameRequiredDescriptionDefault
job_idYesJob identifier. Poll GET /v1/jobs/{job_id} for status and results.
statusYesInitial job status (always 'pending').
messageNoHuman-readable status message.Chat request queued for processing
session_idYesSession identifier for this conversation.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed10 schema fields changed
    • removedInput schema / properties / authorization
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "title": "Authorization"
      -}
    • removedInput schema / properties / cursor_context
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "additionalProperties": true,
      -      "type": "object"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "description": "Editor cursor context at message time, used to default the insert location for new images, diagrams, or sections when the user's prompt doesn't name a position. Shape: {chunk_id: str, pos_in_chunk?: int, text_before?: str, text_after?: str}. Omit when the user typed in chat without focusing the editor first.",
      -  "title": "Cursor Context"
      -}
    • removedInput schema / properties / html_document_id
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "maxLength": 256,
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "description": "Optional: the open document (id from /v1/sessions/{session_id}/documents) that `document_html` is the editor state of. The html is applied to that document only, and a turn that names no `document_id` works on that document by default (it is the one on screen); it does not pin the turn (use `document_id` for that). Set by the web app; omit to mean the focused document.",
      -  "title": "Html Document Id"
      -}
    • changedInput schema / properties / response_mode / anyOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "full",
      -      "compact"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "full",
      +      "compact",
      +      "summary"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / response_mode / description
      Previous value: -"Response shape control. 'full' (default) puts the complete updated document HTML in the job result — required by web app editors and recommended for small documents. 'compact' (recommended for AI agents editing large documents) suppresses the full HTML and stores only per-section diffs (chunk_diffs), saving thousands of tokens when polling get_job. To read sections in compact mode, send a natural-language request to chat ('show me the pricing section') — the AI returns the content in the reply text."New value: +"Response shape control. 'full' (default) puts the complete updated document HTML in the job result — required by web app editors and recommended for small documents. 'compact' (recommended for AI agents editing large documents) suppresses the full HTML and stores only per-section diffs (chunk_diffs), saving thousands of tokens when polling get_job. To read sections in compact mode, send a natural-language request to chat ('show me the pricing section') — the AI returns the content in the reply text. 'summary' (agent jobs): no HTML or diffs, only the reply, change counts, ids of held changes and turn_index; its size does not grow with the document."
    • removedInput schema / properties / touched_chunk_ids
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "items": {
      -        "type": "string"
      -      },
      -      "maxItems": 50000,
      -      "type": "array"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "description": "Optional list of chunk ids (data-chunk-id values) the user actually edited since the last sync, sent alongside document_html. When present, a chunk NOT in this list whose text is unchanged keeps its stored formatting byte-for-byte even if the client serialized it differently (protects styling from editor round-trip loss). Chunks in the list — and any chunk whose text changed — always take the submitted content. Omit for the default behavior (any differing chunk is treated as an edit).",
      -  "title": "Touched Chunk Ids"
      -}
    • addedInput schema / properties / upload_filename
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maxLength": 255,
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The filename given to request_upload_url for upload_id.",
      +  "title": "Upload Filename"
      +}
    • addedInput schema / properties / upload_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maxLength": 64,
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Optional upload_id from request_upload_url (after the PUT): the file is loaded into this session (replacing its focused document) before the turn, so one call loads and edits it. Needs upload_filename.",
      +  "title": "Upload Id"
      +}
    • removedInput schema / properties / user_id
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "maxLength": 256,
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "description": "User identifier. Automatically set from authentication — typically omit this.",
      -  "title": "User Id"
      -}
    • removedInput schema / properties / window_id
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "description": "Optional identifier for the client window (set by the web app) so concurrent edits from two windows of the same chat are merged rather than overwritten. Agents/API may omit.",
      -  "title": "Window Id"
      -}
  2. Changed1 schema field changed
    • addedInput schema / properties / html_document_id
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maxLength": 256,
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Optional: the open document (id from /v1/sessions/{session_id}/documents) that `document_html` is the editor state of. The html is applied to that document only, and a turn that names no `document_id` works on that document by default (it is the one on screen); it does not pin the turn (use `document_id` for that). Set by the web app; omit to mean the focused document.",
      +  "title": "Html Document Id"
      +}
  3. First observed

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden and does so: it discloses that the call returns a job_id immediately, that job state is durable across server restarts, that approval_mode='ask_every_time' pauses execution, and that describing content only in `message` causes the AI to author it and may drift. These are non-obvious behavioral traits an agent could not infer from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded well — selection criteria first, then the verbatim-load warning, then the job lifecycle — but it is long and contains duplication: the compact-mode paragraph and the natural-language section-reading tip essentially repeat the `response_mode` schema description, and the trailing list of optional params restates schema titles. Those sentences do not earn their place under the no-credit-for-repetition rule.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 17-parameter mutation tool with no annotations, the description covers the full lifecycle: submission, job_id, polling, approval gating, and result retrieval. An output schema exists, so return values needn't be detailed, and nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real semantic value beyond it: it distinguishes passing content via `document_html` (verbatim load, AI never re-types) from describing it in `message` (AI authors it), and recommends `response_mode='compact'` for large documents with a token-cost rationale. The remaining optional params (model_tier, thinking_depth, image_attachments) are only restated from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names the specific operation (asynchronous AI chat over a document) and explicitly positions it against the sibling `chat` by listing three concrete conditions that select this tool. An agent can distinguish it from `chat`, `continue_chat`, and `chat` variants without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use criteria ((a) large/multi-step edits, (b) per-change approval, (c) non-blocking), names alternatives for verbatim replacement (`upload_document_base64`), and prescribes the exact downstream sequence (`get_job` polling, `approve_change` per change, resume polling). The HITL workflow is spelled out step by step.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.