{"mcp":"https://mcp.hespia.com/mcp","tools":[{"name":"whoami","title":"Who am I","description":"The person this connection is acting as (uid, email, name) and the orgs they belong to. Call this first — other tools use the same identity to resolve \"me\"/\"my\".","write":false,"params":[]},{"name":"list_orgs","title":"List organizations","description":"List the organizations you can access, with name and allowed sign-in domain.","write":false,"params":[]},{"name":"list_pods","title":"List pods (teams)","description":"List the pods/teams for an org, with mission, pod lead, members, and active/archived status.","write":false,"params":[{"name":"orgId","required":false,"description":"Org id (see list_orgs)."},{"name":"includeArchived","required":false,"description":"Include archived pods (default false)."}]},{"name":"list_areas","title":"List areas of responsibility","description":"List standing Areas of Responsibility for an org (each owned by one person, not quarter-scoped).","write":false,"params":[{"name":"orgId","required":false,"description":"Org id (see list_orgs)."}]},{"name":"list_members","title":"List org members","description":"List people in an org (auth members + directory-only entries used as KR/initiative owners).","write":false,"params":[{"name":"orgId","required":false,"description":"Org id (see list_orgs)."}]},{"name":"get_okrs","title":"Get OKRs for a quarter","description":"Fetch the full OKR tree (objectives → key results → initiatives → tracker) for a quarter. Omit `team` for an org-wide snapshot across all pods, or pass a pod/team id (or \"__company__\" for company-wide objectives) to scope to one pod.","write":false,"params":[{"name":"orgId","required":false,"description":"Org id (see list_orgs)."},{"name":"year","required":false,"description":"Calendar year, e.g. 2026. Defaults to the current quarter."},{"name":"quarter","required":false,"description":"Quarter 1–4. Defaults to the current quarter."},{"name":"team","required":false,"description":"Pod/team id (see list_pods), or \"__company__\". Omit for all pods."},{"name":"includeTracker","required":false,"description":"Include weekly tracker rows per KR (default true)."}]},{"name":"list_personal_tasks","title":"List tasks (todos)","description":"List standalone personal tasks (todos) for a quarter. Defaults to your own tasks in the current quarter, so \"what's on my list?\" needs no arguments.","write":false,"params":[{"name":"orgId","required":false,"description":"Org id (see list_orgs)."},{"name":"ownerId","required":false,"description":"Member id (see list_members). Omit for your own tasks."},{"name":"year","required":false,"description":"Calendar year, e.g. 2026. Defaults to the current quarter."},{"name":"quarter","required":false,"description":"Quarter 1–4. Defaults to the current quarter."},{"name":"onlyOpen","required":false,"description":"Drop completed tasks (default false)."},{"name":"onlyToday","required":false,"description":"Only what's due today, overdue, or flagged for today (default false)."},{"name":"tag","required":false,"description":"Only tasks carrying this tag."}]},{"name":"list_chases","title":"List owner chases","description":"List open/answered/resolved owner 'chases' (diagnostic follow-ups the weekly review raised) for a pod and quarter.","write":false,"params":[{"name":"orgId","required":false,"description":"Org id (see list_orgs)."},{"name":"teamId","required":true,"description":"Pod/team id (see list_pods)."},{"name":"year","required":false,"description":"Calendar year, e.g. 2026. Defaults to the current quarter."},{"name":"quarter","required":false,"description":"Quarter 1–4. Defaults to the current quarter."}]},{"name":"list_checkins","title":"List weekly KR check-ins","description":"The per-KR confidence reads (green/amber/red plus a 'why' note) recorded for one pod in one week. Defaults to the current week of the current quarter.","write":false,"params":[{"name":"orgId","required":false,"description":"Org id (see list_orgs)."},{"name":"teamId","required":true,"description":"Pod/team id (see list_pods)."},{"name":"year","required":false,"description":"Calendar year, e.g. 2026. Defaults to the current quarter."},{"name":"quarter","required":false,"description":"Quarter 1–4. Defaults to the current quarter."},{"name":"weekId","required":false,"description":"Tracker week id, e.g. \"W3\". Defaults to the current week."}]},{"name":"list_messages","title":"List messages sent to a person","description":"Messages on someone's Tasks page (see send_message), newest first. Defaults to your own open messages. Each carries its status (open/done/dismissed/superseded), any reply the person wrote back, for a meeting the notes they wrote afterwards (notes.text), and for each proposed task whether it was added (addedTaskId) or skipped (dismissedAt, with dismissNote saying why). Proposed actions come back with their status (proposed/approved/declined); an approved one you haven't done yet has doneAt null — do it, sending `approvedText` (the person's edit wins over your draft), then call complete_action. Check `ref` before re-sending something you already sent. `supersedes` / `supersededBy` link a card to the one it replaced and the one that replaced it.","write":false,"params":[{"name":"orgId","required":false,"description":"Org id (see list_orgs)."},{"name":"toUserId","required":false,"description":"Whose inbox (see list_members). Defaults to you."},{"name":"status","required":false,"description":"Filter by status. Omit for every message, whatever its status."},{"name":"awaitingAgent","required":false,"description":"Only messages with an approved action you haven't completed yet. Ignores `status` — a closed card can still carry work for you."}]},{"name":"list_notes","title":"List plan notes","description":"List the notes on the Plan view, most recently edited first. Filter by pod, quarter or text. Rows carry a short snippet, not the body; call get_note for the full markdown.","write":false,"params":[{"name":"orgId","required":false,"description":"Org id (see list_orgs)."},{"name":"team","required":false,"description":"Pod/team id (see list_pods), or \"__company__\". Omit for every pod."},{"name":"year","required":false,"description":"Only notes filed under this year."},{"name":"quarter","required":false,"description":"Only notes filed under this quarter (1–4)."},{"name":"search","required":false,"description":"Only notes whose title, snippet or tags contain this text."},{"name":"limit","required":false,"description":"Max rows (default 50)."}]},{"name":"get_note","title":"Read a plan note","description":"Read one note: title, body as markdown, tags, pod and quarter. Takes the note id, or a Plan link (…/plan/<noteId>) as-is. The markdown is the saved copy; while someone is typing in the note it can trail their screen by a second or two.","write":false,"params":[{"name":"noteId","required":true,"description":"Note id, or a Plan link ending in /plan/<noteId>."}]},{"name":"create_objective","title":"Create an objective","description":"Create an objective in a pod for a quarter. Use \"__company__\" as `team` for a company-wide objective.","write":true,"params":[{"name":"orgId","required":false,"description":"Org id (see list_orgs)."},{"name":"team","required":true,"description":"Pod/team id (see list_pods), or \"__company__\"."},{"name":"year","required":false,"description":"Calendar year, e.g. 2026. Defaults to the current quarter."},{"name":"quarter","required":false,"description":"Quarter 1–4. Defaults to the current quarter."},{"name":"title","required":true,"description":"Objective title."},{"name":"icon","required":false,"description":"Optional icon/emoji."},{"name":"color","required":false,"description":"Optional color token."},{"name":"areaId","required":false,"description":"Optional Area of Responsibility id (see list_areas)."},{"name":"alignedTo","required":false,"description":"Optional company objective id this aligns to."}]},{"name":"update_objective","title":"Update an objective","description":"Patch fields on an existing objective. Only provided fields change.","write":true,"params":[{"name":"objId","required":true,"description":"Objective id."},{"name":"title","required":false,"description":""},{"name":"icon","required":false,"description":""},{"name":"color","required":false,"description":""},{"name":"areaId","required":false,"description":"Area of Responsibility id, or empty string to clear."},{"name":"alignedTo","required":false,"description":"Company objective id, or empty string to clear."},{"name":"team","required":false,"description":"Move to a different pod/team id."}]},{"name":"create_key_result","title":"Create a key result","description":"Add a key result under an objective.","write":true,"params":[{"name":"objId","required":true,"description":"Parent objective id."},{"name":"title","required":true,"description":"Key result title."},{"name":"displayId","required":false,"description":"Short label, e.g. \"KR1\"."},{"name":"isHeadline","required":false,"description":"Mark as the objective's headline KR."},{"name":"unit","required":false,"description":"Measurement unit, e.g. \"%\", \"$\"."},{"name":"target","required":false,"description":"Target value, e.g. \"20%\" or 20."}]},{"name":"update_key_result","title":"Update a key result","description":"Patch fields on a key result. Only provided fields change.","write":true,"params":[{"name":"objId","required":true,"description":"Parent objective id."},{"name":"krId","required":true,"description":"Key result id."},{"name":"title","required":false,"description":""},{"name":"displayId","required":false,"description":""},{"name":"isHeadline","required":false,"description":""},{"name":"unit","required":false,"description":""},{"name":"target","required":false,"description":""}]},{"name":"create_initiative","title":"Create an initiative","description":"Add an initiative under a key result.","write":true,"params":[{"name":"objId","required":true,"description":"Parent objective id."},{"name":"krId","required":true,"description":"Parent key result id."},{"name":"text","required":true,"description":"Initiative description."},{"name":"status","required":false,"description":"Initiative status (e.g. \"todo\", \"in_progress\", \"done\")."},{"name":"ownerId","required":false,"description":"Owner member id (see list_members)."},{"name":"dueDate","required":false,"description":"Due date, ISO string."}]},{"name":"update_initiative","title":"Update an initiative","description":"Patch fields on an initiative. Only provided fields change.","write":true,"params":[{"name":"objId","required":true,"description":"Parent objective id."},{"name":"krId","required":true,"description":"Parent key result id."},{"name":"initId","required":true,"description":"Initiative id."},{"name":"text","required":false,"description":""},{"name":"status","required":false,"description":""},{"name":"ownerId","required":false,"description":""},{"name":"dueDate","required":false,"description":""}]},{"name":"delete_objective","title":"Delete an objective","description":"Permanently delete an objective with all its key results, initiatives and tracker weeks. No undo. Only when the person asked for this one to go. Org admins only.","write":true,"params":[{"name":"objId","required":true,"description":"Objective id (see get_okrs)."}]},{"name":"delete_key_result","title":"Delete a key result","description":"Permanently delete a key result with its initiatives and tracker weeks. No undo. Only when the person asked for this one to go.","write":true,"params":[{"name":"objId","required":true,"description":"Parent objective id."},{"name":"krId","required":true,"description":"Key result id."}]},{"name":"delete_initiative","title":"Delete an initiative","description":"Permanently delete one initiative from a key result. No undo. Only when the person asked for it.","write":true,"params":[{"name":"objId","required":true,"description":"Parent objective id."},{"name":"krId","required":true,"description":"Parent key result id."},{"name":"initId","required":true,"description":"Initiative id."}]},{"name":"update_kr_progress","title":"Record a KR's weekly numbers","description":"Write one week's tracker values for a key result. Pass `cells` (a column-name → value map, matched against the KR's trackerCols) or `values` (raw array, positional). Defaults to this week. Merges, so columns you omit keep their current value.","write":true,"params":[{"name":"objId","required":true,"description":"Parent objective id (see get_okrs)."},{"name":"krId","required":true,"description":"Key result id (see get_okrs)."},{"name":"weekId","required":false,"description":"Tracker week id, e.g. \"W3\". Defaults to the current week."},{"name":"cells","required":false,"description":"Column name → value, e.g. {\"Signups\": 120}. Names come from the KR's trackerCols."},{"name":"values","required":false,"description":"Positional values aligned to trackerCols. Use instead of `cells` when you know the order."}]},{"name":"record_checkin","title":"Record a weekly KR check-in","description":"Set this week's confidence read on a key result (green / amber / red) plus an optional 'why' note. One check-in per KR per week — recording again overwrites it.","write":true,"params":[{"name":"orgId","required":false,"description":"Org id (see list_orgs)."},{"name":"teamId","required":true,"description":"Pod/team id (see list_pods)."},{"name":"objId","required":true,"description":"Parent objective id (see get_okrs)."},{"name":"krId","required":true,"description":"Key result id (see get_okrs)."},{"name":"confidence","required":true,"description":"How confident the owner is of hitting this KR."},{"name":"note","required":false,"description":"Why — the one line that makes the colour mean something."},{"name":"year","required":false,"description":"Calendar year, e.g. 2026. Defaults to the current quarter."},{"name":"quarter","required":false,"description":"Quarter 1–4. Defaults to the current quarter."},{"name":"weekId","required":false,"description":"Tracker week id, e.g. \"W3\". Defaults to the current week."}]},{"name":"create_task","title":"Add a task (todo)","description":"Add a standalone task. Defaults to you as the owner and the current quarter, so adding a todo needs nothing but its text. Assign it to someone else with ownerId, and set priority/impact/effort when you know them. Nothing here guesses which key result the task serves — pass `link` if you know it (see get_okrs), otherwise the owner is asked in the app.","write":true,"params":[{"name":"orgId","required":false,"description":"Org id (see list_orgs)."},{"name":"text","required":true,"description":"What the task is."},{"name":"ownerId","required":false,"description":"Who it's for (see list_members). Defaults to you."},{"name":"dueDate","required":false,"description":"Due date as \"YYYY-MM-DD\"."},{"name":"today","required":false,"description":"Flag it for Today (the flag expires overnight)."},{"name":"description","required":false,"description":"Longer notes."},{"name":"tags","required":false,"description":"Tags, e.g. [\"eng\", \"deep-work\"]. Normalized to lowercase-dashed."},{"name":"subtasks","required":false,"description":"Steps within the task."},{"name":"repeat","required":false,"description":"Recurrence. Completing a repeating task mints the next occurrence."},{"name":"priority","required":false,"description":"How much it matters: high (today, or the day is a loss), medium (this week), low (whenever it fits). Left unset when omitted — \"nobody has judged this\" is a different fact from \"low\"."},{"name":"impact","required":false,"description":"How much it moves a key result: high (moves a key result on its own), medium (a real step toward a key result), low (keeps things running; no key result moves). Not the same as priority — urgent and important are different claims. Left unset when omitted."},{"name":"effort","required":false,"description":"Rough size: quick (under 15 minutes), short (up to an hour), half (a few hours of real focus), deep (needs a cleared calendar). Left unsized when omitted."},{"name":"link","required":false,"description":"Optional link to the OKR this task serves (see get_okrs)."},{"name":"year","required":false,"description":"Calendar year, e.g. 2026. Defaults to the current quarter."},{"name":"quarter","required":false,"description":"Quarter 1–4. Defaults to the current quarter."}]},{"name":"update_task","title":"Update a task (todo)","description":"Patch a task: reword it, move its due date, retag it, reassign it, set its priority/impact/effort, tick it off. Only provided fields change.","write":true,"params":[{"name":"orgId","required":false,"description":"Org id (see list_orgs)."},{"name":"taskId","required":true,"description":"Task id (see list_personal_tasks)."},{"name":"text","required":false,"description":""},{"name":"done","required":false,"description":"Tick or untick it."},{"name":"dueDate","required":false,"description":"\"YYYY-MM-DD\", or empty string to clear."},{"name":"today","required":false,"description":"Flag or unflag it for Today."},{"name":"description","required":false,"description":""},{"name":"tags","required":false,"description":"Replaces the whole tag list."},{"name":"subtasks","required":false,"description":"Replaces the whole step list."},{"name":"ownerId","required":false,"description":"Reassign to a different member."},{"name":"repeat","required":false,"description":""},{"name":"priority","required":false,"description":""},{"name":"impact","required":false,"description":""},{"name":"effort","required":false,"description":""},{"name":"link","required":false,"description":"Optional link to the OKR this task serves (see get_okrs)."}]},{"name":"complete_task","title":"Complete a task (todo)","description":"Tick a task off. If it repeats, its next occurrence is created automatically. Use update_task with done:false to un-tick one.","write":true,"params":[{"name":"orgId","required":false,"description":"Org id (see list_orgs)."},{"name":"taskId","required":true,"description":"Task id (see list_personal_tasks)."}]},{"name":"delete_task","title":"Delete a task (todo)","description":"Permanently delete a task. Prefer complete_task for work that's finished — deleting loses the completion record that throughput and streaks are counted from.","write":true,"params":[{"name":"orgId","required":false,"description":"Org id (see list_orgs)."},{"name":"taskId","required":true,"description":"Task id (see list_personal_tasks)."}]},{"name":"attach_signal","title":"Attach an execution signal to a KR","description":"Link a real external artifact (merged PR, closed issue, deploy, message) to a key result so Hespia can ground coaching in actual execution. Idempotent on (source, externalId).","write":true,"params":[{"name":"orgId","required":false,"description":"Org id (see list_orgs)."},{"name":"teamId","required":true,"description":"Pod/team id (see list_pods)."},{"name":"year","required":false,"description":"Calendar year, e.g. 2026. Defaults to the current quarter."},{"name":"quarter","required":false,"description":"Quarter 1–4. Defaults to the current quarter."},{"name":"source","required":true,"description":"Where the signal came from."},{"name":"externalId","required":true,"description":"Stable id of the artifact in its source system (e.g. PR number, issue key). Used for idempotency."},{"name":"kind","required":false,"description":"What kind of artifact this is."},{"name":"title","required":false,"description":"Human-readable title, e.g. the PR/issue title."},{"name":"url","required":false,"description":"Link back to the artifact."},{"name":"krId","required":false,"description":"Key result id this signal is evidence for (see get_okrs)."},{"name":"objId","required":false,"description":"Objective id, if the signal isn't tied to a specific KR."},{"name":"occurredAt","required":false,"description":"When the artifact happened (ISO string, e.g. PR merge time). Defaults to now."}]},{"name":"send_message","title":"Send a message to someone's Tasks page","description":"Post an update, a question, an alert or a meeting prep to a person's Tasks page, optionally with tasks you think they should add. They see it at the top of their list and can add or skip each task with one click, reply, mark it done or dismiss it. A meeting (kind: meeting, with meetingAt and people) sorts by when it is and asks for notes once it has passed. Read the outcome back with list_messages. Defaults to you as the recipient. Keep the body short — it's read on a task list, not in an inbox. Anything longer (a digest, a report, a table) goes in `details` as markdown; the card folds it under the body. Before sending, list_messages and check `ref` so a re-run doesn't send the same prep twice. Tasks are things THEY do; actions are things YOU offer to do (a drafted reply, a Slack post) that wait for their Approve — never do one before it's approved. Sending the same kind of card every day? Pass `supersedes` with yesterday's id so the old one closes instead of stacking up.","write":true,"params":[{"name":"orgId","required":false,"description":"Org id (see list_orgs)."},{"name":"title","required":true,"description":"One line. What this is about."},{"name":"body","required":false,"description":"The message itself. Plain text; a few short lines at most."},{"name":"details","required":false,"description":"The long form, as markdown: headings, bullet lists, tables, links. Shown folded under the body until they open it. Use it for a digest or report instead of cramming the body. Capped at 20000 characters."},{"name":"toUserId","required":false,"description":"Who it's for (see list_members). Defaults to you."},{"name":"from","required":false,"description":"Which agent is speaking, e.g. \"brain\" or \"release-bot\". Defaults to \"brain\"."},{"name":"kind","required":false,"description":"update (FYI), question (needs an answer), alert (needs action now), meeting (prep for a meeting; give meetingAt and people). Defaults to update."},{"name":"meetingAt","required":false,"description":"Meetings only. When it starts, ISO 8601 with offset (\"2026-09-15T14:30:00+05:30\") or a bare \"YYYY-MM-DD\" for all day."},{"name":"people","required":false,"description":"Meetings only. Who's in the room, as names. Not user ids — most attendees are outside the org."},{"name":"ref","required":false,"description":"Your own handle for this message (a calendar event id, \"2026-09-15-ica-1430\"). Returned by list_messages so a re-run can find what it already sent."},{"name":"tasks","required":false,"description":"Tasks to propose. Each becomes a one-click \"Add task\" button in the app."},{"name":"actions","required":false,"description":"Actions you offer to take. Each shows Approve / Edit / Decline in the app. Poll list_messages(awaitingAgent) and complete_action when done."},{"name":"link","required":false,"description":"Optional link back to the source (a PR, a doc, a dashboard)."},{"name":"taskId","required":false,"description":"The existing task this message is about, if any (see list_personal_tasks)."},{"name":"supersedes","required":false,"description":"Pass the id of the card this one replaces, for example yesterday's Top 3 (find it with list_messages and your `ref`). The old card closes as superseded and moves to history. It stays open if it went to someone else, came from a different agent, or still has a task, an action or approved work waiting; the result says why. This message is sent either way."}]},{"name":"complete_action","title":"Mark an approved action as done","description":"After you've carried out an action the person approved (see list_messages with awaitingAgent), stamp it done with a word on the result. Only approved, not-yet-done actions on a message you sent can be completed.","write":true,"params":[{"name":"orgId","required":false,"description":"Org id (see list_orgs)."},{"name":"messageId","required":true,"description":"The message id from list_messages."},{"name":"actionId","required":true,"description":"The action's id within the message (a1, a2, …)."},{"name":"result","required":false,"description":"What happened, briefly: \"sent\", a message link, a thread id."}]},{"name":"create_note","title":"Create a plan note","description":"Start a new note on the Plan view, with a title and a markdown body. File it under a pod with `team` so it shows on that pod's Plan tab. Defaults to the current quarter and to you as owner.","write":true,"params":[{"name":"orgId","required":false,"description":"Org id (see list_orgs)."},{"name":"title","required":true,"description":"Note title."},{"name":"markdown","required":false,"description":"The body, as markdown. Headings, lists, [ ] task lists, tables, links."},{"name":"team","required":false,"description":"Pod/team id (see list_pods), or \"__company__\". Omit for a note on no pod."},{"name":"year","required":false,"description":"Calendar year, e.g. 2026. Defaults to the current quarter."},{"name":"quarter","required":false,"description":"Quarter 1–4. Defaults to the current quarter."},{"name":"tags","required":false,"description":"Tags, e.g. [\"planning\"]."}]},{"name":"update_note","title":"Update a plan note","description":"Change a note's title, tags, or whole body. `markdown` REPLACES the body: read it first with get_note and send back the full edited text. To add to the end, use append_to_note instead. Safe while someone has the note open: the edit merges into their screen live, and text they type at the same moment is kept.","write":true,"params":[{"name":"noteId","required":true,"description":"Note id, or a Plan link ending in /plan/<noteId>."},{"name":"title","required":false,"description":""},{"name":"markdown","required":false,"description":"The new full body, as markdown."},{"name":"tags","required":false,"description":"Replaces the whole tag list."},{"name":"force","required":false,"description":"Rewrite even if the note holds content markdown can't express. Only after the person agrees."}]},{"name":"append_to_note","title":"Add to the end of a plan note","description":"Add markdown to the end of a note without touching what's there. The safest way to write into a note someone is working in: it shows up on their screen live.","write":true,"params":[{"name":"noteId","required":true,"description":"Note id, or a Plan link ending in /plan/<noteId>."},{"name":"markdown","required":true,"description":"What to add, as markdown."}]},{"name":"delete_note","title":"Delete a plan note","description":"Permanently delete a note. No undo. Only when the person asked for this one to go. Objectives already made from the note are not touched.","write":true,"params":[{"name":"noteId","required":true,"description":"Note id, or a Plan link ending in /plan/<noteId>."}]}]}