ActOnChat

MCP Documentation

Any MCP-compatible agent can operate on ActOnChat on behalf of its owner: read context and create traceable actions.

Endpoint

…

Streamable HTTP transport. Protected-resource metadata at /.well-known/oauth-protected-resource.

Authentication

OAuth 2.1 with automatic discovery and short-lived tokens. The agent inherits its owner's session and sees exactly what that person sees; database rules are enforced on every call.

When this one

Any mention of ActOnChat — or of "AOC", which is how people write it once they use it daily — means this server and no other. And it still does without naming it: "add it to my agenda", "message Luis", "ask Ana for the invoice", "remind me to call the bank", "what is pending". The tell is the person: if who they mention is an ActOnChat contact, it goes here.

What is NOT yours: when somebody names another app — "on my Google Calendar", "on WhatsApp", "email her" — that one wins. Doing it here quietly is worse than not doing it, because they believe it is handled.

Who they mean

There is no public directory: somebody is reachable only after being added with their PIN or QR code, or by sharing a chat or a group with them — a direct chat makes both people contacts, whichever of them did the adding. To know who is meant, the agent follows five rules:

  1. Search, don't conclude. search_contacts ignores accents and forgives a typo ("Gonzales" finds "González"), but people say a first name, a surname or a nickname: try the full name, then the first name alone, then the surname alone. Only when all of those come back empty is somebody not a contact; never ask the user to add someone they may already have.
  2. Recent is the tell. search_contacts returns when they last talked (last_talked_at), since when they are a contact (added_at) and what they have open together (open_items_together), the most likely first. With an empty query it lists people most recent first: that answers "the one I just talked to" or "the one I added today".
  3. Carry it forward. Once resolved, the @handle is used for the rest of the conversation: "her", "send it to him too" is the last person resolved, not a new search.
  4. Never pick between two. When a name matches several people, write tools do NOTHING and answer which one is most likely and why: the one in the chat being written in, the one talked to recently, the one with something open. The agent asks offering that one first — "Eugenia González, whom you wrote to today?" — and calls again with the confirmed @handle. It skips the question only when the user's own words already single one out (the surname, the chat they are looking at). A message to the wrong person cannot be unsent.
  5. Say who. After writing to someone, name them as the tool did ("Sent to Eugenia González"), so a mix-up shows at once.

Groups

A group is named by its name (get_groups), never through one of its members. Whatever is agreed or asked in a group comes FROM the user and reaches everyone in it, just like the «+» inside the group chat in the app:

  • A plan with a date — "tomorrow, Elton John concert", "family dinner Saturday at 9" — is create_event with group. Every member is invited and notified, the card appears in the group chat for each one to confirm or decline, and it lands in everyone's calendar. It stays pending until they answer.
  • Asking for something is create_request with group: assignee is one member, or "everyone" to ask each of them. Since a request is accepted and completed by one person, each one gets their own, in the group chat. The card is seen by who asks and who is asked; the rest of the group reads the sentence (message).
  • message, when given, is posted once in the group, from the user, right above the card. No extra send_group_message is needed: the plan already reaches the group.
  • send_group_message is only for conversation. A plan sent as a message lands in nobody's calendar and has nobody to confirm it.
  • Several people outside a group are ONE commitment: "lunch with Maru, Eugenia and Ángel" is create_event with participants: ["Maru", "Eugenia", "Ángel"]. If someone was left out, update_event with add_participants. A commitment with no participants and no group is the user's alone: it is in no chat and nobody else sees it. Never for something that involves others.
  • The time is what the whole group will see in their calendar: if nobody said a time, ask; do not invent one and call it "pending confirmation".
  • who_does_it in a group: 'me', a member's name, or 'both'/'everyone' (the default). Names are looked up only among the group's members, accent-insensitive and forgiving one typo; if two match, none is picked.

How long a task took

When completing a task, the agent says about how long it took, in minutes (minutes_spent, 1 to 1440). It feeds the "≈ 2 h of work" in Stats and time_spent in get_task_stats. Every number keeps where it came from, because they are not worth the same:

  • user — they said it ("took me an hour"). Shown as is.
  • estimate — the agent estimated it from what the task was: a quick call ≈ 10, an email ≈ 15, a meeting ≈ its length, a proposal ≈ 90. It is the default minutes_source and what is expected almost every time: the agent knows best what the task was.
  • calculated — nobody said it, so AOC calculates it on completion: 15 minutes per step (up to 4 hours); with no steps, the median of what was said or estimated for their tasks in that list (or all of them); with no history, 30. Rounded to 5. complete_task answers the number and that it was calculated, so the agent can correct it if it knows better.

