Tax MCP guideDocs home · Quickstart · All guides

How to design a deterministic-decline UI

Explain why Tax MCP declined without making the user think the API failed or that a retry can bypass the boundary.

Target reader

Product designers, support owners, and frontend engineers building review queues.

Supported-envelope boundary

A decline only names the modeled boundary Tax MCP can see. It cannot detect income or facts a caller omitted.

Reference links: GET /api/mcp/tax-capabilities for the supported envelope, OpenAPI for request and response schema, roadmap feedback, changelog/release notes, support/contact, and terms.

What to show

Show the decline code, reason, next_action, and the workflow or route that declined.

Use neutral language: 'Needs preparer review' or 'Outside the supported envelope.'

Link to the supported envelope and roadmap feedback path from the review state.

What not to show

Do not show a tax value, confidence score, or guessed result for the declined surface.

Do not auto-mint a new Idempotency-Key for the same body. The same unsupported input will decline again.

Response-state contract

StateHTTPBilledRetry safenext_actionClient display guidance
Computed200Yes on metered customer planstrue with the same Idempotency-KeynoneShow computed figures with derivation and provenance.
Deterministic decline200Yes on metered customer plansfalse for the same unsupported bodyreview_inputsShow the reason and route to review; do not show a tax estimate.
needs_review200Yes on metered customer planstrue for replay; human review is still requiredreview_inputsShow the review queue item, diff, reason, and provenance.
Validation error400Nofalse until request shape is fixedfix_request_and_resubmitShow a request-error state and tell the developer what field to fix.
Auth error401/403Nofalse until credentials are fixedcheck_credentialsAsk the operator to check, rotate, or unsuspend the API key.
Quota or rate limit429Noquota: false; rate: true after backoffupgrade_plan_or_wait_next_period or retry_after_backoffHard-stop quota or transient rate-limit message; do not overrun.
Idempotency replay200Once totalalready replayednoneShow the original result and reassure that replay did not double bill.
Idempotency mismatch409Nofalse with that keyuse_new_idempotency_keyClient bug: same key was used for a different body.
Idempotency in progress409Notrue with the same key after a short waitretry_after_inflight_completesShow in-progress and retry the same key.
Server failure500/503No500: false; 503: true after backofffix_request_and_resubmit or retry_after_backoffOpen support if persistent; do not show a computed result.

First-user comprehension checkpoint

First evaluators should be able to explain these states without private help before sending taxpayer-like payloads. Each row names the guide to read, the safe recovery behavior, and the privacy-safe telemetry event that can detect confusion.

State to understandExpected understandingPrimary guideSafe recoveryTelemetry hook
Computed 200A computed 200 can show figures, provenance, legal_notice, billed, retry_safe, and next_action.read-responseReplay the same Idempotency-Key for network uncertainty; do not change the body under the same key.docs_guides_computed_comprehension
Deterministic decline 200A computed:false 200 is a successful safety answer, not an outage or a free retry loop.deterministic-decline-uiShow code, reason, billed, retry_safe, and next_action; route to review or feedback without a tax estimate.docs_guides_decline_comprehension
needs_review 200needs_review is not a final computed tax answer; it is a human-review workflow state.read-responseShow diff, reason/provenance, billed, retry_safe, and next_action; route to a review queue.docs_guides_needs_review_comprehension
Validation errorA 400 validation failure is unbilled and should be fixed before resubmitting.billing-retries-quotaFix the request shape; do not ask support to infer a missing taxpayer fact.docs_guides_validation_recovery_view
Auth errorA 401/403 auth failure is unbilled and usually means the API key or account state needs attention.billing-retries-quotaCheck, rotate, or unsuspend the key; never paste keys or bearer tokens into support or feedback.docs_guides_auth_recovery_view
Quota or rate limitA 429 is unbilled; monthly quota is a hard cap, while per-minute rate limit can wait/back off.billing-retries-quotaWait, back off, or use account/billing support; do not expect silent overage.docs_guides_quota_recovery_view
Idempotency replaySame-key same-body replay returns the stored result and bills once total.billing-retries-quotaReuse the same key for uncertainty about the same logical POST.docs_guides_replay_comprehension
Idempotency mismatchSame-key different-body mismatch is a client bug, unbilled, and must not be retried with that key.billing-retries-quotaUse a new key only for a new logical request after fixing the client bug.docs_guides_mismatch_recovery_view
Idempotency in progressAn in-progress response is unbilled at failure time and may be retried with the same key after a short wait.billing-retries-quotaRetry the same key after the in-flight request settles.docs_guides_in_progress_recovery_view
Server failureA 500/503 is unbilled and must not produce a guessed tax result in the client UI.read-responseRetry only when the response class says retry is safe; open support if persistent.docs_guides_server_failure_recovery_view

Examples to reproduce

This decline is a successful safety outcome. It has computed:false, a stable code, billed, retry_safe, next_action, and a reason suitable for a review queue. It intentionally has no tax value.

{
  "computed": false,
  "code": "schedule_c_needs_review",
  "reason": "Schedule C self-employment compute requires scheduleCIsSingleSolePropFinalNetAffirmed:true before Tax MCP can compute this bounded path.",
  "billed": true,
  "retry_safe": false,
  "next_action": "review_inputs"
}

Checklist

Telemetry, support, and privacy handoff

Privacy-safe guide telemetry may record only named events and coarse categories. It must never include API keys, bearer tokens, taxpayer documents, raw taxpayer PII, full unredacted request/response bodies, or unredacted support text.

EventSurfacePurposeSafe fields
docs_guide_index_view/docs/guidesDetect whether evaluators reach the guide index from docs or quickstart.session_id, surface, timestamp
docs_guides_comprehension_map_view/docs/guidesDetect whether first users see the response-class comprehension map before sending payloads.session_id, surface, timestamp
docs_guides_to_quickstart_click/docs/guides/*Measure guide-to-first-call continuity without recording request bodies or secrets.session_id, guide_slug, timestamp
docs_guides_support_click/docs/guides/*Route account or operational confusion to support without collecting raw support text.session_id, guide_slug, support_category, timestamp
docs_guides_feedback_click/docs/guides/*Route unsupported-envelope surprises to structured feedback without taxpayer PII.session_id, guide_slug, response_class, decline_or_error_code, timestamp
docs_guides_privacy_notice_view/docs/guides/*Confirm the no-secrets/no-PII support boundary is visible before support or feedback handoff.session_id, guide_slug, timestamp

Forbidden fields: api_key, bearer_token, raw_taxpayer_document, raw_taxpayer_pii, full_unredacted_request_body, full_unredacted_response_body, unredacted_free_form_support_text.

Run the first safe callContact supportFile roadmap feedback