Errors
The three kinds of error the Wigoo MCP server returns, with the exact messages, and what a client should do about each.
An error can come from three places. Telling them apart tells you what to do.
| Kind | Where you see it | Who made the mistake |
|---|---|---|
| HTTP errors | The HTTP status is not 200 or 202 | The request is malformed |
| Protocol errors | 200, with an error object in the JSON-RPC message | Unknown method or tool |
| Tool errors | 200, with result.isError: true | The arguments, or an id that does not exist |
HTTP errors
The body is a JSON-RPC error. Its id is null, except when the server could read the request's id (the -32020 header mismatch does), in which case it echoes it.
| Status | Code | Message | Fix |
|---|---|---|---|
400 | -32700 | Parse error: Invalid JSON | Send valid JSON |
400 | -32020 | Bad Request: the request headers and body disagree: ... | On the 2026 protocol, send mcp-protocol-version, mcp-method and, for tools/call, mcp-name, matching the body. See protocol |
405 | -32000 | Method not allowed. | Use POST. There is no stream to GET and no session to DELETE |
406 | -32000 | Not Acceptable: Client must accept both application/json and text/event-stream | Send accept: application/json, text/event-stream |
415 | -32000 | Unsupported Media Type: Content-Type must be application/json | Send content-type: application/json |
429 | Too many requests | Wait a few seconds and retry. See rate limits | |
500 | -32603 | Internal server error | Retry once after a moment. If it persists, tell support |
Protocol errors
The HTTP status is 200 and the message has an error instead of a result.
{ "jsonrpc": "2.0", "id": 1, "error": { "code": -32601, "message": "Method not found" } }{ "jsonrpc": "2.0", "id": 2, "error": { "code": -32602, "message": "Tool nope not found" } }Both mean the client and the server disagree about what exists. Call tools/list to see the tools.
Tool errors
The tool ran, or tried to, and could not give an answer. The message is result with isError: true and one text item written for a model to act on:
{
"result": {
"content": [
{ "type": "text", "text": "No destination \"zz-nope\". Call search_destinations to find the right id." }
],
"isError": true
},
"jsonrpc": "2.0",
"id": 3
}| Cause | Text |
|---|---|
| Unknown or empty destination | No destination "{id}". Call search_destinations to find the right id. |
| Plan not found for the destination | No plan "{id}" for this destination. Call list_plans for the current plan ids. |
| Currency Wigoo does not price in | Wigoo does not price in "{code}". Use one of USD, EUR, GBP, ... or omit currency for US dollars. The message lists every supported code |
| Missing required argument | Input validation error: Invalid arguments for tool get_destination: destination_id: Invalid input: expected string, received undefined |
| Value of the wrong shape | Input validation error: Invalid arguments for tool get_destination: currency: Invalid string: must match pattern /^[A-Za-z]{3}$/ |
| Value outside an enum | Input validation error: Invalid arguments for tool list_plans: type: Invalid option: expected one of "all"|"fixed"|"unlimited" |
A model that reads these texts recovers by itself: each one names the tool to call next or the values to use. Do not retry a tool error with the same arguments.
What is not an error
A language that is not supported, such as ja, is answered in English: the buy page still works, only its language changes.
A currency is different: an unsupported code such as XYZ is a tool error, because a price in another currency than the one asked for is easy to repeat to the traveler as the wrong amount.
A search that matches nothing is not an error either: it returns an empty destinations array and a hint that says how to search.