Skip to main content
← Connect Claude (MCP)

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-resource and /.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)

ReadWriteDestructive· param* = required

Tasks

list_tasksRead

List 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: integer
get_taskRead

Get a task record in full detail, including all structured writing fields (description, target, expectation, obstacle, stakes, result, retrospect), schedule, state, and satisfaction.

task_id*: string
create_taskWrite

Create 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: integer
update_taskWrite

Change 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: integer
set_task_stateWrite

Change a task record's state (registered → started → completed / cancelled).

task_id*: stringstate*: registered | started | completed | cancelled
set_focused_taskWrite

Set (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: boolean
update_task_writingWrite

Write 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*: string
add_subtasksWrite

Split 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*: array
delete_taskDestructive

Permanently delete a task record. This cannot be undone.

task_id*: string

Task preparation & rules

add_preparation_itemWrite

Add 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: string
remove_preparation_itemDestructive

Remove a preparation item from a task record by its `order` (from get_task).

task_id*: stringcategory*: materials | tools | venue | personnel | qualificationorder*: integer
add_response_ruleWrite

Add 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*: string
remove_response_ruleDestructive

Remove a response rule from a task record by its `order` (from get_task).

task_id*: stringorder*: integer

Task templates

search_task_templatesRead

Search the user's task templates (reusable blueprints in the Library).

keyword: stringlimit: integerskip: integer
get_task_templateRead

Get a task template in full detail.

template_id*: string
create_task_from_templateWrite

Instantiate a task record from a template, optionally scheduling it.

template_id*: stringstart_date: stringend_date: string

Projects (Goals)

list_projectsRead

List the user's projects. A project IS a goal (not a folder), carrying target/expectation/result/retrospect.

state: registered | started | completedkeyword: stringlimit: integerskip: integer
get_projectRead

Get a project (goal) in full detail: goal-definition fields (target, expectation, obstacle, stakes), outcome fields (result, retrospect, satisfaction), state, dates, and milestones.

project_id*: string
create_projectWrite

Create a new project (goal). abbreviation is a short code (e.g. 'FIT' for a fitness goal) used in task codes.

abbreviation*: string
update_project_goalWrite

Write 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*: string
set_project_stateWrite

Change a project's state.

project_id*: stringstate*: registered | started | completed
delete_projectDestructive

Permanently delete a project (goal) along with its goal fields, journal, and milestones. This cannot be undone.

project_id*: string
add_project_journalWrite

Add a journal entry to a project — an in-progress checkpoint note on how the goal is going.

project_id*: stringcontent*: string
list_project_journalRead

List a project's journal entries (newest first).

project_id*: stringlimit: integerskip: integer
add_project_milestoneWrite

Add a milestone (intermediate goal checkpoint) to a project. Milestones deliberately do not link to tasks.

project_id*: stringtarget_date: string
set_milestone_stateWrite

Mark a project milestone as achieved (or back to pending). Get milestone_key from get_project's milestones array.

project_id*: stringmilestone_key*: stringstate*: pending | achieved
get_project_activityRead

Get 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: string

Memos

search_memosRead

Search the user's memo records by keyword and/or project.

keyword: stringproject_id: stringlimit: integerskip: integer
get_memoRead

Get a memo record in full, including its content.

memo_id*: string
create_memoWrite

Create a memo record. Plain text content with newlines is accepted.

content: stringproject_id: string
update_memo_contentWrite

Replace a memo's content. Plain text with newlines is accepted.

memo_id*: stringcontent*: string
delete_memoDestructive

Permanently delete a memo record. This cannot be undone.

memo_id*: string

Reviews

list_daily_reviewsRead

List the user's daily reviews in a date range (newest first).

from_date: stringto_date: string
write_daily_reviewWrite

Create or update the daily review for a given date (ISO 8601, the day being reviewed). satisfaction is 1-5.

date*: stringdescription: stringsatisfaction: integer
write_weekly_reviewWrite

Create 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: integer

Labels

list_labelsRead

List the user's labels (color-coded tags for tasks/memos). Filter by keyword or state.

keyword: stringstate: active | archivedlimit: integerskip: integer
create_labelWrite

Create 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: string
set_label_stateWrite

Archive a label (hide it) or reactivate it.

label_id*: stringstate*: active | archived
delete_labelDestructive

Permanently delete a label and its links to tasks/memos.

label_id*: string
link_labelWrite

Attach a label to a task record OR a memo record. Provide exactly one of task_id / memo_id.

label_id*: stringtask_id: stringmemo_id: string
unlink_labelDestructive

Detach a label from a task/memo by its label-link id (get the id from list_label_links).

label_link_id*: string
list_label_linksRead

List 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: string

Folders

list_foldersRead

List 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: string
create_folderWrite

Create 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: string
update_folderWrite

Rename a folder and/or move it under another parent folder. Only the fields you pass change.

folder_id*: stringname: stringparent_folder_id: string
delete_folderDestructive

Delete a folder and its subfolders (cascade). Items inside are NOT deleted — they just leave the folder.

folder_id*: string
move_item_to_folderWrite

Move 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 | project

Routines

list_routinesRead

List 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: integer
get_routineRead

Get a single routine in full detail.

routine_id*: string
create_routineWrite

Create 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: string
delete_routineDestructive

Permanently delete a routine. Tasks it already spawned are not affected.

routine_id*: string

Web links

add_web_linkWrite

Attach 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: string
remove_web_linkDestructive

Remove 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*: integer

Insights

get_streakRead

Get 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_achievementsRead

List 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_balanceRead

Get the user's current Dana balance (Fecit's reward points).

Utility

current_datetimeRead

Current 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).