Endpoint
POST is accepted. GET and DELETE return 405 — the server is stateless with no sessions to manage.
OAuth flow
- Client hits
/api/mcpwithout a token → receives401withWWW-Authenticatepointing to/.well-known/oauth-protected-resource/api/mcp - Client fetches protected-resource metadata → discovers the authorization server at
{BACKEND_URL}/auth - Client fetches
/.well-known/oauth-authorization-server/auth→ gets authorize URL, token URL, JWKS URI, and supported scopes - User completes the authorization code flow and approves scopes on the consent screen
- Client exchanges the code for a JWT access token (audience =
{BACKEND_URL}/api/mcp) - Client sends
Authorization: Bearer <token>on every MCP request
{BACKEND_URL}/auth/jwks — no round-trip to the auth server per request.
Scopes
Tools
list_organizations
Scope: organizations:read
Returns the organizations the authorized user belongs to. Call this first when the user belongs to multiple organizations to get the correct organizationId for task tools.
Input: (none)
Output:
list_tasks
Scope: tasks:read
Returns up to 50 tasks (most recently updated) across all organizations the user belongs to.
get_task
Scope: tasks:read
Returns full task detail including owners, subtasks, and parent task.
create_task
Scope: tasks:write
Creates a task. If the user belongs to exactly one organization, organizationId can be omitted — call list_organizations first if they belong to multiple.
update_task
Scope: tasks:write
Updates one or more fields on an existing task. Only supplied fields are changed.
Connecting a client
Claude Desktop
Add toclaude_desktop_config.json:
Claude Code
Cursor / VS Code
Add a remote MCP server pointing to{BACKEND_URL}/api/mcp. The client handles OAuth discovery and the login flow on first use.