Tasks and time blocks

A task list with protected time on every calendar.

Base URL https://api.meetsynced.com/functions/v1/api. Each endpoint calls the MCP tool named below and behaves exactly like it.

GET/tasks

Tasks with their status and time blocks

List my tasks with their status (todo, scheduled, done) and their time blocks, including which calendars each block was written to. Done tasks are left out unless include_done is true.

MCP tool: list_tasks

Query parameters

ParameterTypeDescription
include_donebooleanInclude completed tasks (default false)
curl "https://api.meetsynced.com/functions/v1/api/tasks" \
  -H "x-api-key: $SYNCED_API_KEY"

POST/tasks

Add a task

Add a task to my to-do list. It has no time on the calendar until schedule_task gives it a block.

MCP tool: create_task

JSON body

ParameterTypeDescription
titlerequiredstringWhat the task is, e.g. 'Write Q1 board deck'
notesstringOptional details. Shown in the description of its calendar blocks.
duration_minutesnumberHow long the task takes, 5 to 720 minutes. Default 60. Used as the block length when scheduling.
due_datestringOptional due date, YYYY-MM-DD
projectstringOptional project or list name to group tasks
curl -X POST https://api.meetsynced.com/functions/v1/api/tasks \
  -H "x-api-key: $SYNCED_API_KEY" \
  -H "content-type: application/json" \
  -d '{"title":"…"}'

POST/tasks/capture

Add a task from a sentence and suggest times

Capture something the user needs time for and suggest when to do it. Pass the user's own words as `text` (e.g. 'write the Q1 deck by Friday, 2h') and Synced reads the title, length and due date, or pass the fields yourself. Creates the task and returns free times before its due date; nothing is put on the calendar. Show the suggestions, then call schedule_task with the chosen start. If `kind` comes back 'meeting', the text sounds like a meeting with people: ask who, and use find_meeting_time instead (the task is not created).

MCP tool: capture_task

JSON body

ParameterTypeDescription
textstringWhat the user said, in their words
titlestringWhat the task is, e.g. 'Write Q1 board deck'
notesstringOptional details. Shown in the description of its calendar blocks.
duration_minutesnumberHow long the task takes, 5 to 720 minutes. Default 60. Used as the block length when scheduling.
due_datestringOptional due date, YYYY-MM-DD
projectstringOptional project or list name to group tasks
suggestionsnumberHow many free times to return, default 3, max 20
curl -X POST https://api.meetsynced.com/functions/v1/api/tasks/capture \
  -H "x-api-key: $SYNCED_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'

POST/tasks/plan

Plan open tasks (dry run, then commit)

Lay out my open tasks in free time: earliest due date first, each before it's due, none overlapping each other or anything on my calendar, inside working hours. Without commit, nothing is written: it returns the plan and a plan_id. Show the plan to the user; when they agree, call again with commit: true and that plan_id. Committing twice is safe (the same plan never books twice), and any item whose time has since become busy is skipped and reported. At most 10 tasks per plan.

MCP tool: plan_tasks

JSON body

ParameterTypeDescription
task_idsstring[]Only these tasks. Default: every task not yet scheduled.
fromstringFirst day, YYYY-MM-DD. Default today.
tostringLast day, YYYY-MM-DD. Default a week after from, at most two weeks.
commitbooleanWrite the plan given by plan_id. Only after the user agreed to it.
plan_idstringThe plan_id from a dry run, required with commit
curl -X POST https://api.meetsynced.com/functions/v1/api/tasks/plan \
  -H "x-api-key: $SYNCED_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'

PATCH/tasks/:id

Change a task

Change a task's title, notes, duration, due date or project. A new title is also applied to its upcoming calendar blocks.

MCP tool: update_task · :id is the task_id

JSON body

ParameterTypeDescription
titlestringWhat the task is, e.g. 'Write Q1 board deck'
notesstringOptional details. Shown in the description of its calendar blocks.
duration_minutesnumberHow long the task takes, 5 to 720 minutes. Default 60. Used as the block length when scheduling.
due_datestringOptional due date, YYYY-MM-DD
projectstringOptional project or list name to group tasks
curl -X PATCH https://api.meetsynced.com/functions/v1/api/tasks/ID \
  -H "x-api-key: $SYNCED_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'

