# Errors catalogue

Codes are extracted from API, OAuth, watch, ask and stdio MCP emission sites. Parcel errors use `error.code`; watch uses an `error` string; OAuth uses its own JSON error; ask may send `error` SSE data. HTTP status, error code and coverage are separate signals. Internal watch admission codes can be suppressed as `unsafe_event`, rather than returned to the caller.

## -32600

Invalid or oversized JSON-RPC request.

What to do: Send a supported JSON-RPC request shape and a valid id within transport bounds.

Emission sites: `landfeed/mcp/server.mjs:120`, `landfeed/mcp/server.mjs:40`.

## -32601

The JSON-RPC method does not exist.

What to do: Use initialize, tools/list, tools/call or another supported protocol method.

Emission sites: `landfeed/mcp/server.mjs:79`.

## -32602

JSON-RPC parameters or the requested tool are invalid.

What to do: Match the method schema and use a tool returned by tools/list.

Emission sites: `landfeed/mcp/server.mjs:55`, `landfeed/mcp/server.mjs:71`.

## -32603

Internal JSON-RPC server failure.

What to do: Retain the call context, check billing if a tool started, and retry a read later.

Emission sites: `landfeed/mcp/server.mjs:86`, `landfeed/mcp/server.mjs:88`.

## -32700

JSON-RPC parse failure.

What to do: Send valid UTF-8 JSON, one stdio message per line.

Emission sites: `landfeed/mcp/server.mjs:98`.

## access_denied

Authorization was refused or its redirect policy changed.

What to do: Start consent again with a registered redirect; ask the operator if it is no longer allowed.

Emission sites: `landfeed/api/landfeed_api/oauth.py:95`, `mcp==1.30.0/server/auth/provider.py:64`.

## account_inactive

The account is disabled.

What to do: Use an active account or ask account support.

Emission sites: `landfeed/api/landfeed_api/watch/store.py:35`.

## account_required

A static benchmark credential cannot identify an account.

What to do: Use an issued account API key.

Emission sites: `landfeed/api/landfeed_api/routers/watch.py:39`.

## ambiguous

Several parcel or area candidates match; HTTP 200. Candidate discovery is charged.

What to do: Ask the user for obręb or choose an explicitly confirmed candidate id; never pick silently.

Emission sites: `landfeed/contracts/envelope.json:1`.

## billing_unavailable

Ask could not settle its reserved work. New artifacts and factual text are withheld.

What to do: Retain meta.request_id, inspect the account and reconcile settlement before replaying work.

Emission sites: `landfeed/api/landfeed_api/ask/router.py:228`.

## blocked_destination

The webhook destination resolves to an unsafe address.

What to do: Use public HTTPS on port 443; correct DNS before reconfiguring the webhook.

Emission sites: `landfeed/api/landfeed_api/watch/network.py:100`.

## body_too_large

The request body exceeds the endpoint cap.

What to do: Reduce the body; watch accepts at most 256 KiB.

Emission sites: `landfeed/api/landfeed_api/routers/watch.py:86`.

## cancelled

The stdio MCP client cancelled the call; billing is unknown.

What to do: Check account usage before repeating a paid operation.

Emission sites: `landfeed/mcp/bridge.mjs:127`.

## client_result_required

The continuation expects a client tool result.

What to do: Resend the signed continuation with matching client_results.

Emission sites: `landfeed/api/landfeed_api/ask/conversation.py:50`.

## confirmation_required

The continuation expects explicit action confirmation.

What to do: Ask the user and resend confirmation for the signed step_id.

Emission sites: `landfeed/api/landfeed_api/ask/conversation.py:55`.

## conflicting_historical_evidence

Historical event evidence contradicts the saved change.

What to do: Do not treat a suppressed event as no change; operator must repair producer evidence.

Emission sites: `landfeed/api/landfeed_api/watch/matching.py:122`, `landfeed/api/landfeed_api/watch/matching.py:207`, `landfeed/api/landfeed_api/watch/matching.py:209`.

## conflicting_version_provenance

Event version provenance contradicts its evidence.

What to do: Operator must reconcile version/source evidence; do not reconstruct it from current data.

Emission sites: `landfeed/api/landfeed_api/watch/matching.py:183`.

## context_too_large

Conversation evidence exceeds bounded context limits.

What to do: Resend only relevant signed results; at most 40 results and 512,000 bytes total.

