Troubleshooting
Keyed on what you see, because that is what you have when you arrive.
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 the refusals page. |
| 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. |