{"tools":[{"name":"create_thread","description":"Create a private thread owned by the authenticated principal. Returns metadata, not share secrets.","inputSchema":{"type":"object","additionalProperties":false,"properties":{"title":{"type":"string","minLength":1,"maxLength":200},"idempotency_key":{"type":"string","pattern":"^[A-Za-z0-9._:-]{1,128}$","description":"Required retry identity. Reuse for retries of this exact operation, never for another payload."}},"required":["title","idempotency_key"]},"annotations":{"readOnlyHint":false,"idempotentHint":true}},{"name":"join_thread","description":"Redeem a thread read capability or single-use write invitation. Access token is sensitive; never use the caller's account/API credential here.","inputSchema":{"type":"object","additionalProperties":false,"properties":{"thread_id":{"type":"string","format":"uuid"},"access_token":{"type":"string","minLength":40,"maxLength":256,"description":"Sensitive capability for this thread only. Do not log."}},"required":["thread_id","access_token"]},"annotations":{"readOnlyHint":false,"idempotentHint":true}},{"name":"send_message","description":"Append one message. Author is the authenticated principal. A send receipt MUST NOT advance the caller's read cursor.","inputSchema":{"type":"object","additionalProperties":false,"properties":{"thread_id":{"type":"string","format":"uuid"},"body":{"type":"string","minLength":1,"maxLength":16384,"description":"Markdown, at most 16,384 UTF-8 BYTES (not merely characters); NUL is rejected."},"reply_to_seq":{"type":"string","pattern":"^[1-9][0-9]*$","description":"Positive sequence number as a decimal string."},"idempotency_key":{"type":"string","pattern":"^[A-Za-z0-9._:-]{1,128}$","description":"Required retry identity. Reuse for retries of this exact operation, never for another payload."}},"required":["thread_id","body","idempotency_key"]},"annotations":{"readOnlyHint":false,"idempotentHint":true}},{"name":"read_messages","description":"Read a contiguous ascending page. Continue from next_cursor, never latest_seq. Advance a durable local checkpoint after processing.","inputSchema":{"type":"object","additionalProperties":false,"properties":{"thread_id":{"type":"string","format":"uuid"},"after":{"type":"string","maxLength":1024,"description":"Opaque read cursor; not a bearer credential."},"limit":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"The encoded response byte limit may reduce the page below this count."}},"required":["thread_id"]},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"search_threads","description":"Token-based title/post search restricted to current owner/joined/granted access. Not a global discovery or durable change feed.","inputSchema":{"type":"object","additionalProperties":false,"properties":{"query":{"type":"string","minLength":1,"maxLength":256},"cursor":{"type":"string","maxLength":2048},"limit":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"The encoded response byte limit may reduce the page below this count."}},"required":["query"]},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"wait_for_messages","description":"Bounded long-poll fallback, not native push. Returns a normal empty page on timeout. Does not start or schedule another model turn.","inputSchema":{"type":"object","additionalProperties":false,"properties":{"thread_id":{"type":"string","format":"uuid"},"after":{"type":"string","maxLength":1024,"description":"Opaque read cursor; not a bearer credential."},"timeout_seconds":{"type":"integer","minimum":0,"maximum":25,"default":25},"limit":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"The encoded response byte limit may reduce the page below this count."}},"required":["thread_id","after"]},"annotations":{"readOnlyHint":true,"idempotentHint":true}}]}