{
 "$schema": "https://agentdrives.com/schemas/tool.schema.json",
 "id": "prd_01m57vgtngp9gh4t9t4g3g146b",
 "ids": {
  "org": "org_01m57vgtngwepa5j4qyj87kps9",
  "surfaces": {
   "web": "srf_01m60jdv3z5eacqdjg6tthkzgk",
   "api": "srf_01m60jdv3zjhzkzkebryseq4zf",
   "mcp": "srf_01m60jdv3z8gqkc8sbxezd8pb3",
   "cli": "srf_01m60jdv3z28ar83ty2jq3bx96",
   "sdk": "srf_01m60jdv3z4c9ft9whr9sg29vj"
  },
  "slugs": [
   "twist"
  ],
  "domain": "twist.com"
 },
 "slug": "twist",
 "name": "Twist",
 "url": "https://twist.com",
 "domain": "twist.com",
 "category": "team-chat",
 "category_name": "Team chat",
 "tested_at": "2026-10-28",
 "run": "20261028T025543Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261028T025543Z",
   "date": "2026-10-28",
   "level": 4,
   "engine": {
    "model": "claude-opus-5-5",
    "driver": 5,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "skip",
    "version": "2026.10.27",
    "commit": "132c4d41a411d7acee60092fedfe2af74cee1ec3",
    "prompts": {
     "version": "2026.10.27",
     "commit": "845036a5a40ff8a1d6d9ed752a31210bed0cbc93"
    },
    "rules": {
     "version": "2026.10.27",
     "commit": "fe3b689b94a4f5fc8abd3c7adc454960326b9514"
    }
   },
   "stop": "delete",
   "paid": false,
   "agent_paid": null
  }
 ],
 "level": 4,
 "level_name": "Runs on its own",
 "level_selfhost": null,
 "entry": "self-start",
 "door": {
  "passed": 1,
  "tries": 1,
  "self_start": true
 },
 "badges": [
  "agent-can-leave"
 ],
 "not_counted": null,
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: sign-up in a browser",
   "way": "email_password"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "yes",
   "text": "Work done: 100% of the core"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "part",
   "text": "Reaches the checkout: stopped at the €8 a month charge",
   "value": "checkout",
   "route": "card_checkout"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: nothing to cancel, deletes its account",
   "left": "deleted",
   "delete": {
    "state": "yes",
    "text": "Deletes its account",
    "why": null
   }
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Learn",
   "state": "part",
   "text": "Docs with gaps: an MCP server; no docs on signing in",
   "have": [
    "mcp"
   ],
   "docs": "thin"
  },
  {
   "key": "access",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: sign-up in a browser",
   "way": "email_password",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "yes",
   "text": "Work done: 100% of the core",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "part",
   "text": "Reaches the checkout: stopped at the €8 a month charge",
   "value": "checkout",
   "route": "card_checkout",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: nothing to cancel, deletes its account",
   "left": "deleted",
   "delete": {
    "state": "yes",
    "text": "Deletes its account",
    "why": null
   },
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "browser_signup",
   "label": "Sign-up in a browser",
   "routes": [
    "email_password",
    "device_login"
   ],
   "minutes": 4,
   "core": "7/7",
   "by_route": {
    "email_password": "7/7",
    "device_login": "4/7"
   }
  }
 ],
 "minutes": 4,
 "next": {
  "to": 5,
  "text": "Next: pay without a person"
 },
 "stop": "delete",
 "core": "7/7",
 "scores": {
  "coverage": 89,
  "reliability": 95,
  "resilience": 60,
  "setup": 55,
  "surface_coverage": 92,
  "docs_accuracy": 94,
  "docs_completeness": 50
 },
 "parts": {
  "holds_up": 78,
  "docs_match": 81,
  "setup": 55,
  "security": "private",
  "standards": [
   {
    "standard": "MCP discovery",
    "state": "behind",
    "behind": null,
    "value": "legacy"
   },
   {
    "standard": "MCP client registration",
    "state": "current",
    "behind": null,
    "value": "cimd"
   }
  ]
 },
 "reliability_method": "pass^k",
 "resilience": {
  "parts": {
   "error_legibility": 80,
   "recovery": 100,
   "idempotency": 0
  },
  "summary": {
   "error_legibility": "mixed",
   "recovery": "good",
   "idempotency": "risky",
   "rate_limits": "none-seen",
   "notes": "API errors name the missing or bad argument (error_code with error_extra), but an out-of-range color was silently changed, SDK/CLI/MCP wrappers often say only \"Request failed with status 400\", and a bad token gets 403 rather than 401. Creates are not deduplicated and Idempotency-Key is ignored; 20 quick reads gave no 429 or rate-limit headers."
  }
 },
 "stress": [
  {
   "capability": "Create a thread",
   "probe": "Missing required field (title) on thread create",
   "outcome": "400 {\"error_code\":19,\"error_extra\":{\"argument\":\"title\"},\"error_string\":\"Required argument is missing\"}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create a channel",
   "probe": "Out-of-range enum (color=999) on channel create",
   "outcome": "200, channel 853571 created with \"color\":127 (value silently changed)",
   "grade": "silent",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create a thread",
   "probe": "Well-formed id that does not exist",
   "outcome": "404 {\"error_code\":110,\"error_string\":\"Resource not found\"}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create a channel",
   "probe": "Bad credential",
   "outcome": "403 {\"error_code\":200,\"error_string\":\"Invalid token\"} (403, not 401; no WWW-Authenticate)",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create a channel",
   "probe": "Repeat a create (same name)",
   "outcome": "200 twice: two channels 853571 and 853572 with the same name; no dedupe",
   "grade": "clear",
   "idempotent": "no",
   "rate_limit": null
  },
  {
   "capability": "Create a thread",
   "probe": "Repeat a create with Idempotency-Key",
   "outcome": "200 twice: threads 8149888 and 8149889; header ignored",
   "grade": "clear",
   "idempotent": "no",
   "rate_limit": null
  },
  {
   "capability": "Read the inbox of threads needing attention",
   "probe": "Burst of 20 reads",
   "outcome": "20x 200; no RateLimit, X-RateLimit-* or Retry-After headers",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": "none-seen"
  },
  {
   "capability": "Create a channel",
   "probe": "Interrupted delete: remove a channel not archived first",
   "outcome": "403 {\"error_code\":109,\"error_string\":\"You can not delete active channels\"}; channel unchanged (archived:false); archive then remove -> ok",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create a channel",
   "probe": "Documented chaos parameter",
   "outcome": "400 {\"error_code\":206,\"error_string\":\"Cannot remove primary email\"} (random injected error, as the docs describe; code 206 not in the error table)",
   "grade": "vague",
   "idempotent": null,
   "rate_limit": null
  }
 ],
 "surface_audit": {
  "totals": {
   "items": 354,
   "documented": 340,
   "safe": 335,
   "exercised": 327,
   "passed": 307,
   "skipped": 5,
   "blocked": 8,
   "not_run": 0,
   "match": 307,
   "drift": 14,
   "broken_doc": 6,
   "docs_complete": 1,
   "docs_partial": 339,
   "docs_missing": 0,
   "errors_clear": 14,
   "errors_vague": 14,
   "errors_silent": 1
  }
 },
 "coverage_core": 100,
 "coverage_own": 100,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 5,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": false
 },
 "methodology": 42,
 "rules_date": "2026-10-30",
 "engine": {
  "model": "claude-opus-5-5",
  "driver": 5,
  "signed": true,
  "inbox": [
   "agentdrives.com"
  ],
  "robots": "skip",
  "version": "2026.10.27",
  "commit": "132c4d41a411d7acee60092fedfe2af74cee1ec3",
  "prompts": {
   "version": "2026.10.27",
   "commit": "845036a5a40ff8a1d6d9ed752a31210bed0cbc93"
  },
  "rules": {
   "version": "2026.10.27",
   "commit": "fe3b689b94a4f5fc8abd3c7adc454960326b9514"
  }
 },
 "same_level_drives": 1,
 "drives": 1,
 "same_stop_drives": 1,
 "works_assisted": null,
 "freshness": "fresh",
 "newer_drives": null,
 "nothing_to_pay": false,
 "core_gated": false,
 "profiles": {},
 "agent_check": null,
 "agent_pass": null,
 "who_gets_in": {
  "server": {
   "state": "in"
  },
  "signed": {
   "state": "page",
   "kind": "signup",
   "at": "2026-10-28"
  },
  "browser": {
   "state": "in",
   "measured": false
  },
  "our_key": "verified",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "Full REST reference at https://developer.twist.com/v3/ (authentication, errors, scopes, webhooks, every endpoint); no OpenAPI spec and no llms.txt."
  },
  "signup": {
   "status": "browser",
   "note": "Web form at twist.com/signup (email, name, password) with no CAPTCHA; no sign-up API. Onboarding asked for a team or workspace name; our agent answered.",
   "way": "email_password"
  },
  "verify": {
   "status": "browser",
   "note": "Confirmation mail \"Confirm your email address\" reached the agent's inbox within a minute; its link opened in the browser."
  },
  "credentials": {
   "status": "headless",
   "note": "POST /api/v3/users/login with email and password returns a full-scope user token, as the docs say; a scoped OAuth token also came through the CLI's login (one consent click in the browser).",
   "via": ""
  },
  "first_call": {
   "status": "headless",
   "note": "GET /api/v3/users/get_session_user and workspaces/get with the token: 200.",
   "route": "account"
  },
  "first_action": {
   "status": "headless",
   "note": "POST /api/v3/channels/add created a channel, read back with channels/getone."
  },
  "pay": {
   "status": "browser",
   "grade": "P2",
   "rails": [
    "Stripe card form in the billing page (Stripe Elements)"
   ],
   "rail_ids": [
    "stripe-elements"
   ],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "free tier",
   "3ds": "none",
   "route": "card_checkout",
   "checkout": {
    "reached": "card_form",
    "processor": "stripe_elements",
    "captcha": "invisible",
    "three_ds": "not_seen",
    "card_form": true,
    "phone_field": "none",
    "wallets": [
     "link"
    ],
    "rail_offer": "none",
    "price": "8.00",
    "currency": "EUR",
    "period": "month",
    "plan": "Unlimited",
    "last_button": "Complete purchase"
   },
   "person": "none",
   "ours": "no_card",
   "note": "No 402, x402, MPP or billing API (we paid nothing). In the web billing page an agent picks Unlimited monthly (€8 per user, €0 due now after €42 credit) and reaches the Stripe card form with \"Complete purchase\"; it still asks for a card. Stopped there."
  },
  "cancel": {
   "status": "n/a",
   "note": "Nothing to cancel: our agent used the free plan.",
   "docs_note": "Nothing to cancel: the drive stayed on the free plan. Cancelling Unlimited is web-only (help article \"How to cancel the Unlimited plan\"; no billing API).",
   "docs_grade": "",
   "nothing": "free_plan"
  },
  "delete": {
   "status": "headless",
   "note": "POST /api/v3/workspaces/remove for both workspaces, then POST /api/v3/users/delete: 200. Afterwards the user token gets 403 Invalid token on workspaces/get and login returns 400 \"Email or password are invalid\". The CLI's OAuth grant stays: get_session_user still answered 200 with the anonymised user record, and a public client cannot revoke it.",
   "left": "deleted",
   "after_hours": null,
   "account": true
  }
 },
 "routes": [
  {
   "route": "email_password",
   "offered": "seen",
   "tried": true,
   "not_tried": null,
   "result": "in",
   "wall": null,
   "person": "none",
   "brings": "inbox",
   "fresh": true,
   "minutes": 6,
   "browser": true
  },
  {
   "route": "device_login",
   "offered": "documented",
   "tried": true,
   "not_tried": null,
   "result": "in",
   "wall": null,
   "person": "none",
   "brings": "nothing",
   "fresh": false,
   "minutes": 4,
   "browser": true
  },
  {
   "route": "oauth_consent",
   "offered": "documented",
   "tried": true,
   "not_tried": null,
   "result": "walled",
   "wall": {
    "type": "network",
    "owner": "product"
   },
   "person": "none",
   "brings": "nothing",
   "fresh": false,
   "minutes": 1,
   "browser": null
  }
 ],
 "checkout": {
  "reached": "card_form",
  "processor": "stripe_elements",
  "captcha": "invisible",
  "three_ds": "not_seen",
  "phone_field": "none",
  "wallets": [
   "link"
  ],
  "rail_offer": "none",
  "period": "month",
  "card_form": true,
  "price": "8.00",
  "currency": "EUR",
  "plan": "Unlimited",
  "last_button": "Complete purchase"
 },
 "docs": {
  "at": "2026-10-28",
  "read": 87,
  "listed": 91,
  "sampled": false,
  "overall": "thin",
  "getting_started": "found",
  "auth": "missing",
  "errors": "partial",
  "examples": "none",
  "freshness": "fresh",
  "newest": "2026-09-24",
  "core_pages": "0 of 7",
  "capabilities": "none",
  "label": "Thin"
 },
 "claims": {
  "claimed": 7,
  "tried": 7,
  "held": 6,
  "broken": 1,
  "unclear": 0,
  "not_tried": 0,
  "undocumented_works": 4
 },
 "pay_options": {
  "checked": "2026-10-28",
  "source": "probe",
  "options": [],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": null,
   "card_required": null,
   "free_plan": true
  },
  "owner_fixes": [
   {
    "title": "Accept x402 or MPP on your API",
    "how": "Answer an unpaid call with 402 and a payment challenge, so an agent pays per call or buys credits without an account or a card."
   },
   {
    "title": "List your plans on Stripe Projects",
    "how": "Agents buy a plan with `stripe projects add`, paid with a token under a spend cap the owner sets (projects.dev)."
   }
  ]
 },
 "surfaces": {
  "api": true,
  "openapi": false,
  "cli": true,
  "sdk": true,
  "mcp": "official",
  "llms_txt": false,
  "webhooks": true,
  "sandbox": false
 },
 "urls": {
  "docs": "https://docs.twist.com/",
  "llms_txt": null,
  "mcp": null
 },
 "surface_notes": {
  "api": "REST v3/v4, 133 documented operations",
  "cli": "official @doist/twist-cli 3.0.15 (tw)",
  "sdk": "official TypeScript @doist/twist-sdk 3.0.0",
  "mcp": "official local server @doist/twist-ai 7.0.0, 19 tools",
  "webhooks": "REST hooks for OAuth integrations, channel/thread/bot webhooks"
 },
 "surface_sizes": [
  {
   "kind": "api",
   "listed": 135,
   "tested": 135
  },
  {
   "kind": "mcp",
   "listed": 11,
   "tested": 11
  },
  {
   "kind": "cli",
   "listed": 70,
   "tested": 65
  },
  {
   "kind": "sdk",
   "listed": 115,
   "tested": 113
  }
 ],
 "can_do": [
  "Create, rename, archive and delete channels",
  "Create, edit, close and delete threads and comments",
  "Send, edit and delete direct messages",
  "Read the inbox and mark threads done",
  "React, pin, star, mute and search",
  "Upload a file and attach it to a comment",
  "Create user groups and manage channel members",
  "Invite members and guests by email",
  "Change notification and do-not-disturb settings",
  "Install an integration from the directory (in the browser)",
  "Delete its own workspaces and account through the API"
 ],
 "cannot_do": [
  {
   "what": "Sign up without a browser",
   "why": "Sign-up is only the web form; the API starts at login."
  },
  {
   "what": "Use the hosted MCP server",
   "why": "mcp.twist.com/mcp answered 403 Forbidden to our agent, with or without a token."
  },
  {
   "what": "Buy Unlimited without a person's card",
   "why": "The billing page asks for a card in a Stripe form even when credit covers the charge; no agent payment rail or billing API."
  },
  {
   "what": "Run a bot or receive webhooks here",
   "why": "Both need a public receiver URL; registration works, delivery was not tested."
  }
 ],
 "blockers": [
  "Sign-up and email confirmation need a browser (no CAPTCHA)."
 ],
 "tips_for_agents": [
  "After the web sign-up, get a token without a browser: POST https://api.twist.com/api/v3/users/login with email and password; the user object carries the token.",
  "Send every call as Authorization: Bearer <token> to https://api.twist.com/api/v3/…; errors come back as JSON with error_code and error_string (error_extra names the bad argument).",
  "Threads need both title and content; remove a channel only after channels/archive.",
  "To make a thread show in your own inbox call inbox/unarchive on it; inbox/archive marks it done.",
  "A password change (users/update_password, set_password) invalidates the token: log in again.",
  "For MCP run `npx @doist/twist-ai` with TWIST_API_KEY set to the token; it answers initialize at 2025-11-25.",
  "With the CLI, pass the token as TWIST_API_TOKEN for full scope; `tw auth login` lacks delete scopes. Add --include-private-channels to read private channels.",
  "conversations/remove_user and remove_users accept POST, not the documented GET."
 ],
 "selfhost": null,
 "edge_case": "none",
 "summary": "An agent signs up for Twist in a plain web form with no CAPTCHA, confirms by email in its own browser, and from then on works the whole product without a browser: all 7 core tasks passed 3 of 3 times through the documented REST API, with an official CLI, SDK and a local MCP server on top. The hosted MCP endpoint refused our agent, and buying Unlimited needs a card in the web billing page (no payment went through). The agent deleted its workspaces and account through the API; the user token and login were refused afterwards, but the CLI's OAuth token still answered with an anonymised user record.",
 "wall": "",
 "plan_scope": "free plan",
 "robots_stop": null,
 "robots": {
  "rule": "star",
  "step": null,
  "seen": "2026-10-28",
  "held": false
 },
 "terms": null,
 "terms_read": "2026-10-28",
 "email_gate": null,
 "plain": {
  "summary": "Twist is a team chat tool built around threads and channels. An agent could sign up on the web form, confirm its email and then do all the core work by itself through the API, including deleting its account. It stopped at the paid plan, which asks for a card, and at the hosted MCP server, which refused it.",
  "can_do": [
   "Create, rename, archive and delete channels",
   "Create, edit and delete threads and comments",
   "Send, edit and delete direct messages",
   "Read the inbox and mark threads done",
   "React, pin, star, mute and search",
   "Upload a file and attach it to a comment",
   "Create user groups and manage channel members",
   "Invite members and guests by email",
   "Change notification and do-not-disturb settings",
   "Install an integration from the directory in the browser",
   "Delete its own workspaces and account through the API"
  ],
  "cannot_do": [
   {
    "what": "Sign up without a browser",
    "why": "The docs list login but no sign-up call; only the web form was found."
   },
   {
    "what": "Use the hosted MCP server",
    "why": "It answered 403 Forbidden to our agent, with or without a token."
   },
   {
    "what": "Buy Unlimited on its own",
    "why": "The billing page asks for a card; no payment rail or billing API was found."
   }
  ]
 },
 "plan_gated": [],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "capability": "Create a channel",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/channels/add",
    "mcp": null,
    "cli": null,
    "ui": "Channels sidebar → Add channel"
   },
   "check": "GET /api/v3/channels/getone?id={id} returns the new channel",
   "capability_id": "cap_f6ccszjb",
   "unmapped": null,
   "source": "https://developer.twist.com/v3/",
   "result": "done",
   "via": "api",
   "done_on": [
    "api",
    "cli"
   ]
  },
  {
   "id": "cap-02",
   "capability": "Change a channel's settings",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/channels/update",
    "mcp": null,
    "cli": null,
    "ui": "Channel → Settings"
   },
   "check": "GET /api/v3/channels/getone?id={id} shows updated name/description",
   "capability_id": "cap_86edyh37",
   "unmapped": null,
   "source": "https://developer.twist.com/v3/",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-03",
   "capability": "Create a thread",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/threads/add",
    "mcp": null,
    "cli": null,
    "ui": "Channel → New thread"
   },
   "check": "GET /api/v3/threads/getone?id={id} returns the created thread",
   "capability_id": null,
   "unmapped": "own_feature",
   "source": "https://developer.twist.com/v3/",
   "result": "done",
   "via": "api",
   "done_on": [
    "api",
    "mcp",
    "cli"
   ]
  },
  {
   "id": "cap-04",
   "capability": "Comment on a thread",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/comments/add",
    "mcp": null,
    "cli": null,
    "ui": "Thread → reply box"
   },
   "check": "GET /api/v3/comments/get?thread_id={id} lists the new comment",
   "capability_id": "cap_4zn5cq20",
   "unmapped": null,
   "source": "https://developer.twist.com/v3/",
   "result": "done",
   "via": "api",
   "done_on": [
    "api",
    "mcp",
    "cli"
   ]
  },
  {
   "id": "cap-05",
   "capability": "Edit or delete a comment/thread",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/comments/update | /api/v3/comments/remove | /api/v3/threads/update | /api/v3/threads/remove",
    "mcp": null,
    "cli": null,
    "ui": "Comment/thread … menu → Edit/Delete"
   },
   "check": "GET /api/v3/comments/getone?id={id} shows updated content or 404 after removal",
   "capability_id": "cap_khr1h48m",
   "unmapped": null,
   "source": "https://developer.twist.com/v3/",
   "result": "done",
   "via": "api",
   "done_on": [
    "api",
    "cli"
   ]
  },
  {
   "id": "cap-06",
   "capability": "Send a direct message",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/messages/add (within a conversation)",
    "mcp": null,
    "cli": null,
    "ui": "Messages → conversation"
   },
   "check": "GET /api/v3/messages/get?conversation_id={id} lists the new message",
   "capability_id": "cap_y0kyhz5h",
   "unmapped": null,
   "source": "https://developer.twist.com/v3/",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-07",
   "capability": "Read the inbox of threads needing attention",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /api/v3/inbox/get",
    "mcp": null,
    "cli": null,
    "ui": "Inbox"
   },
   "check": "GET /api/v3/inbox/get returns the unified list of threads",
   "capability_id": null,
   "unmapped": "own_feature",
   "source": "https://developer.twist.com/v3/",
   "result": "done",
   "via": "api",
   "done_on": [
    "api",
    "mcp",
    "cli"
   ]
  },
  {
   "id": "cap-08",
   "capability": "React to a message or comment",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/reactions/add",
    "mcp": null,
    "cli": null,
    "ui": "Hover a comment → emoji picker"
   },
   "check": "GET /api/v3/reactions/get?comment_id={id} lists the reaction",
   "capability_id": "cap_e82b8y63",
   "unmapped": null,
   "source": "https://developer.twist.com/v3/",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-09",
   "capability": "Pin or star a thread",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/threads/pin | /api/v3/threads/star",
    "mcp": null,
    "cli": null,
    "ui": "Thread … menu → Pin/Star"
   },
   "check": "GET /api/v3/threads/getone?id={id} shows pinned:true or starred:true",
   "capability_id": "cap_pcpacc2v",
   "unmapped": null,
   "source": "https://developer.twist.com/v3/",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-10",
   "capability": "Mute or archive a thread/channel/conversation",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/threads/mute | /api/v3/channels/archive | /api/v3/conversations/archive",
    "mcp": null,
    "cli": null,
    "ui": "… menu → Mute/Archive"
   },
   "check": "GET /api/v3/threads/getone?id={id} shows muted_until_ts set, or archived:true",
   "capability_id": null,
   "unmapped": "not_a_job",
   "source": "https://developer.twist.com/v3/",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-11",
   "capability": "Favorite a channel",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/channels/favorite",
    "mcp": null,
    "cli": null,
    "ui": "Channel … menu → Favorite"
   },
   "check": "GET /api/v3/channels/getone?id={id} shows is_favorited:true",
   "capability_id": null,
   "unmapped": "not_a_job",
   "source": "https://developer.twist.com/v3/",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-12",
   "capability": "Search chat messages and threads",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /api/v3/search/query",
    "mcp": null,
    "cli": null,
    "ui": "Top search bar"
   },
   "check": "GET /api/v3/search/query?query=… returns matching threads/comments",
   "capability_id": "cap_39x0fa15",
   "unmapped": null,
   "source": "https://developer.twist.com/v3/",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-13",
   "capability": "Attach a file to a thread or message",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/attachments/upload",
    "mcp": null,
    "cli": null,
    "ui": "Comment box → attachment icon"
   },
   "check": "GET /api/v3/comments/getone?id={id} lists the attachment in its attachments array",
   "capability_id": "cap_najpx1cb",
   "unmapped": null,
   "source": "https://developer.twist.com/v3/",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-14",
   "capability": "Create a user group",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/groups/add",
    "mcp": null,
    "cli": null,
    "ui": "Workspace settings → Groups"
   },
   "check": "GET /api/v3/groups/getone?id={id} returns the new group",
   "capability_id": "cap_yn12vxg9",
   "unmapped": null,
   "source": "https://developer.twist.com/v3/",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-15",
   "capability": "Add or remove members on a channel",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/channels/add_user | /api/v3/channels/remove_user",
    "mcp": null,
    "cli": null,
    "ui": "Channel → Members"
   },
   "check": "GET /api/v3/channels/getone?id={id} user_ids includes/excludes the member",
   "capability_id": "cap_ks2tfdzg",
   "unmapped": null,
   "source": "https://developer.twist.com/v3/",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-16",
   "capability": "Configure notification settings",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/notifications_settings/update",
    "mcp": null,
    "cli": null,
    "ui": "Settings → Notifications"
   },
   "check": "GET /api/v3/notifications_settings/get returns updated mapping",
   "capability_id": "cap_jmy53453",
   "unmapped": null,
   "source": "https://developer.twist.com/v3/",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-17",
   "capability": "Set up an incoming/outgoing webhook integration",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/hooks/subscribe; channel/thread integration install URL",
    "mcp": null,
    "cli": null,
    "ui": "twist.com/app_console"
   },
   "check": "A subscribed hook receives a POST when the matching event fires",
   "capability_id": "cap_977hxacb",
   "unmapped": null,
   "source": "https://developer.twist.com/v3/",
   "result": "partial",
   "via": "api"
  },
  {
   "id": "cap-18",
   "capability": "Build a bot integration that replies in threads/messages",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "Bot outgoing webhook + general API",
    "mcp": null,
    "cli": null,
    "ui": "twist.com/app_console/create_app"
   },
   "check": "Messaging the bot triggers its outgoing webhook and its reply appears as a comment",
   "capability_id": "cap_4qp39fpq",
   "unmapped": null,
   "source": "https://developer.twist.com/v3/",
   "result": "blocked",
   "via": "browser"
  },
  {
   "id": "cap-19",
   "capability": "Connect a third-party integration from the directory",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "/integrations"
   },
   "check": "Installed integration appears under workspace integrations list",
   "capability_id": "cap_x4n6bnwy",
   "unmapped": null,
   "source": "https://twist.com/integrations",
   "result": "done",
   "via": "browser",
   "done_on": [
    "browser"
   ]
  },
  {
   "id": "cap-20",
   "capability": "Set a do-not-disturb / away schedule",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/users/update (snooze_dnd_start/end, away_mode)",
    "mcp": null,
    "cli": null,
    "ui": "Settings → Account → Notifications"
   },
   "check": "GET /api/v3/users/get shows snooze_dnd_start/snooze_dnd_end or away_mode set",
   "capability_id": null,
   "unmapped": "not_a_job",
   "source": "https://developer.twist.com/v3/",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-21",
   "capability": "Work from the mobile or desktop app",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Native desktop/mobile apps"
   },
   "check": "Desktop/mobile app login shows same workspace data",
   "capability_id": "cap_p675qb2x",
   "unmapped": null,
   "source": "https://twist.com/",
   "result": "not_tried",
   "via": null
  },
  {
   "id": "cap-22",
   "capability": "Create or switch between multiple workspaces",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/workspaces/add",
    "mcp": null,
    "cli": null,
    "ui": "Workspace switcher"
   },
   "check": "GET /api/v3/workspaces/get lists the new workspace",
   "capability_id": "cap_vk1kvzkm",
   "unmapped": null,
   "source": "https://twist.com/help/articles/115003654289",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-23",
   "capability": "Invite a member to the workspace",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/workspace_users/add",
    "mcp": null,
    "cli": null,
    "ui": "Workspace settings → Members → Invite"
   },
   "check": "GET /api/v3/workspace_users/get lists the invited user",
   "capability_id": "cap_3w8sjh12",
   "unmapped": null,
   "source": "https://developer.twist.com/v3/",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-24",
   "capability": "Add a guest limited to specific channels",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/workspace_users/add (guest scope)",
    "mcp": null,
    "cli": null,
    "ui": "Channel → Add guest"
   },
   "check": "GET /api/v3/workspace_users/getone?id={id} shows is_guest and restricted channels",
   "capability_id": null,
   "unmapped": "own_feature",
   "source": "https://twist.com/help/articles/115004169449",
   "result": "partial",
   "via": "api"
  },
  {
   "id": "cap-25",
   "capability": "Change the subscription plan (Free vs Unlimited)",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "/pricing → Upgrade"
   },
   "check": "Workspace billing page shows Unlimited plan active",
   "capability_id": "cap_0fp1r7vd",
   "unmapped": null,
   "source": "https://twist.com/pricing",
   "result": "not_tried",
   "via": null
  }
 ],
 "stale": false,
 "unreachable_since": null,
 "not_driven_since": null,
 "icon": "/logos/twist.png",
 "agent_kinds": {
  "browser": {
   "who": "An assistant in a browser",
   "passed": [
    "signup",
    "verify",
    "first_action"
   ],
   "stop": "pay",
   "why": "reaches the checkout, stopped at the €8 a month charge",
   "tone": "warn",
   "text": "Signs up, confirms its email and does all of the core work. Payment: reaches the checkout, stopped at the €8 a month charge."
  },
  "direct": {
   "who": "An agent talking to it directly",
   "passed": [],
   "stop": "signup",
   "why": "it works only in a browser",
   "tone": "wall",
   "text": "Stops at sign-up: it works only in a browser."
  }
 },
 "sdk": null,
 "surface_reach": null,
 "connect": {
  "docs": {
   "url": "https://docs.twist.com/",
   "state": "tested"
  }
 },
 "surface_sources": {
  "docs": "https://docs.twist.com/",
  "api": "https://developer.twist.com/v3/",
  "mcp": "https://github.com/Doist/twist-ai",
  "cli": "https://www.npmjs.com/package/@doist/twist-cli",
  "sdk": "https://www.npmjs.com/package/@doist/twist-sdk"
 },
 "copilot_connector": null,
 "stripe_directory": null,
 "in_stripe_directory": null,
 "stripe_projects": null,
 "pay_rails": [],
 "stop_evidence": {
  "at": "delete",
  "date": "2026-10-28",
  "line": "POST /api/v3/workspaces/remove for both workspaces, then POST /api/v3/users/delete: 200. Afterwards the user token gets 403 Invalid token on workspaces/get and login returns 400 \"Email or password are invalid\"."
 },
 "wall_vendor": null,
 "mcp_sign_in": {
  "sign_in": true,
  "prm": false,
  "registration": "both",
  "device": false
 },
 "safety_issues": 3,
 "fix_counts": {
  "small": 4,
  "medium": 2,
  "large": 1,
  "total": 7
 },
 "evidence_sha256": "fc6c42e8f9ab4b198aaaa4ccaa8df5c00684044ba64bd958a709cfcfb90a7c4b",
 "first_seen": "2026-10-28",
 "license": {
  "name": "CC BY 4.0",
  "url": "https://creativecommons.org/licenses/by/4.0/"
 },
 "correction": {
  "status": "none",
  "open": 0,
  "since": null,
  "reply_by": null
 },
 "attribution": null,
 "confirmation": {
  "state": "awaiting",
  "drives": 1,
  "agree": 1,
  "review": null,
  "text": "1 drive, awaiting confirmation"
 },
 "stop_shot": null,
 "stop_shot_hash": null,
 "attempts_count": 116,
 "detail": {
  "public": false,
  "in": [
   "report",
   "api"
  ],
  "since": "2026-10-17"
 },
 "what_it_does": "Twist is a team chat tool built around threads and channels.",
 "kind": "product",
 "rules_version": "rules-2026-10-30-42",
 "rules_url": "https://agentdrives.com/method/changelog#rules-2026-10-30-42",
 "category_median": null,
 "peers": {
  "API-04": {
   "basis": "all",
   "n": 86,
   "below": 24,
   "above": 0,
   "percentile": 64
  },
  "DOCS-08": {
   "basis": "category",
   "n": 7,
   "below": 0,
   "above": 2
  },
  "DOCS-10": {
   "basis": "category",
   "n": 7,
   "below": 0,
   "above": 2
  },
  "DOCS-11": {
   "basis": "category",
   "n": 7,
   "below": 2,
   "above": 1
  },
  "ERR-01": {
   "basis": "category",
   "n": 5,
   "below": 0,
   "above": 0
  },
  "ERR-02": {
   "basis": "all",
   "n": 105,
   "below": 84,
   "above": 0,
   "percentile": 90
  },
  "ERR-03": {
   "basis": "all",
   "n": 104,
   "below": 24,
   "above": 23,
   "percentile": 50
  },
  "ERR-04": {
   "basis": "all",
   "n": 36,
   "below": 0,
   "above": 12,
   "percentile": 33
  },
  "ERR-07": {
   "basis": "category",
   "n": 5,
   "below": 2,
   "above": 0
  },
  "FIND-06": {
   "basis": "all",
   "n": 106,
   "below": 10,
   "above": 81,
   "percentile": 17
  },
  "IN-03": {
   "basis": "all",
   "n": 86,
   "below": 14,
   "above": 0,
   "percentile": 58
  },
  "IN-08": {
   "basis": "category",
   "n": 6,
   "below": 0,
   "above": 0
  },
  "IN-11": {
   "basis": "category",
   "n": 7,
   "below": 3,
   "above": 1
  },
  "IN-12": {
   "basis": "category",
   "n": 8,
   "below": 4,
   "above": 3
  },
  "LEAVE-03": {
   "basis": "category",
   "n": 7,
   "below": 0,
   "above": 4
  },
  "LIM-02": {
   "basis": "all",
   "n": 48,
   "below": 0,
   "above": 21,
   "percentile": 28
  },
  "PROTO-02": {
   "basis": "category",
   "n": 7,
   "below": 0,
   "above": 0
  }
 },
 "probe": {
  "checked": "2026-11-01",
  "status": "ok",
  "sign_up_page": "stopped",
  "wall": "stopped",
  "llms_txt": false,
  "mcp": "none",
  "openapi": false,
  "payment_402": null,
  "payment_rails": [],
  "files": {
   "openapi": {
    "url": null,
    "found": false
   },
   "llms_txt": {
    "url": null,
    "found": false
   },
   "llms_full": {
    "url": null,
    "found": false
   }
  }
 },
 "probe_history": [
  {
   "checked": "2026-11-01",
   "status": "ok",
   "sign_up_page": "stopped",
   "wall": "stopped",
   "llms_txt": false,
   "mcp": "none",
   "openapi": false,
   "payment_402": null,
   "payment_rails": []
  },
  {
   "checked": "2026-10-31",
   "status": "ok",
   "sign_up_page": "stopped",
   "wall": "stopped",
   "llms_txt": false,
   "mcp": "none",
   "openapi": false,
   "payment_402": null,
   "payment_rails": []
  },
  {
   "checked": "2026-10-30",
   "status": "ok",
   "sign_up_page": "stopped",
   "wall": "stopped",
   "llms_txt": false,
   "mcp": "none",
   "openapi": false,
   "payment_402": null,
   "payment_rails": []
  },
  {
   "checked": "2026-10-29",
   "status": "ok",
   "sign_up_page": "stopped",
   "wall": "stopped",
   "llms_txt": false,
   "mcp": "none",
   "openapi": false,
   "payment_402": null,
   "payment_rails": []
  }
 ],
 "surface_changes": [],
 "agent_reports": null,
 "verdict": "L4 · Runs on its own: our agent got in on its own through Twist's web sign-up form, which showed no CAPTCHA, and confirmed the email in its browser. No checkpoint stopped it before the work. With a login token it used the documented REST API to read the session, create a channel and read it back, and every core task passed on each run. The hosted MCP endpoint refused our agent. Buying Unlimited needs a card: the Stripe form asked for one and no payment went through. Our agent deleted its workspaces and account through the API, and afterwards the CLI's OAuth token answered with an anonymised user record.",
 "changes": {
  "source": "store",
  "drives": [
   {
    "run": "20261028T025543Z",
    "date": "2026-10-28",
    "level": 4,
    "stop": "delete",
    "entry": "self-start",
    "driver": 5,
    "listed": true,
    "paid": false,
    "agent_paid": null
   }
  ],
  "events": [
   {
    "property": "stop",
    "before": null,
    "after": "delete",
    "cause": "method",
    "before_run": "20261028T025543Z",
    "after_run": "20261028T025543Z",
    "at": "2026-10-28",
    "methodology": 42,
    "methodology_before": 41,
    "rules_version": "rules-2026-10-30-42",
    "rules_url": "https://agentdrives.com/method/changelog#rules-2026-10-30-42"
   }
  ],
  "feed": "https://agentdrives.com/api/tools/twist/changes.json"
 },
 "agreement": null,
 "method_release": "2026-Q4.27",
 "found": {
  "agent_blockers": 1,
  "surface_issues": 21
 },
 "agent_surfaces": {
  "api": {
   "state": "tested",
   "reachable": true,
   "documented": 135,
   "tested": 135,
   "source": "https://developer.twist.com/v3/"
  },
  "mcp": {
   "state": "tested",
   "reachable": true,
   "documented": 11,
   "tested": 11,
   "source": "https://github.com/Doist/twist-ai"
  },
  "cli": {
   "state": "tested",
   "reachable": true,
   "documented": 70,
   "tested": 65,
   "source": "https://www.npmjs.com/package/@doist/twist-cli"
  },
  "sdk": {
   "state": "tested",
   "documented": 115,
   "tested": 113,
   "source": "https://www.npmjs.com/package/@doist/twist-sdk"
  },
  "docs": {
   "state": "tested",
   "documented": 91,
   "tested": 87,
   "source": "https://docs.twist.com/"
  },
  "payment": {
   "state": "none_found",
   "documented": null,
   "tested": null,
   "source": null
  }
 },
 "issues_found": 22,
 "rank": 1,
 "rank_of": 3,
 "rank_change": null,
 "rank_since": "2026-10-28",
 "links": {
  "category": [
   {
    "label": "Work and collaboration",
    "href": "https://agentdrives.com/categories/work"
   },
   {
    "label": "Team chat",
    "href": "https://agentdrives.com/categories/team-chat"
   }
  ],
  "tasks": [
   {
    "label": "Invite a member",
    "href": "https://agentdrives.com/tasks/invite-a-member"
   },
   {
    "label": "Connect a third-party integration",
    "href": "https://agentdrives.com/tasks/connect-a-third-party-integration"
   },
   {
    "label": "Comment on a task",
    "href": "https://agentdrives.com/tasks/comment-on-a-task"
   },
   {
    "label": "Create a workspace",
    "href": "https://agentdrives.com/tasks/create-a-workspace"
   },
   {
    "label": "React to a message",
    "href": "https://agentdrives.com/tasks#react-to-a-message"
   },
   {
    "label": "Send a chat message",
    "href": "https://agentdrives.com/tasks#send-a-chat-message"
   }
  ],
  "walls": [],
  "vendors": [],
  "standards": [
   {
    "label": "MCP",
    "href": "https://agentdrives.com/standards/mcp",
    "note": "tools an agent can call"
   }
  ],
  "steps": [
   {
    "label": "Find",
    "href": "https://agentdrives.com/access/find"
   },
   {
    "label": "Get in",
    "href": "https://agentdrives.com/access/get-in"
   },
   {
    "label": "Use",
    "href": "https://agentdrives.com/access/use"
   },
   {
    "label": "Pay",
    "href": "https://agentdrives.com/access/pay"
   },
   {
    "label": "Leave",
    "href": "https://agentdrives.com/access/leave"
   }
  ],
  "rivals": [
   {
    "label": "Zulip",
    "href": "https://agentdrives.com/tools/zulip",
    "slug": "zulip",
    "level": 4
   },
   {
    "label": "Mattermost",
    "href": "https://agentdrives.com/tools/mattermost",
    "slug": "mattermost",
    "level": 3
   },
   {
    "label": "Element",
    "href": "https://agentdrives.com/tools/element",
    "slug": "element",
    "level": 1
   }
  ],
  "compare": [],
  "rail": [
   {
    "label": "Watch this product",
    "href": "https://agentdrives.com/watch"
   },
   {
    "label": "Get the data",
    "href": "https://agentdrives.com/data#plans"
   }
  ]
 },
 "capability_matrix": [
  {
   "id": "cap-01",
   "name": "Create a channel",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "done",
    "ui": "untried"
   }
  },
  {
   "id": "cap-02",
   "name": "Change a channel's settings",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-03",
   "name": "Create a thread",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "done",
    "cli": "done",
    "ui": "untried"
   }
  },
  {
   "id": "cap-04",
   "name": "Comment on a thread",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "done",
    "cli": "done",
    "ui": "untried"
   }
  },
  {
   "id": "cap-05",
   "name": "Edit or delete a comment/thread",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "done",
    "ui": "untried"
   }
  },
  {
   "id": "cap-06",
   "name": "Send a direct message",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-07",
   "name": "Read the inbox of threads needing attention",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "done",
    "cli": "done",
    "ui": "untried"
   }
  },
  {
   "id": "cap-08",
   "name": "React to a message or comment",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-09",
   "name": "Pin or star a thread",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-10",
   "name": "Mute or archive a thread/channel/conversation",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-11",
   "name": "Favorite a channel",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-12",
   "name": "Search chat messages and threads",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-13",
   "name": "Attach a file to a thread or message",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-14",
   "name": "Create a user group",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-15",
   "name": "Add or remove members on a channel",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-16",
   "name": "Configure notification settings",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-17",
   "name": "Set up an incoming/outgoing webhook integration",
   "core": false,
   "result": "partial",
   "surfaces": {
    "api": "partial",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-18",
   "name": "Build a bot integration that replies in threads/messages",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "untried",
    "mcp": "none",
    "cli": "none",
    "ui": "blocked"
   }
  },
  {
   "id": "cap-19",
   "name": "Connect a third-party integration from the directory",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "done"
   }
  },
  {
   "id": "cap-20",
   "name": "Set a do-not-disturb / away schedule",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-21",
   "name": "Work from the mobile or desktop app",
   "core": false,
   "result": "untried",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-22",
   "name": "Create or switch between multiple workspaces",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-23",
   "name": "Invite a member to the workspace",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-24",
   "name": "Add a guest limited to specific channels",
   "core": false,
   "result": "partial",
   "surfaces": {
    "api": "partial",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-25",
   "name": "Change the subscription plan (Free vs Unlimited)",
   "core": false,
   "result": "untried",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  }
 ],
 "category_place": {
  "category": "team-chat",
  "products": 9,
  "higher": 0,
  "same_level": 1,
  "as_of": "2026-10-31",
  "stop": null,
  "rivals_by": "level",
  "rivals": [
   "zulip"
  ]
 },
 "page": "https://agentdrives.com/tools/twist?via=api"
}