FocusBox MCP — tool reference

Connector URL: https://focusbox.io/mcp/api. See /mcp for setup.

list_today

Returns the user's tasks scheduled for today (incomplete only).

Arguments

None.

Returns

Array of { taskId, name, durationSeconds, projectId }.

Example response

[
  { "taskId": "abc", "name": "Write spec", "durationSeconds": 1500, "projectId": "mytasks" }
]

next_task

Returns one task to start next, chosen by what fits the time before the next calendar event, what has carried over from earlier days and what is small enough to begin. Includes the reason, two alternatives and a link to start.

Arguments

availableMinutes (1-480, optional).

Returns

{ task, alternatives, freeWindowMinutes, busyNow, message }.

Example response

{
  "task": {
    "taskId": "abc", "name": "Finish pricing page", "projectId": "work",
    "estimateMinutes": 35, "source": "rollover",
    "reason": "Carried over from 2 days ago; fits the 47 min you have before your next meeting.",
    "startUrl": "https://focusbox.io/now?id=work&taskId=abc"
  },
  "alternatives": [],
  "freeWindowMinutes": 47, "busyNow": false,
  "message": "Start here: Finish pricing page (35 min)."
}

get_streams

List the user's FocusBox projects (containers for tasks; called "streams" in the API for historical reasons). Archived projects and the today/mytasks buckets are excluded.

Arguments

None.

Returns

Array of { streamId, name }.

add_task

Add a new task to a project or schedule it for today. Default duration is 25 minutes.

Arguments

FieldTypeRequiredDescription
streamIdstringrequiredTarget project id from get_streams. Use "today" (or "mytasks") for today.
namestringrequiredTask title (1-500 chars).
durationSecondsnumberoptional60-14400 (1 min — 4 h). Default 1500.
dueDatestringoptionalOptional Unix-seconds timestamp for when the task is scheduled. The Today view shows tasks whose due falls in today's window in the user's timezone.
clientRequestIdstringoptionalIdempotency key. The same key within 5 minutes returns the cached result.

Returns

{ taskId, streamId, name, durationSeconds }.

update_task

Update one or more fields of an existing task: name, durationSeconds, or dueDate.

Arguments

FieldTypeRequiredDescription
streamIdstringrequiredStream id from get_streams. Use "today" or "mytasks" for the inbox.
taskIdstringrequiredTask id from list_today or get_streams.
namestringoptionalNew task title (1-500 chars).
durationSecondsnumberoptionalNew duration in seconds (60-14400). Resets durSecInit to the new value.
dueDatenumberoptionalNew due date as a Unix-seconds timestamp.
clientRequestIdstringoptionalIdempotency key. The same key within 5 minutes returns the cached result.

Returns

{ taskId, streamId, name, durationSeconds, dueDate }.

delete_task

Permanently delete a task. Idempotent: deleting an already-deleted task is not an error.

Arguments

FieldTypeRequired
streamIdstringrequired
taskIdstringrequired

Returns

{ taskId, streamId, deleted, reason? }.

complete_task

Mark a FocusBox task as complete.

Arguments

FieldTypeRequired
streamIdstringrequired
taskIdstringrequired

Returns

{ taskId, streamId, completed: true }.

get_insights_30d

Aggregate summary of the user's completed tasks over the last 30 days.

Arguments

None.

Returns

{ totalTasks, totalFocusMinutes, topStreams[{streamId, name, tasks}, days: 30 }].

Authentication

OAuth (recommended for Claude)

Claude Desktop and claude.ai web complete the OAuth flow automatically. No API key handling needed.

Bearer (Cursor, Inspector, custom clients)

Get your API key at /account/api-keys (starts with apikey_). Send as Authorization: Bearer apikey_xxx on every request.

Rate limits

300 tool calls per 2 minutes per API key. 60 unauthenticated probes per 2 minutes per IP.

FAQ

Authentication: OAuth or Bearer?

Both. Use OAuth (handled automatically by Claude Desktop and claude.ai web) for the smoothest setup. For Cursor, MCP Inspector, or any custom client, use Bearer auth with apikey_<uuid> from /account/api-keys.

What are the rate limits?

300 tool calls per 2 minutes per API key. 60 unauthenticated probes per 2 minutes per IP. Hitting either returns HTTP 429 with a Retry-After header.

How long do OAuth tokens last?

30 days from issuance. After that Claude triggers a re-authorisation automatically. The token is opaque (at_*) and stored on the server side; no refresh token is needed.

Why does my Claude session reconnect after a deploy?

The MCP session map is in-process on a single ECS task. A rolling deploy resets it. Claude reconnects automatically and resumes; you should see no user-visible interruption beyond a brief reload.

Can I use streaming responses (SSE)?

Yes. The transport is the MCP-spec streamable HTTP variant, so each tool call may stream progress events before the final result. Sessions are kept alive with periodic ping frames.