To correct it later: update_task with minutes_spent (null clears it). Reopening a task drops a calculated time — it is calculated again on completion — but not one somebody said. The next occurrence of a repeating task starts with no time. Anything the person did not say is shown with "≈": it is an approximation, not a clock.

How tasks behave

  • Private. Tasks, lists and reminders are the user's alone: nobody else sees them and a task cannot be assigned to anyone. To ask someone for something, create_request; to agree on a time, create_event.
  • No doubles. create_task does not create one nearly identical to a task that is open or was finished in the last 3 days: it returns the existing one to change or complete. allow_duplicate only when two are really wanted.
  • Done is completed, not created. When someone says they already did something, find the task (search_tasks) and use complete_task. A cancelled task cannot be completed: if it really got done, reopen it with update_task first.
  • Repeating tasks. Completing one schedules the next occurrence, with its steps and projects. Unchecking it removes that next one if nobody touched it; if it was already postponed or edited, it stays.
  • Move to tomorrow. postpone_task moves it to tomorrow at the same time and keeps count: by the third time it is worth asking whether to break it into steps, delegate it or drop it.
  • Advance. For what goes in parts: advance_task is "did today's part, continue tomorrow". Today's part counts as a completed task that day in the stats (with its time, list and projects), the task comes back tomorrow (what was for today at the same time; if nothing brought it tomorrow, into tomorrow's My Day) and its advance count goes up, so it is known how long it has been in progress. It can be undone from the app.
  • List and project. A list is WHERE it lives (one); a project is a colored tag for WHAT it is about (several, across lists), and works on commitments too.

Approvals and times

  • queued_for_approval. Depending on the agent's autonomy (get_agent), some tools do not perform the action: they leave it waiting for the user to confirm in the app, on a card that says what will change. Meanwhile NOTHING happened: do not call again and do not say it is done.
  • Timezones. The server runs in UTC and the user does not. Times go in ISO 8601 WITH their offset (2026-10-01T18:00:00-06:00), and their IANA timezone is passed on anything touching My Day or "today", which are calendar days, not instants.
  • Who has the ball. On a commitment, who_does_it says whose side the work is on ('me', the other person or 'both'); AOC infers it when not given, and either person can fix it.

If your AI doesn't see something new

Your AI keeps the list of ActOnChat tools from when you connected it. If it says it can't do something listed here — tagging a task with a project, say — refresh the connection: in ChatGPT, under Settings, Apps (or Connectors), open ActOnChat and refresh it; in Claude, start a new conversation. If nothing changes, disconnect it and connect it again.

Tools

Messaging

  • send_messageSend a message to a person, optionally as urgent.
  • get_conversationsList conversations with their latest message.
  • get_messagesRead recent messages with one person.
  • mark_as_readMark incoming messages as read.
  • search_contactsFind people by name, surname, nickname or handle however they are typed — accents ignored, one typo forgiven: Gonzales finds González — with when you last talked and what you have open. It covers your saved contacts and everyone you share a chat or a group with (is_contact says which). Empty, it lists them most recent first.

Groups

  • get_groupsList the groups you are in, with who is in each one. The group's name is what create_event and create_request take in `group`.
  • get_group_messagesRead a group's recent messages, with who said each one.
  • send_group_messageSend a message to a group by its name: everyone in it receives it. Only for conversation: a plan with a date is create_event with `group`, and an ask is create_request with `group`.

