TaskPile

Taskpile.app is a personal AI-first task manager designed to be used through your chat client.

Community: Submitted by a user or imported; check the owner before granting accessOnlineNo sign-inGlobalFreeRead-only

What it can do

  • Create Task: Create a task in the user's Taskpile inbox. Returns the new task id and shape. Tag syntax is `@tag_name`, NOT `#tag_name` - `#name` is the project shorthand and only the first `#` token i
  • List Tasks: List the user's tasks. Status semantics: `inbox` = unsorted captures, `today` = scheduled for today, `later` = scheduled for a future date (tomorrow, in_n_days, next_week have an explicit
  • Get Task: Fetch a single task by id with full shape including notes and tags.

What data it sees

Do you need an account

No: the server works without sign-in

Taskpile.app is a personal AI-first task manager designed to be used through your chat client. Get stuff done, ever forget. Remember all things.

Workflow:

  1. Capture (over mcp, inbox (with voice support and emails)

  2. Daily review, walk through the new tasks, and tasked that didn't get done yesterday

  3. See your today view and act.

Capture, sort, and finish tasks from Claude, ChatGPT, Cursor, Le Chat, Lovable, or any MCP-compatible client.

57 tools cover task CRUD, projects, tags, teams, bulk operations, and a daily morning digest. Hosted with OAuth 2.1 (DCR + PKCE) — no local install, no per-client setup.

Endpoint: https://taskpile.app/api/mcp

Human centered app: https://taskpile.app

Server tool list (57)

Raw names from tools/list. Only developers need these.

create_taskCreate a task in the user's Taskpile inbox. Returns the new task id and shape. Tag syntax is `@tag_name`, NOT `#tag_name` - `#name` is the project shorthand and only the first `#` token in the title is used. Title may include one `#project_name` (auto-creates the project if missing) and any number of `@tag_name` tokens; both are stripped from the stored title. To set tags at creation, either use `@tag` in the title or pass the `tags: string[]` array (the two forms can be combined and are de-duplicated). Optionally pass `notes` for markdown context, and `horizon` to schedule it in one call (skips placing it in inbox).
list_tasksList the user's tasks. Status semantics: `inbox` = unsorted captures, `today` = scheduled for today, `later` = scheduled for a future date (tomorrow, in_n_days, next_week have an explicit horizon_target_date; someday has none), `delegated` = handed off (see follow_up_at), `done` = completed, `archived` = soft-deleted. With NO `status`/`statuses`, returns all OPEN tasks (inbox + today + later + delegated; done/archived excluded) - so 'my tasks' is never just the inbox. Pass `statuses: string[]` to combine specific ones, e.g. ['today','later']; or a single `status` to narrow.
get_taskFetch a single task by id with full shape including notes and tags.
update_taskEdit an existing task. Any field omitted is left unchanged. Pass `notes` (markdown) for the description body, or `notes: null` to clear. Pass `projectId: null` to clear the project, or a uuid to set/move it (the project must already exist - use list_projects). `#project`/`@tag` shorthand in `title` is NOT parsed on update (unlike create_task) - to change tags use `tags`/`addTags`/`removeTags`, to change project use `projectId`. Tag fields are exclusive: pass `tags` to replace the entire tag list, or `addTags`/`removeTags` for delta updates, not both. Status lets you move a task between buckets without delegating or completing - to mark a task done use `complete_task`, to schedule use `assign_horizon`.
complete_taskMark a task as done. If the task has a recurrence rule, the next instance is auto-created.
uncomplete_taskReverse a completion - restore a done task to the inbox so the user can re-schedule it. Use this when the agent (or the user) marked something complete by mistake. The task's horizon is cleared so the user actively re-decides.
delete_taskPermanently delete a task. No archive, no undo. Prefer `archive_task` for reversible cleanup.
archive_taskSoft-delete a task by moving it to status='archived'. The task disappears from every active view but the row is retained so unarchive_task can bring it back. Prefer this over delete_task for routine cleanup.
unarchive_taskRestore an archived task back to the inbox (no horizon, so the user re-decides where it belongs).
list_projectsList the user's projects with task counts. Active by default - pass includeArchived=true to also surface archived projects.
create_projectCreate a project. Returns the new project id. Project names must be unique per user.
update_projectRename a project and/or change its color. Only provided fields are updated. Setting archived flips the soft-delete flag (use archive_project / unarchive_project for clarity unless you're updating multiple fields at once).
archive_projectSoft-delete a project. The project hides from list_projects (unless includeArchived=true) and from the project picker. Tasks inside it are untouched - they keep referring to the project, so unarchiving brings everything back.
unarchive_projectRestore an archived project to active.
list_tagsList the user's existing tags. Call this before inventing new @tag names in create_task - picking an existing tag keeps the user's tag-list clean.
rename_tagRename a tag for the user. All tasks tagged with the old name will now show the new name (tags are joined by id, not text). Names are unique per user - renaming to an existing name will fail.
delete_tagPermanently delete a tag and unlink it from every task it was attached to. The tasks themselves are untouched. No undo.
search_tasksSearch the user's tasks with rich filters. `query` is a case-insensitive substring matched against title and (when includeBody=true) notes. Additional filters narrow the result set further; all are AND-combined. Omit `query` to filter purely by metadata. Archived tasks are excluded by default - pass includeArchived=true to include them.
assign_horizonSet when a task should be done. Pass EITHER `horizon` (named bucket) OR `date` (explicit ISO date like '2026-05-20') - not both. Named buckets: `today_morning/afternoon/evening` → Today; `tomorrow`/`in_n_days`/`next_week`/`someday` → Later with the corresponding date. Explicit `date` resolves to today/in_n_days automatically (avoids LLM date arithmetic). Pass inNDays to override the user's default for the `in_n_days` bucket.
delegate_taskMark a task as delegated to someone, with a follow-up date. The task disappears from Today until the follow-up date.
move_to_projectBulk-assign a list of task ids to a project. Pass projectId: null to clear the project. The project must already exist (use list_projects).
bulk_completeMark several tasks done in one round-trip. Recurrence is intentionally skipped here - use complete_task one at a time if you need recurring follow-ups.
bulk_deletePermanently delete several tasks. No archive, no undo. Prefer letting the user delete via the UI for safety. Capped at 200 ids per call.
bulk_assign_horizonSet the same horizon on several tasks in one round-trip. Same horizon/date semantics as `assign_horizon` - pass either `horizon` or `date`, not both.
get_todayOne-shot read of everything that should land on the user's Today screen: overdue tasks (horizon_target_date in the past), today's scheduled tasks, delegated tasks with due follow-ups, and tasks completed today. Saves the three or four round-trips an agent would otherwise need to assemble this view. Returns { overdue, today, followUp, completedToday }.
get_review_queueReturn tasks waiting to be triaged - inbox captures (no horizon assigned). Use this to drive a daily-review flow. Returns { inbox, count }.
changes_sinceReturn tasks whose `updated_at` is strictly newer than the given ISO timestamp. Use this for incremental sync - pass the timestamp from the last response back next call. **Caveat:** deletions are NOT reported (no tombstone table); if the agent has a cached copy and a task disappears server-side, a periodic full reconcile is needed. Capped at 500 rows.
set_recurrenceSet or clear a task's repeat rule. Pass rule: null to make the task non-recurring. For weekly, `weekdays` is an array of 0-6 (Sun=0). When a recurring task is completed, the next instance is auto-created.
get_morning_digestRead the user's morning digest email preferences. Returns enabled, target email, mode (combined/per_project), hour (0-23), and IANA timezone. Use this before suggesting edits via configure_morning_digest.
configure_morning_digestConfigure the daily morning digest email. All fields are optional - only provided fields are updated. The digest summarises today's tasks, overdue items, delegated follow-ups, and new inbox captures, delivered at the chosen local hour. Pass `email: ""` to clear an override and fall back to the user's account email.
create_teamCreate a new team. The caller becomes the team owner. Teams own shared projects (see `convert_project_to_shared`) and the owner can invite editor/viewer members.
list_teamsList teams the user is a member of, with the user's role on each (owner/editor/viewer).
get_teamFetch a team's full state: team row, member list with roles, pending invitations, and the caller's own role on the team.
update_teamRename a team. Owner only.
delete_teamPermanently delete a team. Cascades to all shared projects, their tasks, members, and invitations. Owner only. No undo.
list_team_membersList members of a team with role, joined_at, display_name and email. Any member can call this.
update_member_roleChange a member's role between 'editor' and 'viewer'. Cannot promote/demote to/from 'owner' (use ownership transfer flow). Owner only.
remove_team_memberRemove a member from a team. Owner can remove anyone except themselves. A non-owner member can pass their own userId to leave. Owner cannot leave - transfer or delete the team first.
invite_to_teamInvite someone to a team by email. Creates an invitation with a single-use token, expires in 14 days, and sends a transactional email to the recipient. Owner only. The invited email must accept via `accept_invitation` from a Taskpile account where the email matches. A team is capped at 10 active email invitations - if you hit the cap, ask the owner to revoke older invitations or wait for them to be accepted/expire. An optional `personalMessage` (max 500 chars) is included in the email body.
list_invitationsList invitations on a team (pending + accepted history). Any member can read.
revoke_invitationDelete a pending invitation. Owner only. Has no effect if the invitation has already been accepted.
accept_invitationAccept a team invitation. Validates token + expiry + that the caller's account email matches the invitation. Creates the team_members row and marks the invitation accepted.
convert_project_to_sharedConvert a personal project into a shared project owned by a team. IRREVERSIBLE - shared projects cannot be converted back to personal. The team owner becomes the default triager. By default, existing tasks in the project are auto-assigned to the converter so they don't disappear from anyone's Today. Caller must own the project AND be owner/editor of the team.
set_project_triagerSet (or clear) the triager on a shared project. The triager is the team member who sees unassigned tasks from this project in their personal review queue. Pass userId: null to clear. Owner only. The triager must be a team member.
assign_taskAssign (or unassign) a task in a shared project to a team member. The assignee then sees the task in their Today/Later/Inbox based on the task's status. Pass assigneeId: null to unassign and return the task to the project's unassigned pile. Only valid for tasks in shared projects. Caller must be owner/editor of the project's team.
update_project_auto_assignSet the per-project default-assignee strategy for a shared project. New tasks created in this project will be assigned according to `strategy`: 'creator' (default for new shared projects - the task creator gets the assignment), 'owner' (the team owner gets every new task), 'specific' (a fixed member identified by `userId` gets every new task), or 'unassigned' (tasks land in the triager's review pile). Caller must be owner or editor of the project's team. Personal projects ignore this setting.
move_task_to_privatePull a task out of a shared project so it becomes a private inbox task on the caller's account. Allowed for the task's creator OR the project's owner. The task's project_id and assignee_id are cleared and status is reset to 'inbox'. Audit-logged so the team can see where it went.
unshare_projectPull a whole shared project back to a personal project. Strict - only allowed when the project contains no tasks from any other team member AND the team_audit_log has no foreign actor entries against this project. Caller must be the project's original owner. To free up a project that doesn't qualify, the owner must first move or delete the foreign tasks.
invite_to_projectInvite someone to a single project by email. Creates an invitation with a single-use token, expires in 14 days, and sends a transactional email to the recipient. Owner-of-project only. The invited email accepts via `accept_invitation`. Free-tier projects are capped at 4 people total (owner + 3 others, counting members + active invitations).
list_project_membersList people with access to a shared project, including their role (owner/editor/viewer), display_name, email, and is_me flag. Caller must be a member.
update_project_member_roleChange a project member's role between 'editor' and 'viewer'. Owner-of-project only. Owner role cannot be set via this verb.
remove_project_memberRemove a member from a shared project. Owner can remove anyone except themselves; any non-owner member can remove themselves (leave). The departing member's tasks in this project are re-assigned to the project's triager (falling back to project owner).
list_unassigned_tasksList unassigned tasks in shared projects. If `projectId` is provided, returns unassigned tasks for that one project (any team member can call). Without `projectId`, returns unassigned tasks across every shared project where the caller is the triager - the data feed for the triager's review queue.
whoamiIdentify the authenticated Taskpile account and return current state. Returns `user_id`, `email`, `display_name`, `account_created_at`, a `usage` block (task counts by status, active project count, tag count), a `teams` array (each team the user is a member of with role + joined_at) and a `subscription` block (tier, status, next_payment_at, per-tier limits). Use this to greet the user by name, surface their current consumption against limits, list their teams, or remind them of the next billing date. Billing is not yet live during beta - the subscription block will report tier='free' with null limits and a note until Paddle integration ships.
get_inbox_emailReturn the user's per-account email-inbox alias (e.g. inbox-a3f7c2e9b4d18650@taskpile.app). Mails sent to this address create tasks in the inbox. Returns null if the user hasn't generated one yet - point them to Settings → Email to your inbox. NEVER call regenerate from an agent; that's a Settings-only action by design.
searchSearch the user's tasks. Returns ranked results with id, title, snippet, and a deep link. Optimized for ChatGPT Deep Research / Company Knowledge surfaces (OpenAI Apps SDK schema). For richer filtering use `search_tasks` instead.
fetchFetch the full content of a single task by id. Returns id, title, text (markdown body), url, and metadata. OpenAI Apps SDK companion to `search`.
TaskPile: connect to Claude, ChatGPT, Cursor · Connectors.fun