DELETE/tasks/:id

Delete a task and its upcoming blocks

Delete a task and remove its upcoming time blocks from every calendar. Cannot be undone.

MCP tool: delete_task · :id is the task_id

curl -X DELETE "https://api.meetsynced.com/functions/v1/api/tasks/ID" \
  -H "x-api-key: $SYNCED_API_KEY"

POST/tasks/:id/complete

Mark a task done

Mark a task done. Its upcoming time blocks are removed from every calendar unless keep_future_blocks is true; past blocks stay as a record.

MCP tool: complete_task · :id is the task_id

JSON body

ParameterTypeDescription
keep_future_blocksbooleanKeep upcoming blocks on the calendar (default false)
curl -X POST https://api.meetsynced.com/functions/v1/api/tasks/ID/complete \
  -H "x-api-key: $SYNCED_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'

GET/tasks/:id/suggestions

Free times for a task

Suggest free times for a task, inside my working hours and avoiding busy time on all my calendars. The length is the task's duration. Returns start/end as ISO (pass one to schedule_task) plus local times in my timezone.

MCP tool: suggest_task_times · :id is the task_id

Query parameters

ParameterTypeDescription
fromstringFirst day to look, YYYY-MM-DD. Default today.
tostringLast day to look, YYYY-MM-DD. Default a week after from.
preferred_time"morning" | "afternoon" | "evening" | "any"Preferred part of the day
countnumberHow many suggestions, default 5, max 20
curl "https://api.meetsynced.com/functions/v1/api/tasks/ID/suggestions" \
  -H "x-api-key: $SYNCED_API_KEY"

POST/tasks/:id/schedule

Block time for a task

Block time for a task on my calendars. Writes one private, busy event to every account that allows time blocks (set in Settings → Calendars), or only to calendar_accounts when given. If start is omitted, nothing is scheduled: free-time suggestions are returned instead, so confirm one with the user and call again with its start. The result reports each calendar copy; failed copies can be retried with retry_task_block.

MCP tool: schedule_task · :id is the task_id

JSON body

ParameterTypeDescription
startstringWhen the block starts, ISO date-time with offset (e.g. a suggestion's start). Omit to get suggestions.
endstringOptional ISO end. Default start + the task's duration.
calendar_accountsstring[]Optional account emails to write the block to, instead of the Settings default
busybooleanShow as busy (default true). False makes the block free time.
request_idstringOptional id for this request. Repeating a call with the same request_id returns the block already made instead of booking twice.
curl -X POST https://api.meetsynced.com/functions/v1/api/tasks/ID/schedule \
  -H "x-api-key: $SYNCED_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'

PATCH/task-blocks/:id

Move a time block

Move a task's time block on every calendar it was written to.

MCP tool: reschedule_task_block · :id is the block_id

JSON body

ParameterTypeDescription
startrequiredstringNew start, ISO date-time with offset
endstringOptional new end. Default keeps the block's length.
curl -X PATCH https://api.meetsynced.com/functions/v1/api/task-blocks/ID \
  -H "x-api-key: $SYNCED_API_KEY" \
  -H "content-type: application/json" \
  -d '{"start":"…"}'

DELETE/task-blocks/:id

Remove a time block

Remove a task's time block from every calendar. The task stays on the list; with no upcoming blocks left it goes back to 'todo'.

MCP tool: unschedule_task_block · :id is the block_id

curl -X DELETE "https://api.meetsynced.com/functions/v1/api/task-blocks/ID" \
  -H "x-api-key: $SYNCED_API_KEY"

POST/task-blocks/:id/retry

Retry calendar copies that failed

Write the calendar copies of a time block that failed earlier (schedule_task reports failures per account).

MCP tool: retry_task_block · :id is the block_id

curl -X POST https://api.meetsynced.com/functions/v1/api/task-blocks/ID/retry \
  -H "x-api-key: $SYNCED_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'