{
  "count": 32,
  "tools": [
    {
      "name": "time.now",
      "mcp_name": "time_now",
      "family": "data",
      "tier": 1,
      "title": "Current time",
      "summary": "Current date and time in any IANA timezone, with UTC offset and daylight-saving flag.",
      "when_to_use": "Use whenever you need today's date or the current time, because models do not know it. Pass an IANA timezone such as Europe/Berlin. Defaults to UTC.",
      "cost": 1,
      "cache_ttl_s": 0,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "timezone": {
            "default": "UTC",
            "description": "IANA timezone, e.g. America/New_York.",
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          }
        }
      },
      "output": "timezone, iso (local time with offset), utc (ISO 8601 Z), unix_s, weekday, utc_offset, is_dst",
      "examples": [
        {
          "timezone": "Asia/Tokyo"
        },
        {}
      ],
      "sources": [
        {
          "name": "ECMAScript Intl with the IANA tz database",
          "url": "https://tc39.es/ecma402/"
        }
      ],
      "attribution": null,
      "notes": []
    },
    {
      "name": "geo.resolve",
      "mcp_name": "geo_resolve",
      "family": "geo",
      "tier": 1,
      "title": "Place lookup",
      "summary": "Turns a place name into coordinates, country and timezone.",
      "when_to_use": "Use when the user names a place and you need its coordinates or to pick between candidates. Weather, air quality, routing and nearby search accept a place name directly, so you rarely need this on its own.",
      "cost": 1,
      "cache_ttl_s": 2592000,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "minLength": 2,
            "maxLength": 200,
            "description": "Place name, e.g. 'Kyoto' or 'Paris, France'."
          },
          "count": {
            "default": 5,
            "description": "How many candidates to return.",
            "type": "integer",
            "minimum": 1,
            "maximum": 10
          }
        },
        "required": [
          "query"
        ]
      },
      "output": "results: [{name, admin1, country, country_code, latitude, longitude, timezone, population}]",
      "examples": [
        {
          "query": "Springfield",
          "count": 3
        }
      ],
      "sources": [
        {
          "name": "Open-Meteo geocoding",
          "url": "https://open-meteo.com"
        }
      ],
      "attribution": "Geocoding by Open-Meteo.com (CC BY 4.0), data from GeoNames",
      "notes": []
    },
    {
      "name": "weather.current",
      "mcp_name": "weather_current",
      "family": "geo",
      "tier": 1,
      "title": "Current weather",
      "summary": "Current temperature, feels-like, humidity, wind and conditions for a place.",
      "when_to_use": "Use for questions about the weather right now at a place. Use weather.forecast for future days and weather.alerts for warnings.",
      "cost": 1,
      "cache_ttl_s": 600,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "location": {
            "description": "Place name such as 'Tokyo' or 'Austin, TX'. Use instead of latitude and longitude.",
            "type": "string",
            "minLength": 2,
            "maxLength": 200
          },
          "latitude": {
            "description": "Decimal latitude, -90 to 90.",
            "type": "number",
            "minimum": -90,
            "maximum": 90
          },
          "longitude": {
            "description": "Decimal longitude, -180 to 180.",
            "type": "number",
            "minimum": -180,
            "maximum": 180
          },
          "units": {
            "default": "metric",
            "description": "metric (°C, km/h, mm) or imperial (°F, mph, in).",
            "type": "string",
            "enum": [
              "metric",
              "imperial"
            ]
          }
        }
      },
      "output": "location, observed_at (local time), timezone, temperature, feels_like, humidity_pct, precipitation, wind_speed, wind_direction_deg, condition, weather_code, is_day, units",
      "examples": [
        {
          "location": "Tokyo"
        },
        {
          "latitude": 51.5074,
          "longitude": -0.1278,
          "units": "imperial"
        }
      ],
      "sources": [
        {
          "name": "Open-Meteo forecast API",
          "url": "https://open-meteo.com"
        }
      ],
      "attribution": "Weather data by Open-Meteo.com (CC BY 4.0)",
      "notes": []
    },
    {
      "name": "weather.forecast",
      "mcp_name": "weather_forecast",
      "family": "geo",
      "tier": 1,
      "title": "Daily forecast",
      "summary": "Daily forecast up to 16 days: highs, lows, rain chance, wind, sunrise and sunset.",
      "when_to_use": "Use for questions about future weather at a place, such as 'will it rain on Friday' or 'what should I pack for next week'. Use weather.current for right now.",
      "cost": 1,
      "cache_ttl_s": 1800,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "location": {
            "description": "Place name such as 'Tokyo' or 'Austin, TX'. Use instead of latitude and longitude.",
            "type": "string",
            "minLength": 2,
            "maxLength": 200
          },
          "latitude": {
            "description": "Decimal latitude, -90 to 90.",
            "type": "number",
            "minimum": -90,
            "maximum": 90
          },
          "longitude": {
            "description": "Decimal longitude, -180 to 180.",
            "type": "number",
            "minimum": -180,
            "maximum": 180
          },
          "days": {
            "default": 7,
            "description": "Number of days, 1 to 16.",
            "type": "integer",
            "minimum": 1,
            "maximum": 16
          },
          "units": {
            "default": "metric",
            "description": "metric (°C, km/h, mm) or imperial (°F, mph, in).",
            "type": "string",
            "enum": [
              "metric",
              "imperial"
            ]
          }
        }
      },
      "output": "location, timezone, days: [{date, condition, weather_code, temp_max, temp_min, precipitation_sum, precipitation_probability_max, wind_speed_max, sunrise, sunset}], units",
      "examples": [
        {
          "location": "Lisbon",
          "days": 3
        }
      ],
      "sources": [
        {
          "name": "Open-Meteo forecast API",
          "url": "https://open-meteo.com"
        }
      ],
      "attribution": "Weather data by Open-Meteo.com (CC BY 4.0)",
      "notes": []
    },
    {
      "name": "air.quality",
      "mcp_name": "air_quality",
      "family": "geo",
      "tier": 1,
      "title": "Air quality",
      "summary": "Current US and European AQI with PM2.5, PM10, ozone and NO2 readings for a place.",
      "when_to_use": "Use for questions about air pollution, or whether it is safe to exercise outdoors at a place. Returns US AQI (0-500) and European AQI.",
      "cost": 1,
      "cache_ttl_s": 1800,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "location": {
            "description": "Place name such as 'Tokyo' or 'Austin, TX'. Use instead of latitude and longitude.",
            "type": "string",
            "minLength": 2,
            "maxLength": 200
          },
          "latitude": {
            "description": "Decimal latitude, -90 to 90.",
            "type": "number",
            "minimum": -90,
            "maximum": 90
          },
          "longitude": {
            "description": "Decimal longitude, -180 to 180.",
            "type": "number",
            "minimum": -180,
            "maximum": 180
          }
        }
      },
      "output": "location, observed_at, us_aqi, us_category, european_aqi, pollutants: {pm2_5, pm10, ozone, nitrogen_dioxide, sulphur_dioxide, carbon_monoxide} (µg/m³)",
      "examples": [
        {
          "location": "Beijing"
        }
      ],
      "sources": [
        {
          "name": "Open-Meteo air quality API (CAMS)",
          "url": "https://open-meteo.com/en/docs/air-quality-api"
        }
      ],
      "attribution": "Air quality by Open-Meteo.com (CC BY 4.0), CAMS data from Copernicus",
      "notes": []
    },
    {
      "name": "weather.alerts",
      "mcp_name": "weather_alerts",
      "family": "geo",
      "tier": 1,
      "title": "Severe weather alerts",
      "summary": "Active National Weather Service warnings, watches and advisories for a US point.",
      "when_to_use": "Use when the user asks about active warnings, storms or hazards at a location. Coverage is the United States and territories only. Other locations return an empty list with a coverage note.",
      "cost": 1,
      "cache_ttl_s": 300,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "location": {
            "description": "Place name such as 'Tokyo' or 'Austin, TX'. Use instead of latitude and longitude.",
            "type": "string",
            "minLength": 2,
            "maxLength": 200
          },
          "latitude": {
            "description": "Decimal latitude, -90 to 90.",
            "type": "number",
            "minimum": -90,
            "maximum": 90
          },
          "longitude": {
            "description": "Decimal longitude, -180 to 180.",
            "type": "number",
            "minimum": -180,
            "maximum": 180
          }
        }
      },
      "output": "location, coverage, alerts: [{event, severity, urgency, certainty, headline, description, instruction, onset, expires, sender, area}]",
      "examples": [
        {
          "latitude": 39.7392,
          "longitude": -104.9903
        }
      ],
      "sources": [
        {
          "name": "NWS API (api.weather.gov)",
          "url": "https://www.weather.gov/documentation/services-web-api"
        }
      ],
      "attribution": "Alerts from the US National Weather Service",
      "notes": []
    },
    {
      "name": "fx.convert",
      "mcp_name": "fx_convert",
      "family": "data",
      "tier": 1,
      "title": "Currency converter",
      "summary": "Converts an amount between two currencies at the ECB reference rate, latest or historical.",
      "when_to_use": "Use for currency conversion. ECB reference rates are published on business days, so weekend and holiday requests use the last published rate. Not a trading or exact bank quote.",
      "cost": 1,
      "cache_ttl_s": 3600,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "amount": {
            "type": "number",
            "minimum": 0,
            "maximum": 1000000000000,
            "description": "Amount in the source currency."
          },
          "from": {
            "type": "string",
            "pattern": "^[A-Za-z]{3}$",
            "description": "ISO 4217 code, e.g. USD."
          },
          "to": {
            "type": "string",
            "pattern": "^[A-Za-z]{3}$",
            "description": "ISO 4217 code, e.g. EUR."
          },
          "date": {
            "description": "Historical date YYYY-MM-DD, from 1999-01-04. Omit for the latest rate.",
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
          }
        },
        "required": [
          "amount",
          "from",
          "to"
        ]
      },
      "output": "amount, from, to, rate, converted, rate_date, source",
      "examples": [
        {
          "amount": 100,
          "from": "USD",
          "to": "EUR"
        },
        {
          "amount": 250,
          "from": "GBP",
          "to": "JPY",
          "date": "2020-06-01"
        }
      ],
      "sources": [
        {
          "name": "Frankfurter (ECB reference rates)",
          "url": "https://frankfurter.dev"
        }
      ],
      "attribution": "Exchange rates: European Central Bank via frankfurter.dev",
      "notes": []
    },
    {
      "name": "crypto.price",
      "mcp_name": "crypto_price",
      "family": "data",
      "tier": 1,
      "title": "Crypto price",
      "summary": "Price, 24-hour change and market cap for up to 10 coins by CoinGecko id.",
      "when_to_use": "Use for current cryptocurrency prices. Pass CoinGecko ids such as bitcoin or ethereum, not ticker symbols, which are ambiguous. Prices are indicative, not trading quotes.",
      "cost": 1,
      "cache_ttl_s": 60,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "ids": {
            "minItems": 1,
            "maxItems": 10,
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^[a-z0-9-]{2,64}$"
            },
            "description": "CoinGecko ids, lowercase, e.g. ['bitcoin', 'ethereum']."
          },
          "vs": {
            "default": "usd",
            "description": "Quote currency, lowercase ISO code such as usd or eur.",
            "type": "string",
            "pattern": "^[a-z]{3}$"
          }
        },
        "required": [
          "ids"
        ]
      },
      "output": "vs, prices: [{id, price, change_24h_pct, market_cap, last_updated}], missing: [ids not found]",
      "examples": [
        {
          "ids": [
            "bitcoin",
            "ethereum"
          ]
        }
      ],
      "sources": [
        {
          "name": "CoinGecko API",
          "url": "https://www.coingecko.com/en/api"
        }
      ],
      "attribution": "Prices by CoinGecko",
      "notes": [
        "The operator can set a CoinGecko demo key for higher upstream limits."
      ]
    },
    {
      "name": "holidays.list",
      "mcp_name": "holidays_list",
      "family": "data",
      "tier": 1,
      "title": "Public holidays",
      "summary": "Public and bank holidays for a country or state in a year, plus a business-day check.",
      "when_to_use": "Use for holiday calendars, or to check whether a date is a business day, for example when counting working days toward a deadline. Computed offline, so it is fast and always available.",
      "cost": 1,
      "cache_ttl_s": 86400,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "country": {
            "type": "string",
            "pattern": "^[A-Za-z]{2}$",
            "description": "ISO 3166-1 alpha-2 code, e.g. US, DE, JP."
          },
          "subdivision": {
            "description": "State or region code, e.g. CA for California in the US.",
            "type": "string",
            "minLength": 1,
            "maxLength": 10
          },
          "year": {
            "description": "Year. Defaults to the current UTC year.",
            "type": "integer",
            "minimum": 1900,
            "maximum": 2100
          },
          "include_observances": {
            "default": false,
            "description": "Also include observances and optional days, not only public and bank holidays.",
            "type": "boolean"
          },
          "on": {
            "description": "Date YYYY-MM-DD to check for business-day status.",
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
          }
        },
        "required": [
          "country"
        ]
      },
      "output": "country, subdivision, year, holidays: [{date, name, type}], count, on: {date, is_weekend, holiday, is_business_day}",
      "examples": [
        {
          "country": "US",
          "subdivision": "CA",
          "year": 2026,
          "on": "2026-07-04"
        }
      ],
      "sources": [
        {
          "name": "date-holidays (offline dataset)",
          "url": "https://github.com/commenthol/date-holidays"
        }
      ],
      "attribution": "Holiday data from the date-holidays project (MIT)",
      "notes": [
        "Holiday rules come from the date-holidays project. Confirm official observances for legal or payroll decisions."
      ]
    },
    {
      "name": "tokens.count",
      "mcp_name": "tokens_count",
      "family": "data",
      "tier": 1,
      "title": "Token counter",
      "summary": "Exact token count for the OpenAI o200k_base and cl100k_base encodings, computed offline.",
      "when_to_use": "Use to estimate prompt size or cost for OpenAI models. Counts are exact for the named encoding. Anthropic and Google tokenizers differ and are not supported yet.",
      "cost": 1,
      "cache_ttl_s": 0,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200000,
            "description": "Text to tokenize, up to 200,000 characters."
          },
          "encoding": {
            "default": "o200k_base",
            "description": "o200k_base for GPT-4o and later. cl100k_base for GPT-4 and GPT-3.5.",
            "type": "string",
            "enum": [
              "o200k_base",
              "cl100k_base"
            ]
          }
        },
        "required": [
          "text"
        ]
      },
      "output": "tokens, characters, encoding, exact (true for supported encodings)",
      "examples": [
        {
          "text": "Hello, world!"
        },
        {
          "text": "Count me",
          "encoding": "cl100k_base"
        }
      ],
      "sources": [
        {
          "name": "tiktoken encodings via js-tiktoken",
          "url": "https://github.com/dqbd/tiktoken"
        }
      ],
      "attribution": "Tokenization by js-tiktoken (MIT), using OpenAI encodings",
      "notes": []
    },
    {
      "name": "web.extract",
      "mcp_name": "web_extract",
      "family": "web",
      "tier": 1,
      "title": "Article text",
      "summary": "Main text, title, author and publish date from a public web page, as clean plain text.",
      "when_to_use": "Use to read the content of an article, blog post or documentation page. Returns plain text, not HTML. Pages that need JavaScript to render may return EMPTY_CONTENT; web.screenshot can show those.",
      "cost": 1,
      "cache_ttl_s": 900,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "maxLength": 2048,
            "format": "uri",
            "description": "Absolute http or https URL of the page."
          },
          "max_chars": {
            "default": 20000,
            "description": "Maximum characters of text to return.",
            "type": "integer",
            "minimum": 500,
            "maximum": 100000
          }
        },
        "required": [
          "url"
        ]
      },
      "output": "url, title, author, published, site_name, language, excerpt, text, word_count, truncated",
      "examples": [
        {
          "url": "https://en.wikipedia.org/wiki/Web_scraping"
        }
      ],
      "sources": [
        {
          "name": "Mozilla Readability",
          "url": "https://github.com/mozilla/readability"
        }
      ],
      "attribution": "Article text from the source page; copyright remains with the publisher",
      "notes": []
    },
    {
      "name": "web.archive",
      "mcp_name": "web_archive",
      "family": "web",
      "tier": 1,
      "title": "Web archive lookup",
      "summary": "Closest Internet Archive snapshot of a URL, latest or near a given date.",
      "when_to_use": "Use when a link is dead or the user wants a page as it was on a date. Returns the snapshot closest to the timestamp, not every capture.",
      "cost": 1,
      "cache_ttl_s": 86400,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "maxLength": 2048,
            "format": "uri"
          },
          "timestamp": {
            "description": "Target date, YYYY, YYYY-MM or YYYY-MM-DD. Omit for the latest snapshot.",
            "type": "string",
            "pattern": "^\\d{4}(-?\\d{2}(-?\\d{2})?)?$"
          }
        },
        "required": [
          "url"
        ]
      },
      "output": "url, available, snapshot_url, captured_at, http_status",
      "examples": [
        {
          "url": "https://example.com",
          "timestamp": "2015-06-01"
        }
      ],
      "sources": [
        {
          "name": "Internet Archive Wayback Machine",
          "url": "https://archive.org/web/"
        }
      ],
      "attribution": "Snapshots from the Internet Archive Wayback Machine",
      "notes": []
    },
    {
      "name": "feed.read",
      "mcp_name": "feed_read",
      "family": "web",
      "tier": 1,
      "title": "RSS and Atom reader",
      "summary": "Latest items from any RSS or Atom feed: title, link, published time and summary.",
      "when_to_use": "Use to see recent posts from a blog, news site or release channel. Stateless: each call returns the newest items; it does not notify on new ones.",
      "cost": 1,
      "cache_ttl_s": 600,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "maxLength": 2048,
            "format": "uri",
            "description": "Feed URL (RSS 2.0 or Atom)."
          },
          "limit": {
            "default": 10,
            "description": "Maximum items to return.",
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          }
        },
        "required": [
          "url"
        ]
      },
      "output": "feed: {title, link}, items: [{title, link, published, summary}], count",
      "examples": [
        {
          "url": "https://hnrss.org/frontpage",
          "limit": 5
        }
      ],
      "sources": [
        {
          "name": "The feed itself",
          "url": "https://www.rssboard.org/rss-specification"
        }
      ],
      "attribution": "Content belongs to the feed publisher",
      "notes": []
    },
    {
      "name": "site.status",
      "mcp_name": "site_status",
      "family": "net",
      "tier": 1,
      "title": "Site status check",
      "summary": "Is a URL up? HTTP status, redirect target, response time and a failure class, for up to 20 URLs.",
      "when_to_use": "Use to check whether a site is reachable from the public internet, or to diagnose why a link fails. Reports the first response without following redirects. Results are not cached.",
      "cost": 1,
      "cache_ttl_s": 0,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "urls": {
            "minItems": 1,
            "maxItems": 20,
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 2048,
              "format": "uri"
            },
            "description": "Up to 20 absolute http or https URLs."
          }
        },
        "required": [
          "urls"
        ]
      },
      "output": "results: [{url, up, status_code, redirect_to, response_ms, error_class, error}], checked_at",
      "examples": [
        {
          "urls": [
            "https://agentops.tools",
            "https://example.com"
          ]
        }
      ],
      "sources": [
        {
          "name": "Direct HTTP probe from our network",
          "url": "https://agentops.tools"
        }
      ],
      "attribution": null,
      "notes": [
        "Probes come from our network vantage point, so results can differ from the caller's network."
      ]
    },
    {
      "name": "dns.lookup",
      "mcp_name": "dns_lookup",
      "family": "net",
      "tier": 1,
      "title": "DNS records",
      "summary": "A, AAAA, MX, TXT, NS, CNAME and CAA records for a domain, with SPF and DMARC parsed out.",
      "when_to_use": "Use to check where a domain points, which mail servers it uses, or whether SPF and DMARC are set. Answers come from a public recursive resolver, so changes may take time to show.",
      "cost": 1,
      "cache_ttl_s": 300,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 3,
            "maxLength": 253,
            "pattern": "^[A-Za-z0-9._-]+$",
            "description": "Domain name, e.g. example.com."
          },
          "types": {
            "default": [
              "A",
              "AAAA",
              "MX",
              "TXT",
              "NS"
            ],
            "description": "Record types to fetch.",
            "minItems": 1,
            "maxItems": 7,
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "A",
                "AAAA",
                "MX",
                "TXT",
                "NS",
                "CNAME",
                "CAA"
              ]
            }
          }
        },
        "required": [
          "name"
        ]
      },
      "output": "name, status (NOERROR or NXDOMAIN), records: {type: [...]}, spf, dmarc: {tags}",
      "examples": [
        {
          "name": "example.com"
        },
        {
          "name": "github.com",
          "types": [
            "MX",
            "TXT"
          ]
        }
      ],
      "sources": [
        {
          "name": "Cloudflare DNS over HTTPS",
          "url": "https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/"
        }
      ],
      "attribution": null,
      "notes": []
    },
    {
      "name": "domain.whois",
      "mcp_name": "domain_whois",
      "family": "net",
      "tier": 1,
      "title": "Domain registration",
      "summary": "Registrar, creation and expiry dates, status flags and nameservers from RDAP.",
      "when_to_use": "Use for questions about who registered a domain, when it expires, or which nameservers it uses. Uses RDAP, the modern replacement for WHOIS. Some registries redact contact details, which is expected.",
      "cost": 1,
      "cache_ttl_s": 86400,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "domain": {
            "type": "string",
            "pattern": "^(?=.{4,253}$)([a-z0-9-]{1,63}\\.)+[a-z]{2,63}$",
            "description": "Registered domain, e.g. example.com."
          }
        },
        "required": [
          "domain"
        ]
      },
      "output": "domain, registrar, status: [], created, updated, expires, nameservers: [], dnssec_signed",
      "examples": [
        {
          "domain": "example.com"
        }
      ],
      "sources": [
        {
          "name": "RDAP via rdap.org bootstrap",
          "url": "https://about.rdap.org"
        }
      ],
      "attribution": null,
      "notes": []
    },
    {
      "name": "email.check",
      "mcp_name": "email_check",
      "family": "net",
      "tier": 1,
      "title": "Email address check",
      "summary": "Syntax, mail-server (MX) presence, disposable-domain and role-account checks for an address.",
      "when_to_use": "Use to screen addresses before sending or storing them: is the syntax valid, does the domain accept mail, is it a throwaway provider. It does not contact the mailbox, so it cannot confirm that the person exists.",
      "cost": 1,
      "cache_ttl_s": 86400,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "minLength": 3,
            "maxLength": 320,
            "description": "Email address to check."
          }
        },
        "required": [
          "email"
        ]
      },
      "output": "email, valid_syntax, syntax_error, domain, mail_servers: [{priority, host}], accepts_mail, implicit_mx, disposable, role_account, deliverable_signal",
      "examples": [
        {
          "email": "someone@example.com"
        },
        {
          "email": "info@gmail.com"
        }
      ],
      "sources": [
        {
          "name": "disposable-email-domains list",
          "url": "https://github.com/disposable-email-domains/disposable-email-domains"
        },
        {
          "name": "Cloudflare DNS over HTTPS",
          "url": "https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/"
        }
      ],
      "attribution": null,
      "notes": [
        "No SMTP probing is done. A deliverable_signal of true means the domain can receive mail, not that the mailbox exists."
      ]
    },
    {
      "name": "tls.inspect",
      "mcp_name": "tls_inspect",
      "family": "net",
      "tier": 1,
      "title": "TLS certificate check",
      "summary": "Certificate chain, expiry, cipher and TLS version for a host, seen from our network.",
      "when_to_use": "Use to check whether a site's certificate is valid, who issued it, when it expires, or what TLS version and cipher it negotiates. Sees what our servers see, not the agent's own network.",
      "cost": 1,
      "cache_ttl_s": 3600,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "host": {
            "type": "string",
            "minLength": 1,
            "maxLength": 253,
            "description": "Hostname, e.g. example.com. IP literals are rejected."
          },
          "port": {
            "default": 443,
            "type": "integer",
            "minimum": 1,
            "maximum": 65535
          }
        },
        "required": [
          "host"
        ]
      },
      "output": "host, port, valid, subject, issuer, sans, not_before, not_after, days_left, expired, expiring_soon, tls_version, cipher",
      "examples": [
        {
          "host": "example.com"
        }
      ],
      "sources": [
        {
          "name": "Direct TLS handshake from origin network",
          "url": "https://agentops.tools"
        }
      ],
      "attribution": null,
      "notes": []
    },
    {
      "name": "route.plan",
      "mcp_name": "route_plan",
      "family": "geo",
      "tier": 1,
      "title": "Driving route",
      "summary": "Driving distance, duration and turn-by-turn steps through two to ten stops.",
      "when_to_use": "Use for drive distance and time between places, or a multi-stop road trip. Gives road-network estimates without live traffic. Walking and cycling are not offered yet.",
      "cost": 2,
      "cache_ttl_s": 86400,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "stops": {
            "minItems": 2,
            "maxItems": 10,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "location": {
                  "description": "Place name such as 'Tokyo' or 'Austin, TX'. Use instead of latitude and longitude.",
                  "type": "string",
                  "minLength": 2,
                  "maxLength": 200
                },
                "latitude": {
                  "description": "Decimal latitude, -90 to 90.",
                  "type": "number",
                  "minimum": -90,
                  "maximum": 90
                },
                "longitude": {
                  "description": "Decimal longitude, -180 to 180.",
                  "type": "number",
                  "minimum": -180,
                  "maximum": 180
                }
              }
            },
            "description": "Ordered stops. Each is {location} or {latitude, longitude}."
          }
        },
        "required": [
          "stops"
        ]
      },
      "output": "stops: [{name, latitude, longitude}], distance_m, duration_s, legs: [{from, to, distance_m, duration_s, steps: [{road, instruction, distance_m, duration_s}]}], steps_truncated",
      "examples": [
        {
          "stops": [
            {
              "location": "Berlin"
            },
            {
              "location": "Munich"
            }
          ]
        }
      ],
      "sources": [
        {
          "name": "OSRM routing (public demo server)",
          "url": "https://project-osrm.org"
        }
      ],
      "attribution": "Routing by OSRM; map data © OpenStreetMap contributors (ODbL)",
      "notes": [
        "Uses OSRM's public demo server, which is fair-use. A self-hosted router is planned for scale."
      ]
    },
    {
      "name": "places.nearby",
      "mcp_name": "places_nearby",
      "family": "geo",
      "tier": 1,
      "title": "Nearby places",
      "summary": "Named restaurants, cafés, pharmacies, fuel, ATMs and more within a radius, nearest first.",
      "when_to_use": "Use to find named businesses or amenities near a location. Results come from OpenStreetMap, so coverage varies by area, and opening hours are as mapped by volunteers.",
      "cost": 2,
      "cache_ttl_s": 86400,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "location": {
            "description": "Place name such as 'Tokyo' or 'Austin, TX'. Use instead of latitude and longitude.",
            "type": "string",
            "minLength": 2,
            "maxLength": 200
          },
          "latitude": {
            "description": "Decimal latitude, -90 to 90.",
            "type": "number",
            "minimum": -90,
            "maximum": 90
          },
          "longitude": {
            "description": "Decimal longitude, -180 to 180.",
            "type": "number",
            "minimum": -180,
            "maximum": 180
          },
          "category": {
            "type": "string",
            "enum": [
              "restaurant",
              "cafe",
              "pharmacy",
              "hospital",
              "atm",
              "fuel",
              "library",
              "supermarket",
              "park"
            ],
            "description": "Kind of place to search for."
          },
          "radius_m": {
            "default": 1000,
            "description": "Search radius in metres.",
            "type": "integer",
            "minimum": 100,
            "maximum": 5000
          },
          "limit": {
            "default": 20,
            "description": "Maximum places to return.",
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          }
        },
        "required": [
          "category"
        ]
      },
      "output": "location, category, count, places: [{name, category, distance_m, latitude, longitude, address, opening_hours, website}]",
      "examples": [
        {
          "location": "Kreuzberg, Berlin",
          "category": "cafe",
          "radius_m": 500,
          "limit": 10
        }
      ],
      "sources": [
        {
          "name": "OpenStreetMap via Overpass API",
          "url": "https://overpass-api.de"
        }
      ],
      "attribution": "© OpenStreetMap contributors (ODbL)",
      "notes": [
        "Only named places are returned. Unnamed map features are filtered out."
      ]
    },
    {
      "name": "ip.geolocate",
      "mcp_name": "ip_geolocate",
      "family": "geo",
      "tier": 1,
      "title": "IP geolocation",
      "summary": "Country, city and coordinates for a public IP address, from an offline database.",
      "when_to_use": "Use to place an IP address on the map, for example to localise content or annotate logs. City precision is approximate; private addresses are rejected.",
      "cost": 1,
      "cache_ttl_s": 86400,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "ip": {
            "type": "string",
            "minLength": 3,
            "maxLength": 64,
            "description": "IPv4 or IPv6 address."
          }
        },
        "required": [
          "ip"
        ]
      },
      "output": "ip, country, country_name, city, latitude, longitude, source",
      "examples": [
        {
          "ip": "8.8.8.8"
        }
      ],
      "sources": [
        {
          "name": "DB-IP Lite (CC-BY)",
          "url": "https://db-ip.com/db/download/ip-to-city-lite"
        }
      ],
      "attribution": "Geolocation by DB-IP Lite; approximate, city-level",
      "notes": []
    },
    {
      "name": "food.barcode",
      "mcp_name": "food_barcode",
      "family": "data",
      "tier": 1,
      "title": "Food product lookup",
      "summary": "Name, brand, quantity, categories, Nutri-Score and ingredients for a food barcode (EAN/UPC).",
      "when_to_use": "Use to identify a packaged food product from its barcode. Food only: Open Food Facts does not carry prices or non-food items.",
      "cost": 1,
      "cache_ttl_s": 604800,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "barcode": {
            "type": "string",
            "pattern": "^\\d{8,14}$",
            "description": "EAN-8, UPC-A, EAN-13 or GTIN-14 digits, no spaces."
          }
        },
        "required": [
          "barcode"
        ]
      },
      "output": "barcode, found, name, brand, quantity, categories: [], nutriscore_grade, ingredients",
      "examples": [
        {
          "barcode": "3017620422003"
        }
      ],
      "sources": [
        {
          "name": "Open Food Facts",
          "url": "https://world.openfoodfacts.org"
        }
      ],
      "attribution": "Product data from Open Food Facts (ODbL / CC BY-SA 4.0 for images)",
      "notes": []
    },
    {
      "name": "qr.generate",
      "mcp_name": "qr_generate",
      "family": "media",
      "tier": 1,
      "title": "QR code generator",
      "summary": "QR code as PNG (base64) or SVG for any text or URL up to 2,000 characters.",
      "when_to_use": "Use when the user needs a QR code for a link, Wi-Fi string, contact or any text. Output is an image the user can save or print.",
      "cost": 1,
      "cache_ttl_s": 86400,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "minLength": 1,
            "maxLength": 2000,
            "description": "Content to encode."
          },
          "format": {
            "default": "png",
            "type": "string",
            "enum": [
              "png",
              "svg"
            ]
          },
          "size_px": {
            "default": 256,
            "description": "Approximate PNG side length in pixels.",
            "type": "integer",
            "minimum": 64,
            "maximum": 1024
          },
          "error_correction": {
            "default": "M",
            "description": "L recovers ~7% damage, M ~15%, Q ~25%, H ~30%.",
            "type": "string",
            "enum": [
              "L",
              "M",
              "Q",
              "H"
            ]
          },
          "margin": {
            "default": 4,
            "description": "Quiet-zone width in modules.",
            "type": "integer",
            "minimum": 0,
            "maximum": 10
          }
        },
        "required": [
          "text"
        ]
      },
      "output": "format, content_type, width, data_base64 (png) or svg (svg)",
      "examples": [
        {
          "text": "https://agentops.tools"
        },
        {
          "text": "https://agentops.tools",
          "format": "svg"
        }
      ],
      "sources": [
        {
          "name": "qrcode-generator (MIT)",
          "url": "https://github.com/kazuhikoarase/qrcode-generator"
        }
      ],
      "attribution": null,
      "notes": []
    },
    {
      "name": "qr.decode",
      "mcp_name": "qr_decode",
      "family": "media",
      "tier": 1,
      "title": "QR code reader",
      "summary": "Reads the QR code in a PNG or JPEG image, given as a URL or base64.",
      "when_to_use": "Use to read a QR code from a screenshot or photo. Only QR codes are decoded; 1D barcodes are not supported in this version. Images over 12 megapixels are rejected.",
      "cost": 1,
      "cache_ttl_s": 0,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "url": {
            "description": "Absolute http or https URL of the file. Use instead of base64.",
            "type": "string",
            "maxLength": 2048,
            "format": "uri"
          },
          "base64": {
            "description": "Base64-encoded file bytes, up to 10 MB once decoded. Use instead of url.",
            "type": "string",
            "maxLength": 14000000
          }
        }
      },
      "output": "found, count, results: [{text, bytes, corners: [{x, y}]}]",
      "examples": [
        {
          "url": "https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=hello"
        }
      ],
      "sources": [
        {
          "name": "jsQR (Apache-2.0)",
          "url": "https://github.com/cozmo/jsQR"
        }
      ],
      "attribution": null,
      "notes": []
    },
    {
      "name": "image.transform",
      "mcp_name": "image_transform",
      "family": "media",
      "tier": 1,
      "title": "Image resize and convert",
      "summary": "Resize an image and convert it to JPEG, PNG or WebP; metadata is stripped.",
      "when_to_use": "Use to make an image a particular size or format, for example a thumbnail or a WebP for the web. Output up to 1 MB is returned inline as base64.",
      "cost": 2,
      "cache_ttl_s": 0,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "url": {
            "description": "Absolute http or https URL of the file. Use instead of base64.",
            "type": "string",
            "maxLength": 2048,
            "format": "uri"
          },
          "base64": {
            "description": "Base64-encoded file bytes, up to 10 MB once decoded. Use instead of url.",
            "type": "string",
            "maxLength": 14000000
          },
          "width": {
            "type": "integer",
            "minimum": 1,
            "maximum": 4096
          },
          "height": {
            "type": "integer",
            "minimum": 1,
            "maximum": 4096
          },
          "fit": {
            "default": "scale-down",
            "type": "string",
            "enum": [
              "scale-down",
              "contain",
              "cover",
              "crop",
              "pad"
            ]
          },
          "format": {
            "default": "webp",
            "type": "string",
            "enum": [
              "jpeg",
              "png",
              "webp"
            ]
          },
          "quality": {
            "default": 80,
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          }
        }
      },
      "output": "format, content_type, bytes, data_base64",
      "examples": [
        {
          "url": "https://www.w3.org/Icons/w3c_home.png",
          "width": 200,
          "format": "webp"
        }
      ],
      "sources": [
        {
          "name": "Pillow (self-hosted origin)",
          "url": "https://pillow.readthedocs.io"
        }
      ],
      "attribution": null,
      "notes": []
    },
    {
      "name": "image.inspect",
      "mcp_name": "image_inspect",
      "family": "media",
      "tier": 1,
      "title": "Image inspector",
      "summary": "Format, dimensions, EXIF camera and capture data, and dominant colours of an image.",
      "when_to_use": "Use to learn what an image is: its size, format, camera and date from EXIF, and its main colours. EXIF may contain GPS coordinates when the camera recorded them. Dominant colours are only computed for PNG and JPEG.",
      "cost": 1,
      "cache_ttl_s": 0,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "url": {
            "description": "Absolute http or https URL of the file. Use instead of base64.",
            "type": "string",
            "maxLength": 2048,
            "format": "uri"
          },
          "base64": {
            "description": "Base64-encoded file bytes, up to 10 MB once decoded. Use instead of url.",
            "type": "string",
            "maxLength": 14000000
          }
        }
      },
      "output": "format, width, height, bytes, exif: {make, model, software, date_taken, orientation, latitude, longitude} | null, dominant_colors: [{hex, share}] | null",
      "examples": [
        {
          "url": "https://www.w3.org/Icons/w3c_home.png"
        }
      ],
      "sources": [
        {
          "name": "exifr (MIT)",
          "url": "https://github.com/MikeKovarik/exifr"
        }
      ],
      "attribution": null,
      "notes": []
    },
    {
      "name": "image.ocr",
      "mcp_name": "image_ocr",
      "family": "media",
      "tier": 1,
      "title": "Image text recognition",
      "summary": "Printed text read from an image, with mean confidence and word count.",
      "when_to_use": "Use to read text in a photo, scan or screenshot, for example a receipt, sign or document page. Works on clear printed text; handwriting and heavy stylisation fail.",
      "cost": 2,
      "cache_ttl_s": 0,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "url": {
            "description": "Absolute http or https URL of the file. Use instead of base64.",
            "type": "string",
            "maxLength": 2048,
            "format": "uri"
          },
          "base64": {
            "description": "Base64-encoded file bytes, up to 10 MB once decoded. Use instead of url.",
            "type": "string",
            "maxLength": 14000000
          }
        }
      },
      "output": "text, mean_confidence, words",
      "examples": [
        {
          "url": "https://dummyimage.com/600x200/000/fff&text=Hello+World"
        }
      ],
      "sources": [
        {
          "name": "Tesseract OCR (self-hosted origin)",
          "url": "https://tesseract-ocr.github.io"
        }
      ],
      "attribution": null,
      "notes": []
    },
    {
      "name": "media.probe",
      "mcp_name": "media_probe",
      "family": "media",
      "tier": 1,
      "title": "Audio/video file info",
      "summary": "Duration, codecs, dimensions and container for an audio or video file up to 20 MB.",
      "when_to_use": "Use to inspect a media file before processing it: how long it is, what codecs it uses, its resolution. Give a URL or base64 bytes.",
      "cost": 2,
      "cache_ttl_s": 0,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "url": {
            "description": "Absolute http or https URL of the file. Use instead of base64.",
            "type": "string",
            "maxLength": 2048,
            "format": "uri"
          },
          "base64": {
            "description": "Base64-encoded file bytes, up to 20 MB once decoded. Use instead of url.",
            "type": "string",
            "maxLength": 28000000
          }
        }
      },
      "output": "streams: [{codec, type, width, height, duration_s, bit_rate}], duration_s, size_bytes, format",
      "examples": [
        {
          "url": "https://www.w3schools.com/html/mov_bbb.mp4"
        }
      ],
      "sources": [
        {
          "name": "ffprobe (self-hosted origin)",
          "url": "https://ffmpeg.org"
        }
      ],
      "attribution": null,
      "notes": []
    },
    {
      "name": "chart.render",
      "mcp_name": "chart_render",
      "family": "media",
      "tier": 1,
      "title": "Chart renderer",
      "summary": "Bar, line or pie chart from up to 24 labelled values, returned as a PNG.",
      "when_to_use": "Use to turn numbers into a shareable chart image, for example a report figure or a quick visual of a comparison. Up to 24 points; for larger data summarise first.",
      "cost": 2,
      "cache_ttl_s": 86400,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "kind": {
            "default": "bar",
            "type": "string",
            "enum": [
              "bar",
              "line",
              "pie"
            ]
          },
          "labels": {
            "minItems": 1,
            "maxItems": 24,
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 60
            }
          },
          "values": {
            "minItems": 1,
            "maxItems": 24,
            "type": "array",
            "items": {
              "type": "number"
            }
          },
          "title": {
            "default": "",
            "type": "string",
            "maxLength": 120
          }
        },
        "required": [
          "labels",
          "values"
        ]
      },
      "output": "content_type, bytes, data_base64",
      "examples": [
        {
          "kind": "bar",
          "labels": [
            "Q1",
            "Q2",
            "Q3"
          ],
          "values": [
            3,
            7,
            5
          ],
          "title": "Sales"
        }
      ],
      "sources": [
        {
          "name": "Matplotlib (self-hosted origin)",
          "url": "https://matplotlib.org"
        }
      ],
      "attribution": null,
      "notes": []
    },
    {
      "name": "pdf.extract",
      "mcp_name": "pdf_extract",
      "family": "media",
      "tier": 1,
      "title": "PDF text extractor",
      "summary": "Page-by-page text from a text-based PDF, given as a URL or base64, up to 10 MB.",
      "when_to_use": "Use to read the text of a PDF such as a report, contract or paper. Works on text-based PDFs; for scanned pages with no text layer, use image.ocr on a rendered page image instead.",
      "cost": 2,
      "cache_ttl_s": 0,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "url": {
            "description": "Absolute http or https URL of the file. Use instead of base64.",
            "type": "string",
            "maxLength": 2048,
            "format": "uri"
          },
          "base64": {
            "description": "Base64-encoded file bytes, up to 10 MB once decoded. Use instead of url.",
            "type": "string",
            "maxLength": 14000000
          },
          "max_pages": {
            "default": 50,
            "description": "Pages to read from the start of the document.",
            "type": "integer",
            "minimum": 1,
            "maximum": 200
          }
        }
      },
      "output": "page_count, pages_extracted, truncated, pages: [{page, text}]",
      "examples": [
        {
          "url": "https://arxiv.org/pdf/1706.03762",
          "max_pages": 2
        }
      ],
      "sources": [
        {
          "name": "unpdf (PDF.js build for serverless)",
          "url": "https://github.com/unjs/unpdf"
        }
      ],
      "attribution": null,
      "notes": []
    },
    {
      "name": "web.screenshot",
      "mcp_name": "web_screenshot",
      "family": "web",
      "tier": 1,
      "title": "Webpage screenshot",
      "summary": "Renders a public URL in a headless Chromium and returns a JPEG or PNG screenshot.",
      "when_to_use": "Use to see what a page looks like, including pages that need JavaScript. Renders with a real browser, which is slower than the text tools. Output up to 1 MB is returned inline.",
      "cost": 5,
      "cache_ttl_s": 900,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "maxLength": 2048,
            "format": "uri"
          },
          "width": {
            "default": 1280,
            "type": "integer",
            "minimum": 320,
            "maximum": 1920
          },
          "height": {
            "default": 800,
            "type": "integer",
            "minimum": 200,
            "maximum": 2000
          },
          "full_page": {
            "default": false,
            "description": "Capture the full scroll height instead of the viewport.",
            "type": "boolean"
          },
          "format": {
            "default": "jpeg",
            "type": "string",
            "enum": [
              "jpeg",
              "png"
            ]
          }
        },
        "required": [
          "url"
        ]
      },
      "output": "url, width, format, content_type, bytes, data_base64",
      "examples": [
        {
          "url": "https://example.com",
          "width": 1024,
          "height": 768
        }
      ],
      "sources": [
        {
          "name": "Headless Chromium (self-hosted origin)",
          "url": "https://agentops.tools"
        }
      ],
      "attribution": "Screenshot of a third-party page; rights remain with the site owner",
      "notes": [
        "Rendered by a real browser on our compute; costs five rate-limit units per call."
      ]
    },
    {
      "name": "web.pdf",
      "mcp_name": "web_pdf",
      "family": "web",
      "tier": 1,
      "title": "Webpage to PDF",
      "summary": "Prints a public URL, or HTML you supply, to an A4 or Letter PDF using a headless browser.",
      "when_to_use": "Use to produce a printable PDF of a page, or of HTML the agent has written. Renders JavaScript and CSS like a browser print. Output up to 1 MB is returned inline.",
      "cost": 5,
      "cache_ttl_s": 0,
      "version": "1.0.0",
      "input_schema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "type": "object",
        "properties": {
          "url": {
            "description": "Public page to print. Use instead of html.",
            "type": "string",
            "maxLength": 2048,
            "format": "uri"
          },
          "html": {
            "description": "Raw HTML to print. Use instead of url.",
            "type": "string",
            "maxLength": 500000
          },
          "format": {
            "default": "A4",
            "type": "string",
            "enum": [
              "A4",
              "Letter"
            ]
          },
          "print_background": {
            "default": true,
            "type": "boolean"
          }
        }
      },
      "output": "format, content_type, bytes, data_base64",
      "examples": [
        {
          "html": "<h1>Invoice 42</h1><p>Total: $120</p>",
          "format": "A4"
        }
      ],
      "sources": [
        {
          "name": "Headless Chromium (self-hosted origin)",
          "url": "https://agentops.tools"
        }
      ],
      "attribution": null,
      "notes": [
        "Rendered by a real browser on our compute; costs five rate-limit units per call."
      ]
    }
  ]
}
