MCP Server Reference
The complete technical specification of the Fecit MCP server — connection, authentication, and all 57 tools an MCP client can call.
Connection
https://fecit.vaudium.net/api/mcp- Protocol
- Model Context Protocol (MCP)
- Transport
- Streamable HTTP (stateless, JSON responses)
- Scope
fecit
Authentication
The server is an OAuth 2.1 authorization server. Clients that support remote MCP discover and connect automatically — no manual key handling.
- Dynamic Client Registration (RFC 7591) at
/api/mcp/register - Authorization Code + PKCE (S256); refresh tokens supported
- Metadata discovery at
/.well-known/oauth-protected-resourceand/.well-known/oauth-authorization-server(path-aware) - Sign-in happens on a Fecit consent page (Google, Apple, or username/password) — your password is never shared with the client
- Access token lifetime 14 days, refresh token 90 days; revoke anytime by removing the connector
Data access
- Tools reach only your own data, under the exact same authorization as the Fecit app.
- Each tool reuses an existing Fecit API endpoint — there is no separate permission surface.
- Tools are annotated as Read, Write, or Destructive so clients can gate confirmations.
Tools (57)
param* = requiredTasks
list_tasksReadList the user's task records (execution instances). Filter by keyword, state, date range (ISO 8601), or project. Returns brief entries — use get_task for full detail.
keyword: stringstate: registered | started | completed | cancelledfrom_date: stringto_date: stringproject_id: stringlimit: integerskip: integerget_taskReadGet a task record in full detail, including all structured writing fields (description, target, expectation, obstacle, stakes, result, retrospect), schedule, state, and satisfaction.
task_id*: stringcreate_taskWriteCreate a task record. priority/difficulty 1-5, dates ISO 8601, project_id links it to a goal. Title only — add a description later via update_task_writing only if the user dictates one. reminder_minutes_before (needs start_date): 0/5/15/30/60/1440; omit = none.
start_date: stringend_date: stringduration_seconds: integerpriority: integerdifficulty: integerproject_id: stringreminder_minutes_before: integerupdate_taskWriteChange a task record's fields after creation — pass only what changes. start_date/end_date set the schedule (ISO 8601); reminder_minutes_before is 0/5/15/30/60/1440 before start (needs a start_date); satisfaction 1-5 rates a completed task; priority/difficulty 1-5; point_color is the star color; address is a place name; instruction is how-to guidance; assigned_to is an achiever id (project tasks only); duration_seconds is planned duration. (To change state use set_task_state; for writing spaces target/result/… use update_task_writing.)
task_id*: stringstart_date: stringend_date: stringreminder_minutes_before: integersatisfaction: integerpriority: integerdifficulty: integerpoint_color: peach | salmon | scarlet | maple | apricot | lemon | lime | avocado | mint | seafoam | water | sky | peacock | indigo | violet | lavender | arctic | steel | charcoal | midnightaddress: stringinstruction: stringassigned_to: stringduration_seconds: integerset_task_stateWriteChange a task record's state (registered → started → completed / cancelled).
task_id*: stringstate*: registered | started | completed | cancelledset_focused_taskWriteSet (or unset) the user's single focused task — the one task to concentrate on now. Focusing a task automatically unfocuses any previously focused task.
task_id*: stringis_focused: booleanupdate_task_writingWriteWrite one of a task's structured writing spaces (Fecit core). Fields: target=current situation; expectation=desired change; obstacle=what's in the way; stakes=cost if it fails; result=what happened; retrospect=lessons; also description. Plain text with newlines OK.
task_id*: stringfield*: description | target | expectation | obstacle | stakes | result | retrospectvalue*: stringadd_subtasksWriteSplit a big task into a sequential chain of subtasks linked in order (step 1 → 2 → …). Use when a task feels too big and the user wants concrete next steps. Provide 2-5 SHORT ordered action titles (never numbered in the text); never more than 5. Steps append after existing ones; don't over-split a simple to-do.
task_id*: stringtitles*: arraydelete_taskDestructivePermanently delete a task record. This cannot be undone.
task_id*: stringTask preparation & rules
add_preparation_itemWriteAdd a preparation item to a task record (what's needed to do it). materials/tools take quantity+unit, venue takes address, personnel takes specialty, qualification takes issuer; cost is free text. Existing items are in get_task (each has an `order`).
task_id*: stringcategory*: materials | tools | venue | personnel | qualificationdescription: stringquantity: stringunit: stringaddress: stringspecialty: stringissuer: stringcost: stringremove_preparation_itemDestructiveRemove a preparation item from a task record by its `order` (from get_task).
task_id*: stringcategory*: materials | tools | venue | personnel | qualificationorder*: integeradd_response_ruleWriteAdd a response rule (implementation intention) to a task record — an if-then plan: when `situation` happens, do `response`. Existing rules are visible in get_task (each has an `order`).
task_id*: stringsituation*: stringresponse*: stringremove_response_ruleDestructiveRemove a response rule from a task record by its `order` (from get_task).
task_id*: stringorder*: integerTask templates
search_task_templatesReadSearch the user's task templates (reusable blueprints in the Library).
keyword: stringlimit: integerskip: integerget_task_templateReadGet a task template in full detail.
template_id*: stringcreate_task_from_templateWriteInstantiate a task record from a template, optionally scheduling it.
template_id*: stringstart_date: stringend_date: stringProjects (Goals)
list_projectsReadList the user's projects. A project IS a goal (not a folder), carrying target/expectation/result/retrospect.
state: registered | started | completedkeyword: stringlimit: integerskip: integerget_projectReadGet a project (goal) in full detail: goal-definition fields (target, expectation, obstacle, stakes), outcome fields (result, retrospect, satisfaction), state, dates, and milestones.
project_id*: stringcreate_projectWriteCreate a new project (goal). abbreviation is a short code (e.g. 'FIT' for a fitness goal) used in task codes.
abbreviation*: stringupdate_project_goalWriteWrite into a project's goal-definition or outcome fields. target: the concrete goal / expectation: anticipated outcome / obstacle: foreseen blockers / stakes: why it matters / result: what actually happened / retrospect: lessons learned.
project_id*: stringfield*: description | target | expectation | obstacle | stakes | result | retrospectvalue*: stringset_project_stateWriteChange a project's state.
project_id*: stringstate*: registered | started | completeddelete_projectDestructivePermanently delete a project (goal) along with its goal fields, journal, and milestones. This cannot be undone.
project_id*: stringadd_project_journalWriteAdd a journal entry to a project — an in-progress checkpoint note on how the goal is going.
project_id*: stringcontent*: stringlist_project_journalReadList a project's journal entries (newest first).
project_id*: stringlimit: integerskip: integeradd_project_milestoneWriteAdd a milestone (intermediate goal checkpoint) to a project. Milestones deliberately do not link to tasks.
project_id*: stringtarget_date: stringset_milestone_stateWriteMark a project milestone as achieved (or back to pending). Get milestone_key from get_project's milestones array.
project_id*: stringmilestone_key*: stringstate*: pending | achievedget_project_activityReadGet a project's activity feed — who did what (task completions, journal entries, member joins, state changes, milestone achievements). Useful for shared projects.
project_id*: stringlimit: integercursor: stringMemos
search_memosReadSearch the user's memo records by keyword and/or project.
keyword: stringproject_id: stringlimit: integerskip: integerget_memoReadGet a memo record in full, including its content.
memo_id*: stringcreate_memoWriteCreate a memo record. Plain text content with newlines is accepted.
content: stringproject_id: stringupdate_memo_contentWriteReplace a memo's content. Plain text with newlines is accepted.
memo_id*: stringcontent*: stringdelete_memoDestructivePermanently delete a memo record. This cannot be undone.
memo_id*: stringReviews
list_daily_reviewsReadList the user's daily reviews in a date range (newest first).
from_date: stringto_date: stringwrite_daily_reviewWriteCreate or update the daily review for a given date (ISO 8601, the day being reviewed). satisfaction is 1-5.
date*: stringdescription: stringsatisfaction: integerwrite_weekly_reviewWriteCreate or update the weekly review for the week starting at week_start (ISO 8601 datetime — local midnight of the user's week start day, as provided by the weekly-review prompt or list_weekly_reviews). satisfaction is 1-5.
week_start*: stringdescription: stringsatisfaction: integerLabels
list_labelsReadList the user's labels (color-coded tags for tasks/memos). Filter by keyword or state.
keyword: stringstate: active | archivedlimit: integerskip: integercreate_labelWriteCreate a label (color-coded tag). point_color is one of the 20 Fecit colors.
name*: stringpoint_color: peach | salmon | scarlet | maple | apricot | lemon | lime | avocado | mint | seafoam | water | sky | peacock | indigo | violet | lavender | arctic | steel | charcoal | midnightdescription: stringset_label_stateWriteArchive a label (hide it) or reactivate it.
label_id*: stringstate*: active | archiveddelete_labelDestructivePermanently delete a label and its links to tasks/memos.
label_id*: stringlink_labelWriteAttach a label to a task record OR a memo record. Provide exactly one of task_id / memo_id.
label_id*: stringtask_id: stringmemo_id: stringunlink_labelDestructiveDetach a label from a task/memo by its label-link id (get the id from list_label_links).
label_link_id*: stringlist_label_linksReadList the label links on a task record OR a memo record (provide exactly one). Each entry has its link id (for unlink_label) and the nested label.
task_id: stringmemo_id: stringFolders
list_foldersReadList folders for one of the four item trees (task/memo × record/template). Folders are exclusive containers, separate from labels and projects. scope='project' needs project_id.
target_type*: task_record | memo_record | task_template | memo_templatescope: personal | projectproject_id: stringcreate_folderWriteCreate a folder in one of the four item trees. Nest it under parent_folder_id if given. scope='project' needs project_id.
name*: stringtarget_type*: task_record | memo_record | task_template | memo_templatescope: personal | projectparent_folder_id: stringproject_id: stringupdate_folderWriteRename a folder and/or move it under another parent folder. Only the fields you pass change.
folder_id*: stringname: stringparent_folder_id: stringdelete_folderDestructiveDelete a folder and its subfolders (cascade). Items inside are NOT deleted — they just leave the folder.
folder_id*: stringmove_item_to_folderWriteMove a task/memo (record or template) into a folder, or remove it from its folder (omit folder_id). item_type selects which of the four trees the folder belongs to.
item_type*: task_record | memo_record | task_template | memo_templateitem_id*: stringfolder_id: stringscope: personal | projectRoutines
list_routinesReadList the user's routines (recurring task generators). Filter by period (daily/weekly) and whether they're archived. With no period, returns both daily and weekly.
period: daily | weeklyarchived: booleanproject_id: stringlimit: integerskip: integerget_routineReadGet a single routine in full detail.
routine_id*: stringcreate_routineWriteCreate a routine that spawns a task on a schedule. period='daily'/'weekly'. start_date (ISO 8601) sets when it begins and the time of day; for 'weekly' give weekday. Base it on a task_template_id or give a title. end_date optionally stops it; reminder_minutes_before reminds on each spawned task.
period*: daily | weeklystart_date*: stringdescription: stringweekday: mon | tue | wed | thu | fri | sat | suntask_template_id: stringreminder_minutes_before: integerend_date: stringproject_id: stringdelete_routineDestructivePermanently delete a routine. Tasks it already spawned are not affected.
routine_id*: stringWeb links
add_web_linkWriteAttach a web link (URL) to a task or memo (record or template). item_type selects which.
item_type*: task_record | memo_record | task_template | memo_templateitem_id*: stringurl*: stringdescription: stringremove_web_linkDestructiveRemove a web link from a task/memo by its order index (see the item's web_links list).
item_type*: task_record | memo_record | task_template | memo_templateitem_id*: stringorder*: integerInsights
get_streakReadGet the user's completion streak: current_streak, longest_streak, completed_today, and streak start/last-completion dates. Use to recognize and celebrate their momentum.
get_achievementsReadList the user's achievements (badges) with progress — each has title, description, threshold, progress, and achieved_at (null if not yet earned). Use to acknowledge milestones.
get_dana_balanceReadGet the user's current Dana balance (Fecit's reward points).
Utility
current_datetimeReadCurrent datetime in the user's local timezone. Call before interpreting relative dates ('today'/'tonight'/'tomorrow'). When passing a datetime to other tools, output local wall-clock time (e.g. 2026-06-13T21:00:00); the system converts it to the correct instant.
Looking for setup steps instead? See Connect Claude (MCP).