Emission sites: `landfeed/api/landfeed_api/ask/conversation.py:27`, `landfeed/api/landfeed_api/ask/conversation.py:66`.

## duplicate_artifact

An artifact identifier occurs more than once.

What to do: Send each complete signed artifact once.

Emission sites: `landfeed/api/landfeed_api/ask/conversation.py:32`.

## event_type_has_no_producer

The requested event family has no serving producer.

What to do: Use one of the seven supported layer.changed watch filters.

Emission sites: `landfeed/api/landfeed_api/watch/validation.py:60`.

## expired_continuation

The signed conversation continuation expired.

What to do: Start a new turn with fresh context; continuations last one hour.

Emission sites: `landfeed/api/landfeed_api/ask/conversation.py:25`.

## idempotency_conflict

A request key was reused with different watch items.

What to do: Use the original items for a retry, or a new key for a new action.

Emission sites: `landfeed/api/landfeed_api/watch/store.py:89`.

## incomplete_version_provenance

An event lacks the version/source evidence required for delivery.

What to do: Operator must repair the producer; never infer a negative from a missing delivery.

Emission sites: `landfeed/api/landfeed_api/watch/matching.py:51`.

## insufficient_credits

Ask could not reserve the declared budget.

What to do: Reduce max_credits within the supported range or fund the account before asking again.

Emission sites: `landfeed/api/landfeed_api/ask/router.py:228`.

## internal

The server failed to complete the operation; HTTP 500, refunded.

What to do: Retain meta.request_id and retry a read later; check billing after an interrupted response.

Emission sites: `landfeed/api/landfeed_api/app.py:469`, `landfeed/contracts/envelope.json:1`.

## invalid_arguments

The stdio tool received an invalid argument object or path value.

What to do: Match the tool inputSchema; path arguments must be nonempty strings.

Emission sites: `landfeed/mcp/bridge.mjs:71`, `landfeed/mcp/bridge.mjs:76`, `landfeed/mcp/bridge.mjs:81`.

## invalid_client

OAuth client authentication failed.

What to do: Check client registration and auth method, then reconnect.

Emission sites: `landfeed/api/landfeed_api/oauth.py:365`, `mcp==1.30.0/server/auth/provider.py:81`.

## invalid_client_metadata

OAuth registration requested unsupported metadata.

What to do: Use authorization_code/refresh_token and a supported client authentication method.

Emission sites: `landfeed/api/landfeed_api/oauth.py:83`, `landfeed/api/landfeed_api/oauth.py:85`, `mcp==1.30.0/server/auth/provider.py:50`.

## invalid_client_tool

A declared client tool schema or its conversation input is invalid.

What to do: Send a self-contained local JSON schema and correctly shaped client results; remote/dynamic references are rejected.

Emission sites: `landfeed/api/landfeed_api/ask/router.py:167`.

## invalid_digest

Signed evidence or its account binding failed verification.

What to do: Send the original signed object unchanged from this account; otherwise start again.

Emission sites: `landfeed/api/landfeed_api/ask/signing.py:41`.

## invalid_grant

OAuth code or refresh token is expired, consumed or invalid.

What to do: Restart authorization; do not replay an old rotated refresh token.

Emission sites: `landfeed/api/landfeed_api/oauth.py:165`, `landfeed/api/landfeed_api/oauth.py:194`, `landfeed/api/landfeed_api/oauth.py:298`, `mcp==1.30.0/server/auth/provider.py:81`.

## invalid_id

A watch/resource UUID is malformed.

What to do: Copy the UUID returned by creation/listing.

Emission sites: `landfeed/api/landfeed_api/routers/watch.py:48`.

## invalid_input

Request parameters or JSON do not match the operation; generally HTTP 400 and free.

What to do: Correct required fields, types and exclusivity; inspect error.hint where present.

Emission sites: `landfeed/api/landfeed_api/account/router.py:51`, `landfeed/api/landfeed_api/account/router.py:57`, `landfeed/api/landfeed_api/app.py:460`, `landfeed/api/landfeed_api/app.py:549`, `landfeed/api/landfeed_api/app.py:557`, `landfeed/api/landfeed_api/app.py:577`, `landfeed/api/landfeed_api/mcp_remote.py:39`, `landfeed/api/landfeed_api/routers/billing.py:141`, `landfeed/api/landfeed_api/routers/billing.py:87`, `landfeed/api/landfeed_api/routers/billing.py:93`, `landfeed/api/landfeed_api/routers/watch.py:104`, `landfeed/api/landfeed_api/routers/watch.py:116`, `landfeed/api/landfeed_api/routers/watch.py:183`, `landfeed/api/landfeed_api/routers/watch.py:188`, `landfeed/api/landfeed_api/routers/watch.py:91`, `landfeed/api/landfeed_api/routers/watch.py:99`, `landfeed/api/landfeed_api/watch/store.py:81`, `landfeed/api/landfeed_api/watch/validation.py:48`, `landfeed/contracts/envelope.json:1`.

