{
 "slug": "mattermost",
 "name": "Mattermost",
 "url": "https://mattermost.com",
 "domain": "mattermost.com",
 "category": "team-chat",
 "category_name": "Team chat",
 "tested_at": "2026-10-06",
 "run": "20261006T022445Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261006T022445Z",
   "date": "2026-10-06",
   "level": 3,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": null,
    "robots": "start"
   }
  }
 ],
 "level": 3,
 "level_name": "Does the work",
 "level_selfhost": null,
 "entry": "self-start",
 "door": {
  "passed": 1,
  "tries": 1,
  "self_start": true
 },
 "badges": [],
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: sign-up in a browser"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "part",
   "text": "Work done: 62% of the core"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "no",
   "text": "A person has to buy: a sales call",
   "value": "person",
   "route": "sales",
   "why": "sales"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Nothing to cancel; can't delete its account",
   "at": "delete",
   "left": "stuck"
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Find",
   "state": "part",
   "text": "Some docs agents can read: an OpenAPI and an MCP server",
   "have": [
    "openapi",
    "mcp"
   ]
  },
  {
   "key": "access",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: sign-up in a browser",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "part",
   "text": "Work done: 62% of the core",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "no",
   "text": "A person has to buy: a sales call",
   "value": "person",
   "route": "sales",
   "why": "sales",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Nothing to cancel; can't delete its account",
   "at": "delete",
   "left": "stuck",
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "browser_signup",
   "label": "Sign-up in a browser",
   "routes": [],
   "minutes": 7.8,
   "core": "5/8"
  }
 ],
 "minutes": 7.8,
 "next": {
  "to": 4,
  "text": "Next: do 80% of the core work (now 62%)"
 },
 "stop": "pay",
 "core": "5/8",
 "scores": {
  "coverage": 61,
  "reliability": 100,
  "resilience": null,
  "setup": 80,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": null,
  "docs_match": null,
  "setup": 80,
  "security": null,
  "standards": [
   {
    "standard": "OpenAPI",
    "state": "behind",
    "behind": 2,
    "value": "3.0.0"
   }
  ]
 },
 "reliability_method": "first-try",
 "resilience": null,
 "stress": [],
 "surface_audit": null,
 "coverage_core": 62,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 2,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": null,
  "prompt_sha": "59d395064c20",
  "kb_version": "2",
  "identity": null
 },
 "methodology": 15,
 "rules_date": "2026-10-15",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 2,
  "signed": true,
  "inbox": null,
  "robots": "start"
 },
 "same_level_drives": 1,
 "drives": 1,
 "works_assisted": null,
 "freshness": "fresh",
 "nothing_to_pay": false,
 "core_gated": false,
 "profiles": {},
 "agent_check": null,
 "agent_pass": null,
 "who_gets_in": {
  "server": {
   "state": "in"
  },
  "signed": {
   "state": "robots",
   "kind": "signup",
   "at": "2026-10-12"
  },
  "browser": {
   "state": "in",
   "measured": false
  },
  "our_key": "pending",
  "robots": "closed",
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "docs.mattermost.com/api: 549 endpoints generated from the OpenAPI fragments (openapi 3.0.0); auth docs cover login and personal access tokens"
  },
  "signup": {
   "status": "browser",
   "note": "Customer Portal sign-up form (name, email, organization, password), no CAPTCHA; Cloud workspace created in the portal UI (My Workspace > create a new workspace), ready in about 4 minutes, 30-day Cloud Enterprise trial, no card. No documented sign-up API."
  },
  "verify": {
   "status": "browser",
   "note": "6-digit email code arrived within a minute; read headless from the inbox, typed into the portal page"
  },
  "credentials": {
   "status": "headless",
   "note": "POST /api/v4/users/login with email+password gave a session token; POST /users/{id}/tokens created a personal access token",
   "via": ""
  },
  "first_call": {
   "status": "headless",
   "note": "GET /api/v4/users/me with the token: 200"
  },
  "first_action": {
   "status": "headless",
   "note": "POST /api/v4/channels created a private channel, read back by name"
  },
  "pay": {
   "status": "blocked",
   "grade": "P0",
   "rails": [
    "contact sales"
   ],
   "rail_ids": [],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "no-card trial",
   "note": "No 402/x402/MPP/UCP, not in mpp.dev or the x402 Bazaar. Pricing: Contact Sales / Get Pricing / Request Quote; workspace Subscription page: 'Contact Sales to continue after the trial ends'. Documented cloud API has no purchase endpoint."
  },
  "cancel": {
   "status": "n/a",
   "grade": "X5",
   "note": "Nothing to cancel: our agent started no paid plan.",
   "docs_note": "No-card trial with nothing recurring; it ends on the 6 Nov 2026 MCP spec on its own",
   "nothing": "no_plan"
  },
  "delete": {
   "status": "blocked",
   "note": "Data, guests and channel deleted via the API (permanent delete after enabling the API-deletion settings); no documented API or UI control to delete the Cloud workspace or the Customer Portal account, apparently only by support request (not filed)",
   "left": "stuck",
   "account": true
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-06",
  "source": "drive",
  "options": [],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": true,
   "card_required": null,
   "free_plan": null
  },
  "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": true,
  "cli": true,
  "sdk": true,
  "mcp": "official",
  "llms_txt": false,
  "webhooks": true,
  "sandbox": false
 },
 "surface_notes": {
  "api": "REST v4, 549 endpoints, PAT or session token",
  "openapi": "3.0.0, published as 56 YAML fragments in the server repo; no bundled spec URL on the docs host",
  "mcp": "official, in the Agents plugin, off by default; not reached",
  "cli": "mmctl (not used on Cloud)"
 },
 "can_do": [
  "Post messages, thread replies, files and links in channels via the REST API",
  "Create private or public channels and sort them into sidebar categories",
  "Search posts, files and hashtags",
  "React, pin, and set message priority",
  "Create an incoming webhook and post through it",
  "Invite guests to a channel, including passwordless magic-link guests",
  "Create custom user groups and custom profile attributes",
  "Install and enable marketplace plugins",
  "Turn on MFA and activate it with a TOTP code",
  "Create and revoke personal access tokens headless once signed up"
 ],
 "cannot_do": [
  {
   "what": "Sign up and create a Cloud workspace headless",
   "why": "Customer Portal web forms only; no documented sign-up or workspace API"
  },
  {
   "what": "Use the AI Agents or the MCP server",
   "why": "needs an LLM provider key; the HTTP MCP endpoint is off and its toggle was not shown"
  },
  {
   "what": "Talk or share a screen in a call",
   "why": "Calls are WebRTC media in the app; no API in the map"
  },
  {
   "what": "Buy a plan",
   "why": "sales only (Contact Sales)"
  },
  {
   "what": "Delete the workspace or portal account",
   "why": "no documented API or UI control"
  },
  {
   "what": "Enable the announcement banner on Cloud",
   "why": "EnableBanner is set by the environment; the config API returns 200 and ignores the change"
  }
 ],
 "blockers": [
  "Sign-up and workspace creation are browser-only",
  "Purchase is sales-only",
  "No workspace delete found (no control, no API, none in the docs)",
  "Agents and MCP need an LLM provider key"
 ],
 "tips_for_owner": [
  "Offer a headless Cloud sign-up and workspace API",
  "Add self-serve workspace and account deletion",
  "Make the MCP endpoint reachable and discoverable",
  "Let agents buy Cloud Professional self-serve",
  "Reject changes to environment-locked settings",
  "Publish llms.txt, Markdown docs and a bundled OpenAPI"
 ],
 "tips_for_agents": [
  "After sign-up, POST /api/v4/users/login then POST /users/{id}/tokens; the personal access token covers the whole v4 API",
  "Check GET /config/environment before trusting a 200 from /config/patch on Cloud",
  "POST /groups takes a flat body: name, display_name, source 'custom', allow_reference true, user_ids",
  "Permanent deletes need EnableAPIUserDeletion / EnableAPIChannelDeletion first",
  "Workspace creation takes about 4 minutes; poll the workspace URL /api/v4/system/ping"
 ],
 "selfhost": {
  "install": {
   "status": "skipped",
   "minutes": 0,
   "note": "no docker in the drive sandbox; Mattermost has an open-source self-hosted edition"
  }
 },
 "summary": "An agent can sign up for a 30-day Mattermost Cloud Enterprise trial without a card, but only in the browser. After that the documented REST API v4 does almost all of the chat product headless: channels, posts, threads, files, search, webhooks, guests, groups and plugins. The AI Agents and MCP need an LLM key, calls are browser media, buying goes through sales, and no way to delete the workspace was found.",
 "wall": "Workspace sign-up browser-only; buying via sales, no delete found",
 "plan_scope": "no-card trial",
 "robots_stop": null,
 "robots": null,
 "plain": {
  "summary": "Mattermost is a team chat tool. An agent can sign up for a free 30-day trial only through the website (not fully automated), but once signed in it can send messages, create channels, search, and do most chat tasks on its own through the API. It gets stuck trying to buy a paid plan (only 'Contact Sales' is offered) or delete the trial workspace (no delete control or API was found).",
  "can_do": [
   "Send messages, replies, files and links in chat channels automatically",
   "Create and organize channels",
   "Search messages and files",
   "Invite guests and set up automated webhooks",
   "Turn on two-factor login and customize branding, all without a person"
  ],
  "cannot_do": [
   {
    "what": "Sign up for the service without using a web browser",
    "why": "there is no sign-up option outside the website forms"
   },
   {
    "what": "Use the built-in AI chatbot",
    "why": "it needs an AI service key the trial doesn't provide"
   },
   {
    "what": "Buy a paid subscription on its own",
    "why": "the only path shown is 'Contact Sales'"
   },
   {
    "what": "Delete the trial workspace or account",
    "why": "no delete control or API was found, and the docs name none"
   }
  ]
 },
 "plan_gated": [],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Channel-based collaboration",
   "capability": "Send a message in a channel or DM",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /posts",
    "mcp": null,
    "cli": "mmctl post create",
    "ui": "channel center / DM"
   },
   "check": "GET /channels/{channel_id}/posts shows the new post",
   "source": "https://docs.mattermost.com/api/reference/posts; https://mattermost.com/pricing/"
  },
  {
   "id": "cap-02",
   "group": "Channel-based collaboration",
   "capability": "Create a public or private channel",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /channels",
    "mcp": null,
    "cli": "mmctl channel create",
    "ui": "team sidebar + button"
   },
   "check": "GET /teams/{team_id}/channels/name/{name} returns the channel",
   "source": "https://docs.mattermost.com/api/reference/channels; https://mattermost.com/pricing/"
  },
  {
   "id": "cap-03",
   "group": "Channel-based collaboration",
   "capability": "Share a file or link in a conversation",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /files",
    "mcp": null,
    "cli": null,
    "ui": "message composer attach"
   },
   "check": "GET /files/{file_id}/info returns the uploaded file metadata",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-04",
   "group": "Channel-based collaboration",
   "capability": "Reply in a thread",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /posts (root_id set)",
    "mcp": null,
    "cli": null,
    "ui": "thread panel"
   },
   "check": "GET /posts/{post_id}/thread includes the new reply",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-05",
   "group": "Channel-based collaboration",
   "capability": "Start a 1:1 audio call with screen share",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "DM call icon"
   },
   "check": "Call appears in channel call widget and call log state is active",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-06",
   "group": "Channel-based collaboration",
   "capability": "Search messages and files",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /teams/{team_id}/posts/search",
    "mcp": null,
    "cli": null,
    "ui": "search bar"
   },
   "check": "Search response returns matching posts (core search up to 3M posts)",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-07",
   "group": "Channel-based collaboration",
   "capability": "React to a message with emoji",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /reactions",
    "mcp": null,
    "cli": null,
    "ui": "message hover toolbar"
   },
   "check": "GET /posts/{post_id}/reactions shows the new reaction",
   "source": "https://docs.mattermost.com/api/reference/posts"
  },
  {
   "id": "cap-08",
   "group": "Channel-based collaboration",
   "capability": "Pin a message to a channel",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /posts/{post_id}/pin",
    "mcp": null,
    "cli": null,
    "ui": "message menu > Pin"
   },
   "check": "GET /channels/{channel_id}/pinned shows the pinned post",
   "source": "https://docs.mattermost.com/api/reference/posts"
  },
  {
   "id": "cap-09",
   "group": "Channel-based collaboration",
   "capability": "Set a message priority (Standard/Important/Urgent)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /posts (metadata.priority)",
    "mcp": null,
    "cli": null,
    "ui": "composer priority picker"
   },
   "check": "Post metadata shows priority value when read back",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-10",
   "group": "Channel-based collaboration",
   "capability": "Tag topics with hashtags",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "message composer #tag"
   },
   "check": "Search by hashtag returns the tagged post",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-11",
   "group": "Channel-based collaboration",
   "capability": "Organize channels into custom categories",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "PUT /users/{user_id}/teams/{team_id}/channels/categories",
    "mcp": null,
    "cli": null,
    "ui": "sidebar right-click > Move to"
   },
   "check": "GET sidebar categories shows channel under new category",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-12",
   "group": "Multi-team collaboration",
   "capability": "Run a group call with screen share",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "channel call icon"
   },
   "check": "Channel call widget shows multiple active participants (up to ~50)",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-13",
   "group": "Multi-team collaboration",
   "capability": "Invite a guest into a specific channel",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /teams/{team_id}/invite-guests/email",
    "mcp": null,
    "cli": "mmctl user invite",
    "ui": "system console > guest invite"
   },
   "check": "GET /users/{user_id} shows guest role and channel membership",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-14",
   "group": "Multi-team collaboration",
   "capability": "Create a custom user group for mentions",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /groups",
    "mcp": null,
    "cli": null,
    "ui": "system console > user groups"
   },
   "check": "@group-name mention in a post notifies all group members",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-15",
   "group": "Multi-team collaboration",
   "capability": "Broadcast a system-wide announcement banner",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "system console > announcement banner"
   },
   "check": "Banner renders at top of app for all logged-in users",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-16",
   "group": "Agentic platform",
   "capability": "Chat with an interactive AI bot in a channel or DM",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": "POST /posts (to bot user)",
    "mcp": null,
    "cli": null,
    "ui": "DM with AI bot / channel mention"
   },
   "check": "Bot posts a reply visible via GET /channels/{channel_id}/posts",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-17",
   "group": "Agentic platform",
   "capability": "Connect a bring-your-own or multi-LLM backend",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "system console > AI/LLM configuration"
   },
   "check": "System console shows configured LLM endpoint and bot responds using it",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-18",
   "group": "Agentic platform",
   "capability": "Summarize a thread or channel with AI",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "thread/channel menu > AI summarize"
   },
   "check": "Summary post appears attributed to AI bot",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-19",
   "group": "Agentic platform",
   "capability": "Generate a real-time channel briefing from calls/chat",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "channel briefing panel"
   },
   "check": "Briefing artifact posted summarizing transcript, recordings, and chat logs",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-20",
   "group": "Integrations platform",
   "capability": "Call Mattermost over the REST API v4",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "all 549 endpoints",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Authenticated curl call to any documented endpoint returns 2xx JSON",
   "source": "https://docs.mattermost.com/api"
  },
  {
   "id": "cap-21",
   "group": "Integrations platform",
   "capability": "Automate posts via incoming/outgoing webhooks and slash commands",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /hooks/{hook_id}",
    "mcp": null,
    "cli": "mmctl webhook create-incoming",
    "ui": "system console > integrations"
   },
   "check": "Posting to the webhook URL creates a message visible in the target channel",
   "source": "https://docs.mattermost.com/api/reference/webhooks; https://mattermost.com/pricing/"
  },
  {
   "id": "cap-22",
   "group": "Integrations platform",
   "capability": "Install a plugin to extend functionality",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /plugins",
    "mcp": null,
    "cli": "mmctl plugin install",
    "ui": "system console > plugins"
   },
   "check": "GET /plugins/webapp lists the installed plugin as active",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-23",
   "group": "Integrations platform",
   "capability": "Connect DevOps tools (Jira, GitHub, GitLab, Zoom)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "marketplace > integrations"
   },
   "check": "Linked tool events post notifications into the configured channel",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-24",
   "group": "Access controls + automation",
   "capability": "Log in via single sign-on (SAML/OIDC/OAuth2)",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": "GET /oauth/{service}/login",
    "mcp": null,
    "cli": null,
    "ui": "login page SSO button"
   },
   "check": "Session token issued after SSO redirect completes",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-25",
   "group": "Access controls + automation",
   "capability": "Enable multifactor authentication for an account",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "POST /users/{user_id}/mfa",
    "mcp": null,
    "cli": null,
    "ui": "account settings > security"
   },
   "check": "GET /users/{user_id} shows mfa_active true",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-26",
   "group": "Access controls + automation",
   "capability": "Sync users and groups from AD/LDAP",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": "mmctl ldap sync",
    "ui": "system console > AD/LDAP"
   },
   "check": "User list reflects directory membership after sync job completes",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-27",
   "group": "Access controls + automation",
   "capability": "Restrict channel access with attribute-based access control (ABAC)",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "system console > access control policies"
   },
   "check": "User without matching attribute is denied channel/file access",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-28",
   "group": "Access controls + automation",
   "capability": "Lock down a channel to admin-only membership changes",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": "PUT /channels/{channel_id} (group_constrained)",
    "mcp": null,
    "cli": null,
    "ui": "channel settings > advanced"
   },
   "check": "Non-admin add/remove member request is rejected",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-29",
   "group": "Scale + high availability",
   "capability": "Deploy in a high-availability cluster",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "system console > HA settings"
   },
   "check": "System console cluster status page lists multiple healthy nodes",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-30",
   "group": "Scale + high availability",
   "capability": "Enable Elasticsearch-backed enterprise search beyond 3M posts",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": "POST /elasticsearch/test",
    "mcp": null,
    "cli": null,
    "ui": "system console > elasticsearch"
   },
   "check": "Search test endpoint confirms Elasticsearch connectivity and indexing status",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-31",
   "group": "Scale + high availability",
   "capability": "Monitor system performance via Grafana/Prometheus metrics",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": "GET /metrics",
    "mcp": null,
    "cli": null,
    "ui": "system console > performance monitoring"
   },
   "check": "Prometheus /metrics endpoint returns scrape-able metric series",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-32",
   "group": "Scale + high availability",
   "capability": "Deploy to Kubernetes via the Mattermost operator",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "kubectl get pods shows Mattermost operator-managed pods running",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-33",
   "group": "Peripheral admin",
   "capability": "Customize branding, theme, and emojis",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "PATCH /config",
    "mcp": null,
    "cli": null,
    "ui": "system console > customization"
   },
   "check": "GET /config/client reflects updated site name/theme values",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-34",
   "group": "Peripheral admin",
   "capability": "Define custom profile attributes for users",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": "POST /custom_profile_attributes/fields",
    "mcp": null,
    "cli": null,
    "ui": "system console > profile attributes"
   },
   "check": "GET /users/{user_id}/custom_profile_attributes shows the new field value",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-35",
   "group": "Peripheral admin",
   "capability": "Switch app interface language (20 languages)",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "account settings > display > language"
   },
   "check": "UI chrome re-renders in the selected locale",
   "source": "https://mattermost.com/pricing/"
  },
  {
   "id": "cap-36",
   "group": "Peripheral admin",
   "capability": "Grant instant guest access via a magic link",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "channel invite > magic link"
   },
   "check": "Clicking the link signs in a passwordless guest session scoped to the channel",
   "source": "https://mattermost.com/pricing/"
  }
 ],
 "attempts": [
  {
   "t": "02:31",
   "cap": "discovery",
   "route": "none",
   "documented": true,
   "verified": true,
   "capability": "llms.txt / agent cards",
   "task": "probe /llms.txt (mattermost.com, docs., developers.), /.well-known/ai-catalog.json, agent-card.json, agent.json, mcp/server-card.json",
   "result": "failed",
   "evidence": "all 404 text/html",
   "notes": "no llms.txt, no AI catalog, no A2A card"
  },
  {
   "t": "02:31",
   "cap": "discovery",
   "route": "none",
   "documented": true,
   "verified": true,
   "capability": "robots/aipref",
   "task": "robots.txt on mattermost.com, docs., developers.",
   "result": "done",
   "evidence": "mattermost.com: 'User-agent: * Allow: /'; docs: Allow /; developers: Disallow utm paths only. No Content-Usage or Content-signal lines",
   "notes": "no aipref"
  },
  {
   "t": "02:31",
   "cap": "discovery",
   "route": "none",
   "documented": true,
   "verified": true,
   "capability": "markdown negotiation",
   "task": "GET docs.mattermost.com with Accept: text/markdown; .md URLs",
   "result": "failed",
   "evidence": "content-type text/html, no Vary: Accept (server AmazonS3); /api.md and /api/introduction.md 404",
   "notes": ""
  },
  {
   "t": "02:31",
   "cap": "discovery",
   "route": "none",
   "documented": true,
   "verified": true,
   "capability": "OpenAPI",
   "task": "find OpenAPI spec",
   "result": "done",
   "evidence": "docs.mattermost.com/api: '549 Endpoints', generated from mattermost/mattermost/api/v4/source (56 YAML fragments); introduction.yaml declares 'openapi: 3.0.0'",
   "notes": "no bundled spec URL found on docs host; api.mattermost.com redirects to docs.mattermost.com/api"
  },
  {
   "t": "02:31",
   "cap": "discovery",
   "route": "none",
   "documented": true,
   "verified": true,
   "capability": "MCP server",
   "task": "find MCP server",
   "result": "done",
   "evidence": "agents-admin-guide: 'Enable Mattermost MCP Server (HTTP)'; endpoint https://your-mattermost-server/plugins/mattermost-ai/mcp-server/mcp; 'Authentication: OAuth 2.0 ... manual and automatic client registration'",
   "notes": "official, per-instance, needs a workspace and admin toggle; not probed without a workspace"
  },
  {
   "t": "02:31",
   "cap": "discovery",
   "route": "none",
   "documented": true,
   "verified": true,
   "capability": "pay discovery",
   "task": "/.well-known/ucp, oauth-protected-resource, oauth-authorization-server, /auth.md, /SKILL.md on mattermost.com; x402./mpp./agents. subdomains",
   "result": "failed",
   "evidence": "well-knowns and md files 404 text/html; x402/mpp/agents subdomains do not resolve (curl 6)",
   "notes": ""
  },
  {
   "t": "04:37",
   "cap": "docs",
   "capability": "find docs",
   "task": "find API reference and auth docs",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "docs.mattermost.com/api: '549 Endpoints', auth page 'Log in flows, personal access tokens, session tokens, MFA, SSO'",
   "notes": "api.mattermost.com redirects to docs.mattermost.com/api"
  },
  {
   "t": "04:37",
   "cap": "signup",
   "capability": "sign up",
   "task": "create a Mattermost account with our agent",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "customers.mattermost.com/signup form (first/last name, email, organization, password, privacy checkbox) -> /verify-email; no CAPTCHA seen. Marketing form at mattermost.com/sign-up ('Start your 1-hour trial') needs Country/Region from a fixed list, company size, use case, deploy timeline - not used",
   "notes": "No documented sign-up API; Customer Portal is a JS SPA",
   "quality": {
    "error_legibility": "n/a"
   }
  },
  {
   "t": "04:37",
   "cap": "verify",
   "capability": "verify email",
   "task": "enter emailed 6-digit code",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "mail 'Verification Code - •••• - Mattermost Customer Portal' from no-reply@mattermost.com arrived within ~1 min; code typed in browser -> /console/subscriptions 'No Licenses'",
   "notes": "code read headless from inbox, typed in browser"
  },
  {
   "t": "07:46",
   "cap": "first_call",
   "capability": "first API call",
   "task": "POST /api/v4/users/login with email+password",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "HTTP 200, Token header returned, user roles 'system_user system_admin', x-version-id 11.11.1",
   "notes": "session token works headless; docs Authentication page documents login + PATs"
  },
  {
   "t": "08:16",
   "cap": "credentials",
   "capability": "get API credentials",
   "task": "create a personal access token via POST /users/{id}/tokens with the session token",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "HTTP 200 token id za6ozkswx3dgiyp3a5x798p9na; GET /users/me with the PAT -> 200 an inbox; GET /users/{id}/tokens lists it",
   "notes": "headless after the workspace existed; workspace creation itself was browser-only",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "08:24",
   "cap": "cap-02",
   "capability": "Create a public or private channel",
   "task": "create private channel agentdrives-test",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /channels 201 id 9dxzocarwbb6fnqa5gdgh1uqto type P; GET /teams/{team}/channels/name/agentdrives-test 200 same id",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "08:24",
   "cap": "first_action",
   "capability": "first real action",
   "task": "create a private channel via API",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /api/v4/channels -> 201 id 9dxzocarwbb6fnqa5gdgh1uqto, read back by name"
  },
  {
   "t": "08:38",
   "cap": "cap-01",
   "capability": "Send a message in a channel or DM",
   "task": "post a message in our private channel",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /posts 200 id gy45zbnnrbd3tnryimuq79wtza; GET /channels/{id}/posts order contains it",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "idempotent": "no"
   }
  },
  {
   "t": "08:39",
   "cap": "cap-04",
   "capability": "Reply in a thread",
   "task": "reply to the post with root_id",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /posts root_id -> 201 id wmfi8m8aabgn9g7mfuj5q66deo; GET /posts/{id}/thread 200 includes it",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "08:41",
   "cap": "cap-03",
   "capability": "Share a file or link in a conversation",
   "task": "upload a text file and post it with a link",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /files 201 id xk1z1d3ac7nqfxqognd1rk61jc; GET /files/{id}/info 200 name agentdrives.txt; POST /posts with file_ids 201 id zsc7o9iaiib83cs1w5rwg6k6sa",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "08:42",
   "cap": "cap-07",
   "capability": "React to a message with emoji",
   "task": "add thumbsup reaction",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /reactions 200; GET /posts/{id}/reactions 200 shows thumbsup",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "08:43",
   "cap": "cap-08",
   "capability": "Pin a message to a channel",
   "task": "pin the root post",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /posts/{id}/pin 200; GET /channels/{id}/pinned 200 contains post",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "08:48",
   "cap": "cap-09",
   "capability": "Set a message priority",
   "task": "post with metadata.priority=important",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /posts 201 id 6oeooxqrhbnctxcswwdhrb6poo; GET /posts/{id} metadata.priority.priority='important'",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "08:58",
   "cap": "cap-06",
   "capability": "Search messages and files",
   "task": "search posts for 'AgentDrives' and files for 'agentdrives'",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /teams/{id}/posts/search 200 returns post gy45zbnnrbd3tnryimuq79wtza; POST /teams/{id}/files/search with JSON -> 200 order ['xk1z1d3ac7nqfxqognd1rk61jc']; first try with multipart form -> 400 'api.post.search_files.invalid_body.app_error: Unable to parse the request body.'",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "clear",
    "recoverable": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "08:58",
   "cap": "cap-10",
   "capability": "Tag topics with hashtags",
   "task": "post with #agentdrives then search the hashtag",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /teams/{id}/posts/search terms '#agentdrives' 200 returns gy45zbnnrbd3tnryimuq79wtza; post.hashtags set",
   "notes": "map lists no API surface; posts/search covers hashtags",
   "quality": {
    "verify_route": "yes"
   }
  },
  {
   "t": "09:08",
   "cap": "cap-11",
   "capability": "Organize channels into custom categories",
   "task": "create custom sidebar category 'AgentDrives' holding our channel",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /users/{uid}/teams/{tid}/channels/categories 200 id hz4fdqhedjyxtbhmaqqwt4roeh; GET categories shows it with channel 9dxzocarwbb6fnqa5gdgh1uqto",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "09:10",
   "cap": "cap-21",
   "capability": "Automate posts via incoming/outgoing webhooks and slash commands",
   "task": "create incoming webhook via API and post through it",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /hooks/incoming 201 id [redacted]; POST /hooks/{id} -> 200; GET /channels/{id}/posts shows 'posted via incoming webhook'",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "09:10",
   "cap": "cap-20",
   "capability": "Call Mattermost over the REST API v4",
   "task": "authenticated call with PAT",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET /api/v4/users/me with PAT -> 200 JSON; dozens of further v4 calls in this drive",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "10:24",
   "cap": "discovery",
   "capability": "MCP server/discover",
   "task": "POST server/discover (2026-07-28 headers) to [redacted]/plugins/mattermost-ai/mcp-server/mcp, without and with PAT",
   "route": "mcp",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "no auth: HTTP 401, empty body, no WWW-Authenticate header; with PAT: HTTP 404 '404 page not found' (HTTP MCP endpoint off by default). /.well-known/oauth-protected-resource returns 200 text/html (SPA, not PRM). /.well-known/oauth-authorization-server JSON: grant_types authorization_code+refresh_token, S256, no registration_endpoint, no client_id_metadata_document_supported, no device endpoint",
   "notes": "Docs: 'Enable Mattermost MCP Server (HTTP)' toggle in System Console > Plugins > Agents > MCP; on this workspace the Agents settings page only shows 'No AI services added yet / Add an AI Service', so the MCP toggle is not reachable without an LLM provider key we do not have"
  },
  {
   "t": "10:24",
   "cap": "cap-16",
   "capability": "Chat with an interactive AI bot in a channel or DM",
   "task": "use Mattermost Agents on the trial workspace",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "GET /api/v4/bots lists only 'playbooks' and 'calls'; System Console > Plugins > Agents (mattermost-ai v2.6.1): 'No AI services added yet. To get started with Agents, add an AI service'",
   "notes": "Agents need an LLM provider (BYO API key); the trial ships no built-in model and we have no LLM provider key to give it"
  },
  {
   "t": "10:24",
   "cap": "cap-17",
   "capability": "Connect a bring-your-own or multi-LLM backend",
   "task": "use Mattermost Agents on the trial workspace",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "GET /api/v4/bots lists only 'playbooks' and 'calls'; System Console > Plugins > Agents (mattermost-ai v2.6.1): 'No AI services added yet. To get started with Agents, add an AI service'",
   "notes": "Agents need an LLM provider (BYO API key); the trial ships no built-in model and we have no LLM provider key to give it"
  },
  {
   "t": "10:24",
   "cap": "cap-18",
   "capability": "Summarize a thread or channel with AI",
   "task": "use Mattermost Agents on the trial workspace",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "GET /api/v4/bots lists only 'playbooks' and 'calls'; System Console > Plugins > Agents (mattermost-ai v2.6.1): 'No AI services added yet. To get started with Agents, add an AI service'",
   "notes": "Agents need an LLM provider (BYO API key); the trial ships no built-in model and we have no LLM provider key to give it"
  },
  {
   "t": "10:24",
   "cap": "cap-19",
   "capability": "Generate a real-time channel briefing from calls/chat",
   "task": "use Mattermost Agents on the trial workspace",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "GET /api/v4/bots lists only 'playbooks' and 'calls'; System Console > Plugins > Agents (mattermost-ai v2.6.1): 'No AI services added yet. To get started with Agents, add an AI service'",
   "notes": "Agents need an LLM provider (BYO API key); the trial ships no built-in model and we have no LLM provider key to give it"
  },
  {
   "t": "11:53",
   "cap": "cap-12",
   "capability": "Run a group call with screen share",
   "task": "start a call in our channel from the web UI",
   "route": "browser",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "clicked 'Start call' in channel header: UI shows 'Call started', 'Leave'; GET /channels/{id}/posts shows a custom_calls post (start_at set, no end_at). The call client then reported 'Unable to find a valid audio input device.'",
   "notes": "Calls are WebRTC media in the web/desktop app: the capability map lists no API, so an agent can only open a call, not talk or share a screen; single participant (no second account of our own to join)",
   "quality": {
    "verify_route": "yes"
   }
  },
  {
   "t": "11:53",
   "cap": "cap-05",
   "capability": "Start a 1:1 audio call with screen share",
   "task": "1:1 call with screen share",
   "route": "browser",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "same Calls client as call can be started, but audio needs an input device ('Unable to find a valid audio input device.') and screen share is a media capture; no API surface in the map",
   "notes": "a 1:1 call also needs a second person; we only have our own account"
  },
  {
   "t": "12:34",
   "cap": "cap-13",
   "capability": "Invite a guest into a specific channel",
   "task": "invite our second inbox as guest to our private channel and accept the invite",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /teams/{id}/invite-guests/email 200 {status: OK}; invite mail arrived at our own second inbox; POST /users?t=•••• 201 roles system_guest; GET /users/{id} roles system_guest; GET /channels/{id}/members/{guest} 200",
   "notes": "invite sent only to an address we own; enterprise trial license",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "13:01",
   "cap": "cap-14",
   "capability": "Create a custom user group for mentions",
   "task": "create custom group with our user and mention it",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "first POST /groups with a nested {group:{...},user_ids} body -> 400 app.group.crud_permission 'Unable to perform operation for that source type.'; flat body per docs -> 201 id z3pd1k45fbds3mr954sowgwd9y; GET /groups/{id} 200 name agentdrivesgroup; GET members 200; post '@agentdrivesgroup ...' 201",
   "notes": "the 400 for a mis-shaped body names the source type, not the shape: misleading",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "vague",
    "recoverable": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "13:10",
   "cap": "cap-15",
   "capability": "Broadcast a system-wide announcement banner",
   "task": "enable a banner via config patch",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "PUT /config/patch {AnnouncementSettings:{EnableBanner:true,BannerText:...}} -> 200; GET /config shows BannerText saved but EnableBanner still false; GET /config/client EnableBanner 'false'",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "silent",
    "docs_match": "drift"
   },
   "notes": "200 response but the enable flag silently not applied"
  },
  {
   "t": "13:11",
   "cap": "cap-33",
   "capability": "Customize branding, theme, and emojis",
   "task": "set site name via config patch",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "PUT /config/patch TeamSettings.SiteName -> 200; GET /config/client SiteName='AgentDrives Test'",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "13:12",
   "cap": "cap-35",
   "capability": "Switch app interface language",
   "task": "set user locale to German",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "PUT /users/{id}/patch locale=de -> 200; GET /users/me locale 'de'",
   "notes": "map lists UI only; user patch API sets it",
   "quality": {
    "verify_route": "yes"
   }
  },
  {
   "t": "13:33",
   "cap": "cap-15",
   "capability": "Broadcast a system-wide announcement banner",
   "task": "retry: PUT /config with EnableBanner=true; check /config/environment",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "PUT /config -> 200 but EnableBanner still false; GET /config/environment lists AnnouncementSettings.EnableBanner: true (set by environment, so locked on this Cloud workspace)",
   "notes": "The 200 on a locked setting is silent; only /config/environment explains it",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "silent",
    "recoverable": "no"
   }
  },
  {
   "t": "13:45",
   "cap": "cap-25",
   "capability": "Enable multifactor authentication for an account",
   "task": "enable MFA server-wide, generate TOTP secret, activate with a computed code",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "first POST /users/{id}/mfa/generate -> 501 'Multi-factor authentication has been disabled on this server.'; PUT /config/patch EnableMultifactorAuthentication=true 200; generate 200 secret; PUT /users/{id}/mfa {activate:true, code:••••} 200 OK; GET /users/me mfa_active true",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "clear",
    "recoverable": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "14:03",
   "cap": "cap-22",
   "capability": "Install a plugin to extend functionality",
   "task": "install GitHub plugin from the marketplace and enable it",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /plugins/marketplace {id:github} 201; POST /plugins/github/enable 200; GET /plugins/webapp lists 'github'; GET /plugins/statuses state 2 (running)",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "14:03",
   "cap": "cap-23",
   "capability": "Connect DevOps tools (Jira, GitHub, GitLab, Zoom)",
   "task": "connect GitHub to the channel",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "GitHub plugin installed and running; connecting it needs a GitHub OAuth app and a GitHub account to link, which the drive does not have",
   "notes": "needs an account at the third-party tool"
  },
  {
   "t": "14:09",
   "cap": "cap-34",
   "capability": "Define custom profile attributes for users",
   "task": "create a text attribute and set our value",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "first POST /custom_profile_attributes/fields name 'AgentDrives role' -> 422 'Invalid CPA field name ... must match ^[A-Za-z_][A-Za-z0-9_]*$'; retry 'agentdrives_role' -> 201 id mqim9du6ifghbymm3xpyj9ogfc; PATCH values 200; GET /users/{id}/custom_profile_attributes 200 -> 'test driver'",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "clear",
    "recoverable": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "14:31",
   "cap": "cap-24",
   "capability": "Log in via single sign-on (SAML/OIDC/OAuth2)",
   "task": "Log in via single sign-on (SAML/OIDC/OAuth2)",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "not attempted end to end: SSO needs an identity provider (SAML/OIDC app) that the drive does not have",
   "quality": {
    "verify_route": "no"
   }
  },
  {
   "t": "14:31",
   "cap": "cap-26",
   "capability": "Sync users and groups from AD/LDAP",
   "task": "Sync users and groups from AD/LDAP",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "POST /ldap/sync -> 200 {status: OK} but GET /jobs/type/ldap_sync returns []; no AD/LDAP server to sync from",
   "quality": {
    "verify_route": "no"
   }
  },
  {
   "t": "14:31",
   "cap": "cap-27",
   "capability": "Restrict channel access with attribute-based access control (ABAC)",
   "task": "Restrict channel access with attribute-based access control (ABAC)",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": false,
   "evidence": "POST /access_control_policies/cel/check with a CEL expression on our new attribute -> 500 app.pap.check_expression.app_error 'Could not check expression.'",
   "quality": {
    "error_legibility": "vague",
    "recoverable": "no"
   }
  },
  {
   "t": "14:31",
   "cap": "cap-28",
   "capability": "Lock down a channel to admin-only membership changes",
   "task": "Lock down a channel to admin-only membership changes",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "group_constrained channels need LDAP/SAML-synced groups; the workspace has none",
   "quality": {
    "verify_route": "no"
   }
  },
  {
   "t": "14:31",
   "cap": "cap-29",
   "capability": "Deploy in a high-availability cluster",
   "task": "Deploy in a high-availability cluster",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "Cloud workspace: GET /config/environment shows ClusterSettings set by environment (managed by Mattermost); HA is a self-hosted deployment concern",
   "quality": {
    "verify_route": "no"
   }
  },
  {
   "t": "14:31",
   "cap": "cap-30",
   "capability": "Enable Elasticsearch-backed enterprise search beyond 3M posts",
   "task": "Enable Elasticsearch-backed enterprise search beyond 3M posts",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": false,
   "evidence": "POST /elasticsearch/test -> 403 HTML page with meta refresh to customers.mattermost.com/cloud/inaccessible",
   "quality": {
    "error_legibility": "vague",
    "recoverable": "no"
   }
  },
  {
   "t": "14:31",
   "cap": "cap-31",
   "capability": "Monitor system performance via Grafana/Prometheus metrics",
   "task": "Monitor system performance via Grafana/Prometheus metrics",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": false,
   "evidence": "GET https://<workspace>/metrics -> 200 text/html (web app shell, not Prometheus); MetricsSettings set by environment on Cloud",
   "quality": {
    "verify_route": "no"
   }
  },
  {
   "t": "14:31",
   "cap": "cap-32",
   "capability": "Deploy to Kubernetes via the Mattermost operator",
   "task": "Deploy to Kubernetes via the Mattermost operator",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "self-hosted deployment; no Kubernetes or Docker in the drive sandbox",
   "quality": {
    "verify_route": "no"
   }
  },
  {
   "t": "15:04",
   "cap": "cap-36",
   "capability": "Grant instant guest access via a magic link",
   "task": "enable guest magic link, invite our third inbox with guest_magic_link=true, log in passwordless",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "PUT /config/patch GuestAccountsSettings.EnableGuestMagicLink=true 200; POST /teams/{id}/invite-guests/email?guest_magic_link=true 200; mail link -> /landing#/login/one_time_link?t=••••; POST /users/login {magic_link_token: ••••} 200 user an inbox roles system_guest; GET /channels/{id}/members/{guest} with the guest session 200",
   "notes": "invite went only to an address we own",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "17:37",
   "cap": "pay",
   "capability": "buy the product",
   "task": "find an agent-native or self-serve way to buy a paid plan",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": true,
   "evidence": "No 402 anywhere: unauthenticated /api/v4/users/me and /cloud/products -> 401 application/json; x402./mpp./agents.mattermost.com do not resolve; not in mpp.dev/api/services or the CDP x402 Bazaar; no x402/MPP/ACP/UCP text on pricing or API docs. Pricing page: Professional 'Contact Sales', Enterprise 'Get Pricing', Enterprise Advanced 'Request Quote'. Workspace System Console > Subscription: 'Your free trial will expire in 30 days. Contact Sales to continue after the trial ends.' Documented cloud API (cloud.yaml) has products/subscription/invoices reads but no purchase endpoint. GET /cloud/products lists Cloud Professional $10 per_seat month, Cloud Enterprise 'sales_serve'.",
   "notes": "No self-serve purchase found: buying goes through sales"
  },
  {
   "t": "19:07",
   "cap": "cancel",
   "capability": "cancel plan",
   "task": "cancel the trial",
   "route": "none",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET /cloud/subscription: status 'trialing', is_free_trial 'true', no payment method (GET /cloud/customer payment_method type ''), trial_end_at 2026-11-06; subscription page: 'Contact Sales to continue after the trial ends'",
   "notes": "nothing recurring: the no-card trial simply ends; there is nothing to cancel"
  },
  {
   "t": "19:07",
   "cap": "delete",
   "capability": "delete account and data",
   "task": "delete our data, users and the Cloud workspace and portal account",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "Data: DELETE /hooks/incoming, /groups, /custom_profile_attributes/fields, /plugins/github, sidebar category, posts -> 200; after PUT /config/patch EnableAPIUserDeletion+EnableAPIChannelDeletion, DELETE /users/{guest}?permanent=true x2 and DELETE /channels/{id}?permanent=true -> 200, read back 404. Workspace: no delete control in System Console > Subscription, no endpoint in the documented cloud API (cloud.yaml); docs page cloud-billing-account-settings mentions no deletion. Customer Portal profile page has only Update/Cancel, no account deletion.",
   "notes": "Workspace and portal account deletion appear to need a support request; not filed (no messages to people). The trial workspace stays until it expires."
  },
  {
   "t": "19:28",
   "cap": "signup",
   "capability": "create Cloud workspace",
   "task": "create a Cloud workspace from the Customer Portal",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "customers.mattermost.com/cloud/workspace-name: 'Create your workspace' -> 'Create my workspace' -> /cloud/preparing-workspace 'Spinning up a dedicated Mattermost server… Hold on for about one minute.' -> after ~4 min 'Your workspace is ready!' -> agentdrives-test-099.cloud.mattermost.com, banner 'Your trial has started! There are 30 days left'; no card asked",
   "notes": "Reachable in the normal web UI: mattermost.com nav Login > My Workspace (customers.mattermost.com/cloud/connect-workspace) > 'Don't know your server URL?' > /cloud/create-or-join 'I want to create a new workspace, Create your own cloud workspace in minutes' > /cloud/workspace-name. The portal's own landing after verification only shows 'No Licenses / Contact sales'. GET /cloud/subscription: status trialing, is_free_trial true, Cloud Enterprise, no card."
  },
  {
   "t": "21:32",
   "cap": "discovery",
   "capability": "CLI and SDK",
   "task": "find official CLI and SDKs",
   "route": "none",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "docs.mattermost.com/administration-guide/manage/mmctl-command-line-tool 200, documents 'mmctl post create'; api/v4/source/introduction.yaml: 'Official JavaScript and Golang drivers'",
   "notes": "mmctl not used against Cloud in this drive"
  }
 ],
 "stale": false,
 "icon": "/logos/mattermost.png",
 "monitored": false,
 "verdict": "Gets in on its own, L3 · Does the work: signs up for a Cloud Enterprise trial and runs the chat product headless. No bot check met it. Once past verification our agent logged in, took a personal access token, called the users endpoint, and created and read back a private channel through the documented API. Buying stops it: pricing is Contact Sales, with no 402, x402 or purchase endpoint for the agent to use. Our agent found no API or UI control to delete the workspace or the portal account.",
 "page": "https://agentdrives.com/tools/mattermost?via=api"
}