Search travel eSIM data plans worldwide with live prices, plan details and a buy link.
Full LLM thinking from the 4-phase benchmark pipeline.
{
"service_type": "mcp_server",
"base_url": "https://e-esim.com/wp-json/e-esim",
"auth_method": "none",
"auth_config": {},
"endpoints": [
{
"path": "/mcp",
"method": "POST",
"purpose": "MCP handshake (initialize). Must be the first call; response carries Mcp-Session-Id header.",
"params": {
"jsonrpc": {"type": "string", "required": true},
"id": {"type": "integer", "required": true},
"method": {"type": "string", "required": true},
"params": {"type": "object", "required": true}
},
"response_format": "json",
"is_primary": false
},
{
"path": "/mcp",
"method": "POST",
"purpose": "MCP handshake completion notification (notifications/initialized). No response body expected.",
"params": {
"jsonrpc": {"type": "string", "required": true},
"method": {"type": "string", "required": true}
},
"response_format": "json",
"is_primary": false
},
{
"path": "/mcp",
"method": "POST",
"purpose": "List available tools (tools/list).",
"params": {
"jsonrpc": {"type": "string", "required": true},
"id": {"type": "integer", "required": true},
"method": {"type": "string", "required": true}
},
"response_format": "json",
"is_primary": false
},
{
"path": "/mcp",
"method": "POST",
"purpose": "Search eSIM plans for a destination with live prices and buy links (search_esim_plans).",
"params": {
"jsonrpc": {"type": "string", "required": true},
"id": {"type": "integer", "required": true},
"method": {"type": "string", "required": true},
"params": {"type": "object", "required": true}
},
"response_format": "json",
"is_primary": true
},
{
"path": "/mcp",
"method": "POST",
"purpose": "Get details for a specific eSIM plan (get_plan_details).",
"params": {
"jsonrpc": {"type": "string", "required": true},
"id": {"type": "integer", "required": true},
"method": {"type": "string", "required": true},
"params": {"type": "object", "required": true}
},
"response_format": "json",
"is_primary": false
},
{
"path": "/mcp",
"method": "POST",
"purpose": "Start checkout and return a buy link (start_checkout). Does not take payment or create an order.",
"params": {
"jsonrpc": {"type": "string", "required": true},
"id": {"type": "integer", "required": true},
"method": {"type": "string", "required": true},
"params": {"type": "object", "required": true}
},
"response_format": "json",
"is_primary": false
}
],
"pricing_model": {
"type": "unknown",
"details": {},
"free_tier": null,
"paid_tiers": []
},
"rate_limits": {
"rpm": 60,
"tpm": null,
"daily": null,
"concurrent": null
},
"capabilities": [
"esim_plan_search",
"plan_details",
"checkout_link_generation",
"multi_language",
"multi_currency",
"destination_search"
],
"agent_readiness": {
"supports_x402": false,
"supports_streaming": false,
"has_sandbox": false,
"sdks": [],
"agent_auth_methods": ["public", "notlogin"]
}
}```json
{
"tests": [
{
"name": "mcp_initialize_handshake",
"endpoint": "/mcp",
"method": "POST",
"headers": {
"Content-Type": "application/json",
"Accept": "application/json, text/event-stream"
},
"payload": {
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {},
"clientInfo": {
"name": "prowl-benchmark",
"version": "1.0.0"
}
}
},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns JSON-RPC initialize result with serverInfo, capabilities, and Mcp-Session-Id header for subsequent calls",
"metrics": ["latency", "status_code", "accuracy"],
"validation": {"field": "result.serverInfo", "type": "object", "min_length": 1}
},
{
"name": "tools_list",
"endpoint": "/mcp",
"method": "POST",
"headers": {
"Content-Type": "application/json",
"Accept": "application/json, text/event-stream",
"Mcp-Session-Id": "REQUIRES_PRIOR_INIT_SESSION"
},
"payload": {
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list",
"params": {}
},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns list of MCP tools including search_esim_plans, get_plan_details, start_checkout",
"metrics": ["latency", "status_code", "accuracy"],
"validation": {"field": "result.tools", "type": "array", "min_length": 1}
},
{
"name": "search_esim_plans_happy",
"endpoint": "/mcp",
"method": "POST",
"headers": {
"Content-Type": "application/json",
"Accept": "application/json, text/event-stream",
"Mcp-Session-Id": "REQUIRES_PRIOR_INIT_SESSION"
},
"payload": {
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "search_esim_plans",
"arguments": {
"destination": "Japan"
}
}
},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns eSIM plans for Japan with names, data allowances, prices and buy links",
"metrics": ["latency", "status_code", "accuracy"],
"validation": {"field": "result.content", "type": "array", "min_length": 1}
},
{
"name": "search_esim_plans_multi_currency",
"endpoint": "/mcp",
"method": "POST",
"headers": {
"Content-Type": "application/json",
"Accept": "application/json, text/event-stream",
"Mcp-Session-Id": "REQUIRES_PRIOR_INIT_SESSION"
},
"payload": {
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "search_esim_plans",
"arguments": {
"destination": "France",
"currency": "EUR"
}
}
},
"expected_status": 200,
"intent": "happy_path",
"expected_behavior": "Returns plans with EUR-denominated prices honoring currency parameter",
"metrics": ["latency", "status_code", "accuracy"],
"validation": {"field": "result.content", "type": "array", "min_length": 1}
},
{
"name": "search_esim_plans_validation_missing_destination",
"endpoint": "/mcp",
"method": "POST",
"headers": {
"Content-Type": "application/json",
"Accept": "application/json, text/event-stream",
"Mcp-Session-Id": "REQUIRES_PRIOR_INIT_SESSION"
},
"payload": {
"jsonrpc": "2.0",
"id": 5,
"method": "tools/call",
"params": {
"name": "search_esim_plans",
"arguments": {}
}
},
"expected_status": 200,
"intent": "validation",
"expected_behavior": "MCP returns a JSON-RPC error object (isError true) indicating missing required 'destination' argument",
"metrics": ["latency", "status_code", "accuracy"],
"validation": {"field": "error", "type": "object", "min_length": 1}
},
{
"name": "unknown_tool_validation",
"endpoint": "/mcp",
"method": "POST",
"headers": {
"Content-Type": "application/json",
"Accept": "application/json, text/event-stream",
"Mcp-Session-Id": "REQUIRES_PRIOR_INIT_SESSION"
},
"payload": {
"jsonrpc": "2.0",
"id": 6,
"method": "tools/call",
"params": {
"name": "nonexistent_tool_xyz",
"arguments": {}
}
},
"expected_status": 200,
"intent": "validation",
"expected_behavior": "Returns JSON-RPC error -32601 (method not found) or isError tool result for unknown tool",
"metrics": ["latency", "status_code", "accuracy"],
"validation": {"field": "error", "type": "object", "min_length": 1}
},
{
"name": 12/12 tests passed
| Test | Endpoint | Status | Latency |
|---|---|---|---|
| mcp_initialize_handshake | POST /mcp | 200 | 516ms |
| tools_list | POST /mcp | 200 | 463ms |
| search_esim_plans_happy | POST /mcp | 200 | 397ms |
| search_esim_plans_multi_currency | POST /mcp | 200 | 849ms |
| search_esim_plans_validation_missing_destination | POST /mcp | 200 | 177ms |
| unknown_tool_validation | POST /mcp | 200 | 176ms |
| malformed_jsonrpc_method | POST /mcp | 200 | 183ms |
| get_plan_details_happy | POST /mcp | 200 | 182ms |
| get_plan_details_invalid_id | POST /mcp | 200 | 183ms |
| start_checkout_happy | POST /mcp | 200 | 178ms |
{"model": "deepseek", "data": {"overall": 74, "dimensions": {"token_efficiency": 7.0, "first_try_success": 7.5, "response_parseability": 9.0, "error_clarity": 6.5, "doc_quality": 7.0, "auth_simplicity": 9.0, "latency": 8.5, "consistency": 8.0}, "pricing_normalized": {"cost_per_1k_requests": null, "cost_per_1m_input_tokens": null, "cost_per_1m_output_tokens": null, "free_tier_requests": null, "estimated_monthly_cost_light": null, "estimated_monthly_cost_heavy": null}, "issues": [{"severity": "medium", "detail": "MCP tool-level errors are returned inside a 200 JSON-RPC envelope with code:\"error\"/\"unavailable\" as nested TEXT payload rather than as a structured JSON-RPC error object. The agent must parse the inner text string (double-encoded JSON) to detect failure \u2014 awkward but functional.", "endpoint": "/mcp"}, {"severity": "medium", "detail": "get_plan_details 'happy path' returned 'Plan not found or not available' \u2014 likely a non-live/placeholder product ID. Agents cannot verify happy-path purchase flow works end-to-end.", "endpoint": "/mcp"}, {"severity": "medium", "detail": "start_checkout returned code:\"unavailable\" / 'Product is not available for purchase' for all checkout attempts, including the happy path \u2014 checkout capability appears non-functional for tested inputs.", "endpoint": "/mcp"}, {"severity": "low", "detail": "Malformed JSON-RPC method returned JSON-RPC error -32601 inside a 200 status rather than an HTTP 400. This is spec-compliant for JSON-RPC-over-HTTP but diverges from the planner's expected 400.", "endpoint": "/mcp"}, {"severity": "low", "detail": "Session auth boundary test (missing Mcp-Session-Id header) still returned tools/list successfully (200) rather than 400/401 \u2014 session header is not enforced, which weakens the intended handshake ordering.", "endpoint": "/mcp"}], "recommendations": ["Document the expected flow of: initialize \u2192 notifications/initialized \u2192 tools/list \u2192 tools/call, including the Mcp-Session-Id header requirement, in an agent-facing README.", "Return tool-level failures using the JSON-RPC `error` object with proper error codes (or at least `isError:true` in the content) instead of double-encoded text strings, so agents can detect failures without parsing inner JSON.", "Provide realistic sample product IDs in documentation so agents can exercise get_plan_details and start_checkout happy paths.", "Enforce or document the Mcp-Session-Id boundary \u2014 either reject calls without a valid session, or explicitly state it is optional.", "Add example responses (search, details, checkout) to the tool schema/docs to reduce trial-and-error token cost.", "Expose structured error codes (e.g. DESTINATION_REQUIRED, PLAN_NOT_FOUND, PRODUCT_UNAVAILABLE) as machine-readable fields rather than only human strings."]}}Travel eSIM data plans for 158 countries and regions, searchable by destination and returned with live prices, plan specs and a direct buy link. Three plan shapes: Daily Surf, a fresh high-speed allowance every day; Trip Surf, one data pool for the whole trip; and All You Can Surf, unlimited in volume with a daily full-speed allowance followed by a still-usable reduced speed, in standard, premium and titanium grades. No account, no app — the eSIM is emailed immediately after payment.
Show your live agent-readiness score on your own site. Free, no auth — it updates as your score changes.
<a href="https://prowl.world/service/e-esim-catalog">
<img src="https://prowl.world/badge/e-esim-catalog.svg" height="56" alt="Agent-readiness on Prowl">
</a>
See operational metrics, LLM evaluations, agent readiness, and more.
Open in Dashboard