# Troubleshooting

Keyed on what you see, because that is what you have when you arrive — not the
cause. Every entry here cost real debugging time.

## By symptom

| symptom                                                                                                   | cause                                                                                                                                   | fix                                                                                                                                                                 |
| --------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **HTTP 307 or 308, and the call seems to vanish**                                                         | The endpoint was called without its trailing slash. `/mcp` redirects to `/mcp/`.                                                        | Use `https://buyer.moxlade.com/mcp/` exactly. A client that does not replay a POST body across a redirect loses the body, which looks like a server bug and is not. |
| **HTTP 421 Misdirected Request**                                                                          | DNS-rebinding protection: the Host header is one the server does not serve.                                                             | Reach it by its real hostname. This bites behind a proxy that rewrites Host.                                                                                        |
| **`-32602 params._meta must be an object carrying the required io.modelcontextprotocol/protocolVersion`** | You sent `MCP-Protocol-Version: 2026-07-28`. On that spec the version travels in `params._meta` as well as the header.                  | Add it to `params._meta`, or send an older `MCP-Protocol-Version`, which needs only the header. The error names the field now.                                      |
| **`-32022 Unsupported protocol version`**                                                                 | A version this server does not speak.                                                                                                   | The error carries the supported list. Pick one from it.                                                                                                             |
| **401 that mentions OAuth when you sent a token**                                                         | Two different 401s. No credential gets a discovery challenge; a BAD credential gets `error="invalid_token"` and no `resource_metadata`. | If you see `invalid_token` your token is wrong — do not start an OAuth flow. If you see `resource_metadata`, nothing was sent.                                      |
| **"this posting is not in your feed" for an id you just searched**                                        | Reach follows the ACCOUNT. Before 2026-09-03 it followed the token, so re-minting emptied it.                                           | Fixed. If it persists, the id came from somewhere other than your own search or saved match — that is the gate working.                                             |
| **A cursor is refused**                                                                                   | It belongs to a different search. Query, phrase, exclude or filters changed.                                                            | Re-send the original search unchanged, or drop the cursor and start over. Paging on it would mix two result sets.                                                   |
| **Everything returns 200 but your client reports success on failures**                                    | A refused tool call is HTTP 200 with `result.isError: true`.                                                                            | Branch on `isError`, not on the status code. See [refusals](/docs/refusals).                                                                                        |
| **`skill_demand` looks like demand is collapsing**                                                        | The newest weekly bucket is always short — weeks are cut on Mondays and the window is not.                                              | Compare `per_day`, or read `trend`, which excludes partial weeks. Buckets marked `partial` are not comparable by count.                                             |
| **A tool errors with a Pydantic-looking message**                                                         | Should no longer happen; validation failures are re-rendered in plain language.                                                         | If you see one, it is a bug — the argument name and its accepted range should be in the text.                                                                       |
