Skip to content

MCP vocabulary for decisions

Coalex is standardising the words it uses for human decisions on the Model Context Protocol elicitation vocabulary. Both sets of words work, everywhere, today.

If you have an existing integration, you do not need to change anything. Nothing has been removed and nothing has changed meaning. This page exists so you can move when it suits you, not because you must.

The mapping

MCP name Original name What it means
accept approved the human approved the call as proposed
accept-with-content corrected the human approved it after editing the output
decline rejected the human refused it, usually with an instruction
cancel expired nobody decided before the deadline — an operational outcome, not a judgement on the agent
input_required escalated the call is paused, waiting for a human

accept-with-content and corrected are the same decision: MCP distinguishes an accept that carried edits by the presence of content, rather than by a different action name.

Resolving

Either vocabulary, in both SDKs:

import coalex

# MCP names
coalex.resolve(escalation_id=eid, decision="accept")
coalex.resolve(escalation_id=eid, decision="decline", reason="unverified payee")
coalex.resolve(escalation_id=eid, decision="accept-with-content", corrections={"amount": "5000"})

# The original names keep working, unchanged
coalex.resolve(escalation_id=eid, decision="approved")
import { resolve } from "@coalex-ai/sdk";

await resolve({ escalationId, decision: "accept" });
await resolve({ escalationId, decision: "decline", reason: "unverified payee" });
await resolve({ escalationId, decision: "accept-with-content", corrections: { amount: "5000" } });

await resolve({ escalationId, decision: "approved" }); // still fine

The SDK does not translate. Whatever word you pass is the word that goes on the wire, so a payload you are debugging says what you actually sent.

Reading a result

Responses gained fields rather than changing any. status still returns exactly what it always returned; the MCP reading sits beside it:

result = coalex.resolve(escalation_id=eid, decision="accept")

result.status         # "approved"  — unchanged, whatever you sent
result.task_state     # "completed"
result.result_action  # "accept"
decision = coalex.evaluate(input=..., output=...)

decision.status      # "escalated" — unchanged
decision.task_state  # "input_required"

task_state and result_action are None when talking to a Coalex deployment that predates them. They are reported as absent rather than derived locally, because "this deployment is older" and "this decision has no action yet" are different facts and guessing would erase the difference.

Which should I use?

Use the MCP names in new code. They are the vocabulary the Gateway, the Decision Request API and the SDKs all share, so an agent that speaks them needs no translation layer as more of the platform becomes MCP-native.

Move existing code when you touch it. There is no deprecation deadline on this page, and there will not be one without notice here first.

What has not changed

  • Stored values. Coalex records approved / rejected / corrected / expired regardless of which word you send. Reports, exports and health scores are unaffected.
  • Your resume payload. The body delivered to a checkpoint resume hook is unchanged.
  • Anything else. If you send only the original vocabulary, every response is byte-identical to before.