StayFocus MCP server
Connect Claude, ChatGPT or any MCP client to your own StayFocus day: tasks, focus sessions, projects, experiments, notes and brain dump. OAuth 2.1, 24 tools, one endpoint.
Endpoint
https://stayfocus.now/mcp
Streamable HTTP · 24 tools · OAuth 2.1
Machine-readable copies of this page: /mcp.md · /mcp.json
Summary
StayFocus is an execution loop. Work descends through four levels: a project answers why, a task answers what, a next action answers what to do in the next five minutes, and a focus session is the block of time where it happens. Around that sit a daily loop (check in, commit to one thing, close the day), a brain dump for thoughts that are not work yet, time-boxed experiments, and a streak. The StayFocus MCP server lets an AI assistant read and write one authenticated user's own StayFocus data over the Model Context Protocol.
The fastest route into a user's day is get-today: it returns their check-in, the task they committed to, where they last stopped, the focus time the day still holds, and up to three ranked candidates that each say why they surfaced.
Every tool resolves the user from the authorizing token and scopes each query to that user. No tool can reach another user's data, billing data, or admin data.
Connection
| Field | Value |
|---|---|
| Endpoint | https://stayfocus.now/mcp |
| Transport | Streamable HTTP (POST, JSON-RPC 2.0) |
| Server name | StayFocus |
| Server version | 2.0.0 |
| Tools | 24 |
| Resources / prompts | None — tools only |
| Authentication | OAuth 2.1 (authorization code + PKCE), or a bearer personal access token |
| Plan required | Active subscription or trial (14-day free trial, no card) |
Authentication
Two supported paths. Web connectors use OAuth; command-line clients that can set headers may use a bearer token instead.
Option A — OAuth 2.1 (Claude.ai, ChatGPT, any MCP web connector)
The user pastes only the endpoint URL. The client discovers and completes the flow automatically; no application registration with Anthropic or OpenAI is required.
GET https://stayfocus.now/.well-known/oauth-protected-resource # resource metadata
GET https://stayfocus.now/.well-known/oauth-authorization-server # authorization server metadata
POST https://stayfocus.now/oauth/register # dynamic client registration
GET https://stayfocus.now/oauth/authorize # user approves the grant
POST https://stayfocus.now/oauth/token # authorization code + PKCE -> access token
POST https://stayfocus.now/mcp # tool calls, Authorization: Bearer <token>
The issued token is bound to the user who approved the grant and carries the single scope mcp:use. The user can revoke it at any time in Settings → Account → AI assistant → Connected assistants.
Option B — bearer personal access token (desktop and CLI)
Generate a token in Settings → Account → AI assistant → Desktop & CLI (advanced). It is shown once. Send it on every request:
Authorization: Bearer <token>
Verify a token works:
curl -s -X POST https://stayfocus.now/mcp \
-H "Authorization: Bearer $STAYFOCUS_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Without a valid token the endpoint returns 401.
Client configuration
Claude.ai and Claude Desktop (web connector, OAuth)
-
Open claude.ai/settings/connectors → Add custom connector.
-
Name it
StayFocus, pastehttps://stayfocus.now/mcp, confirm. There is no token field — none is needed. -
Enable StayFocus from the search & tools menu in a chat.
-
On first use, approve the StayFocus grant screen. Claude Desktop and mobile sync the connector automatically.
Claude Code
# OAuth (recommended) — Claude Code opens the browser to authorize
claude mcp add --transport http stayfocus https://stayfocus.now/mcp
# Or with a personal access token
claude mcp add --transport http stayfocus https://stayfocus.now/mcp \
--header "Authorization: Bearer YOUR_TOKEN"
Claude Desktop config file
Settings → Developer → Edit Config, then add:
{
"mcpServers": {
"stayfocus": {
"command": "npx",
"args": [
"mcp-remote",
"https://stayfocus.now/mcp"
]
}
}
}
ChatGPT
-
Settings → Apps & Connectors, enable Developer mode (Plus, Pro, Team or Enterprise).
-
Create, name it
StayFocus, pastehttps://stayfocus.now/mcp, choose OAuth as the authentication method. -
Approve the StayFocus permission screen.
Any other MCP client
Point it at https://stayfocus.now/mcp with transport Streamable HTTP. Both OAuth and Authorization: Bearer are accepted.
Tools
24 tools — 9 read, 15 write. All parameters are JSON, passed as arguments to tools/call.
| Tool | Type | Purpose |
|---|---|---|
get-today |
read | The single best call for "what should I be doing right now?" / "شنو ندير دابا؟" / "كيف هو نهاري؟" |
record-arrival |
write | Record how the user showed up today: clear, scattered, loaded, drained or charged |
commit-to-task |
write | Commit to one task as today's single most important thing, or decline a task that was suggested |
close-day |
write | Close the working day — StayFocus's shutdown ritual |
get-tasks |
read | List the user's tasks — the unit of work between a project and a focus session |
create-task |
write | Create a task — an outcome the user could finish in a few days |
update-task |
write | Edit an existing task: rename it, write or clear its next action, change its status, schedule it, or move it to a project |
break-down-task |
write | Split a task into smaller steps |
get-focus-sessions |
read | Get the authenticated user's focus session history: total count, total focused minutes, and the most recent sessions |
get-active-session |
read | Get the user's currently running or paused focus session, if any — including the task it is committed to, how long is left, and how many distractions have been logged |
start-focus-session |
write | Start a focus session |
control-focus-session |
write | Pause, resume, or log a distraction on the running focus session, without ending it |
end-focus-session |
write | End the running focus session and record how it went |
get-projects |
read | List the authenticated user's projects with status, visibility, description and how much open work each one holds |
create-project |
write | Create a new project for the authenticated user |
get-stats |
read | Get the authenticated user's numbers: streaks, total sessions, focused time, experiments, and the shape of their task list — how much is open, how much is actually startable, and how much has stalled |
get-experiments |
read | List the authenticated user's tiny experiments (time-bound commitments) and highlight the active one |
get-notes |
read | Search and read the authenticated user's notes — their decision log, reflections and progress journal from the "Updates" page |
create-note |
write | Create a private note in the user's decision log / reflection journal (the "Updates" page) |
get-brain-dump-items |
read | List items in the user's brain dump — the capture lane for thoughts and ideas that are not a project, experiment or note yet |
capture-brain-dump-item |
write | Capture a quick thought, idea or brain dump into the user's brain dump — for things that are not ready to become a project, experiment or note yet, or that should come back later |
schedule-brain-dump-reminder |
write | Schedule (or reschedule) a reminder on an open brain dump item, so it resurfaces in "needs attention" later |
archive-brain-dump-item |
write | Archive an brain dump item once the user is done with it — it will no longer show up in "needs attention" |
convert-brain-dump-item |
write | Turn a brain dump item into a task, a project, a tiny experiment, or a reflection — when the user has decided what to do with a captured idea |
get-today
The single best call for "what should I be doing right now?" / "شنو ندير دابا؟" / "كيف هو نهاري؟". Returns the user's day in one shot: how they said they arrived this morning, the one task they committed to, where they last stopped and what they left open, how much focus time the day still has, and up to three ranked candidates with the reason each one surfaced. Read this before recommending anything — the candidates already account for deadlines, how cold the work has gone, and whether it fits the time left. Prefer this over get-tasks when the question is about today rather than about the whole list.
Parameters: none.
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get-today"
}
}
record-arrival
Record how the user showed up today: clear, scattered, loaded, drained or charged. Use it when they say how they are feeling about work at the start of a session or a day — "I am fried today" / "راسي مخربق" / "I feel sharp". It branches what the app offers them and it is deliberately never scored, averaged, or shown back as a verdict, so record it plainly and do not editorialise. One answer per day; answering again overwrites it, which is correct — someone scattered at nine and clear at eleven is telling the truth both times.
| Parameter | Type | Required | Description |
|---|---|---|---|
state |
string (one of: clear, scattered, loaded, drained, charged) | yes | How the user arrived. clear: knows what to do. scattered: too many open loops. loaded: carrying something heavy. drained: low on fuel. charged: ready to push. |
chose |
string | no | Optional: what they decided to do about it, in their own words. |
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "record-arrival",
"arguments": {
"state": "clear"
}
}
}
commit-to-task
Commit to one task as today's single most important thing, or decline a task that was suggested. Use commit for "let's do X today" / "غادي نخدم على هادي اليوم", and decline for "not that one". Declining is recorded on purpose rather than hidden: the same task turned down three days running is worth surfacing back to the user. Get candidates from get-today before choosing. Committing schedules the task for today; it does not start a timer, use start-focus-session for that.
| Parameter | Type | Required | Description |
|---|---|---|---|
task_uuid |
string | yes | UUID of the task (see get-today candidates, or get-tasks). |
decision |
string (one of: commit, decline) | no | Whether this is today's one thing, or a task the user turned down. |
available_minutes |
integer | no | Commit only: how much focus time the day realistically holds. Defaults to what StayFocus already computes from the user's daily focus goal minus time already spent. |
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "commit-to-task",
"arguments": {
"task_uuid": "9f8c1e2a-7b4d-4c31-9a0e-5d6f7a8b9c0d"
}
}
}
close-day
Close the working day — StayFocus's shutdown ritual. Use it for "I am done for today" / "سالينا اليوم" / "let's wrap up". Two questions: what moved, and what should be waiting tomorrow. For a task that was scheduled but never moved, "carry" keeps it as it is, "shrink" clears its next action so a smaller step gets written, and "drop" lets it go — these are three different decisions and should not be treated as one. A day can only be closed once; check get-today's day_closed first.
| Parameter | Type | Required | Description |
|---|---|---|---|
moved_note |
string | no | What moved today, in the user's own words. |
stalled_task_uuid |
string | no | Optional: a task that was scheduled today but did not move (see get-tasks with filter="stalled"). |
stalled_decision |
string (one of: carry, shrink, drop) | no | What to do with that stalled task. carry: leave it alone. shrink: clear its next action so a smaller step gets written. drop: let it go. |
tomorrow_task_uuid |
string | no | Optional: the task to have waiting tomorrow morning. |
tomorrow_next_action |
string | no | Optional: the first concrete step for that task tomorrow, written now while the context is warm. |
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "close-day"
}
}
get-tasks
List the user's tasks — the unit of work between a project and a focus session. Use this to answer "what am I working on?", "what's on my plate?", "what can I actually start?", "what's blocked?" / "شنو خاصني ندير؟" / "شنو بقا عليا؟". A task is startable only when it has a next action written; use filter="startable" for "what could I start right now", filter="inbox" for undecided tasks that still need a next action, and filter="stalled" for tasks scheduled repeatedly that never moved.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter |
string (one of: open, startable, inbox, scheduled_today, stalled, blocked, done, all) | no | Which slice of the task list to return. "open" (default) is everything not done or dropped. |
project_uuid |
string | no | Optional: only tasks belonging to this project (see get-projects). |
search |
string | no | Optional: match against the task title, outcome and next action. |
limit |
integer | no | How many tasks to return, 1-50. |
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get-tasks"
}
}
create-task
Create a task — an outcome the user could finish in a few days. Use this when the user has decided something is real work: "add a task", "I need to ...", "زيد هاد المهمة". Only the title is required. Writing a next_action is what makes a task startable, so include one whenever the user has said what the first concrete step is; without it the task lands in the inbox as undecided, which is the honest place for it. For a thought that is not work yet, use capture-brain-dump-item instead.
| Parameter | Type | Required | Description |
|---|---|---|---|
title |
string | yes | What the task is, in the user's own words. |
outcome |
string | no | Optional: what "done" looks like for this task. |
next_action |
string | no | Optional but valuable: the smallest concrete first step. Writing one promotes the task from inbox to ready. |
project_uuid |
string | no | Optional: the project this task belongs to (see get-projects). |
energy |
string (one of: deep, light, admin) | no | The kind of attention the task needs. Defaults to deep. |
estimate_minutes |
integer | no | Optional: how long the user thinks it will take. |
due_on |
string | no | Optional: hard deadline as an ISO 8601 date (YYYY-MM-DD). Resolve relative dates yourself before calling. |
scheduled_for |
string | no | Optional: the day the user intends to do it, as an ISO 8601 date (YYYY-MM-DD). |
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create-task",
"arguments": {
"title": "…"
}
}
}
update-task
Edit an existing task: rename it, write or clear its next action, change its status, schedule it, or move it to a project. Every field is optional — send only what changes. Use this for "the next step is ...", "mark that done" / "سالينا هادي", "I'm blocked on ...", "move that to tomorrow". Writing a next_action promotes an undecided task to ready; sending an empty next_action clears it and sends the task back to the inbox. Marking a task done also closes its open questions and its subtasks. To split a task into smaller steps, use break-down-task instead.
| Parameter | Type | Required | Description |
|---|---|---|---|
task_uuid |
string | yes | UUID of the task to edit (see get-tasks). |
title |
string | no | New title. |
outcome |
string | no | New definition of done. |
next_action |
string | no | The smallest concrete next step. Pass an empty string to clear it, which returns the task to the inbox. |
status |
string (one of: inbox, ready, active, blocked, done, dropped) | no | New status. "ready" requires a next action, either already on the task or sent in the same call. |
blocked_reason |
string | no | Only used with status "blocked": what the task is waiting on. |
project_uuid |
string | no | Move the task to this project (see get-projects). |
energy |
string (one of: deep, light, admin) | no | The kind of attention the task needs. |
estimate_minutes |
integer | no | How long the user thinks it will take. |
due_on |
string | no | Hard deadline as an ISO 8601 date (YYYY-MM-DD). |
scheduled_for |
string | no | The day the user intends to do it, as an ISO 8601 date (YYYY-MM-DD). |
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "update-task",
"arguments": {
"task_uuid": "9f8c1e2a-7b4d-4c31-9a0e-5d6f7a8b9c0d"
}
}
}
break-down-task
Split a task into smaller steps. This is the answer to a task that keeps getting scheduled and never moves, and to "this feels too big" / "هادي كبيرة بزاف" / "قسمها ليا". The steps become subtasks, and the first one becomes the task's next action when it does not have one yet. Check get-tasks with filter="stalled" to find the tasks most likely to need this.
| Parameter | Type | Required | Description |
|---|---|---|---|
task_uuid |
string | yes | UUID of the task to break down (see get-tasks). |
steps |
array of string | yes | The smaller steps, in the order they should be done. Each one should be small enough to start without thinking. |
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "break-down-task",
"arguments": {
"task_uuid": "9f8c1e2a-7b4d-4c31-9a0e-5d6f7a8b9c0d",
"steps": []
}
}
}
get-focus-sessions
Get the authenticated user's focus session history: total count, total focused minutes, and the most recent sessions.
Parameters: none.
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get-focus-sessions"
}
}
get-active-session
Get the user's currently running or paused focus session, if any — including the task it is committed to, how long is left, and how many distractions have been logged. Also reports a session that has just finished and is still waiting to be closed with an outcome, so an assistant can ask how it went instead of losing the block.
Parameters: none.
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get-active-session"
}
}
start-focus-session
Start a focus session. Attach it to a task whenever there is one — a task carries its own project, prefills the intention from its next action, and is what lets end-focus-session record an outcome and log the time against the work. Falling back to a project or an experiment still works, and passing nothing starts a quick unattached block that can be filed later. Idempotent: if a session is already running it is returned unchanged instead of starting a second one.
| Parameter | Type | Required | Description |
|---|---|---|---|
task_uuid |
string | no | Preferred. UUID of a startable task (see get-tasks with filter="startable", or get-today candidates). The task supplies the project and, if intention is omitted, the intention. |
project_uuid |
string | no | UUID of one of the user's projects (see get-projects). Use only when no task fits. |
experiment_uuid |
string | no | UUID of one of the user's running experiments (see get-experiments). |
intention |
string | no | What the user will work on during this session. Required unless task_uuid is given, in which case the task's next action is used. |
duration_minutes |
integer | no | Planned session length in minutes (15, 25, 50 or 90). |
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "start-focus-session"
}
}
control-focus-session
Pause, resume, or log a distraction on the running focus session, without ending it. Use "pause" for "hold the timer" / "وقف الوقت", "resume" for "I am back" / "رجعت", and "log-distraction" when the user notices they got pulled away — the count is a record, never a judgement. Pausing keeps the session alive; resuming pushes the expected end time out by however long it was paused. To finish the session, use end-focus-session.
| Parameter | Type | Required | Description |
|---|---|---|---|
action |
string (one of: pause, resume, log-distraction) | yes | What to do with the running session. |
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "control-focus-session",
"arguments": {
"action": "pause"
}
}
}
end-focus-session
End the running focus session and record how it went. A finished timer is not an outcome, so ask the user what actually happened and pass it: "finished" completed the next action, "progress" moved it, "stuck" hit a wall, "not_started" never really began. When the session was attached to a task, this is also what logs the time against that task, writes the note the user will see when they pick it back up, and stores the questions they are leaving open — skip those and the record of their afternoon is wrong. Outcome defaults to "progress" when omitted. Safe to call twice: it does nothing if no session is running and never overwrites an outcome that was already recorded.
| Parameter | Type | Required | Description |
|---|---|---|---|
outcome |
string (one of: finished, progress, stuck, not_started) | no | What actually happened in the block. Defaults to "progress". |
note |
string | no | What happened, in the user's words. With outcome "stuck" this becomes the task's blocked reason. |
resume_context |
string | no | The note to the user's future self: where exactly they stopped, so picking it back up is cheap. |
next_action |
string | no | The smallest concrete step for next time. Writing one now, while the context is warm, is what makes returning easy. |
open_questions |
array of string | no | Things the user did not know when they stopped. They resurface on the resume card. |
completes_task |
boolean | no | Only honoured with outcome "finished": marks the whole task done, not just this block. |
mood |
integer | no | Optional reflection, 1 rough, 2 okay, 3 good, 4 great. |
reflection_note |
string | no | Optional free-text reflection on the block. |
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "end-focus-session"
}
}
get-projects
List the authenticated user's projects with status, visibility, description and how much open work each one holds. A project is the why; the tasks inside it are the what — use get-tasks with a project_uuid to see them.
Parameters: none.
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get-projects"
}
}
create-project
Create a new project for the authenticated user. Projects are private by default.
| Parameter | Type | Required | Description |
|---|---|---|---|
name |
string | yes | The project name. |
description |
string | no | Optional short description of the project. |
visibility |
string (one of: private, public) | no | Project visibility. Defaults to private. |
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create-project",
"arguments": {
"name": "…"
}
}
}
get-stats
Get the authenticated user's numbers: streaks, total sessions, focused time, experiments, and the shape of their task list — how much is open, how much is actually startable, and how much has stalled. Use it for "how am I doing?" / "كيفاش خدمت هاد الأسبوع؟". For what to do right now rather than how much has been done, use get-today.
Parameters: none.
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get-stats"
}
}
get-experiments
List the authenticated user's tiny experiments (time-bound commitments) and highlight the active one.
Parameters: none.
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get-experiments"
}
}
get-notes
Search and read the authenticated user's notes — their decision log, reflections and progress journal from the "Updates" page. Use this to answer questions like "what did I decide about X", "summarize my recent notes on project Y", or "search my notes for...". The user may ask in Arabic (e.g. "ملاحظاتي", "قراراتي", "مذكراتي") — treat that the same as "notes". Filter by free-text search, a project, or tags.
| Parameter | Type | Required | Description |
|---|---|---|---|
search |
string | no | Free-text search within note content. Leave empty to list recent notes. |
project_uuid |
string | no | Only return notes linked to this project (see get-projects for uuids). |
tags |
array of string | no | Only return notes tagged with at least one of these tags. |
limit |
integer | no | Maximum number of notes to return (1-50). |
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get-notes"
}
}
create-note
Create a private note in the user's decision log / reflection journal (the "Updates" page). Use this when the user wants to record a decision, write down a reflection, log progress, or asks to "save this as a note" — including Arabic phrasing like "خليه كملاحظة" or "سجل هاد القرار". Optionally link the note to a project (get-projects for the uuid), tag it, and set a mood.
| Parameter | Type | Required | Description |
|---|---|---|---|
content |
string | yes | The note content — the decision, reflection or progress update to record. |
project_uuid |
string | no | Optional: link this note to one of the user's projects (see get-projects for uuids). |
tags |
array of string | no | Optional tags for this note (max 5). |
mood_key |
string (one of: motivated, focused, excited, proud, grateful, hopeful, calm, tired, bored, stuck, confused, stressed, anxious, frustrated, overwhelmed, sad, lonely, angry) | no | Optional mood associated with this note. |
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create-note",
"arguments": {
"content": "…"
}
}
}
get-brain-dump-items
List items in the user's brain dump — the capture lane for thoughts and ideas that are not a project, experiment or note yet. By default returns items that need attention: open items plus scheduled reminders that are now due. Use this to answer "what's in my brain dump?" / "شنو عندي فتفريغ الذهن دابا؟" or to check for reminders that just came due. Each item shows its uuid, content, status (open, scheduled, converted, archived) and whether a reminder is due.
| Parameter | Type | Required | Description |
|---|---|---|---|
status |
string (one of: needs_attention, open, scheduled, converted, archived, all) | no | Which items to return. "needs_attention" (default) is open items plus due reminders. |
limit |
integer | no | Maximum number of items to return (1-50). |
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get-brain-dump-items"
}
}
capture-brain-dump-item
Capture a quick thought, idea or brain dump into the user's brain dump — for things that are not ready to become a project, experiment or note yet, or that should come back later. Use this whenever the user says things like "save this idea", "add this to my brain dump", "remind me about this later", or in Arabic "احفظ هاد الفكرة" / "خزن هاد الشي". Only the content is required — capture is zero-friction by design. The user can later ask to schedule a reminder, convert it to a project/experiment/note, or archive it.
| Parameter | Type | Required | Description |
|---|---|---|---|
content |
string | yes | The thought, idea or note to capture. |
focus_session_uuid |
string | no | Optional: the uuid of the user's currently active/paused focus session, if this idea came up mid-session (see get-active-session). |
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "capture-brain-dump-item",
"arguments": {
"content": "…"
}
}
}
schedule-brain-dump-reminder
Schedule (or reschedule) a reminder on an open brain dump item, so it resurfaces in "needs attention" later. Use this when the user says "remind me about this on Friday at 9am", "ذكرني بها يوم الجمعة" or similar. Get the item's uuid from get-brain-dump-items. Provide either "remind_at" with a concrete ISO 8601 date-time you computed from the user's request (must be in the future), or a "preset" (in_1_hour, tomorrow, next_week).
| Parameter | Type | Required | Description |
|---|---|---|---|
item_uuid |
string | yes | UUID of the brain dump item (see get-brain-dump-items). |
remind_at |
string | no | A concrete future date-time, ideally ISO 8601 (e.g. 2026-06-19T09:00:00). Resolve relative phrases like "next Friday at 9am" to a real date yourself before calling this tool. |
preset |
string (one of: in_1_hour, tomorrow, next_week) | no | A quick preset instead of remind_at. "tomorrow" and "next_week" mean 9:00 local time. |
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "schedule-brain-dump-reminder",
"arguments": {
"item_uuid": "9f8c1e2a-7b4d-4c31-9a0e-5d6f7a8b9c0d"
}
}
}
archive-brain-dump-item
Archive an brain dump item once the user is done with it — it will no longer show up in "needs attention". Use this when the user says they're done with an idea, want to dismiss it, or "no longer need" something from their brain dump. Get the item's uuid from get-brain-dump-items.
| Parameter | Type | Required | Description |
|---|---|---|---|
item_uuid |
string | yes | UUID of the brain dump item (see get-brain-dump-items). |
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "archive-brain-dump-item",
"arguments": {
"item_uuid": "9f8c1e2a-7b4d-4c31-9a0e-5d6f7a8b9c0d"
}
}
}
convert-brain-dump-item
Turn a brain dump item into a task, a project, a tiny experiment, or a reflection — when the user has decided what to do with a captured idea. "task" is usually the right answer and the most common one: it is a single outcome the user could finish in a few days, and it arrives undecided on purpose, so follow up with update-task once they say what the first step is. Use "project" for something with many tasks in it, "experiment" for a time-boxed try, "note" for a reflection worth keeping. Use this for "turn this into a task" / "حولها لمهمة", "make this a project" / "حولها لمشروع", "save this as a reflection" / "احفظها كتأمل". Get the item's uuid from get-brain-dump-items. For "experiment", you may optionally pass duration_days, success_criteria and visibility.
| Parameter | Type | Required | Description |
|---|---|---|---|
item_uuid |
string | yes | UUID of the brain dump item (see get-brain-dump-items). |
target |
string (one of: task, project, experiment, note) | yes | What to convert the brain dump item into. |
duration_days |
integer | no | Experiment only: how many days the experiment should run. Defaults to 14. |
success_criteria |
string | no | Experiment only: what success looks like for this experiment. |
visibility |
string (one of: private, public) | no | Experiment only: visibility of the new experiment. Defaults to private. |
Example call:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "convert-brain-dump-item",
"arguments": {
"item_uuid": "9f8c1e2a-7b4d-4c31-9a0e-5d6f7a8b9c0d",
"target": "task"
}
}
}
Errors
| Response | Meaning |
|---|---|
401 Unauthorized |
Missing, expired or revoked token. Re-authorize the connector, or generate a new personal access token. |
403 Forbidden |
The account has no active subscription or trial. See Pricing. |
405 Method Not Allowed |
The request used GET or DELETE on the endpoint. MCP messages are POST only. |
429 Too Many Requests |
Rate limit exceeded. Back off and retry. |
JSON-RPC isError: true |
The tool ran but rejected the input — for example an unknown UUID, or a second start-focus-session while one is already running. The message text explains what to change. |
Limits and rules
- Plan: the endpoint requires an active subscription or trial. Authentication succeeds but tool calls are refused without one.
- One active session:
start-focus-sessionis a no-op when a session is already running; end it first withend-focus-session. - Scope: every tool is scoped to the authorizing user. There is no way to read another user's data through this server.
- Write tools go through the same domain actions as the web app, so the same rules apply.
- Relative dates: the server does not parse "next Friday". Resolve dates to ISO 8601 before calling
schedule-brain-dump-reminder,create-taskorupdate-task. - Next actions gate starting: a task is startable only once it has a
next_action. Writing one promotes it from inbox to ready; clearing one demotes it back.start-focus-sessionrefuses a task that is not ready or active. - Outcomes, not timers:
end-focus-sessiontakes anoutcomeof finished, progress, stuck or not_started, and defaults to progress when omitted. For a session attached to a task, that call is also what logs the time against the task and writes its resume note, so an outcome should be passed rather than left to the default. - One decision per day:
commit-to-tasksets the day's primary task, andclose-daycan only close a given day once.
Related
- Pricing — plans, limits and the free trial.
- StayFocus overview — what the product does.
- Sign up — create an account, then connect from Settings → Account.