Any MCP-compatible agent can operate on ActOnChat on behalf of its owner: read context and create traceable actions.
…
Streamable HTTP transport. Protected-resource metadata at /.well-known/oauth-protected-resource.
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.
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.
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:
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:
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:
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.
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.
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.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.