Skip to main content
Use this path when your MCP server is not written in Node.
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.
  1. Implement stateless MCP 2026-07-28 and server/discover.
  2. Validate every present HTTP Origin against an explicit allowlist.
  3. Require matching MCP-Protocol-Version, Mcp-Method, and, for named calls, Mcp-Name.
  4. Require current protocol metadata in params._meta for every request.
  5. Return resultType: "complete", server identity metadata, and deterministic tool-list cache hints.
  6. Emit confirmed telemetry when a normal product tool completes. Add accountRef/userRef only from verified product authentication, anonymousRef only from a product-owned first-party pre-login ID, and sessionRef only from server/product state that already proves a journey. Keep customerRef only for durable Ask once; when accountRef is present it must be the exact same opaque account ID. Never pair customerRef with userRef alone or derive any reference from names, emails, prompts, caller inputs, or tool arguments.
  7. Register both record_product_feedback_consent and report_product_feedback with strict input schemas.
  8. Decorate a schema-less object result at structuredContent._agentFeedback; for a tool with outputSchema, preserve its structured result and use the standalone JSON TextContent location. Include the state and only the action currently allowed. A consent_required result carries consentTool, the exact question, and a scoped feedbackHandle; it must not carry a report schema or report action.
  9. Forward only approved or declined from record_product_feedback_consent to /api/v2/consent/decisions. Approval returns a separate feedback_ready report action. Refusal returns no report action, and silence must never be inferred as approval.
  10. Call report_product_feedback only from a feedback_ready action and forward its bounded report with the scoped capability. Reports never contain consent fields.
Deliver telemetry through one bounded, process-local queue so rapid tool calls retain order and do not create an unbounded set of background requests. A telemetry delivery succeeds only when Epode returns HTTP 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.
Do not treat MCP client information, agent claims, or a transport connection as customer or agent identity. Do not create transport sessions for modern requests. Private telemetry references never enter the tool result’s agent-facing feedback envelope.

Verify

Test discovery, unsupported-version errors, origin rejection, header/body version consistency, deterministic tools/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