Make one supported computed call, then inspect a deterministic decline and a needs_review response. The goal is to learn the product contract before building around it: auth, canonical host, idempotency, billing, retry safety, provenance, and next_action.
Authorization: Bearer <api_key>. Treat it like a password.https://tax-mcp.com.Content-Type: application/json.Idempotency-Key on every billable POST.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.
Preflight this example against the capability manifest before sending taxpayer-like payloads. It names modeled fields, required affirmations, deterministic decline codes, needs_review states, not-modeled residuals, billing semantics, and docs links. OpenAPI lives at /api/openapi.json.
curl https://tax-mcp.com/api/mcp/tax-compute/federal \
-H "Authorization: Bearer <api_key>" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"year": 2025,
"filingStatus": "single",
"wages": 85000,
"medicareWages": 85000,
"federalWithholding": 9500
}'The same first safe call in TypeScript:
import crypto from "node:crypto";
const response = await fetch("https://tax-mcp.com/api/mcp/tax-compute/federal", {
method: "POST",
headers: {
Authorization: "Bearer <api_key>",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
year: 2025,
filingStatus: "single",
wages: 85000,
medicareWages: 85000,
federalWithholding: 9500,
}),
});
const body = await response.json();
if (body.computed) {
console.log(body.totalTax, body.next_action);
} else {
console.log(body.code, body.reason, body.next_action);
}A computed 200 on a metered customer plan is billable. Replay the same Idempotency-Key with the same body if a network retry is needed; do not mint a new key for an unknown result.
This request omits the required Schedule C affirmation. Tax MCP returns a successful safety answer:computed:false, a code, a reason, billed, retry_safe, and next_action. It does not leak a tax value.
curl https://tax-mcp.com/api/mcp/tax-compute/federal \
-H "Authorization: Bearer <api_key>" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"year": 2025,
"filingStatus": "single",
"wages": 80000,
"scheduleCIncome": 20000
}'{
"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"
}Reconcile can compute independently and still route the comparison to human review. Filed values are reconciliation oracles, not compute inputs.
curl https://tax-mcp.com/api/mcp/tax-compute/reconcile \
-H "Authorization: Bearer <api_key>" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"sourceProfile": {
"state": "ca",
"year": 2025,
"filingStatus": "single",
"wages": 80000,
"medicareWages": 80000,
"caWithholding": 5000
},
"filed": {
"stateAGI": "<caller-supplied filed value>"
}
}'{
"status": "needs_review",
"computed": {
"computed": true,
"state": "ca",
"year": 2025,
"stateTaxableIncome": "<computed value elided>",
"totalTax": "<computed value elided>"
},
"diff": [
{
"line": "CA AGI (540:17)",
"engine": "<computed value elided>",
"filed": "<filed value supplied by caller, elided>",
"delta": "<difference elided>",
"cls": "DIFFERS",
"note": "source set appears incomplete vs the filed oracle; a human reviews"
}
],
"billed": true,
"retry_safe": true,
"next_action": "review_inputs",
"provenance": {
"engine": "deterministic",
"jurisdiction": "ca",
"tax_year": 2025
}
}| State | HTTP | Billed | Retry safe | next_action | Client display guidance |
|---|---|---|---|---|---|
| Computed | 200 | Yes on metered customer plans | true with the same Idempotency-Key | none | Show computed figures with derivation and provenance. |
| Deterministic decline | 200 | Yes on metered customer plans | false for the same unsupported body | review_inputs | Show the reason and route to review; do not show a tax estimate. |
| needs_review | 200 | Yes on metered customer plans | true for replay; human review is still required | review_inputs | Show the review queue item, diff, reason, and provenance. |
| Validation error | 400 | No | false until request shape is fixed | fix_request_and_resubmit | Show a request-error state and tell the developer what field to fix. |
| Auth error | 401/403 | No | false until credentials are fixed | check_credentials | Ask the operator to check, rotate, or unsuspend the API key. |
| Quota or rate limit | 429 | No | quota: false; rate: true after backoff | upgrade_plan_or_wait_next_period or retry_after_backoff | Hard-stop quota or transient rate-limit message; do not overrun. |
| Idempotency replay | 200 | Once total | already replayed | none | Show the original result and reassure that replay did not double bill. |
| Idempotency mismatch | 409 | No | false with that key | use_new_idempotency_key | Client bug: same key was used for a different body. |
| Idempotency in progress | 409 | No | true with the same key after a short wait | retry_after_inflight_completes | Show in-progress and retry the same key. |
| Server failure | 500/503 | No | 500: false; 503: true after backoff | fix_request_and_resubmit or retry_after_backoff | Open support if persistent; do not show a computed result. |
Recovery is state-specific: fix request shape for validation errors, add required affirmations only when the capability manifest names them, route needs_review to a human, reuse the same idempotency key for safe replay, back off for rate limits, open support for persistent failures, or file roadmap feedback for unsupported workflows.
Preflight this example against the capability manifest before sending taxpayer-like payloads. It names modeled fields, required affirmations, deterministic decline codes, needs_review states, not-modeled residuals, billing semantics, and docs links. OpenAPI lives at /api/openapi.json.
{
"computed": true,
"year": 2025,
"filingStatus": "single",
"taxableIncome": 69250,
"incomeTax": 10149,
"totalTax": 10149,
"billed": true,
"retry_safe": true,
"next_action": "none",
"provenance": {
"engine": "deterministic",
"jurisdiction": "federal",
"tax_year": 2025
},
"legal_notice": {
"ref": "https://tax-mcp.com/terms#compute-notice",
"version": "v1"
}
}Preflight this example against the capability manifest before sending taxpayer-like payloads. It names modeled fields, required affirmations, deterministic decline codes, needs_review states, not-modeled residuals, billing semantics, and docs links. OpenAPI lives at /api/openapi.json.
{
"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"
}Preflight this example against the capability manifest before sending taxpayer-like payloads. It names modeled fields, required affirmations, deterministic decline codes, needs_review states, not-modeled residuals, billing semantics, and docs links. OpenAPI lives at /api/openapi.json.
{
"status": "needs_review",
"computed": {
"computed": true,
"state": "ca",
"year": 2025,
"stateTaxableIncome": "<computed value elided>",
"totalTax": "<computed value elided>"
},
"diff": [
{
"line": "CA AGI (540:17)",
"engine": "<computed value elided>",
"filed": "<filed value supplied by caller, elided>",
"delta": "<difference elided>",
"cls": "DIFFERS",
"note": "source set appears incomplete vs the filed oracle; a human reviews"
}
],
"billed": true,
"retry_safe": true,
"next_action": "review_inputs",
"provenance": {
"engine": "deterministic",
"jurisdiction": "ca",
"tax_year": 2025
}
}{
"error": "invalid_request",
"billed": false,
"retry_safe": false,
"next_action": "fix_request_and_resubmit",
"reason": "Correct the request body before resubmitting."
}