{
  "version": "1.21.0",
  "tools": [
    {
      "name": "search_businesses",
      "description": "Search the AgentWeb global business directory. Use agentweb_health for current counts. If a business is not in the database yet, AgentWeb tries to discover it from the web in real time (~3s) and saves it. Returns markdown prose by default. Supports text search (q), category, city/country, and geographic search (lat+lng+radius_km). ONE CALL RETURNS EVERYTHING: name, phone, email, hours, website, address, geo, trust score. Use format='json' for structured JSON.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "q": {
            "type": "string",
            "description": "Text search query, e.g. 'noma', 'thai restaurant', 'dentist near me'"
          },
          "category": {
            "type": "string",
            "description": "Business category filter (e.g., 'restaurant', 'hotel', 'pharmacy')"
          },
          "city": {
            "type": "string",
            "description": "City name for location filter"
          },
          "country": {
            "type": "string",
            "description": "Country code (ISO 3166-1 alpha-2, e.g., 'US', 'GB', 'DK')"
          },
          "lat": {
            "type": "number",
            "description": "Latitude for geographic search (requires lng and radius_km)"
          },
          "lng": {
            "type": "number",
            "description": "Longitude for geographic search (requires lat and radius_km)"
          },
          "radius_km": {
            "type": "number",
            "description": "Search radius in kilometers (used with lat/lng)"
          },
          "limit": {
            "type": "number",
            "description": "Maximum number of results (default: 10, max: 100)",
            "default": 10
          },
          "cursor": {
            "type": "string",
            "description": "Pagination cursor from a previous response's meta.next_cursor"
          },
          "format": {
            "type": "string",
            "enum": [
              "text",
              "json"
            ],
            "description": "Response format. 'text' (default) returns markdown prose; 'json' returns structured JSON.",
            "default": "text"
          }
        }
      },
      "title": "Search businesses",
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "local_search",
      "description": "Search local businesses from external sources; availability and freshness vary. Returns name, star rating, review count, phone, today's opening hours, website, full address, category, and geo coordinates for each result. Use when you need CURRENT info (today's hours, latest ratings) or when search_businesses doesn't have the business yet. Use for location-based business queries. Results may be cached.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "What to look for, e.g. 'coffee shops', 'dentist', 'thai restaurant'"
          },
          "location": {
            "type": "string",
            "description": "City, area, or 'near me': e.g. 'Copenhagen', 'Shibuya Tokyo'"
          },
          "limit": {
            "type": "number",
            "description": "Maximum number of results (default: 15)",
            "default": 15
          }
        },
        "required": [
          "query"
        ]
      },
      "title": "Live local search",
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "get_business",
      "description": "Fetch a single business by slug or UUID. Returns markdown prose by default (~60% fewer tokens than JSON). Slugs look like 'noma-copenhagen-abc12345'. Use when you already have an identifier from a previous search. Set format='json' for structured data.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Business slug (e.g. 'noma-copenhagen-abc12345') or UUID. Slugs preferred."
          },
          "format": {
            "type": "string",
            "enum": [
              "text",
              "json"
            ],
            "description": "'text' (default) markdown prose; 'json' structured JSON.",
            "default": "text"
          }
        },
        "required": [
          "id"
        ]
      },
      "title": "Get business",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "agentweb_get_short",
      "description": "Fetch a business in the AgentWeb compact shorthand format (~320 bytes vs 3-5 KB). Single-letter keys (n=name, p=phone, e=email, w=website, h=hours, g=[lat,lng]…). ~80% fewer tokens. Use when you just need contact info. Schema: https://api.agentweb.live/v1/schema/short",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The unique business ID from AgentWeb"
          }
        },
        "required": [
          "id"
        ]
      },
      "title": "Get business (short)",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "agentweb_health",
      "description": "Check the health status of the AgentWeb API, including total businesses and countries available.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "title": "AgentWeb health",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "agentweb_capabilities",
      "description": "Get the machine-readable description of the entire AgentWeb API: every endpoint, tool, data source, and current live counts. Use to discover what AgentWeb can do.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "title": "AgentWeb capabilities",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "contribute_business",
      "description": "Contribute a new business to AgentWeb, OR enrich an existing one with missing data (phone, email, website, hours, address). Deduplicates automatically: same name within 100m, or a matching phone, merges into the existing record. Use whenever you find structured business data AgentWeb doesn't have yet.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Business name (required, min 2 chars)"
          },
          "phone": {
            "type": "string",
            "description": "Phone number (any format; will be cleaned)"
          },
          "website": {
            "type": "string",
            "description": "Business website URL"
          },
          "email": {
            "type": "string",
            "description": "Business email address"
          },
          "category": {
            "type": "string",
            "description": "Business category, e.g. 'restaurant', 'dentist', 'hotel'"
          },
          "country_code": {
            "type": "string",
            "description": "ISO 3166-1 alpha-2 country code, e.g. 'US', 'DE'"
          },
          "lat": {
            "type": "number",
            "description": "Latitude (recommended for accurate dedup)"
          },
          "lng": {
            "type": "number",
            "description": "Longitude (recommended for accurate dedup)"
          },
          "address": {
            "type": "object",
            "description": "Address fields: { street, city, postcode, country, full }",
            "properties": {
              "street": {
                "type": "string"
              },
              "city": {
                "type": "string"
              },
              "postcode": {
                "type": "string"
              },
              "country": {
                "type": "string"
              },
              "full": {
                "type": "string"
              }
            }
          },
          "hours": {
            "type": "object",
            "description": "Opening hours (e.g. { monday: '09:00-17:00', ... })"
          }
        },
        "required": [
          "name"
        ]
      },
      "title": "Contribute business",
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "report_business",
      "description": "Report a business as closed, having wrong info, or being spam. Three or more 'closed' reports automatically lower its confidence score. Use when you discover a business is permanently closed, has wrong phone/address/hours, is spam, or is a duplicate.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "business_id": {
            "type": "string",
            "description": "The unique business ID from AgentWeb (required)"
          },
          "report_type": {
            "type": "string",
            "description": "Type of issue",
            "enum": [
              "closed",
              "wrong_phone",
              "wrong_address",
              "wrong_hours",
              "spam",
              "duplicate",
              "other"
            ]
          },
          "details": {
            "type": "string",
            "description": "Optional free-text explanation, max 500 chars"
          }
        },
        "required": [
          "business_id",
          "report_type"
        ]
      },
      "title": "Report business",
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "agentweb_leaderboard",
      "description": "Get the public leaderboard of top contributing AI agents (most creates, enrichments, reports).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "number",
            "description": "Number of top contributors (default: 10, max: 50)",
            "default": 10
          }
        }
      },
      "title": "Contributor leaderboard",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "suggest",
      "description": "Autocomplete / type-ahead for business names, cities, or categories. Use to disambiguate user input before searching. Returns up to 15 suggestions by relevance. Fast (<20ms).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "q": {
            "type": "string",
            "description": "Query prefix, min 2 characters (e.g. 'nom', 'copenh')"
          },
          "type": {
            "type": "string",
            "enum": [
              "business",
              "city",
              "category"
            ],
            "description": "What to autocomplete (default: 'business').",
            "default": "business"
          },
          "country": {
            "type": "string",
            "description": "Optional ISO country code to narrow suggestions"
          },
          "limit": {
            "type": "number",
            "description": "Max suggestions (default: 10, max: 15)",
            "default": 10
          }
        },
        "required": [
          "q"
        ]
      },
      "title": "Autocomplete",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "batch_get_businesses",
      "description": "Fetch up to 50 businesses in a single call by IDs or slugs. Saves N round-trips. Supports prose (markdown), JSON, and shorthand formats.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "ids": {
            "type": "string",
            "description": "Comma-separated business IDs or slugs (max 50)"
          },
          "format": {
            "type": "string",
            "enum": [
              "text",
              "json",
              "short"
            ],
            "description": "'text' (default) markdown; 'json' structured; 'short' compact shorthand.",
            "default": "text"
          }
        },
        "required": [
          "ids"
        ]
      },
      "title": "Get businesses (batch)",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "trending_businesses",
      "description": "Get the most searched/popular businesses on AgentWeb right now (last 24h or all time).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "period": {
            "type": "string",
            "enum": [
              "24h",
              "alltime"
            ],
            "description": "Time period (default: '24h').",
            "default": "24h"
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "description": "Max results (default: 10)",
            "default": 10
          }
        }
      },
      "title": "Trending businesses",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "agent_history",
      "description": "Retrieve this agent's interaction history: every business it searched for, viewed, or contributed to. Persists 90 days, up to 500 interactions. Recall past lookups without re-searching.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "number",
            "description": "Max entries (default: 50, max: 500)",
            "default": 50
          },
          "offset": {
            "type": "number",
            "description": "Skip N entries (default: 0)",
            "default": 0
          }
        }
      },
      "title": "My history",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "agent_favorites",
      "description": "Get this agent's implicit favorites: businesses it interacted with more than once, by frequency.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "number",
            "description": "Max favorites (default: 20, max: 100)",
            "default": 20
          }
        }
      },
      "title": "My favorites",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "agent_profile",
      "description": "Get this agent's identity and stats: API key info, tier, contribution count, request totals, remembered interactions.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "title": "My profile",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "search_flights",
      "description": "Search flights across multiple sources (booking.com + kiwi.com) and return the cheapest. Returns airlines, prices, times, stops, duration, source, and booking links. ~3s.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "description": "Origin airport IATA code (e.g. 'CPH', 'JFK', 'LHR')"
          },
          "to": {
            "type": "string",
            "description": "Destination airport IATA code (e.g. 'FCO', 'CDG', 'NRT')"
          },
          "depart": {
            "type": "string",
            "description": "Departure date YYYY-MM-DD"
          },
          "return": {
            "type": "string",
            "description": "Return date YYYY-MM-DD (omit for one-way)"
          },
          "adults": {
            "type": "number",
            "description": "Adult passengers (default: 2)",
            "default": 2
          },
          "cabin": {
            "type": "string",
            "enum": [
              "ECONOMY",
              "BUSINESS",
              "FIRST"
            ],
            "description": "Cabin class (default: ECONOMY)",
            "default": "ECONOMY"
          },
          "sort": {
            "type": "string",
            "enum": [
              "cheapest",
              "fastest",
              "direct"
            ],
            "description": "Sort order",
            "default": "cheapest"
          },
          "limit": {
            "type": "number",
            "description": "Max results (default: 10)",
            "default": 10
          }
        },
        "required": [
          "from",
          "to",
          "depart"
        ]
      },
      "title": "Search flights",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "search_hotels",
      "description": "Search hotels across multiple sources (booking.com + kiwi.com) and return the cheapest. Returns name, price, stars, rating, reviews, source, booking links. ~2s.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "destination": {
            "type": "string",
            "description": "City or destination (e.g. 'Rome', 'Tokyo')"
          },
          "checkin": {
            "type": "string",
            "description": "Check-in date YYYY-MM-DD"
          },
          "checkout": {
            "type": "string",
            "description": "Check-out date YYYY-MM-DD"
          },
          "adults": {
            "type": "number",
            "description": "Adult guests (default: 2)",
            "default": 2
          },
          "sort": {
            "type": "string",
            "enum": [
              "cheapest",
              "expensive"
            ],
            "description": "Sort by price",
            "default": "cheapest"
          },
          "max_price": {
            "type": "number",
            "description": "Maximum price per night filter"
          },
          "limit": {
            "type": "number",
            "description": "Max results (default: 10)",
            "default": 10
          }
        },
        "required": [
          "destination",
          "checkin",
          "checkout"
        ]
      },
      "title": "Search hotels",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "search_cars",
      "description": "Search real-time car rental availability and prices on booking.com via AgentWeb. Returns vehicle, supplier (Avis, Hertz, Sixt…), price, transmission, doors, mileage, pickup location, booking links. Works with any airport IATA code. ~1s.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "description": "Pickup: airport IATA code or city name"
          },
          "pickup_date": {
            "type": "string",
            "description": "Pickup date YYYY-MM-DD"
          },
          "dropoff_date": {
            "type": "string",
            "description": "Drop-off date YYYY-MM-DD"
          },
          "dropoff": {
            "type": "string",
            "description": "Drop-off location if different from pickup"
          },
          "pickup_time": {
            "type": "string",
            "description": "Pickup time HH:MM (default: 10:00)",
            "default": "10:00"
          },
          "dropoff_time": {
            "type": "string",
            "description": "Drop-off time HH:MM (default: 10:00)",
            "default": "10:00"
          },
          "driver_age": {
            "type": "number",
            "description": "Driver age (default: 30)",
            "default": 30
          },
          "transmission": {
            "type": "string",
            "enum": [
              "automatic",
              "manual"
            ],
            "description": "Filter by transmission type"
          },
          "sort": {
            "type": "string",
            "enum": [
              "cheapest",
              "expensive"
            ],
            "description": "Sort by price",
            "default": "cheapest"
          },
          "limit": {
            "type": "number",
            "description": "Max results (default: 15)",
            "default": 15
          }
        },
        "required": [
          "location",
          "pickup_date",
          "dropoff_date"
        ]
      },
      "title": "Search car rentals",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "kiwi_search_flights",
      "description": "Search flights on Kiwi.com: aggregates all airlines, often cheaper than airline sites. Returns prices, airlines, times, stops, duration, booking links. ~1.5s.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "description": "Origin airport IATA code"
          },
          "to": {
            "type": "string",
            "description": "Destination airport IATA code"
          },
          "depart": {
            "type": "string",
            "description": "Departure date YYYY-MM-DD"
          },
          "return": {
            "type": "string",
            "description": "Return date YYYY-MM-DD (omit for one-way)"
          },
          "adults": {
            "type": "number",
            "description": "Adult passengers (default: 1)",
            "default": 1
          },
          "cabin": {
            "type": "string",
            "enum": [
              "ECONOMY",
              "BUSINESS",
              "FIRST"
            ],
            "description": "Cabin class (default: ECONOMY)",
            "default": "ECONOMY"
          },
          "sort": {
            "type": "string",
            "enum": [
              "price",
              "duration",
              "quality"
            ],
            "description": "Sort (default: price)",
            "default": "price"
          },
          "limit": {
            "type": "number",
            "description": "Max results (default: 10)",
            "default": 10
          }
        },
        "required": [
          "from",
          "to",
          "depart"
        ]
      },
      "title": "Search flights (Kiwi)",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "flixbus_search",
      "description": "Search FlixBus bus and train routes between cities in Europe. Returns prices, times, duration, transfers, booking links. ~1s.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "description": "Origin city (e.g. 'Copenhagen', 'Berlin')"
          },
          "to": {
            "type": "string",
            "description": "Destination city (e.g. 'Berlin', 'Rome')"
          },
          "date": {
            "type": "string",
            "description": "Travel date YYYY-MM-DD"
          },
          "adults": {
            "type": "number",
            "description": "Passengers (default: 1)",
            "default": 1
          },
          "sort": {
            "type": "string",
            "enum": [
              "cheapest",
              "fastest",
              "earliest"
            ],
            "description": "Sort (default: cheapest)",
            "default": "cheapest"
          },
          "limit": {
            "type": "number",
            "description": "Max results (default: 10)",
            "default": 10
          }
        },
        "required": [
          "from",
          "to",
          "date"
        ]
      },
      "title": "Search buses",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "currency_convert",
      "description": "Convert between currencies using live ECB exchange rates. 30+ currencies. Returns converted amount and rate. ~0.5s.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "amount": {
            "type": "number",
            "description": "Amount to convert"
          },
          "from": {
            "type": "string",
            "description": "Source currency code (e.g. 'USD', 'EUR')"
          },
          "to": {
            "type": "string",
            "description": "Target currency code (e.g. 'EUR', 'JPY')"
          }
        },
        "required": [
          "amount",
          "from",
          "to"
        ]
      },
      "title": "Convert currency",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "time_now",
      "description": "Get the current date and time in a country (e.g. Denmark), supported city, or IANA timezone. Returns UTC offset, DST, Unix timestamp and timezone-data version. Fresh every call. Countries with multiple zones return choices; select one and retry. Use this for 'What time is it in Denmark right now?'.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "description": "Country name/code or supported city, e.g. Denmark, DK, Tokyo. Use either location or timezone."
          },
          "timezone": {
            "type": "string",
            "description": "IANA timezone, e.g. Europe/Copenhagen. Defaults to UTC if neither field is supplied."
          }
        },
        "additionalProperties": false
      },
      "title": "Current local time",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "time_convert",
      "description": "Convert a local date/time between IANA zones, supported cities or countries. Rejects nonexistent clock-change times. Repeated local times require fold=0/1 or an explicit UTC offset. HH:MM uses today's date in the source zone.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "description": "Source IANA timezone, supported city or country."
          },
          "to": {
            "type": "string",
            "description": "Destination IANA timezone, supported city or country."
          },
          "time": {
            "type": "string",
            "description": "ISO datetime, YYYY-MM-DD HH:MM, HH:MM or now (default)."
          },
          "fold": {
            "type": "integer",
            "enum": [
              0,
              1
            ],
            "description": "First (0) or second (1) occurrence during a backward clock change."
          }
        },
        "required": [
          "from",
          "to"
        ],
        "additionalProperties": false
      },
      "title": "Convert time",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "weather_forecast",
      "description": "Get weather forecast for any city worldwide. Returns current conditions plus daily forecast up to 14 days (high/low, rain chance, UV, sunrise/sunset, packing advisories). ~1s.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "city": {
            "type": "string",
            "description": "City name (e.g. 'Rome', 'Tokyo', 'New York')"
          },
          "days": {
            "type": "number",
            "description": "Forecast days (1-14, default: 3)",
            "default": 3
          },
          "units": {
            "type": "string",
            "enum": [
              "celsius",
              "fahrenheit"
            ],
            "description": "Temperature unit (default: celsius)",
            "default": "celsius"
          }
        },
        "required": [
          "city"
        ]
      },
      "title": "Weather forecast",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "search_attractions",
      "description": "Search real-time attractions, tours, and activities on booking.com via AgentWeb. Returns name, price, description, rating, duration, free-cancellation, discounts, booking links. ~2s.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "destination": {
            "type": "string",
            "description": "City name (e.g. 'Rome', 'Tokyo', 'Barcelona')"
          },
          "date": {
            "type": "string",
            "description": "Date YYYY-MM-DD"
          },
          "end_date": {
            "type": "string",
            "description": "End date YYYY-MM-DD (defaults to date)"
          },
          "sort": {
            "type": "string",
            "enum": [
              "popular",
              "cheapest",
              "rating"
            ],
            "description": "Sort (default: popular)",
            "default": "popular"
          },
          "limit": {
            "type": "number",
            "description": "Max results (default: 15)",
            "default": 15
          }
        },
        "required": [
          "destination",
          "date"
        ]
      },
      "title": "Search attractions",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "list_recipes",
      "description": "Discover every public recipe and its parameters, authentication and cache policy. Includes news, holidays, Wikipedia, Amazon products and provider-specific travel. A listed recipe is not a guarantee of upstream availability.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "title": "List recipes",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "execute_recipe",
      "description": "Execute a public recipe discovered with list_recipes. Pass its exact domain, recipe_name and named params. Covers all public recipes, including those without a dedicated tool. Upstream errors are returned as tool errors. Authentication follows the selected recipe.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string",
            "description": "Catalog key, e.g. news, holidays, wikipedia.org or amazon.com"
          },
          "recipe_name": {
            "type": "string",
            "description": "Recipe name, e.g. search, list or search_products"
          },
          "params": {
            "type": "object",
            "additionalProperties": {
              "type": [
                "string",
                "number",
                "boolean"
              ]
            },
            "description": "Named parameters from list_recipes. Do not include authentication credentials."
          }
        },
        "required": [
          "domain",
          "recipe_name",
          "params"
        ]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      },
      "title": "Execute recipe"
    },
    {
      "name": "web_search",
      "description": "General web search. mode=index searches AgentWeb's own indexed pages with a short time budget; mode=hybrid also queries external sources (the default). Returns the top web results (title, URL, snippet) for a query: general web pages, not just businesses. Use for research, finding pages, and current info. Pair with web_fetch to read a result.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "q": {
            "type": "string",
            "description": "Search query"
          },
          "num": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "description": "Number of results (default 10, max 20)",
            "default": 10
          },
          "mode": {
            "type": "string",
            "enum": [
              "index",
              "hybrid"
            ],
            "default": "hybrid"
          }
        },
        "required": [
          "q"
        ]
      },
      "title": "Web search",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "web_research",
      "description": "Web search PLUS the cleaned text of the top pages in one call (pages are fetched in parallel). Prefer this over web_search + web_fetch whenever you need to read the results, not just list them.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "q": {
            "type": "string",
            "description": "Search query"
          },
          "num": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5,
            "description": "Pages to read (default 3)",
            "default": 3
          },
          "max_chars": {
            "type": "integer",
            "minimum": 300,
            "maximum": 8000,
            "description": "Characters per page (default 2500)",
            "default": 2500
          },
          "idempotency_key": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "Reuse for a retry of exactly the same operation/input."
          },
          "max_duration_ms": {
            "type": "integer",
            "minimum": 1000,
            "maximum": 20000,
            "default": 10000
          },
          "max_units": {
            "type": "integer",
            "minimum": 1,
            "maximum": 6,
            "default": 4
          },
          "intent": {
            "type": "string",
            "enum": [
              "general",
              "official_website"
            ]
          },
          "entity": {
            "type": "string",
            "description": "Explicit entity for official_website candidate identification; ownership is not verified."
          }
        },
        "required": [
          "q"
        ]
      },
      "title": "Web research (search + read)",
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "web_fetch",
      "description": "Page fetch. Fetches a public URL and returns its cleaned text content (title + body) ready to read.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "description": "The page URL to fetch"
          },
          "max_chars": {
            "type": "number",
            "description": "Truncate content (default 8000)",
            "default": 8000
          }
        },
        "required": [
          "url"
        ]
      },
      "title": "Fetch web page",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "evidence_get",
      "description": "Retrieve an exact evidence passage and its immutable capture metadata. Evidence is scoped to this application's user/workspace and retained for seven days.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "evidence_id": {
            "type": "string"
          }
        },
        "required": [
          "evidence_id"
        ]
      },
      "title": "Evidence get",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "research_status",
      "description": "Get the status, evidence and usage receipt of an accepted research request.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "request_id": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "request_id"
        ]
      },
      "title": "Research status",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "research_cancel",
      "description": "Request cancellation of an accepted research execution. In-flight usage can remain pending; retrying cancellation does not start new work.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "request_id": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "request_id"
        ]
      },
      "title": "Research cancel",
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "watch_create",
      "description": "Create an expiring, resource-limited watch for URL text changes, text appearance or an unambiguous structured product price. Baselines are silent by default. An optional webhook receives signed changes; without it, poll watch_events.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "url": {
            "anyOf": [
              {
                "maxLength": 2048,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Url"
          },
          "query": {
            "anyOf": [
              {
                "maxLength": 500,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Query"
          },
          "kind": {
            "enum": [
              "content_changed",
              "text_appeared",
              "price_below",
              "price_dropped"
            ],
            "title": "Kind",
            "type": "string"
          },
          "terms": {
            "items": {
              "type": "string"
            },
            "maxItems": 5,
            "title": "Terms",
            "type": "array"
          },
          "price": {
            "anyOf": [
              {
                "exclusiveMinimum": 0,
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Price"
          },
          "currency": {
            "anyOf": [
              {
                "pattern": "^[A-Z]{3}$",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Currency"
          },
          "interval_seconds": {
            "default": 1800,
            "maximum": 86400,
            "minimum": 300,
            "title": "Interval Seconds",
            "type": "integer"
          },
          "expires_in_seconds": {
            "default": 86400,
            "maximum": 604800,
            "minimum": 300,
            "title": "Expires In Seconds",
            "type": "integer"
          },
          "max_checks": {
            "default": 48,
            "maximum": 288,
            "minimum": 1,
            "title": "Max Checks",
            "type": "integer"
          },
          "max_units": {
            "default": 192,
            "maximum": 1000,
            "minimum": 1,
            "title": "Max Units",
            "type": "integer"
          },
          "max_pages": {
            "default": 3,
            "maximum": 3,
            "minimum": 1,
            "title": "Max Pages",
            "type": "integer"
          },
          "notify_initial": {
            "default": false,
            "title": "Notify Initial",
            "type": "boolean"
          },
          "webhook_url": {
            "anyOf": [
              {
                "maxLength": 2048,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Webhook Url"
          },
          "idempotency_key": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "Reuse for a retry of exactly the same operation/input."
          }
        },
        "required": [
          "kind"
        ],
        "title": "WatchRequest",
        "type": "object"
      },
      "title": "Watch create",
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "watch_list",
      "description": "List change watches in the current application/user/workspace scope.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "title": "Watch list",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "watch_events",
      "description": "Read detected changes, supporting evidence and delivery status for a watch in the current scope.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "watch_id": {
            "type": "string",
            "format": "uuid"
          },
          "after": {
            "type": "string",
            "description": "next_cursor from the previous page"
          }
        },
        "required": [
          "watch_id"
        ]
      },
      "title": "Watch events",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "watch_cancel",
      "description": "Cancel a watch and its queued callback deliveries. An already in-flight delivery may still arrive.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "watch_id": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "watch_id"
        ]
      },
      "title": "Watch cancel",
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    }
  ]
}
