Focuh
ADHD system of record for agents: tasks, goals, loops, calendar, focus stats.
Should I use this
Quality & Safety
Findings (1)
- LOWin reorder_subtasks
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"focuh": {
"url": "https://www.focuh.com/api/mcp"
}
}
}Remote endpoints
https://www.focuh.com/api/mcpstreamable-httpWhat it can do
Tool inventory
Tools (16)
🟢get_tasks
Today/tomorrow tasks with id, date and priority. Call first to get refs.
Input Schema
{
"type": "object",
"properties": {},
"additionalProperties": false
}🟡create_tasks(tasks)
Create tasks, each with optional nested subtasks. Defaults: today, 30 min.
Input Schema
{
"type": "object",
"properties": {
"tasks": {
"type": "array",
"maxItems": 100,
"description": "Tasks to create",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 500,
"description": "Title"
},
"date": {
"type": "string",
"maxLength": 10,
"description": "Date"
},
"estimatedMinutes": {
"type": "number",
"minimum": 0,
"maximum": 1440,
"description": "Minutes"
},
"priority": {
"type": "string",
"enum": [
"critical",
"important",
"nice-to-have"
],
"description": "Priority"
},
"parent": {
"type": "string",
"maxLength": 500,
"description": "Parent"
},
"goalId": {
"type": "string",
"maxLength": 64,
"description": "Goal"
},
"loopBucket": {
"type": "string",
"enum": [
"pressing",
"important",
"backlog",
"waiting"
],
"description": "Undated loop; excludes date/priority; waiting=parked"
},
"subtasks": {
"type": "array",
"maxItems": 100,
"items": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 500
},
"estimatedMinutes": {
"type": "number",
"minimum": 0,
"maximum": 1440
}
},
"required": [
"title"
]
}
}
},
"required": [
"title"
]
}
}
},
"required": [
"tasks"
]
}🟡update_tasks(tasks)
Change tasks: date (moves the day), priority, title, estimate, done, time slot.
Input Schema
{
"type": "object",
"properties": {
"tasks": {
"type": "array",
"maxItems": 100,
"description": "Changes to apply, one entry per task",
"items": {
"type": "object",
"properties": {
"ref": {
"type": "string",
"maxLength": 500,
"description": "Task id, #N, or title"
},
"title": {
"type": "string",
"maxLength": 500,
"description": "Title"
},
"estimatedMinutes": {
"type": "number",
"minimum": 0,
"maximum": 1440,
"description": "Minutes"
},
"completed": {
"type": "boolean",
"description": "Done"
},
"date": {
"type": "string",
"maxLength": 10,
"description": "Date"
},
"priority": {
"type": "string",
"enum": [
"critical",
"important",
"nice-to-have"
],
"description": "Priority"
},
"startTime": {
"type": "string",
"maxLength": 5,
"description": "Start"
},
"endTime": {
"type": "string",
"maxLength": 5,
"description": "End"
},
"goalId": {
"type": "string",
"maxLength": 64
},
"loopBucket": {
"type": "string",
"enum": [
"pressing",
"important",
"backlog",
"waiting"
],
"description": "Into Loops or re-bucket; excl. date; waiting=parked"
}
},
"required": [
"ref"
]
}
}
},
"required": [
"tasks"
]
}🔴delete_tasks(tasks, date, filter)
Delete tasks by ref, every task on a date, or all completed. Subtasks go too.
Input Schema
{
"type": "object",
"properties": {
"tasks": {
"type": "array",
"maxItems": 100,
"items": {
"type": "string",
"maxLength": 500
}
},
"date": {
"type": "string",
"maxLength": 10
},
"filter": {
"type": "string",
"enum": [
"completed"
]
}
}
}🟢get_subtasks(ref)
List subtasks of a parent. Returns ids usable as refs.
Input Schema
{
"type": "object",
"properties": {
"ref": {
"type": "string",
"maxLength": 500,
"description": "Task id, #N, or title"
}
},
"required": [
"ref"
],
"additionalProperties": false
}⚪reorder_subtasks(ref, order)
Reorder a parent's subtasks. Pass the complete new order, every one once.
Input Schema
{
"type": "object",
"properties": {
"ref": {
"type": "string",
"maxLength": 500,
"description": "Task id, #N, or title"
},
"order": {
"type": "array",
"maxItems": 100,
"items": {
"type": [
"number",
"string"
],
"maxLength": 64
}
}
},
"required": [
"ref",
"order"
]
}🟢get_loops
Loops — undated intentions in 4 buckets (pressing/important/backlog/waiting=parked). Call before pull_loops.
Input Schema
{
"type": "object",
"properties": {},
"additionalProperties": false
}⚪pull_loops(loops, date)
Copy loops onto a date as linked tasks — each loop stays in Loops. Idempotent per loop+date.
Input Schema
{
"type": "object",
"properties": {
"loops": {
"type": "array",
"maxItems": 100,
"items": {
"type": "string",
"maxLength": 500
}
},
"date": {
"type": "string",
"maxLength": 10
}
},
"required": [
"loops"
]
}🟢get_calendar(date)
Events + scheduled/unscheduled tasks for a date. Check before scheduling.
Input Schema
{
"type": "object",
"properties": {
"date": {
"type": "string",
"maxLength": 10
}
},
"additionalProperties": false
}🟢get_goals(horizon, status)
Goals by horizon (week/month/year/decade) — exactly what the app's Goals view shows.
Input Schema
{
"type": "object",
"properties": {
"horizon": {
"type": "string",
"enum": [
"week",
"month",
"year",
"decade"
]
},
"status": {
"type": "string",
"enum": [
"active",
"completed",
"all"
]
}
},
"additionalProperties": false
}🟡create_goal(title, horizon, bottleneckNote, lever)
Create a goal in a horizon, with optional bottleneck note and lever.
Input Schema
{
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 500
},
"horizon": {
"type": "string",
"enum": [
"week",
"month",
"year",
"decade"
]
},
"bottleneckNote": {
"type": "string",
"maxLength": 5000
},
"lever": {
"type": "string",
"maxLength": 5000
}
},
"required": [
"title",
"horizon"
]
}🟡update_goal(id, title, horizon, status, bottleneckNote, ...)
Update goal fields: title, horizon (moves section), status, bottleneckNote, lever.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"maxLength": 64
},
"title": {
"type": "string",
"maxLength": 500
},
"horizon": {
"type": "string",
"enum": [
"week",
"month",
"year",
"decade"
]
},
"status": {
"type": "string",
"enum": [
"active",
"completed",
"paused",
"dropped"
]
},
"bottleneckNote": {
"type": "string",
"maxLength": 5000
},
"lever": {
"type": "string",
"maxLength": 5000
}
},
"required": [
"id"
]
}🔴delete_goal(id)
Delete a goal by id. Linked tasks are kept and unlinked, never deleted.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"maxLength": 64
}
},
"required": [
"id"
],
"additionalProperties": false
}🟢get_focus_stats
Today/week focus minutes, streak, task completion rates.
Input Schema
{
"type": "object",
"properties": {},
"additionalProperties": false
}🟢get_journal(date)
Read a daily journal and recent dates. Preserve ^task markers when writing back.
Input Schema
{
"type": "object",
"properties": {
"date": {
"type": "string",
"maxLength": 10
}
},
"additionalProperties": false
}🟡write_journal(content, date, mode)
Append or replace a journal. Read before replacing and preserve ^task markers.
Input Schema
{
"type": "object",
"properties": {
"content": {
"type": "string",
"maxLength": 100000
},
"date": {
"type": "string",
"maxLength": 10
},
"mode": {
"type": "string",
"enum": [
"append",
"replace"
]
}
},
"required": [
"content"
],
"additionalProperties": false
}Community
Evidence