## invalid_polygon

The supplied geometry cannot be admitted.

What to do: Use a valid WGS84 Polygon/MultiPolygon within endpoint limits.

Emission sites: `landfeed/api/landfeed_api/watch/store.py:65`, `landfeed/api/landfeed_api/watch/validation.py:96`.

## invalid_redirect_uri

OAuth callback URI is not allowed by server policy.

What to do: Register an exact client callback allowed by the operator.

Emission sites: `landfeed/api/landfeed_api/oauth.py:81`, `mcp==1.30.0/server/auth/provider.py:50`.

## invalid_request

The OAuth request is incomplete or violates resource/PKCE requirements.

What to do: Use S256 PKCE, exact redirect_uri and the discovered MCP resource.

Emission sites: `landfeed/api/landfeed_api/oauth.py:290`, `landfeed/api/landfeed_api/oauth.py:307`, `landfeed/api/landfeed_api/oauth.py:367`, `landfeed/api/landfeed_api/oauth.py:93`, `landfeed/api/landfeed_api/oauth.py:97`, `mcp==1.30.0/server/auth/provider.py:64`, `mcp==1.30.0/server/auth/provider.py:81`.

## invalid_response

The stdio bridge received invalid JSON, UTF-8 or a non-envelope response. Billing is unknown.

What to do: Keep the request context, check usage and report the transport failure.

Emission sites: `landfeed/mcp/bridge.mjs:119`, `landfeed/mcp/bridge.mjs:130`.

## invalid_scope

OAuth requested a scope other than landfeed:read.

What to do: Request landfeed:read.

Emission sites: `landfeed/api/landfeed_api/oauth.py:100`, `mcp==1.30.0/server/auth/provider.py:64`, `mcp==1.30.0/server/auth/provider.py:81`.

## invalid_software_statement

OAuth registration contains an invalid software statement.

What to do: Remove unsupported software metadata or use dynamic client registration with valid client metadata.

Emission sites: `mcp==1.30.0/server/auth/provider.py:50`.

## invalid_target

The OAuth resource does not identify this MCP server.

What to do: Use the resource in protected-resource discovery, ending /mcp.

Emission sites: `landfeed/api/landfeed_api/oauth.py:296`.

## invalid_webhook_url

Webhook URL syntax, protocol or privacy admission failed.

What to do: Use a public HTTPS URL on port 443 with no credentials, fragment or private fields.

Emission sites: `landfeed/api/landfeed_api/watch/network.py:63`.

## missing_artifact

Conversation history refers to an artifact absent from results.

What to do: Resend the full original signed artifact, including data.

Emission sites: `landfeed/api/landfeed_api/ask/conversation.py:36`.

## missing_historical_evidence

Historical event evidence or its dated source is missing.

What to do: Operator must repair source evidence; current dates cannot replace historical dates.

Emission sites: `landfeed/api/landfeed_api/watch/matching.py:201`, `landfeed/api/landfeed_api/watch/matching.py:42`, `landfeed/api/landfeed_api/watch/matching.py:78`, `landfeed/api/landfeed_api/watch/matching.py:84`, `landfeed/api/landfeed_api/watch/matching.py:87`, `landfeed/api/landfeed_api/watch/matching.py:99`.

## not_covered

The input resolved outside the loaded data; this is unknown, not a negative result.

What to do: Inspect scope/source/note; use another source. The uncovered work is refunded.

Emission sites: `landfeed/api/landfeed_api/app.py:199`, `landfeed/api/landfeed_api/app.py:212`, `landfeed/api/landfeed_api/app.py:216`, `landfeed/api/landfeed_api/app.py:228`, `landfeed/api/landfeed_api/app.py:231`, `landfeed/api/landfeed_api/app.py:344`, `landfeed/api/landfeed_api/app.py:392`, `landfeed/api/landfeed_api/app.py:432`, `landfeed/contracts/envelope.json:1`.

