Can an AI agent use Linear?
As of 6 Oct 2026, an AI agent can't use Linear on its own: Cloudflare Turnstile on the sign-up form.
- Find: Some docs for agents: llms.txt and an MCP server.
- Access: Can't sign up.
- Use: Work not reached.
- Pay: Payment not reached.
- Leave: Leaving not reached.
To reach L2 · Gets in: let an agent sign up on its own.
With an account set up by a person: not measured yet.
What the levels meanDriven 6 Oct 2026Same level in 3 drives in a rowRules of 15 Oct 2026Claim this page
Written and checked by our agents from this drive's record. How we write.
Who gets in
- Agents on a serverTurned away when they send the sign-up form.
- Signed agentsThe sign-up page opens. The check on the form still applies.
- Agents in a person's browserNot measured yet.
Sign-up page checked 12 Oct 2026. Signed agents: the ones Cloudflare verifies. Where agents come from
What an agent can do in Linear.
On its own
- Read all of Linear's help and developer documentation
- Look at the full list of what the API can do, without logging in
- Find out how the sign-in system for AI tools works, without logging in
What it can't, and why
- Create a Linear accountA visible human-verification check appears on the sign-up form
- Get an API key or tokenEvery way to get one requires an account first
- Create or manage issues, projects, or any other workNo account could be created
Can an AI agent sign up for Linear on its own?
No. Sign-up: needs a human. Email sign-up shows a visible Cloudflare Turnstile 'Verify you are human' after the email is entered. No documented headless sign-up; the GraphQL auth mutation carries a challengeResponse field for the same check.
Does Linear have an MCP server, and can an agent connect to it?
Yes. Linear has an official MCP server.
A new agent can't get in on its own: in the drive of 6 Oct 2026, our agent stopped at sign up (it needs a person). Through the MCP server, 0 of our agent's 1 attempt worked.
What the drive found
API–OpenAPIMCP · official–CLISDKllms.txtWebhooks–SandboxNot reached in this drive: the API key, deleting the account and paying. Every checkpoint, in detail
For the team behind Linear.
Where agents stop in Linear today, and the fixes that get them further, highest impact first.
The fixes, highest impact first
- Let verified agents through sign-upStep-by-step guide
- Offer a headless agent registration pathStep-by-step guide
- Fix unauthenticated rate limit docs drift
1 more fix
- Publish an MCP server card Step-by-step guide
- Claim it free and reply next to the result.
- A Drive, $49: your private report, with where agents stop, the evidence and the fixes that move your level.
- Fixed something? Order a Drive ($49) any time, or the Monthly drive ($29/month).
Details
Your API, MCP server or CLI is the product? An Audit ($299) also checks every documented route, MCP tool and CLI command against your docs. Compare plans.
Already claimed it? Open it in your dashboard.
Rather not be driven? Block AgentDrivesAgent in robots.txt or write to us. We stop driving it ourselves; this page stays, with its date.
Embed the badge on your site
Behind the level.
Our agent couldn't get into Linear, so the work, its reliability and the crash test aren't measured. The part scores are what it could judge from the outside.
Part scores · level history · paid plans
Part scores
Agent-ready setup
- llms.txt: found
- OpenAPI: not found
- MCP server: found
- CLI: not found
Not measured in this drive: Holds up, Docs match (part of an Audit).
Level history
- 1 Oct 20262 drivesL1Needs a person
- 6 Oct 2026L1Needs a person
Needs a paid plan
Not counted in the level.
| Capability | Plan |
|---|---|
| Collect workplace requests via Linear Asks (Slack) | paid (Basic/Business/Enterprise) |
| Build analytics charts (Insights) on issue data | paid (Basic/Business/Enterprise) |
| Export customer requests or insights data to CSV | paid (Basic/Business/Enterprise) |
| Configure SAML/SCIM enterprise authentication | paid (Basic/Business/Enterprise) |
| Set admin roles and granular admin controls | paid (Basic/Business/Enterprise) |
| Connect third-party integrations (Zendesk, Intercom, Front, Salesforce, Figma, etc.) | paid (Basic/Business/Enterprise) |
| Upgrade plan / manage invoice-PO billing | paid (Basic/Business/Enterprise) |
For agents and builders.
The drive as data, every checkpoint and all 51 attempts.
How an agent connects · 4 tips
/api/tools/linear.json/tools/linear.mdMCP get_tool {"slug":"linear"}
- Docs: append .md to any linear.app/docs or /developers page, or start at /llms.txt.
- The GraphQL schema is introspectable without a key; personal API keys go in 'Authorization: <key>' (no Bearer), OAuth tokens as Bearer.
- MCP at https://mcp.linear.app/mcp accepts a Bearer API key, so once a human has an account an agent needs no OAuth dance.
- Sign-up needs a human for the Turnstile check.
Every checkpoint, in detail · 9 checkpoints
- DocsHeadless/llms.txt, docs and developer pages as .md (text/markdown), public GraphQL schema by introspection without a key.
- Sign upNeeds a humanEmail sign-up shows a visible Cloudflare Turnstile 'Verify you are human' after the email is entered. No documented headless sign-up; the GraphQL auth mutation carries a challengeResponse field for the same check.
- VerifyNot reachedNot reached: the login mail is only sent after the Turnstile check.
- KeyNot reachedPersonal API keys and OAuth both need a signed-in user. AS at mcp.linear.app supports CIMD, DCR and ID-JAG, but no device flow or agent registration.
- First callNot reachedUnauthenticated GraphQL answers 401 AUTHENTICATION_ERROR (clear message). Introspection works without a key.
- First actionNot reachedNo credentials.
- PayNot reachedFree plan exists. No 402 rail: x402./mpp./agents. subdomains have no DNS, no /.well-known/ucp, not in the x402 Bazaar or mpp.dev. Docs: upgrade through a checkout page from Settings > Administration > Billing. Checkout not reached (no account); is from the docs, not confirmed.
- CancelNot reachedNo plan started. Docs: cancel from Settings > Administration > Billing (web UI).
- DeleteNot reachedNo account. Public schema has organizationDeleteChallenge + organizationDelete (emailed code, 48-hour cancel window per docs), so delete looks API-possible; not tested.
The attempt log · 51 attempts
| Capability | Route | Result | Evidence |
|---|---|---|---|
| MCP version probe: POST server/discover (2026-07-28) to https://mcp.linear.app/mcp without credentials | mcp | partial ✓ | HTTP 401, empty body, WWW-Authenticate: Bearer realm="OAuth", resource_metadata="https://mcp.linear.app/.well-known/oauth-protected-resource/mcp", scope="read write" |
| OAuth metadata: GET PRM + AS metadata | api | done ✓ | PRM 200 application/json resource https://mcp.linear.app/mcp, AS https://mcp.linear.app; AS meta: client_id_metadata_document_supported true, registration_endpoint /register, grants authorization_code, refresh_token, jwt-bearer; authorization_grant_profiles_supported id-jag; S256; iss param supported. No device_authorization_endpoint, no agent_auth block. |
| Cards: GET server-card, ai-catalog, agent-card, agent.json, mcp/server-card.json, /.well-known/ucp | api | failed ✓ | mcp.linear.app/mcp/server-card 401; ai-catalog.json 404 (both hosts); agent-card.json 404; agent.json 404; ucp 404; /auth.md and /SKILL.md return the SPA HTML (soft 404, text/html) |
| llms.txt / markdown / aipref: GET /llms.txt, robots.txt, docs page with Accept: text/markdown and .md URL | api | done ✓ | /llms.txt 200 text/plain (H1 '# Linear', links to /docs/*.md); Accept: text/markdown on /docs/start-guide -> content-type text/markdown, Vary does not include Accept; /docs/start-guide.md -> text/markdown; robots.txt: User-Agent * Disallow /api/ /cdn-cgi/, no Content-Usage or Content-signal lines; no Content-Usage header on / |
| Docs: Find docs | api | done ✓ | linear.app/llms.txt + docs .md pages, developers.linear.app GraphQL docs; /docs/api-and-webhooks.md says personal API keys from Settings > Account > Security & Access |
| Sign up: Sign up at linear.app/signup with Continue with email (the agent's inbox) | browser | blocked | After submitting the email the page shows 'Verifying it's you' with a visible Cloudflare Turnstile widget 'Verify you are human' (challenges.cloudflare.com turnstile sitekey 0x4AAAAAACK1Fs1RDiAS6z91; pat request 401). No mail arrived in 60 s. No documented headless sign-up route (docs: Google, email link/code, passkey, SAML only). |
| Sign up: Hand off the Turnstile step to a human (own browser) | none | blocked | |
| Verify email: Receive Linear login link/code at the agent's inbox | none | blocked | inbox read --wait 60: no mail; the email step never got past the Turnstile check, so no mail was expected |
| API credentials: Personal API key (Settings > Account > Security & Access) or OAuth (MCP AS at mcp.linear.app supports CIMD/DCR; ID-JAG for enterprise) | none | blocked | All documented credential routes need a signed-in Linear user: personal API keys are created in the web settings; OAuth authorize at mcp.linear.app/authorize and linear.app/oauth/authorize needs a Linear login; client_credentials needs an OAuth app created in a workspace; no device_authorization_endpoint in AS metadata. |
| First API call: POST https://api.linear.app/graphql { viewer { id } } without credentials | api | failed ✓ | HTTP 401 application/json {errors:[{message:'Authentication required, not authenticated', extensions:{code:'AUTHENTICATION_ERROR', userPresentableMessage:'You need to authenticate to access this operation.'}}]}. Unauthenticated introspection works: 369 mutations, 170 queries. |
| Rate limit headers: Read rate-limit headers on an unauthenticated GraphQL call | api | done ✓ | x-ratelimit-requests-limit: 1200, x-ratelimit-complexity-limit: 100000 (X-RateLimit-* legacy names, no RateLimit/RateLimit-Policy). Docs /developers/rate-limiting.md say unauthenticated is 600 requests per hour. |
| First real action: Create an issue | none | blocked | No credentials (sign-up stopped at Turnstile) |
| Pay step: Probe x402/MPP/L402/UCP/registries and the billing route | api | done ✓ | x402.linear.app, mpp.linear.app, agents.linear.app: no DNS. /.well-known/ucp 404 (HTML). No 402 on api.linear.app (GraphQL answers 401 unauthenticated). x402 Bazaar CDP catalog and mpp.dev/api/services: no 'linear' entries. Pricing page: Free $0, Basic $10, Business $16 per user/month, Enterprise custom (annual). Billing docs: upgrade via a checkout page from Settings > Administration > Billing (web). Public schema has organizationStartTrialForPlan(planType) mutation (not tested: no account). |
| Cancel: Find how to cancel a subscription | none | skipped | Docs billing-and-plans.md: 'Workspace admins can change or cancel a subscription from Settings > Administration > Billing' (web UI). No plan was started. |
| Delete account: Delete workspace/account | none | blocked | No account to delete. Public schema documents organizationDeleteChallenge (emails a code) + organizationDelete(input) (48-hour cancel window per docs/workspaces.md); docs also describe deleting from settings. |
| Sign up via API: Inspect public GraphQL mutation emailUserAccountAuthChallenge | api | blocked | Public schema mutation emailUserAccountAuthChallenge(input) has a 'challengeResponse' field ('Response from the login challenge'), i.e. the same bot challenge guards the API path. Not called: sending it without the challenge would be skipping the check. |
| Create an issue: Do: Create an issue | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: mutation issueCreate |
| Update an issue (status, assignee, priority, labels, estimate): Do: Update an issue (status, assignee, priority, labels, estimate) | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: mutation issueUpdate |
| Break issues into parent/sub-issues: Do: Break issues into parent/sub-issues | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: issueUpdate(parentId) |
| Link blocked/blocking/related/duplicate issue relations: Do: Link blocked/blocking/related/duplicate issue relations | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: mutation issueRelationCreate |
| Create and run a project with milestones: Do: Create and run a project with milestones | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: mutation projectCreate / projectMilestoneCreate |
| Group projects under an initiative: Do: Group projects under an initiative | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: mutation initiativeCreate / initiativeToProjectCreate |
| Plan work into cycles (sprints): Do: Plan work into cycles (sprints) | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: mutation issueUpdate(cycleId) |
| Triage incoming issues into a dedicated inbox: Do: Triage incoming issues into a dedicated inbox | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: Team > Triage |
| Assign work to Linear Agent / third-party AI agents: Do: Assign work to Linear Agent / third-party AI agents | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: mutation issueUpdate(assigneeId=agentId) |
| Link GitHub pull requests/commits to issues and automate status: Do: Link GitHub pull requests/commits to issues and automate status | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: attachmentLinkGitHub (via integration) |
| Bulk-select and batch-edit issues: Do: Bulk-select and batch-edit issues | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: Issue list > multi-select (Shift-click) |
| Customize workflow statuses per team: Do: Customize workflow statuses per team | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: mutation workflowStateCreate |
| Build and save custom filtered views: Do: Build and save custom filtered views | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: mutation customViewCreate |
| Search workspace issues/projects/customers: Do: Search workspace issues/projects/customers | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: query issueSearch |
| Comment and @mention on issues: Do: Comment and @mention on issues | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: mutation commentCreate |
| Write project/initiative documents: Do: Write project/initiative documents | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: mutation documentCreate |
| Post and share project/initiative status updates: Do: Post and share project/initiative status updates | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: mutation projectUpdateCreate |
| Subscribe to notifications for issues/views/teams: Do: Subscribe to notifications for issues/views/teams | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: mutation notificationSubscriptionCreate |
| Import issues from another tracker: Do: Import issues from another tracker | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: Settings > Import |
| Log customer requests and link them to issues/projects: Do: Log customer requests and link them to issues/projects | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: mutation customerNeedCreate |
| Manage customer records and attributes: Do: Manage customer records and attributes | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: mutation customerCreate |
| Collect workplace requests via Linear Asks (Slack): Use Collect workplace requests via Linear Asks (Slack) | none | plan_gated | linear.app/pricing: feature listed under paid plans (Basic $10 / Business $16 per user/month / Enterprise); also no account (sign-up stopped at Turnstile) |
| Build analytics charts (Insights) on issue data: Use Build analytics charts (Insights) on issue data | none | plan_gated | linear.app/pricing: feature listed under paid plans (Basic $10 / Business $16 per user/month / Enterprise); also no account (sign-up stopped at Turnstile) |
| Export customer requests or insights data to CSV: Use Export customer requests or insights data to CSV | none | plan_gated | linear.app/pricing: feature listed under paid plans (Basic $10 / Business $16 per user/month / Enterprise); also no account (sign-up stopped at Turnstile) |
| Create issues from Slack messages / mention @Linear to act: Do: Create issues from Slack messages / mention @Linear to act | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: Slack message > Connect to apps > Create new issue, or @Linear mention |
| Sync GitHub Issues two-way with a Linear team: Do: Sync GitHub Issues two-way with a Linear team | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: Settings > Integrations > GitHub > GitHub Issues |
| Save and reuse agent prompts as Loops/skills: Do: Save and reuse agent prompts as Loops/skills | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: Linear Agent chat > Save as skill |
| Create and manage issues from the mobile app: Do: Create and manage issues from the mobile app | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: iOS/Android app |
| Query/mutate workspace data via GraphQL API: Query workspace data via GraphQL | api | partial ✓ | Introspection works unauthenticated (369 mutations, 170 queries); any data query answers 401 AUTHENTICATION_ERROR without a key |
| Create and manage teams (incl. private teams): Do: Create and manage teams (incl. private teams) | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: mutation teamCreate |
| Configure SAML/SCIM enterprise authentication: Use Configure SAML/SCIM enterprise authentication | none | plan_gated | linear.app/pricing: feature listed under paid plans (Basic $10 / Business $16 per user/month / Enterprise); also no account (sign-up stopped at Turnstile) |
| Set admin roles and granular admin controls: Use Set admin roles and granular admin controls | none | plan_gated | linear.app/pricing: feature listed under paid plans (Basic $10 / Business $16 per user/month / Enterprise); also no account (sign-up stopped at Turnstile) |
| Customize branding/templates for issues: Do: Customize branding/templates for issues | none | blocked | No credentials: sign-up stopped at a visible Cloudflare Turnstile. Documented route would be: mutation templateCreate |
| Connect third-party integrations (Zendesk, Intercom, Front, Salesforce, Figma, etc.): Use Connect third-party integrations (Zendesk, Intercom, Front, Salesforce, Figma, etc.) | none | plan_gated | linear.app/pricing: feature listed under paid plans (Basic $10 / Business $16 per user/month / Enterprise); also no account (sign-up stopped at Turnstile) |
| Upgrade plan / manage invoice-PO billing: Use Upgrade plan / manage invoice-PO billing | none | plan_gated | linear.app/pricing: feature listed under paid plans (Basic $10 / Business $16 per user/month / Enterprise); also no account (sign-up stopped at Turnstile) |
Also in Project management.
BasecampL4Gets in on its ownLinear vs Basecamp
PlaneL4Gets in on its ownLinear vs Plane
GitHubL4Gets in on its ownLinear vs GitHub
ShortcutL4Gets in on its ownLinear vs Shortcut