{
  "schema_version": "1.0",
  "name": "Whaber Oracle",
  "description": "Ground truth operational layer for verified urban transfers in LatAm. Provides safe pickup points, operational windows, carrier compliance validation, and place safety context — built on the Whaber Place Graph (20 zones, 478 verified POIs in Quito, Ecuador). All outputs pass moatGuard: semantic labels only, no raw scoring.",
  "url": "https://oracle.whaber.ai",
  "mcp_endpoint": "https://oracle.whaber.ai/mcp/v1",
  "rest_endpoint": "https://oracle.whaber.ai/api/v1",
  "version": "1.0.0",
  "provider": {
    "name": "Whaber",
    "url": "https://whaber.ai",
    "contact": "oracle@whaber.ai",
    "legal_info": "https://whaber.ai/legal",
    "privacy_policy": "https://whaber.ai/privacy"
  },
  "capabilities": {
    "transport": [
      "mcp-streamable-http",
      "rest"
    ],
    "auth": [
      "api_key",
      "agent_jwt"
    ],
    "auth_url": "https://whaber.ai/oracle/access",
    "rate_limits": {
      "requests_per_minute": 60,
      "requests_per_day": 5000
    }
  },
  "access": {
    "tier": "partner-only",
    "apply_url": "https://whaber.ai/oracle/access",
    "pricing_model": "per_call",
    "pricing_url": "https://whaber.ai/oracle/pricing"
  },
  "coverage": {
    "cities": [
      "Quito"
    ],
    "countries": [
      "EC"
    ],
    "regions": [
      "LatAm"
    ],
    "coverage_detail": "20 operational zones + 478 verified POIs in Quito. Expanding to Guayaquil and Cuenca Q3-Q4 2026.",
    "service_area": {
      "@type": "AdministrativeArea",
      "name": "Quito, Pichincha, Ecuador"
    }
  },
  "tools": [
    {
      "name": "get_safe_pickup_point",
      "auth_required": false,
      "description": "Returns a verified, operationally safe pickup location for a given hotel or venue in the Place Graph. Takes into account time-of-day safety context, vehicle access constraints, and historical incident data for the zone. Output is a verified coordinate pair with human-readable instructions — never a raw safety score.",
      "input_schema": {
        "type": "object",
        "properties": {
          "hotel_id": {
            "type": "string",
            "description": "Whaber Place Graph hotel identifier"
          },
          "vehicle_class": {
            "type": "string",
            "enum": [
              "sedan",
              "suv",
              "van",
              "luxury"
            ],
            "description": "Vehicle class requested"
          },
          "datetime_utc": {
            "type": "string",
            "format": "date-time",
            "description": "Requested pickup datetime in UTC ISO 8601"
          }
        },
        "required": [
          "hotel_id",
          "datetime_utc"
        ]
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "pickup_point": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lng": {
                "type": "number"
              },
              "instructions": {
                "type": "string"
              },
              "zone_label": {
                "type": "string",
                "description": "Semantic safety label: bajo | moderado | alto | muy_alto"
              },
              "verified": {
                "type": "boolean"
              }
            }
          }
        }
      },
      "pricing": {
        "per_call": 0.05,
        "currency": "USD"
      },
      "tags": [
        "pickup",
        "safety",
        "place-graph",
        "verified"
      ],
      "requires_user_consent": true
    },
    {
      "name": "calculate_ops_window",
      "auth_required": false,
      "description": "Calculates the operational availability window for a transfer request — combining real-time traffic (Google Routes API v2), driver availability, zone safety by time-of-day, and airport buffer margins from the Place Graph. Returns confirmed or tentative time windows with margin annotations.",
      "input_schema": {
        "type": "object",
        "properties": {
          "origin_place_id": {
            "type": "string",
            "description": "Whaber Place Graph origin node ID (hotel, address, or POI)"
          },
          "destination_place_id": {
            "type": "string",
            "description": "Whaber Place Graph destination node ID"
          },
          "requested_arrival_utc": {
            "type": "string",
            "format": "date-time",
            "description": "Passenger must arrive by this time (UTC)"
          },
          "passenger_count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 12
          }
        },
        "required": [
          "origin_place_id",
          "destination_place_id",
          "requested_arrival_utc"
        ]
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "pickup_window_start": {
            "type": "string",
            "format": "date-time"
          },
          "pickup_window_end": {
            "type": "string",
            "format": "date-time"
          },
          "estimated_duration_minutes": {
            "type": "integer"
          },
          "buffer_applied_minutes": {
            "type": "integer"
          },
          "confidence": {
            "type": "string",
            "enum": [
              "confirmed",
              "tentative",
              "unavailable"
            ]
          }
        }
      },
      "pricing": {
        "per_call": 0.04,
        "currency": "USD"
      },
      "tags": [
        "scheduling",
        "eta",
        "traffic",
        "place-graph"
      ],
      "requires_user_consent": false
    },
    {
      "name": "validate_carrier_compliance",
      "auth_required": false,
      "description": "Validates that a carrier (driver + vehicle) meets all 7 legal compliance requirements for commercial ground transport in Ecuador: national ID, professional license, driving record points, background check, liability insurance (RC), ANT commercial operating permit, and current vehicle registration. Returns a binary pass/fail with expiration metadata. Zero exceptions — a single missing document blocks the carrier.",
      "input_schema": {
        "type": "object",
        "properties": {
          "carrier_id": {
            "type": "string",
            "description": "Whaber internal carrier identifier"
          },
          "check_date": {
            "type": "string",
            "format": "date",
            "description": "Date to validate compliance against (ISO 8601 date). Defaults to today."
          }
        },
        "required": [
          "carrier_id"
        ]
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "compliant": {
            "type": "boolean"
          },
          "documents_checked": {
            "type": "integer"
          },
          "next_expiration": {
            "type": "string",
            "format": "date"
          },
          "blocking_documents": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "List of document names that are expired or missing. Empty if compliant."
          }
        }
      },
      "pricing": {
        "per_call": 0.05,
        "currency": "USD"
      },
      "tags": [
        "compliance",
        "legal",
        "carrier",
        "ant",
        "ecuador"
      ],
      "requires_user_consent": false
    },
    {
      "name": "query_place_safety",
      "auth_required": false,
      "description": "Returns the operational safety context for a given zone in the Whaber Place Graph, scoped to a time-of-day window. Output is always a semantic label (bajo / moderado / alto / muy_alto) — never a numeric score. Raw risk indices and computed_scores are internal MOAT data and are never exposed via this tool.",
      "input_schema": {
        "type": "object",
        "properties": {
          "zone_id": {
            "type": "string",
            "description": "Whaber Place Graph zone identifier (e.g. 'UIO_NORTH', 'CENTRO_HISTORICO')"
          },
          "time_window": {
            "type": "string",
            "enum": [
              "morning",
              "afternoon",
              "evening",
              "night"
            ],
            "description": "Time-of-day window for the safety query"
          }
        },
        "required": [
          "zone_id",
          "time_window"
        ]
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "zone_id": {
            "type": "string"
          },
          "safety_label": {
            "type": "string",
            "enum": [
              "bajo",
              "moderado",
              "alto",
              "muy_alto"
            ],
            "description": "Semantic safety label. Raw numeric scores are never returned."
          },
          "recommendation": {
            "type": "string"
          },
          "data_freshness_hours": {
            "type": "integer"
          }
        }
      },
      "pricing": {
        "per_call": 0.03,
        "currency": "USD"
      },
      "tags": [
        "safety",
        "place-graph",
        "zones",
        "latam"
      ],
      "requires_user_consent": false
    },
    {
      "name": "get_hotel_context",
      "auth_required": false,
      "description": "Returns the full operational context for a hotel registered in the Whaber Place Graph: verified pickup point, operational notes, check-in/check-out times, VIP policies, preferred vehicle classes, and historical transfer performance. This is the context a travel agent or booking system needs to coordinate ground transfers for a hotel property.",
      "input_schema": {
        "type": "object",
        "properties": {
          "hotel_id": {
            "type": "string",
            "description": "Whaber Place Graph hotel identifier"
          },
          "include_transfer_stats": {
            "type": "boolean",
            "default": false,
            "description": "If true, includes aggregated transfer performance (count, avg CSAT, punctuality rate)"
          }
        },
        "required": [
          "hotel_id"
        ]
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "hotel_name": {
            "type": "string"
          },
          "verified_pickup_point": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lng": {
                "type": "number"
              },
              "instructions": {
                "type": "string"
              }
            }
          },
          "operational_notes": {
            "type": "string"
          },
          "preferred_vehicle_classes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "transfer_stats": {
            "type": "object",
            "description": "Only returned if include_transfer_stats=true",
            "properties": {
              "total_transfers": {
                "type": "integer"
              },
              "avg_csat": {
                "type": "number"
              },
              "punctuality_rate": {
                "type": "number"
              }
            }
          }
        }
      },
      "pricing": {
        "per_call": 0.04,
        "currency": "USD"
      },
      "tags": [
        "hotel",
        "context",
        "place-graph",
        "hospitality"
      ],
      "requires_user_consent": true
    },
    {
      "name": "whaber_validar_vuelo",
      "display_name": "Validar Vuelo",
      "auth_required": true,
      "description": "Returns real-time flight status from AeroDataBox webhooks (<30s push) plus derived terminal assignment for Mariscal Sucre UIO: T1 (domestic) or T2 (international). Grounds all transfer operations to actual flight state — never estimated. Internal-only (Bloque B): declared for discovery, blocked at runtime via assertInternalOnly until Gate 1 promotion.",
      "input_schema": {
        "type": "object",
        "properties": {
          "flight_number": {
            "type": "string",
            "description": "IATA flight number (e.g. 'LA1455', 'AV253')",
            "pattern": "^[A-Z0-9]{2,3}[0-9]{1,4}$"
          },
          "scheduled_date": {
            "type": "string",
            "format": "date",
            "description": "Scheduled flight date (ISO 8601). Defaults to today."
          }
        },
        "required": [
          "flight_number"
        ]
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "flight_number": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "scheduled",
              "active",
              "landed",
              "cancelled",
              "delayed",
              "diverted"
            ]
          },
          "terminal": {
            "type": "string",
            "enum": [
              "T1",
              "T2"
            ],
            "description": "Derived from real flight status, never from prefix"
          },
          "scheduled_utc": {
            "type": "string",
            "format": "date-time"
          },
          "estimated_utc": {
            "type": "string",
            "format": "date-time"
          },
          "delay_minutes": {
            "type": "integer"
          }
        }
      },
      "pricing": {
        "per_call": 0.06,
        "currency": "USD"
      },
      "slo_push_ms": 30000,
      "tags": [
        "flight-status",
        "uio",
        "airport",
        "terminal",
        "grounding",
        "internal-only"
      ],
      "requires_user_consent": false
    },
    {
      "name": "whaber_enriched_route",
      "display_name": "Enriched Route",
      "auth_required": true,
      "description": "Calculates a transfer route with real-time traffic via Google Routes API v2, Place Graph safety overlays, and encoded polylines. Returns ETA, distance, traffic alerts, and night-mode risk flag. Internal-only (Bloque B): declared for discovery, blocked at runtime via assertInternalOnly until Gate 1 promotion.",
      "input_schema": {
        "type": "object",
        "properties": {
          "origin": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lng": {
                "type": "number"
              }
            },
            "required": [
              "lat",
              "lng"
            ]
          },
          "destination": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lng": {
                "type": "number"
              }
            },
            "required": [
              "lat",
              "lng"
            ]
          },
          "departure_utc": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "origin",
          "destination",
          "departure_utc"
        ]
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "eta_minutes": {
            "type": "integer"
          },
          "distance_km": {
            "type": "number"
          },
          "polyline_encoded": {
            "type": "string"
          },
          "traffic_alerts": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "night_mode_risk": {
            "type": "boolean"
          },
          "safety_overlay_label": {
            "type": "string",
            "enum": [
              "bajo",
              "moderado",
              "alto",
              "muy_alto"
            ]
          }
        }
      },
      "pricing": {
        "per_call": 0.08,
        "currency": "USD"
      },
      "slo_p95_ms": 800,
      "tags": [
        "routing",
        "traffic",
        "eta",
        "polyline",
        "quito",
        "place-graph",
        "internal-only"
      ],
      "requires_user_consent": false
    },
    {
      "name": "whaber_compliance_gate",
      "display_name": "Compliance Gate",
      "auth_required": true,
      "description": "Full 7-document ANT compliance check for a carrier in Ecuador. Returns binary compliant/non-compliant verdict. Missing one document = full service block. Zero exceptions. Internal-only (Bloque B): declared for discovery, blocked at runtime via assertInternalOnly until Gate 1 promotion.",
      "input_schema": {
        "type": "object",
        "properties": {
          "carrier_id": {
            "type": "string"
          },
          "check_date": {
            "type": "string",
            "format": "date"
          }
        },
        "required": [
          "carrier_id"
        ]
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "compliant": {
            "type": "boolean"
          },
          "documents_checked": {
            "type": "integer",
            "const": 7
          },
          "blocking_documents": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "next_expiration": {
            "type": "string",
            "format": "date"
          }
        }
      },
      "pricing": {
        "per_call": 0.05,
        "currency": "USD"
      },
      "slo_p95_ms": 80,
      "tags": [
        "compliance",
        "ant",
        "carrier",
        "ecuador",
        "7-docs",
        "hard-gate",
        "internal-only"
      ],
      "requires_user_consent": false
    },
    {
      "name": "whaber_recompute_zone_safety",
      "display_name": "Recompute Zone Safety",
      "auth_required": true,
      "description": "Triggers a recalculation of the safety classification for a Quito zone after a new driver report or incident. Returns the new semantic label (bajo/moderado/alto/muy_alto). Internal computed_score never exposed. Internal-only (Bloque B): declared for discovery, blocked at runtime via assertInternalOnly until Gate 1 promotion.",
      "input_schema": {
        "type": "object",
        "properties": {
          "zone_id": {
            "type": "string"
          },
          "trigger_report_id": {
            "type": "string",
            "description": "ID of the driver report that triggered recompute (optional)"
          }
        },
        "required": [
          "zone_id"
        ]
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "zone_id": {
            "type": "string"
          },
          "previous_label": {
            "type": "string",
            "enum": [
              "bajo",
              "moderado",
              "alto",
              "muy_alto"
            ]
          },
          "new_label": {
            "type": "string",
            "enum": [
              "bajo",
              "moderado",
              "alto",
              "muy_alto"
            ]
          },
          "recomputed_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "pricing": {
        "per_call": 0.03,
        "currency": "USD"
      },
      "slo_p95_ms": 200,
      "tags": [
        "safety",
        "zone",
        "place-graph",
        "real-time",
        "quito",
        "internal-only"
      ],
      "requires_user_consent": false
    },
    {
      "name": "whaber_resolver_direccion",
      "display_name": "Resolver Dirección",
      "auth_required": true,
      "description": "Geocodes a free-text address or place name against the Whaber Place Graph (478 POIs, 20 zones) with fuzzy matching for Quito naming conventions. Falls back to Google Maps MCP if no Place Graph match. Returns verified coordinates and matched POI node. Internal-only (Bloque B): declared for discovery, blocked at runtime via assertInternalOnly until Gate 1 promotion.",
      "input_schema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Free-text address or place name"
          },
          "bias_zone_id": {
            "type": "string",
            "description": "Optional Place Graph zone to bias the search"
          }
        },
        "required": [
          "query"
        ]
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "matched": {
            "type": "boolean"
          },
          "source": {
            "type": "string",
            "enum": [
              "place_graph",
              "google_maps_fallback"
            ]
          },
          "poi_node_id": {
            "type": "string"
          },
          "coordinates": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lng": {
                "type": "number"
              }
            }
          },
          "confidence": {
            "type": "string",
            "enum": [
              "high",
              "medium",
              "low"
            ]
          }
        }
      },
      "pricing": {
        "per_call": 0.03,
        "currency": "USD"
      },
      "slo_p95_ms": 50,
      "tags": [
        "geocoding",
        "place-graph",
        "quito",
        "poi",
        "fuzzy-match",
        "internal-only"
      ],
      "requires_user_consent": false
    }
  ],
  "moat_guard": {
    "description": "All Oracle outputs pass moatGuard before delivery. Numeric risk scores (computed_score, safety_margin, carrier_internal_score, historical_punctuality) are never exposed. All safety-related outputs use semantic labels only: bajo / moderado / alto / muy_alto.",
    "protected_fields": [
      "computed_score",
      "safety_margin",
      "carrier_internal_score",
      "historical_punctuality",
      "risk_index"
    ]
  },
  "compliance": {
    "data_protection": "LOPDP (Ecuador) · DPO registered with SPDP",
    "transport_regulation": "ANT (Agencia Nacional de Tránsito) compliance required for all carriers",
    "audit_trail": "All tool calls logged to agent_events EventStore for full auditability"
  },
  "tags": [
    "oracle",
    "mcps",
    "travel-ops",
    "latam",
    "compliant",
    "ground-transport",
    "quito",
    "ecuador"
  ],
  "links": {
    "documentation": "https://whaber.ai/oracle/docs",
    "pricing": "https://whaber.ai/oracle/pricing",
    "access_request": "https://whaber.ai/oracle/access",
    "status": "https://whaber.ai/oracle/status",
    "changelog": "https://whaber.ai/oracle/changelog"
  },
  "registries": [
    {
      "name": "MIT Nanda Registry",
      "status": "pending_gate_1",
      "url": "https://nanda.media.mit.edu"
    }
  ],
  "last_updated": "2026-09-13",
  "status": "active_pilot",
  "pilot_note": "Currently operating in pilot at NH Collection Royal Quito, Ecuador. Gate 0 target: 50 verified transfers with CSAT ≥ 4.3. Partner access available upon request.",
  "compatibility": {
    "protocols": [
      "mcp-streamable-http",
      "rest",
      "a2a"
    ],
    "clients": [
      "Anthropic_Claude_MCP",
      "OpenAI_function_calling",
      "Google_A2A",
      "Meta_AI_Connectors"
    ],
    "commerce_agent_blueprints": [
      {
        "name": "Anthropic Commerce Agents",
        "repo": "https://github.com/anthropics/commerce-agents",
        "role": "Whaber is not a shopping agent. It is the verified physical-execution backend a commerce agent calls after the order is staged.",
        "integration": "Call Whaber Oracle tools from inside a StorefrontBackend method (server-side, host-held credential). Whaber returns verified facts: carrier compliance, safe pickup point, operational window, delivery confirmation.",
        "does_not": [
          "place orders",
          "take payments",
          "write to the host catalog or cart"
        ],
        "safety_alignment": [
          "server-authored disclosures",
          "tool-result provenance only",
          "host approval for irreversible actions",
          "double guardrail at apply time",
          "hard caps on analysis path"
        ],
        "safety_page": "https://whaber.ai/developers/agent-safety"
      }
    ]
  }
}