## not_found

No matching resource was found; parcel reads refund the work.

What to do: Check the id and account ownership; refine q or point where applicable.

Emission sites: `landfeed/api/landfeed_api/account/router.py:49`, `landfeed/api/landfeed_api/app.py:193`, `landfeed/api/landfeed_api/app.py:208`, `landfeed/api/landfeed_api/app.py:577`, `landfeed/api/landfeed_api/watch/store.py:114`, `landfeed/api/landfeed_api/watch/store.py:120`, `landfeed/api/landfeed_api/watch/store.py:74`, `landfeed/api/landfeed_api/watch/store.py:91`, `landfeed/contracts/envelope.json:1`.

## note_required

A correction event lacks its explanatory note.

What to do: Operator must supply the producer correction note before delivery.

Emission sites: `landfeed/api/landfeed_api/watch/matching.py:148`.

## private_content

Watch input contains forbidden owner or land-register content.

What to do: Remove private fields; use only cadastral parcel/area selectors.

Emission sites: `landfeed/api/landfeed_api/watch/validation.py:50`.

## provider_unavailable

The ask provider failed.

What to do: Retry later after checking settled billing; factual output is withheld on failed settlement.

Emission sites: `landfeed/api/landfeed_api/ask/providers/codex_pool.py:205`, `landfeed/api/landfeed_api/ask/v2.py:155`.

## rate_limited

A rate, concurrency, credit or team quota limit refused admission; HTTP 429.

What to do: Inspect balance, plan/quota and any Retry-After; reduce concurrency and retry reads with backoff.

Emission sites: `landfeed/api/landfeed_api/account/router.py:53`, `landfeed/api/landfeed_api/ask/router.py:197`, `landfeed/api/landfeed_api/billing/metering.py:110`, `landfeed/api/landfeed_api/mcp_remote.py:114`, `landfeed/api/landfeed_api/routers/billing.py:126`, `landfeed/api/landfeed_api/routers/billing.py:89`, `landfeed/api/landfeed_api/watch/store.py:130`, `landfeed/contracts/envelope.json:1`.

## resolution_unavailable

Webhook destination DNS could not be resolved.

What to do: Retry later; fix DNS if persistent.

Emission sites: `landfeed/api/landfeed_api/watch/network.py:92`, `landfeed/api/landfeed_api/watch/network.py:98`.

## response_too_large

The stdio response exceeded 16 MiB; billing is unknown.

What to do: Reduce requested data and check usage before replay.

Emission sites: `landfeed/mcp/bridge.mjs:103`.

## server_error

OAuth could not complete due to a server failure.

What to do: Reconnect later; report the failure without sending secrets.

Emission sites: `landfeed/api/landfeed_api/oauth.py:369`, `mcp==1.30.0/server/auth/provider.py:64`.

## signing_unavailable

Ask conversation signing is unavailable.

What to do: Retry later; operator must configure the persistent signing secret.

Emission sites: `landfeed/api/landfeed_api/ask/signing.py:30`.

## source_unavailable

A required source or accounting/authentication service failed; HTTP 503.

What to do: Retry the read later; retain request_id and inspect billing. Do not interpret this as no data.

Emission sites: `landfeed/api/landfeed_api/account/router.py:61`, `landfeed/api/landfeed_api/app.py:462`, `landfeed/api/landfeed_api/app.py:464`, `landfeed/api/landfeed_api/app.py:466`, `landfeed/api/landfeed_api/auth.py:45`, `landfeed/api/landfeed_api/billing/metering.py:110`, `landfeed/contracts/envelope.json:1`.

## temporarily_unavailable

OAuth endpoint exceeded its per-process request budget.

What to do: Respect Retry-After (60 seconds) and restart authorization if necessary.

Emission sites: `landfeed/api/landfeed_api/oauth.py:358`, `mcp==1.30.0/server/auth/provider.py:64`.

## timeout

The stdio bridge exceeded its 30-second deadline; billing is unknown.

What to do: Check usage before retrying; the server may have completed the work.

Emission sites: `landfeed/mcp/bridge.mjs:128`.

## transport_error

The stdio bridge could not complete HTTP; billing is unknown.

What to do: Check service connectivity and account usage before replay.

Emission sites: `landfeed/mcp/bridge.mjs:139`.

## unapproved_software_statement

The OAuth server does not approve the submitted software statement.

What to do: Use supported dynamic registration and contact the operator for an approved client policy.