Tasks & reminders

  • create_taskA task for yourself: list, projects, steps, due date, reminder, star, My Day and Eisenhower box (`quadrant`). It cannot be assigned to anyone else — for that, create_request. If one with almost the same title is open or was completed in the last 3 days, nothing is created and the existing one comes back (allow_duplicate to force it).
  • get_tasksList tasks by status, list or project, or through My Day / Review / Important / Planned. Each one comes with its projects and how many times it was postponed.
  • search_tasksThe app's search box: words and filters in one query — today, overdue, week, important, done, #project, list:name, "exact phrase", -word. Returns the best matches and how the query was understood.
  • update_taskChange title, notes, due date, status, list, star, My Day, how long it took (`minutes_spent`, to correct the time of a finished task), its Eisenhower Matrix box (`quadrant`: 1 do it, 2 schedule it, 3 delegate it, 4 drop it; `null` takes it out), or its projects: `projects` leaves exactly those (`[]` removes them all), `add_projects` / `remove_projects` touch only the ones named. That is how an existing task goes into a project, without recreating it.
  • postpone_task«Move to tomorrow»: a task that is for today moves to tomorrow at the same time, and the count of how many times goes up.
  • advance_task«Did today's part, continue tomorrow»: for a task that goes in parts. Today's part counts as a completed task today in the stats (with `minutes_spent`), the task comes back tomorrow, and its advance count goes up (`avances`, since `primer_avance`). Not postpone_task (not done) nor complete_task (finished for good).
  • complete_taskMark a task as done, with about how long it took: `minutes_spent` plus `minutes_source` (user if they said it, estimate if the agent estimated it). Without it AOC calculates the time. A repeating task schedules its next occurrence; a cancelled one cannot be completed.
  • get_task_listsThe user's lists. The default one has no id — leave `list` out to use it.
  • create_task_listCreate a new list.
  • get_task_projectsThe user's projects — colored tags across lists — with their open tasks and upcoming commitments.
  • set_projectsPut, change or remove projects on a task or a commitment: add, remove, or replace with exactly these. On a shared commitment the tags are private — the other person never sees them.
  • get_project_itemsEverything in one project: its open tasks and its upcoming commitments.
  • create_task_projectCreate a project with one of ten colors. A list is where a task lives; a project is what it is about, and a task can have several.
  • update_task_projectRename a project or change its color.
  • add_task_stepBreak a task into steps. A step that needs instructions goes as `{ title, notes }`: a short line to check off, and the how —commands, links, what done looks like— in `notes`.
  • complete_task_stepCheck a step off, or put it back.
  • update_task_stepChange a step: its title, its instructions (`notes`; `null` clears them) or whether it is done. To add instructions to a step that already exists, instead of adding another.
  • create_reminderNudge yourself later, by time, condition, or both. It is private: it tells nobody else anything.
  • cancel_reminderCancel a scheduled reminder.

Requests & commitments

  • create_requestAsk another person to do something — it delivers: notification, a card they accept or decline, and a line in both pending lists. Use this instead of send_message for anything you are asking for. With `group`, the ask is made in that group's chat to one member, or to "everyone" (each member gets their own).
  • accept_requestAccept a request addressed to you.
  • reject_requestReject a request addressed to you.
  • complete_requestMark a request as fulfilled.
  • cancel_requestWithdraw a request you made — you no longer need it. Only the one who asked can; the other person is notified and stops seeing it as open.
  • propose_request_datePropose another due date for an open request, from either side; the other person accepts or declines it from the card. Accepting also accepts a request that was still unanswered.
  • answer_request_dateAccept or decline the date the other person proposed (`proposed_due_at` in get_pending_interactions). Accepting moves the request to that date.
  • create_eventAgree on a time with one or several people (`participants`, e.g. ["Maru", "Eugenia", "Ángel"]) or with a whole group (`group`) — it delivers: notification, a card each one confirms or declines, and it lands in everyone's calendar. Every name is resolved first: if one fails, nothing is created and the error says which. With one person it lives in your direct chat; with several outside a group it is in no single chat, and `message` is left in your direct chat with each. Use this instead of send_message for any time you agreed on. Without participants or group it is only in your own calendar. `projects` tags it (privately). `who_does_it` says who has the ball when ONE person does the work ('me', a participant or member, or 'both').
  • update_eventChange title, time or location, invite more people (`add_participants` — alone or with other changes; each gets a notification and a card, and it goes back to pending confirmation), add and remove its projects, or pass the ball (`who_does_it`, which may name someone just added). Anyone in the commitment can invite, not only its creator. Moving the time puts it back to pending confirmation.
  • confirm_eventConfirm your attendance.
  • cancel_eventCancel a commitment. The other person is NOT notified — they find out when they next open the chat. To move it instead, use update_event.

Context

  • get_pending_interactionsWhat you owe, what you are owed, open requests.
  • get_commitmentsUpcoming meetings and commitments: who is in each one and whether they confirmed (`with`), its group if it was agreed in one, who has the ball, and your projects on each; `project` narrows it to one.
  • get_contact_historyEverything shared with one person.
  • get_agentDetails of the agents you registered.
  • get_task_statsHow much you finish in the last 7 days, 30 days or 12 months: vs. the previous period, per day, on time, active days, streak, best day and hour, by project and by list, about how many hours of work it was (`time_spent`), and today's count and minutes (`today`). Advances count as completed (`of_which_advances` says how many).

Deep research

  • searchSearch across everything you can see — messages, tasks, requests, commitments — and get back records you can open.
  • fetchOpen one record returned by search, in full.

Principles

Tools are idempotent where it applies, every action keeps its origin (message and conversation), and the human can review it. Agent autonomy can be set to auto, suggest, or confirm.

TermsPrivacyMCP docs