Wire up the Litmus MCP server with Clerk OAuth or an API key from Claude Code, Claude Desktop, Cursor, or a custom client.
Authentication
Litmus accepts two bearer-token shapes: Clerk OAuth for interactive clients (Claude Desktop, Claude Code, Cursor) and API keys for headless agents and CI. Both resolve to the same Clerk org — pick whichever fits the calling context.
Use your org-scoped URL. Each Litmus org has its own MCP connector
URL of the form https://litmushiring.com/mcp/<your-org-id>/ — copy the
exact value from Settings → API Keys in your dashboard. The
org-scoped path is required if you're a member of multiple Clerk orgs
(the OAuth verifier needs to know which one you mean), and recommended
in all cases. The trailing / matters too — without it, most HTTP
clients drop the Authorization header across a 308 redirect and you'll
see a confusing 401.
The legacy https://litmushiring.com/mcp/ (no org segment) still works
for API-key callers (each key is org-scoped by construction) and for
OAuth users who belong to exactly one Clerk org. Examples below use the
org-scoped form throughout — substitute your own org id.
OAuth
Modern MCP clients discover Litmus's OAuth flow automatically. Point the
client at https://litmushiring.com/mcp/<your-org-id>/ and on first call it'll open a
browser for Clerk sign-in, get a scoped token, and reuse it for subsequent
requests.
OAuth access is admin-only — non-admin members of your Clerk org get a
401 even after a successful sign-in.
Claude Code
claude mcp add --transport http litmus https://litmushiring.com/mcp/<your-org-id>/Verify with /mcp inside a Claude Code session.
Claude Desktop
Open Settings → Connectors → Add custom connector, paste
https://litmushiring.com/mcp/<your-org-id>/, and follow the Clerk sign-in popup. No
config file edit needed.
Cursor
Add to your mcp.json:
{
"mcpServers": {
"litmus": {
"type": "http",
"url": "https://litmushiring.com/mcp/<your-org-id>/"
}
}
}Cursor runs the OAuth flow on first use.
API keys
OAuth covers any client a human signs into. API keys cover the rest: CI runners, cron jobs, backend services, and one-off scripts where opening a browser isn't an option. Unlike OAuth tokens, API keys don't expire — they're valid until you revoke them.
Mint a key
API key minting is admin-only — non-admin members of your Clerk org
won't see the Settings → API Keys tab, and direct API hits to mint
or revoke a key return 403.
In your dashboard, go to Settings → API Keys → Create key, name it, and copy the value — Litmus only shows it once. Revoke anytime from the same page; revocation takes effect on the next request.
Direct bearer (Python / TypeScript / your own agent)
Set the Authorization header on the connection:
import asyncio
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
async def main():
headers = {"Authorization": "Bearer litmus_sk_..."}
async with streamablehttp_client(
"https://litmushiring.com/mcp/<your-org-id>/", headers=headers
) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
for t in tools.tools:
print(t.name)
asyncio.run(main())The same header works for the artifact streaming URLs returned by
get_submission — one credential covers
the whole surface.
Claude Code (headless / CI)
For service-account use where you don't want OAuth's browser step:
claude mcp add --transport http litmus https://litmushiring.com/mcp/<your-org-id>/ \
--header "Authorization: Bearer litmus_sk_..."Pass --scope project to write a shared .mcp.json (reference the token
via ${LITMUS_MCP_TOKEN} so the secret isn't committed).
Audit log
Every MCP tool call your org's credentials make — OAuth or API key —
lands in Settings → Audit Log. Each row records the tool name,
status (ok or the exception class), latency, and which credential
made the call (API key name + prefix, or the OAuth user). The page is
admin-only, paginated, and shows revoked keys with a Revoked badge so
post-revocation activity stays attributable.
Use it to spot credentials that should be rotated, confirm what an agent actually did, or surface unusual access patterns. Activity appears within a second of the call landing.
Older clients
Anything that doesn't speak HTTP MCP natively used to need the
mcp-remote stdio-to-HTTP bridge.
We don't recommend it.
CVE-2025-6514 (command
injection, CVSS 9.6) lets a malicious MCP server run arbitrary commands on
the user's machine. Upgrade to a client version with native HTTP MCP support
instead.
Rate limits
The MCP surface is rate-limited per-org, defaulting to 60 requests per minute. All API keys on an org share one bucket, and artifact streaming URLs count against it too — minting more keys won't buy more headroom.
When you exceed the limit you'll get a 429 with a Retry-After header;
see Troubleshooting → 429 Too Many Requests
for the response shape and a backoff snippet. If your workload needs a
higher ceiling, email founders@litmushiring.com.