Emission sites: `mcp==1.30.0/server/auth/provider.py:50`.

## unapproved_source

Event evidence references a source without the required serving approval.

What to do: Operator must review the source; never substitute an unapproved answer.

Emission sites: `landfeed/api/landfeed_api/watch/matching.py:28`.

## unauthorized

Credentials are missing, invalid or lack account/role authority (401 or 403).

What to do: Use a valid account key, reconnect OAuth, or request the required team role.

Emission sites: `landfeed/api/landfeed_api/account/router.py:28`, `landfeed/api/landfeed_api/account/router.py:47`, `landfeed/api/landfeed_api/auth.py:38`, `landfeed/api/landfeed_api/routers/billing.py:85`, `landfeed/api/landfeed_api/routers/watch.py:36`, `landfeed/contracts/envelope.json:1`.

## unauthorized_client

The OAuth client is not allowed to use this grant.

What to do: Register a client supporting authorization_code and refresh_token, then reconnect.

Emission sites: `mcp==1.30.0/server/auth/provider.py:64`, `mcp==1.30.0/server/auth/provider.py:81`.

## unavailable

Ask cannot finish due to provider, signing or settlement availability.

What to do: Keep request_id; inspect billing and retry only when safe.

Emission sites: `landfeed/api/landfeed_api/ask/streaming.py:48`, `landfeed/api/landfeed_api/ask/v2.py:151`.

## unexpected_continuation

A confirmation/client result does not match the continuation kind.

What to do: Resend only the matching signed action/result or start a new turn.

Emission sites: `landfeed/api/landfeed_api/ask/conversation.py:58`.

## unknown_tool

The stdio MCP tool name is not in the six-tool catalogue.

What to do: Call tools/list and use a published tool name.

Emission sites: `landfeed/mcp/bridge.mjs:69`.

## unsafe_event

Notification evidence failed schema, source or privacy admission.

What to do: Operator must correct the producer; a suppressed notification proves no absence.

Emission sites: `landfeed/api/landfeed_api/watch/matching.py:141`, `landfeed/api/landfeed_api/watch/matching.py:151`, `landfeed/api/landfeed_api/watch/matching.py:160`, `landfeed/api/landfeed_api/watch/matching.py:167`, `landfeed/api/landfeed_api/watch/matching.py:172`, `landfeed/api/landfeed_api/watch/matching.py:177`, `landfeed/api/landfeed_api/watch/matching.py:185`, `landfeed/api/landfeed_api/watch/matching.py:214`, `landfeed/api/landfeed_api/watch/matching.py:226`, `landfeed/api/landfeed_api/watch/worker.py:67`.

## unsupported_grant_type

The OAuth grant type is unsupported.

What to do: Use authorization_code or refresh_token; client_credentials is not supported.

Emission sites: `mcp==1.30.0/server/auth/provider.py:81`.

## unsupported_legacy_event

A stored legacy event has no safe supported notification shape.

What to do: Use supported layer.changed events; operator must implement a typed producer for other families.

Emission sites: `landfeed/api/landfeed_api/watch/matching.py:114`.

## unsupported_response_type

OAuth authorization requested a response type other than code.

What to do: Request response_type=code with PKCE S256.

Emission sites: `mcp==1.30.0/server/auth/provider.py:64`.

## validation_work_limit

Watch validation exceeds item/vertex work bounds (413).

What to do: Limit to 100 items and 1024 polygon vertices in aggregate; reduce the request.

Emission sites: `landfeed/api/landfeed_api/watch/validation.py:67`, `landfeed/api/landfeed_api/watch/validation.py:79`, `landfeed/api/landfeed_api/watch/validation.py:91`.

## watch_limit

The shared plan watch-item quota is exhausted (409).

What to do: Remove items or obtain an approved larger limit; zero can mean operator configuration is pending.

Emission sites: `landfeed/api/landfeed_api/watch/store.py:46`, `landfeed/api/landfeed_api/watch/store.py:58`.

## watch_unavailable

Watch storage or processing is unavailable (503).

What to do: Retry reads later; use the creation idempotency key when retrying creation.

Emission sites: `landfeed/api/landfeed_api/ask/router.py:204`.

## webhook_unconfigured

The watch has no configured webhook to rotate.

What to do: Configure the webhook first, then save its one-time secret securely.

Emission sites: `landfeed/api/landfeed_api/watch/store.py:157`.

