For schema-less object results, emit
structuredContent._agentFeedback. When the business tool
declares outputSchema, leave structuredContent exactly schema-valid and emit a standalone JSON
TextContent block shaped as {"_agentFeedback": {...}} instead. A following plain-text instruction
may restate the action. Never mutate a strict business schema or emit two machine-readable actions.Download the contract
Required behavior
Never ask is the most reliable mode on current Codex and Claude MCP clients. Ask once and Ask every time depend on client support for surfacing and resuming consent; treat them as experimental until you verify the exact client versions you support. Never infer approval when a client stops early.- Implement stateless MCP
2026-07-28andserver/discover. - Validate every present HTTP
Originagainst an explicit allowlist. - Require matching
MCP-Protocol-Version,Mcp-Method, and, for named calls,Mcp-Name. - Require current protocol metadata in
params._metafor every request. - Return
resultType: "complete", server identity metadata, and deterministic tool-list cache hints. - Emit confirmed telemetry when a normal product tool completes. Add
accountRef/userRefonly from verified product authentication,anonymousRefonly from a product-owned first-party pre-login ID, andsessionRefonly from server/product state that already proves a journey. KeepcustomerRefonly for durable Ask once; whenaccountRefis present it must be the exact same opaque account ID. Never paircustomerRefwithuserRefalone or derive any reference from names, emails, prompts, caller inputs, or tool arguments. - Register both
record_product_feedback_consentandreport_product_feedbackwith strict input schemas. - Decorate a schema-less object result at
structuredContent._agentFeedback; for a tool withoutputSchema, preserve its structured result and use the standalone JSONTextContentlocation. Include thestateand only the action currently allowed. Aconsent_requiredresult carriesconsentTool, the exact question, and a scopedfeedbackHandle; it must not carry a report schema or report action. - Forward only
approvedordeclinedfromrecord_product_feedback_consentto/api/v2/consent/decisions. Approval returns a separatefeedback_readyreport action. Refusal returns no report action, and silence must never be inferred as approval. - Call
report_product_feedbackonly from afeedback_readyaction and forward its bounded report with the scoped capability. Reports never contain consent fields.
202 and
the integer accepted plus dropped counts account for the submitted batch. Treat reported drops and malformed
receipts as terminal, log the affected interaction ID without customer data or credentials, and retry only
timeouts, HTTP 408/429, and server errors with bounded backoff.
If delivery returns retryable: true, tell the agent to retry exactly once with the same handle and report.
Do not retry validation, consent, or other non-retryable failures.
Verify
Test discovery, unsupported-version errors, origin rejection, header/body version consistency, deterministictools/list, a product-tool call, consent_required and feedback_ready actions, approval and refusal,
feedback-tool submission, idempotency, and the 2025-11-25 compatibility path.
See MCP 2026-07-28 reference for the exact contract.
View the runnable language-neutral MCP example