{
  "data": {
    "tool": {
      "category": "weather",
      "endpoint": "https://micro.mu/mcp",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/micro-mu.json",
      "kind": "mcp",
      "listed": "indexed",
      "liveUrl": "https://www.anchorterminal.com/api/v1/live/micro-mu.json",
      "markdownUrl": "https://www.anchorterminal.com/tools/micro-mu.md",
      "mcpTools": {
        "check": {
          "checker": "anchor-check/1.0",
          "totalTokens": 20294,
          "counts": {
            "error": 0,
            "note": 1,
            "warn": 109
          },
          "findings": [
            {
              "rule": "TC06",
              "severity": "warn",
              "tool": "events_delete",
              "message": "the description is \"Cancel an event by id\"",
              "fix": "Add when to use it, what it returns and any side effect, in two or three sentences."
            },
            {
              "rule": "TC06",
              "severity": "warn",
              "tool": "files_delete",
              "message": "the description is \"Delete a file you own\"",
              "fix": "Add when to use it, what it returns and any side effect, in two or three sentences."
            },
            {
              "rule": "TC06",
              "severity": "warn",
              "tool": "groups_create",
              "message": "the description is \"Create a private group\"",
              "fix": "Add when to use it, what it returns and any side effect, in two or three sentences."
            },
            {
              "rule": "TC06",
              "severity": "warn",
              "tool": "images_delete",
              "message": "the description is \"Delete an image you own\"",
              "fix": "Add when to use it, what it returns and any side effect, in two or three sentences."
            },
            {
              "rule": "TC06",
              "severity": "warn",
              "tool": "notes_delete",
              "message": "the description is \"Delete one note by title\"",
              "fix": "Add when to use it, what it returns and any side effect, in two or three sentences."
            },
            {
              "rule": "TC06",
              "severity": "warn",
              "tool": "tasks_delete",
              "message": "the description is \"Remove a task\"",
              "fix": "Add when to use it, what it returns and any side effect, in two or three sentences."
            },
            {
              "rule": "TC06",
              "severity": "warn",
              "tool": "users_get",
              "message": "the description is \"One user, by username\"",
              "fix": "Add when to use it, what it returns and any side effect, in two or three sentences."
            },
            {
              "rule": "TC13",
              "severity": "warn",
              "tool": "events_create",
              "message": "advance (object with no properties)",
              "fix": "Declare the properties (or additionalProperties with a schema) and the array's items."
            },
            {
              "rule": "TC13",
              "severity": "warn",
              "tool": "events_update",
              "message": "advance (object with no properties)",
              "fix": "Declare the properties (or additionalProperties with a schema) and the array's items."
            },
            {
              "rule": "TC13",
              "severity": "warn",
              "tool": "images_update",
              "message": "tags (array with no items)",
              "fix": "Declare the properties (or additionalProperties with a schema) and the array's items."
            },
            {
              "rule": "TC13",
              "severity": "warn",
              "tool": "mail_markread",
              "message": "ids (array with no items)",
              "fix": "Declare the properties (or additionalProperties with a schema) and the array's items."
            },
            {
              "rule": "TC13",
              "severity": "warn",
              "tool": "routes_nearest",
              "message": "to (array with no items)",
              "fix": "Declare the properties (or additionalProperties with a schema) and the array's items."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "apps_build",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "apps_builds",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "apps_buildstatus",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "apps_collection",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "apps_create",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "apps_edit",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "apps_embed",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "apps_fork",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "apps_test",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "blog_create",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "blog_update",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "bookmarks_add",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "bookmarks_annotate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "browser_shot",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "chat_messages",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "chat_rooms",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "chat_send",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "chat_source",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "chat_sources",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "contacts_add",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "docs_write",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "events_create",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "events_update",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "files_driveread",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "files_drivesearch",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "files_put",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "files_share",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "flights_airport",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "flights_overhead",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "flights_status",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"status\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "flights_track",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "food_hygiene",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "food_product",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "groups_create",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "hazards_alerts",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "hazards_floods",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "hazards_quakes",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "images_daily",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "images_generate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "images_update",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "images_upload",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "mail_gmailread",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "mail_gmailsearch",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "mail_info",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"info\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "mail_markread",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "mail_source",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "mail_sources",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "maps_area",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "maps_tile",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "markets_convert",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "markets_history",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "markets_quote",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "news_headlines",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "notes_add",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "notify_devices",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "notify_send",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "places_elevation",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "places_geocode",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "recall_conversation",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "routes_directions",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "routes_nearest",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "shell_run",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "shell_write",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "sms_history",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "sms_number",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "sms_source",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "sms_sources",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "sms_verify",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "tasks_create",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "tasks_next",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "tasks_update",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "text_classify",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "text_extract",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "text_summarise",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"summarise\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "text_translate",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "transit_arrivals",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "transit_buses",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "transit_feeds",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "transit_status",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"status\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "transit_trains",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "weather_air",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "weather_history",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "weather_lookup",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"lookup\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "weather_marine",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "web_fetch",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"fetch\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "web_images",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC18",
              "severity": "warn",
              "tool": "archive_list",
              "message": "readOnlyHint is true but the name says \"archive\"",
              "fix": "If it changes anything, readOnlyHint must be false."
            },
            {
              "rule": "TC18",
              "severity": "warn",
              "tool": "archive_search",
              "message": "readOnlyHint is true but the name says \"archive\"",
              "fix": "If it changes anything, readOnlyHint must be false."
            },
            {
              "rule": "TC21",
              "severity": "warn",
              "tool": "chat_source",
              "message": "described almost the same as mail_source (100% of the same words)",
              "fix": "Say in each description when to use it instead of the other."
            },
            {
              "rule": "TC21",
              "severity": "warn",
              "tool": "chat_source",
              "message": "described almost the same as sms_source (100% of the same words)",
              "fix": "Say in each description when to use it instead of the other."
            },
            {
              "rule": "TC21",
              "severity": "warn",
              "tool": "chat_sources",
              "message": "described almost the same as mail_sources (100% of the same words)",
              "fix": "Say in each description when to use it instead of the other."
            },
            {
              "rule": "TC21",
              "severity": "warn",
              "tool": "chat_sources",
              "message": "described almost the same as sms_sources (100% of the same words)",
              "fix": "Say in each description when to use it instead of the other."
            },
            {
              "rule": "TC21",
              "severity": "warn",
              "tool": "files_driveread",
              "message": "described almost the same as files_drivesearch (90% of the same words)",
              "fix": "Say in each description when to use it instead of the other."
            },
            {
              "rule": "TC21",
              "severity": "warn",
              "tool": "mail_gmailread",
              "message": "described almost the same as mail_gmailsearch (89% of the same words)",
              "fix": "Say in each description when to use it instead of the other."
            },
            {
              "rule": "TC21",
              "severity": "warn",
              "tool": "mail_source",
              "message": "described almost the same as sms_source (100% of the same words)",
              "fix": "Say in each description when to use it instead of the other."
            },
            {
              "rule": "TC21",
              "severity": "warn",
              "tool": "mail_sources",
              "message": "described almost the same as sms_sources (100% of the same words)",
              "fix": "Say in each description when to use it instead of the other."
            },
            {
              "rule": "TC23",
              "severity": "warn",
              "message": "162 tools, about 20,352 tokens of definitions",
              "fix": "Split the server by job, or offer a smaller default toolset (a read-only set, or a search-then-call pattern)."
            },
            {
              "rule": "TC24",
              "severity": "note",
              "message": "162 of 162 tools have no outputSchema",
              "fix": "Declare outputSchema for tools that return structured data, and return structuredContent that matches it."
            }
          ]
        },
        "checkedAt": "2026-10-04T22:25:32Z",
        "count": 162,
        "note": "answered without the initialize handshake",
        "schemaTokens": 20294,
        "status": "ok",
        "tools": [
          {
            "name": "apps_build",
            "title": "Build apps",
            "description": "Queue a durable app build and immediately return its ID and status URL. Use BuildStatus to retrieve progress and the completed app. Reuse request_key on retries. Builds survive server restarts",
            "inputSchema": {
              "properties": {
                "prompt": {
                  "description": "Description of the app to build, e.g. 'an expense tracker', 'a packing checklist', 'a water intake counter'",
                  "type": "string"
                },
                "request_key": {
                  "description": "Reuse this key when retrying the same request. Omit to deduplicate identical descriptions.",
                  "type": "string"
                }
              },
              "required": [
                "prompt"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Build apps"
            }
          },
          {
            "name": "apps_builds",
            "title": "Builds apps",
            "description": "List your app build jobs and outcomes",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "title": "Builds apps"
            }
          },
          {
            "name": "apps_buildstatus",
            "title": "Buildstatus apps",
            "description": "Read your saved app build status by ID. Poll until complete or failed; the same ID survives restarts.",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Buildstatus apps"
            }
          },
          {
            "name": "apps_collection",
            "title": "Collection apps",
            "description": "List your saved apps and their source references",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "title": "Collection apps"
            }
          },
          {
            "name": "apps_create",
            "title": "Create apps",
            "description": "Create an app — a small, self-contained HTML tool hosted here. Takes the HTML; apps_build writes it for you from a description Apps run in a sandbox. Use fetch('/api/v1/\u003cservice\u003e/\u003cmethod\u003e') or mu.service(name, method, args); mu.api does not exist. Direct external fetch is blocked. Inspect real service schemas and data before coding; never invent fields, rankings or claim runtime verification from static checks.",
            "inputSchema": {
              "properties": {
                "description": {
                  "description": "What the app does. Defaults to the name",
                  "type": "string"
                },
                "html": {
                  "description": "The app's HTML, inline CSS and JavaScript included, up to 256KB",
                  "type": "string"
                },
                "icon": {
                  "description": "An SVG icon",
                  "type": "string"
                },
                "name": {
                  "description": "App name, e.g. \"Pomodoro Timer\"",
                  "type": "string"
                },
                "price": {
                  "description": "Credits charged per use, 0 for free, up to 1000",
                  "type": "number"
                },
                "private": {
                  "description": "Keep this app private to its owner; use true for personal widgets",
                  "type": "boolean"
                },
                "public": {
                  "description": "Publish only when explicitly requested by the owner. Personal apps are private by default.",
                  "type": "boolean"
                },
                "slug": {
                  "description": "URL-friendly id, e.g. pomodoro-timer. Derived from the name if omitted",
                  "type": "string"
                },
                "tags": {
                  "description": "Comma-separated tags",
                  "type": "string"
                }
              },
              "required": [
                "name",
                "html"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Create apps"
            }
          },
          {
            "name": "apps_edit",
            "title": "Edit apps",
            "description": "Edit an app you own — its name, description, tags, icon, HTML or price. Fields left out keep their value Apps run in a sandbox. Use fetch('/api/v1/\u003cservice\u003e/\u003cmethod\u003e') or mu.service(name, method, args); mu.api does not exist. Direct external fetch is blocked. Inspect real service schemas and data before coding; never invent fields, rankings or claim runtime verification from static checks.",
            "inputSchema": {
              "properties": {
                "description": {
                  "description": "New description. Left alone if omitted",
                  "type": "string"
                },
                "html": {
                  "description": "New HTML, up to 256KB. Left alone if omitted",
                  "type": "string"
                },
                "icon": {
                  "description": "New SVG icon. Left alone if omitted",
                  "type": "string"
                },
                "name": {
                  "description": "New name. Left alone if omitted",
                  "type": "string"
                },
                "price": {
                  "description": "Credits charged per use, 0 for free, up to 1000. Left alone if omitted",
                  "type": "number"
                },
                "slug": {
                  "description": "The app's URL slug, e.g. pomodoro-timer",
                  "type": "string"
                },
                "tags": {
                  "description": "New comma-separated tags. Left alone if omitted",
                  "type": "string"
                }
              },
              "required": [
                "slug"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Edit apps"
            }
          },
          {
            "name": "apps_embed",
            "title": "Embed apps",
            "description": "Show a saved micro app in the conversation. Embedding preserves access permissions and does not publish the app",
            "inputSchema": {
              "properties": {
                "slug": {
                  "description": "The app's URL slug",
                  "type": "string"
                }
              },
              "required": [
                "slug"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Embed apps"
            }
          },
          {
            "name": "apps_fork",
            "title": "Fork apps",
            "description": "Fork an app into your own account, to change independently of the original",
            "inputSchema": {
              "properties": {
                "new_slug": {
                  "description": "Slug for the copy. Generated from the original if omitted",
                  "type": "string"
                },
                "slug": {
                  "description": "Slug of the app to fork",
                  "type": "string"
                }
              },
              "required": [
                "slug"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Fork apps"
            }
          },
          {
            "name": "apps_read",
            "title": "Read apps",
            "description": "Read an app or build status by slug, including source HTML for apps you own",
            "inputSchema": {
              "properties": {
                "slug": {
                  "description": "The app's URL slug, e.g. pomodoro-timer",
                  "type": "string"
                }
              },
              "required": [
                "slug"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Read apps"
            }
          },
          {
            "name": "apps_search",
            "title": "Search apps",
            "description": "Find your saved private micro apps by name, description or tag",
            "inputSchema": {
              "properties": {
                "query": {
                  "description": "Search query — name, description or tag",
                  "type": "string"
                },
                "tag": {
                  "description": "Filter to apps carrying this tag",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Search apps"
            }
          },
          {
            "name": "apps_test",
            "title": "Test apps",
            "description": "Test an app by checking its HTML and checking supported SDK calls; this is not browser execution, so an author finds out what is broken without opening it",
            "inputSchema": {
              "properties": {
                "slug": {
                  "description": "The app's URL slug",
                  "type": "string"
                }
              },
              "required": [
                "slug"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Test apps"
            }
          },
          {
            "name": "archive_list",
            "title": "Browse archive",
            "description": "With a kind, the most recent entries of it. Without one, what kinds are archived and how much of each",
            "inputSchema": {
              "properties": {
                "kind": {
                  "description": "One kind: news, post, video, market, social, reminder. Omit for a summary of what is here",
                  "type": "string"
                },
                "limit": {
                  "description": "Max entries (default 20, max 100)",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Browse archive"
            }
          },
          {
            "name": "archive_search",
            "title": "Search archive",
            "description": "Search everything this instance has collected, across news, video, markets and posts at once. Use it when the question crosses a service, or when you do not know which service would hold the answer; news_search is narrower and better when you know it is news",
            "inputSchema": {
              "properties": {
                "kind": {
                  "description": "Narrow to one kind: news, post, video, market, social, reminder. Omit to search everything",
                  "type": "string"
                },
                "limit": {
                  "description": "Max results (default 20, max 100)",
                  "type": "number"
                },
                "query": {
                  "description": "What to look for",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Search archive"
            }
          },
          {
            "name": "blog_create",
            "title": "Create blog",
            "description": "Publish a post to the caller's blog. For anything meant to be read later by other people — notes, write-ups, announcements. For a private note to yourself, prefer files or memory",
            "inputSchema": {
              "properties": {
                "content": {
                  "description": "The post body, at least 50 characters",
                  "type": "string"
                },
                "private": {
                  "description": "True to keep it to yourself",
                  "type": "boolean"
                },
                "tags": {
                  "description": "Comma-separated tags",
                  "type": "string"
                },
                "title": {
                  "description": "Post title. One is generated from the body if omitted",
                  "type": "string"
                }
              },
              "required": [
                "content"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Create blog"
            }
          },
          {
            "name": "blog_delete",
            "title": "Delete blog",
            "description": "Delete one of the caller's own blog posts, by id or title. Refuses posts written by anyone else, and refuses an ambiguous title rather than guessing. Irreversible, so confirm with the user first",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "The post's id, as given by blog_list",
                  "type": "string"
                },
                "title": {
                  "description": "The post's title, or enough of it to be unambiguous. An ambiguous title is refused rather than guessed — deleting the wrong post is not recoverable",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "title": "Delete blog"
            }
          },
          {
            "name": "blog_list",
            "title": "Browse blog",
            "description": "Read recent blog posts — titles, snippets and ids",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "Optional max number of posts (default all recent)",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Browse blog"
            }
          },
          {
            "name": "blog_read",
            "title": "Read blog",
            "description": "Read one blog post in full, by id or by title. Use after blog_list has found a candidate and the summary is not enough",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "The post's id, as given by blog_list",
                  "type": "string"
                },
                "title": {
                  "description": "The post's title, or enough of it to be unambiguous — use this when you have a name rather than an id",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Read blog"
            }
          },
          {
            "name": "blog_update",
            "title": "Update blog",
            "description": "Edit one of the caller's own posts. Fields left out keep their current value",
            "inputSchema": {
              "properties": {
                "content": {
                  "description": "New body, at least 50 characters. Left alone if omitted",
                  "type": "string"
                },
                "id": {
                  "description": "The post's id, as given by blog_list",
                  "type": "string"
                },
                "tags": {
                  "description": "New comma-separated tags. Left alone if omitted",
                  "type": "string"
                },
                "title": {
                  "description": "New title. Left alone if omitted",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Update blog"
            }
          },
          {
            "name": "bookmarks_add",
            "title": "Add bookmarks",
            "description": "Save an article, video, blog post or link privately. Re-saving preserves its note",
            "inputSchema": {
              "properties": {
                "note": {
                  "description": "Optional private note",
                  "type": "string"
                },
                "ref": {
                  "description": "Public archive item id for an article, video or blog post",
                  "type": "string"
                },
                "title": {
                  "description": "Title for a link",
                  "type": "string"
                },
                "url": {
                  "description": "Link to save when no archive id is available",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Add bookmarks"
            }
          },
          {
            "name": "bookmarks_annotate",
            "title": "Annotate bookmarks",
            "description": "Set or clear a private note on one saved item",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "",
                  "type": "string"
                },
                "note": {
                  "description": "Private note, or empty to clear",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Annotate bookmarks"
            }
          },
          {
            "name": "bookmarks_delete",
            "title": "Delete bookmarks",
            "description": "Remove one of your saved items",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "Saved item id",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "title": "Delete bookmarks"
            }
          },
          {
            "name": "bookmarks_get",
            "title": "Read bookmarks",
            "description": "Read one saved item and its private note, with available archived text. Videos have descriptions, not transcripts",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "Saved item id",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Read bookmarks"
            }
          },
          {
            "name": "bookmarks_list",
            "title": "Browse bookmarks",
            "description": "Find your saved reading by text or kind, newest first. Private notes are searched too",
            "inputSchema": {
              "properties": {
                "kind": {
                  "description": "article, video, post or link; empty for all",
                  "type": "string"
                },
                "limit": {
                  "description": "Maximum items, default 20, at most 100",
                  "type": "number"
                },
                "offset": {
                  "description": "Number of matching items to skip",
                  "type": "number"
                },
                "query": {
                  "description": "Search your saved titles, links, excerpts and private notes",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Browse bookmarks"
            }
          },
          {
            "name": "browser_read",
            "title": "Read browser",
            "description": "Open a page in a real browser and read it after its JavaScript has run. Use it when web_fetch comes back empty or with only a nav bar, which is what a page that builds itself in the browser looks like to a plain fetch. web_fetch is free and is the right first try; this costs, because it runs a browser",
            "inputSchema": {
              "properties": {
                "url": {
                  "description": "The page to open",
                  "type": "string"
                },
                "wait": {
                  "description": "Optional CSS selector to wait for before reading, for content that arrives late",
                  "type": "string"
                }
              },
              "required": [
                "url"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Read browser"
            }
          },
          {
            "name": "browser_shot",
            "title": "Shot browser",
            "description": "Photograph a page and get back a URL for the picture. What it looks like, rather than what it says — a chart, a layout, a page whose content is an image. Ask for full to capture past the first screenful",
            "inputSchema": {
              "properties": {
                "full": {
                  "description": "Capture the whole page rather than one screenful",
                  "type": "boolean"
                },
                "url": {
                  "description": "The page to photograph",
                  "type": "string"
                },
                "wait": {
                  "description": "Optional CSS selector to wait for before the shot",
                  "type": "string"
                }
              },
              "required": [
                "url"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Shot browser"
            }
          },
          {
            "name": "chat_messages",
            "title": "Messages chat",
            "description": "Read the recent conversation in a discussion room",
            "inputSchema": {
              "properties": {
                "room": {
                  "description": "Room id, as returned by Rooms",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Messages chat"
            }
          },
          {
            "name": "chat_rooms",
            "title": "Rooms chat",
            "description": "List discussion rooms that currently have activity",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "How many rooms to return (default 20)",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Rooms chat"
            }
          },
          {
            "name": "chat_send",
            "title": "Send chat",
            "description": "Say something in a discussion room, as the caller. Use chat_rooms to find the room id",
            "inputSchema": {
              "properties": {
                "message": {
                  "description": "What to say",
                  "type": "string"
                },
                "room": {
                  "description": "Room id, as returned by chat_rooms",
                  "type": "string"
                }
              },
              "required": [
                "room",
                "message"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Send chat"
            }
          },
          {
            "name": "chat_source",
            "title": "Source chat",
            "description": "Read one stored message owned by the caller, by id",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "Stored message id",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Source chat"
            }
          },
          {
            "name": "chat_sources",
            "title": "Sources chat",
            "description": "List stored message ids owned by the caller",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "",
                  "type": "number"
                },
                "offset": {
                  "description": "",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Sources chat"
            }
          },
          {
            "name": "contacts_add",
            "title": "Add contacts",
            "description": "Save someone to the address book. Adding a name already there updates it rather than making a second card",
            "inputSchema": {
              "properties": {
                "email": {
                  "description": "Their email address",
                  "type": "string"
                },
                "name": {
                  "description": "The person's name, e.g. \"Sarah Chen\"",
                  "type": "string"
                },
                "note": {
                  "description": "Anything worth remembering about them",
                  "type": "string"
                },
                "phone": {
                  "description": "Their phone number",
                  "type": "string"
                }
              },
              "required": [
                "name"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Add contacts"
            }
          },
          {
            "name": "contacts_delete",
            "title": "Delete contacts",
            "description": "Remove someone from the address book",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "The contact's id, from contacts_find or contacts_list",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "title": "Delete contacts"
            }
          },
          {
            "name": "contacts_find",
            "title": "Find contacts",
            "description": "Look someone up in the address book by name, part of a name, or address. Use this before sending mail to a person named rather than addressed",
            "inputSchema": {
              "properties": {
                "query": {
                  "description": "A name, part of a name, or an address",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Find contacts"
            }
          },
          {
            "name": "contacts_list",
            "title": "Browse contacts",
            "description": "List everyone in the caller's address book",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Browse contacts"
            }
          },
          {
            "name": "docs_delete",
            "title": "Delete docs",
            "description": "Delete one of your documents, by id",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "Document id, from docs_list",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "title": "Delete docs"
            }
          },
          {
            "name": "docs_list",
            "title": "Browse docs",
            "description": "List your documents, most recently changed first, with an optional search over titles and bodies. Use this to find an id",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "Maximum documents to return (default 50)",
                  "type": "number"
                },
                "query": {
                  "description": "Optional text to match against titles and bodies",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Browse docs"
            }
          },
          {
            "name": "docs_read",
            "title": "Read docs",
            "description": "Read one of your documents in full, by id or by exact title",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "Document id, from docs_list",
                  "type": "string"
                },
                "title": {
                  "description": "Exact title, if you do not have the id",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Read docs"
            }
          },
          {
            "name": "docs_write",
            "title": "Write docs",
            "description": "Write a document — a title and a markdown body. Pass an id to replace one you already have. Private unless you set public. For something long enough to re-read; for a short thing to remember, use notes",
            "inputSchema": {
              "properties": {
                "content": {
                  "description": "The document's body, as markdown",
                  "type": "string"
                },
                "id": {
                  "description": "Existing document id to replace. Omit to create a new one",
                  "type": "string"
                },
                "public": {
                  "description": "Readable by anyone when true. Private by default",
                  "type": "boolean"
                },
                "title": {
                  "description": "The document's title",
                  "type": "string"
                }
              },
              "required": [
                "title",
                "content"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Write docs"
            }
          },
          {
            "name": "events_create",
            "title": "Create events",
            "description": "Schedule a reminder or event at a given time; optionally repeating, and optionally running a prompt through the agent when it fires",
            "inputSchema": {
              "properties": {
                "advance": {
                  "description": "Optional advance trigger: minutes before the event and recipient user or agent. Agent prepares a read-only report for delivery at when; actions that change records must use a normal scheduled prompt without advance",
                  "type": "object"
                },
                "minutes": {
                  "description": "How long it lasts in minutes (default 30)",
                  "type": "number"
                },
                "note": {
                  "description": "Optional extra detail",
                  "type": "string"
                },
                "prompt": {
                  "description": "Optional instruction to run through the agent when it fires, e.g. \"brief me on today's news\". The answer is mailed to you",
                  "type": "string"
                },
                "repeat": {
                  "description": "How often it recurs: hourly, daily, weekly or monthly. Omit for once",
                  "type": "string"
                },
                "title": {
                  "description": "What to be reminded about, e.g. 'Call the dentist'",
                  "type": "string"
                },
                "when": {
                  "description": "When to fire, RFC3339 with timezone offset, e.g. 2026-07-22T15:00:00+01:00",
                  "type": "string"
                }
              },
              "required": [
                "title",
                "when"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Create events"
            }
          },
          {
            "name": "events_delete",
            "title": "Delete events",
            "description": "Cancel an event by id",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "The event's id, as given by events_list",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "title": "Delete events"
            }
          },
          {
            "name": "events_free",
            "title": "Find free time",
            "description": "Find when the caller has nothing booked — open slots of a given length, within working hours",
            "inputSchema": {
              "properties": {
                "day_end": {
                  "description": "Latest hour of the day to offer, 0-23 (default 18)",
                  "type": "number"
                },
                "day_start": {
                  "description": "Earliest hour of the day to offer, 0-23 (default 9)",
                  "type": "number"
                },
                "from": {
                  "description": "Start of the window to search, RFC3339, e.g. 2026-08-03T00:00:00+01:00. Defaults to now",
                  "type": "string"
                },
                "minutes": {
                  "description": "How long a slot you need, in minutes (default 30)",
                  "type": "number"
                },
                "to": {
                  "description": "End of the window, RFC3339. Defaults to a week after from",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Find free time"
            }
          },
          {
            "name": "events_list",
            "title": "Browse events",
            "description": "List the caller's upcoming events and reminders, each with its id",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "Maximum events, default 20, max 100",
                  "type": "number"
                },
                "offset": {
                  "description": "Events to skip",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Browse events"
            }
          },
          {
            "name": "events_read",
            "title": "Read events",
            "description": "Read one schedule owned by the caller",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Read events"
            }
          },
          {
            "name": "events_update",
            "title": "Update events",
            "description": "Update one of your scheduled events without changing its id. Omitted fields stay unchanged; empty notes, prompts or recurrence clear them",
            "inputSchema": {
              "properties": {
                "advance": {
                  "description": "Advance trigger with minutes and recipient user or agent; zero minutes and empty recipient clears it. Agent preparation is read-only",
                  "type": "object"
                },
                "id": {
                  "description": "Event id from events_list",
                  "type": "string"
                },
                "minutes": {
                  "description": "Duration in minutes, 1 to 10080",
                  "type": "number"
                },
                "note": {
                  "description": "New note; empty clears it",
                  "type": "string"
                },
                "prompt": {
                  "description": "New standing instruction; empty clears it",
                  "type": "string"
                },
                "repeat": {
                  "description": "hourly, daily, weekly, monthly; empty makes it one-off",
                  "type": "string"
                },
                "title": {
                  "description": "New title; omitted keeps the existing title",
                  "type": "string"
                },
                "when": {
                  "description": "New future time as RFC3339 with timezone offset",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Update events"
            }
          },
          {
            "name": "files_delete",
            "title": "Delete files",
            "description": "Delete a file you own",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "The file's id",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "title": "Delete files"
            }
          },
          {
            "name": "files_driveread",
            "title": "Driveread files",
            "description": "Read the caller's connected Google Drive. Read-only; connect in Account first.",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "Drive file id from DriveSearch",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Driveread files"
            }
          },
          {
            "name": "files_drivesearch",
            "title": "Drivesearch files",
            "description": "Search the caller's connected Google Drive. Read-only; connect in Account first.",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "Number of files, up to 20",
                  "type": "number"
                },
                "page": {
                  "description": "Next page token from a previous search",
                  "type": "string"
                },
                "query": {
                  "description": "Text to find in the caller's connected Google Drive",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Drivesearch files"
            }
          },
          {
            "name": "files_get",
            "title": "Read files",
            "description": "Read a stored file back by its id",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "The file's id, as returned by files_put or files_list",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Read files"
            }
          },
          {
            "name": "files_list",
            "title": "Browse files",
            "description": "List the caller's stored files, newest first",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Browse files"
            }
          },
          {
            "name": "files_put",
            "title": "Store files",
            "description": "Store a file and get a URL for it — a report, a CSV, a transcript",
            "inputSchema": {
              "properties": {
                "content": {
                  "description": "The file's contents — plain text, or base64 when encoding is \"base64\"",
                  "type": "string"
                },
                "encoding": {
                  "description": "\"base64\" for binary files; omit for text",
                  "type": "string"
                },
                "name": {
                  "description": "File name including its extension, e.g. \"report.csv\"",
                  "type": "string"
                },
                "type": {
                  "description": "Optional content type, e.g. \"text/csv\". Guessed from the name when omitted",
                  "type": "string"
                }
              },
              "required": [
                "name",
                "content"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Store files"
            }
          },
          {
            "name": "files_share",
            "title": "Share files",
            "description": "Make a file readable by anyone with its URL, or private again",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "The file's id",
                  "type": "string"
                },
                "public": {
                  "description": "True to let anyone with the URL read it, false to make it private again",
                  "type": "boolean"
                }
              },
              "required": [
                "id",
                "public"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Share files"
            }
          },
          {
            "name": "flights_airport",
            "title": "Airport flights",
            "description": "Report what is happening at an airport right now: what is on the ground, what is on approach and what is climbing out. Live positions, not the timetable, so it says nothing about scheduled or delayed departures",
            "inputSchema": {
              "properties": {
                "code": {
                  "description": "An airport code or name, e.g. 'LHR', 'EGLL' or 'Heathrow'",
                  "type": "string"
                }
              },
              "required": [
                "code"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Airport flights"
            }
          },
          {
            "name": "flights_overhead",
            "title": "Overhead flights",
            "description": "List the aircraft flying near a location right now, nearest first, with altitude, speed, heading and distance. Live positions broadcast by the aircraft themselves, not a schedule",
            "inputSchema": {
              "properties": {
                "lat": {
                  "description": "Optional latitude, if the location is already known",
                  "type": "number"
                },
                "lon": {
                  "description": "Optional longitude, if the location is already known",
                  "type": "number"
                },
                "near": {
                  "description": "Where to look: a place name, or an airport name or code, e.g. 'Camden, London' or 'LHR'",
                  "type": "string"
                },
                "radius": {
                  "description": "Optional radius in nautical miles (default 30, maximum 250)",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Overhead flights"
            }
          },
          {
            "name": "flights_status",
            "title": "Status flights",
            "description": "Scheduled, estimated and actual flight arrival/departure times from Aviationstack. Requires a configured provider.",
            "inputSchema": {
              "properties": {
                "airport": {
                  "description": "IATA airport code, e.g. LHR",
                  "type": "string"
                },
                "direction": {
                  "description": "arrivals or departures (default arrivals)",
                  "type": "string"
                },
                "flight": {
                  "description": "IATA flight number, e.g. BA117",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Status flights"
            }
          },
          {
            "name": "flights_track",
            "title": "Track flights",
            "description": "Find where an aircraft is right now by flight number ('BA117'), radio callsign ('BAW117') or registration ('G-ZBKL'). Only sees aeroplanes that are airborne and in range of a receiver — not finding one does not mean the flight was cancelled",
            "inputSchema": {
              "properties": {
                "flight": {
                  "description": "A flight number ('BA117'), a radio callsign ('BAW117'), or an aircraft registration ('G-ZBKL')",
                  "type": "string"
                }
              },
              "required": [
                "flight"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Track flights"
            }
          },
          {
            "name": "food_hygiene",
            "title": "Hygiene food",
            "description": "Food hygiene ratings for UK businesses, from the Food Standards Agency inspections. Takes a business name, a town or postcode, or a lat/lon to look around",
            "inputSchema": {
              "properties": {
                "lat": {
                  "description": "Optional: look around this point instead",
                  "type": "number"
                },
                "limit": {
                  "description": "How many to return, default 10, max 30",
                  "type": "number"
                },
                "lon": {
                  "description": "Optional: look around this point instead",
                  "type": "number"
                },
                "name": {
                  "description": "Business name, e.g. 'Nandos'",
                  "type": "string"
                },
                "where": {
                  "description": "Town, street or postcode to narrow it to",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Hygiene food"
            }
          },
          {
            "name": "food_product",
            "title": "Product food",
            "description": "Look up a packaged food by its barcode — name, brand, ingredients, allergens, nutrition per 100g, Nutri-Score and how processed it is",
            "inputSchema": {
              "properties": {
                "barcode": {
                  "description": "The barcode, 6 to 14 digits, e.g. 5000168034928",
                  "type": "string"
                }
              },
              "required": [
                "barcode"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Product food"
            }
          },
          {
            "name": "food_search",
            "title": "Search food",
            "description": "Find packaged foods by name or brand, with the barcode of each so one can then be looked up in full",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "How many to return, default 10, max 25",
                  "type": "number"
                },
                "query": {
                  "description": "Product or brand name, e.g. 'hobnobs' or 'oat milk'",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Search food"
            }
          },
          {
            "name": "groups_create",
            "title": "Create groups",
            "description": "Create a private group",
            "inputSchema": {
              "properties": {
                "encrypted": {
                  "description": "Require end-to-end encrypted XMPP clients; web chat cannot decrypt these messages",
                  "type": "boolean"
                },
                "name": {
                  "description": "Group name",
                  "type": "string"
                }
              },
              "required": [
                "name"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Create groups"
            }
          },
          {
            "name": "groups_list",
            "title": "Browse groups",
            "description": "List your groups and pending invitations",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Browse groups"
            }
          },
          {
            "name": "groups_read",
            "title": "Read groups",
            "description": "Read a group you belong to and open its chat",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "Group ID",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Read groups"
            }
          },
          {
            "name": "groups_update",
            "title": "Update groups",
            "description": "Manage invitations, membership and roles. Accept invitations before accessing a group. Removing yourself leaves; owners must transfer ownership first. Delete closes the group for everyone.",
            "inputSchema": {
              "properties": {
                "account": {
                  "description": "Local username for invite, remove or role; defaults to yourself for remove",
                  "type": "string"
                },
                "action": {
                  "description": "invite, accept, decline, remove, role, rename or delete",
                  "type": "string"
                },
                "id": {
                  "description": "",
                  "type": "string"
                },
                "value": {
                  "description": "New name for rename, or member/admin/owner for role",
                  "type": "string"
                }
              },
              "required": [
                "id",
                "action"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "title": "Update groups"
            }
          },
          {
            "name": "hazards_alerts",
            "title": "Alerts hazards",
            "description": "Current disasters worldwide from GDACS — cyclones, floods, volcanoes, wildfires and earthquakes — with an alert level of green, orange or red. Pass lat/lon to ask about somewhere in particular",
            "inputSchema": {
              "properties": {
                "lat": {
                  "description": "Optional: only alerts near this point",
                  "type": "number"
                },
                "level": {
                  "description": "Lowest level to include: green, orange or red — default green (everything)",
                  "type": "string"
                },
                "lon": {
                  "description": "Optional: only alerts near this point",
                  "type": "number"
                },
                "within_km": {
                  "description": "Optional: how near, in kilometres, default 1000 when lat/lon given",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Alerts hazards"
            }
          },
          {
            "name": "hazards_floods",
            "title": "Floods hazards",
            "description": "Flood warnings and alerts in force in England, most severe first, from the Environment Agency. The one hazard here that is a forecast rather than a record — a warning says flooding is expected, which is something you can act on. Optionally near a point. England only, and the answer says so",
            "inputSchema": {
              "properties": {
                "lat": {
                  "description": "Optional: only warnings near this point",
                  "type": "number"
                },
                "lon": {
                  "description": "Optional: only warnings near this point",
                  "type": "number"
                },
                "severe": {
                  "description": "Only warnings and severe warnings — leave out the be-prepared alerts",
                  "type": "boolean"
                },
                "within_km": {
                  "description": "Optional: how near, in kilometres, default 30 when a point is given",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Floods hazards"
            }
          },
          {
            "name": "hazards_quakes",
            "title": "Quakes hazards",
            "description": "Recent earthquakes worldwide from the USGS, with magnitude, place and how long ago. Pass lat/lon to ask about somewhere in particular, min for a magnitude floor, and period for hour, day, week or month",
            "inputSchema": {
              "properties": {
                "lat": {
                  "description": "Optional: only events near this point",
                  "type": "number"
                },
                "lon": {
                  "description": "Optional: only events near this point",
                  "type": "number"
                },
                "min": {
                  "description": "Smallest magnitude to include, default 2.5",
                  "type": "number"
                },
                "period": {
                  "description": "hour, day, week or month — default day",
                  "type": "string"
                },
                "within_km": {
                  "description": "Optional: how near, in kilometres, default 500 when lat/lon given",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Quakes hazards"
            }
          },
          {
            "name": "images_daily",
            "title": "Daily images",
            "description": "Retrieve the current daily image or a date",
            "inputSchema": {
              "properties": {
                "date": {
                  "description": "YYYY-MM-DD; omitted for the current daily image",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Daily images"
            }
          },
          {
            "name": "images_delete",
            "title": "Delete images",
            "description": "Delete an image you own",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "title": "Delete images"
            }
          },
          {
            "name": "images_generate",
            "title": "Generate images",
            "description": "Generate an image from a text prompt and return its URL",
            "inputSchema": {
              "properties": {
                "prompt": {
                  "description": "What the image should depict",
                  "type": "string"
                }
              },
              "required": [
                "prompt"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Generate images"
            }
          },
          {
            "name": "images_get",
            "title": "Read images",
            "description": "Retrieve accessible image metadata and URL",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Read images"
            }
          },
          {
            "name": "images_list",
            "title": "Browse images",
            "description": "List stored images or the daily archive with pagination",
            "inputSchema": {
              "properties": {
                "cursor": {
                  "description": "Next cursor from the previous page; keep query and scope unchanged",
                  "type": "string"
                },
                "limit": {
                  "description": "Page size, default 20, maximum 100",
                  "type": "number"
                },
                "scope": {
                  "description": "mine, public, all (own plus public), or daily; defaults to public",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Browse images"
            }
          },
          {
            "name": "images_search",
            "title": "Search images",
            "description": "Search accessible stored images by title, description, prompt and tags; public by default",
            "inputSchema": {
              "properties": {
                "cursor": {
                  "description": "",
                  "type": "string"
                },
                "limit": {
                  "description": "Max results (default 20)",
                  "type": "number"
                },
                "query": {
                  "description": "What the image should show, in words",
                  "type": "string"
                },
                "scope": {
                  "description": "public, mine, all, or daily; defaults to public",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Search images"
            }
          },
          {
            "name": "images_share",
            "title": "Share images",
            "description": "Explicitly publish or unpublish your image",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "",
                  "type": "string"
                },
                "public": {
                  "description": "Explicitly publish or unpublish this image",
                  "type": "boolean"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "title": "Share images"
            }
          },
          {
            "name": "images_update",
            "title": "Update images",
            "description": "Edit metadata on an image you own",
            "inputSchema": {
              "properties": {
                "description": {
                  "description": "",
                  "type": "string"
                },
                "id": {
                  "description": "",
                  "type": "string"
                },
                "tags": {
                  "description": "",
                  "type": "array"
                },
                "title": {
                  "description": "",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Update images"
            }
          },
          {
            "name": "images_upload",
            "title": "Upload images",
            "description": "Upload a private raster image",
            "inputSchema": {
              "properties": {
                "data": {
                  "description": "Base64 PNG, JPEG or GIF; at most 512 KB decoded and 8 megapixels; browser uploads support 8 MB",
                  "type": "string"
                },
                "description": {
                  "description": "Image caption, at most 1000 characters",
                  "type": "string"
                }
              },
              "required": [
                "data"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Upload images"
            }
          },
          {
            "name": "islam_read",
            "title": "Read islam",
            "description": "Read the full Islamic source passage from an islam_search result, with its source and reference. Preserve distinctions between original text, translation and commentary.",
            "inputSchema": {
              "properties": {
                "path": {
                  "description": "Resource path from a search result, e.g. /quran/2/255 or /seerah/page/10; an https://aslam.org URL is also accepted",
                  "type": "string"
                }
              },
              "required": [
                "path"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Read islam"
            }
          },
          {
            "name": "islam_search",
            "title": "Search islam",
            "description": "Search Aslam.org's Quran, hadith, names of Allah, Seerah, Ghazali, IslamQA, adhkar and Riyad us-Salihin. Returns reference excerpts, not generated answers. Distinguish Quran and hadith from biography and scholarly interpretation; cite the source.",
            "inputSchema": {
              "properties": {
                "collection": {
                  "description": "Optional source: quran, hadith, names, seerah, ghazali, islamqa, adhkar or salihin",
                  "type": "string"
                },
                "limit": {
                  "description": "Maximum results, 1-50 (default 20)",
                  "type": "number"
                },
                "query": {
                  "description": "Keywords to find in the Islamic knowledge base",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Search islam"
            }
          },
          {
            "name": "mail_gmailread",
            "title": "Gmailread mail",
            "description": "Read the caller's connected Gmail. Read-only; connect in Account first.",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "Gmail message id from GmailSearch",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Gmailread mail"
            }
          },
          {
            "name": "mail_gmailsearch",
            "title": "Gmailsearch mail",
            "description": "Search the caller's connected Gmail. Read-only; connect in Account first.",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "Number of messages, up to 20",
                  "type": "number"
                },
                "page": {
                  "description": "Next page token from a previous search",
                  "type": "string"
                },
                "query": {
                  "description": "Gmail search, e.g. is:unread. Limited to the last seven days. Returns headers only; use GmailRead for a relevant message body. Older mail is unavailable",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Gmailsearch mail"
            }
          },
          {
            "name": "mail_inbox",
            "title": "Read mail",
            "description": "List the account's most recent messages — read my mail, check my inbox",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "Max messages (default 10)",
                  "type": "number"
                },
                "offset": {
                  "description": "Matching messages to skip",
                  "type": "number"
                },
                "tag": {
                  "description": "Only messages sent to this plus-address tag",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Read mail"
            }
          },
          {
            "name": "mail_info",
            "title": "Info mail",
            "description": "How to reach the caller here: the handle, the email address if this instance has a mail domain, and whether mail from outside can arrive at all. Pass a tag for a separate one (you+tag) — give that out, then read only its messages with mail_inbox(tag)",
            "inputSchema": {
              "properties": {
                "tag": {
                  "description": "A label for this handle, e.g. \"research\" or \"receipts\". Omit for the plain one",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Info mail"
            }
          },
          {
            "name": "mail_markread",
            "title": "Markread mail",
            "description": "Mark specified inbox message IDs, or explicitly all current inbox messages, as read. Changes read status only; does not read, summarize or triage the content.",
            "inputSchema": {
              "properties": {
                "all": {
                  "description": "Explicitly mark all current inbox mail as read",
                  "type": "boolean"
                },
                "ids": {
                  "description": "Message IDs to mark read; use all instead to clear the inbox unread count",
                  "type": "array"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Markread mail"
            }
          },
          {
            "name": "mail_read",
            "title": "Read mail",
            "description": "Read your correspondence by id in bounded body-character pages, including attachment names. Follow the returned next offset for the rest. Omitting id retains the legacy inbox summary",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "Message id from mail_inbox or mail_search",
                  "type": "string"
                },
                "limit": {
                  "description": "Body characters per page; default and maximum 2000",
                  "type": "number"
                },
                "offset": {
                  "description": "Body character offset",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Read mail"
            }
          },
          {
            "name": "mail_search",
            "title": "Search mail",
            "description": "Search the account's mail and return matching messages",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "Max results (default 10)",
                  "type": "number"
                },
                "offset": {
                  "description": "Matching messages to skip",
                  "type": "number"
                },
                "query": {
                  "description": "What to look for",
                  "type": "string"
                },
                "tag": {
                  "description": "Only messages sent to this plus-address tag",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Search mail"
            }
          },
          {
            "name": "mail_send",
            "title": "Send mail",
            "description": "Write to somebody, as you. A username reaches them on this instance and is free; a full email address leaves over SMTP under this instance's domain, so a reply comes back to your inbox, and is charged. Resolve a name with contacts_find first. Mail that leaves needs MAIL_DOMAIN configured on the instance",
            "inputSchema": {
              "properties": {
                "body": {
                  "description": "Message body, plain text",
                  "type": "string"
                },
                "subject": {
                  "description": "Message subject",
                  "type": "string"
                },
                "to": {
                  "description": "Recipient: a username on this instance, or a full email address. Resolve a name with contacts_find first",
                  "type": "string"
                }
              },
              "required": [
                "to",
                "subject",
                "body"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "title": "Send mail"
            }
          },
          {
            "name": "mail_source",
            "title": "Source mail",
            "description": "Read one stored message owned by the caller, by id",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "Stored message id",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Source mail"
            }
          },
          {
            "name": "mail_sources",
            "title": "Sources mail",
            "description": "List stored message ids owned by the caller",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "",
                  "type": "number"
                },
                "offset": {
                  "description": "",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Sources mail"
            }
          },
          {
            "name": "maps_area",
            "title": "Area maps",
            "description": "Every tile covering a bounding box at a zoom level, as URLs, row by row from the north-west, and how many are already held. What to ask for when you want the map around a place rather than one numbered tile",
            "inputSchema": {
              "properties": {
                "east": {
                  "description": "Eastern edge, in degrees longitude",
                  "type": "number"
                },
                "north": {
                  "description": "Northern edge, in degrees latitude",
                  "type": "number"
                },
                "south": {
                  "description": "Southern edge",
                  "type": "number"
                },
                "style": {
                  "description": "road, outdoor or light",
                  "type": "string"
                },
                "west": {
                  "description": "Western edge",
                  "type": "number"
                },
                "zoom": {
                  "description": "Zoom level, 0 to 20",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Area maps"
            }
          },
          {
            "name": "maps_tile",
            "title": "Tile maps",
            "description": "The URL for one map tile, by zoom, column and row. Styles: road, outdoor (rights of way and contours), light (a quiet basemap to draw on). Free. Britain only",
            "inputSchema": {
              "properties": {
                "style": {
                  "description": "road, outdoor or light — outdoor has rights of way and contours",
                  "type": "string"
                },
                "x": {
                  "description": "Tile column at that zoom",
                  "type": "number"
                },
                "y": {
                  "description": "Tile row at that zoom",
                  "type": "number"
                },
                "z": {
                  "description": "Zoom level, 0 to 20",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Tile maps"
            }
          },
          {
            "name": "markets_convert",
            "title": "Convert markets",
            "description": "Convert an amount from one currency to another — 250 GBP in JPY. Uses European Central Bank reference rates, and takes a past date back to 1999. Crypto converts at the live price through the dollar",
            "inputSchema": {
              "properties": {
                "amount": {
                  "description": "How much to convert. Default 1",
                  "type": "number"
                },
                "date": {
                  "description": "Optional: the rate on a past day, as 2020-01-03. Currencies only, back to 1999",
                  "type": "string"
                },
                "from": {
                  "description": "Currency or asset to convert from, as a code: GBP, USD, EUR, BTC…",
                  "type": "string"
                },
                "to": {
                  "description": "Currency or asset to convert to, as a code: JPY, USD, ETH…",
                  "type": "string"
                }
              },
              "required": [
                "from",
                "to"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Convert markets"
            }
          },
          {
            "name": "markets_history",
            "title": "History markets",
            "description": "Read daily closing prices for a supported instrument over a range of up to 366 days. Missing trading days are omitted. Uses Yahoo Finance",
            "inputSchema": {
              "properties": {
                "end": {
                  "description": "Last date inclusive, YYYY-MM-DD; default today. Maximum range 366 days",
                  "type": "string"
                },
                "limit": {
                  "description": "Maximum points per page, default 20, maximum 100",
                  "type": "number"
                },
                "offset": {
                  "description": "",
                  "type": "number"
                },
                "start": {
                  "description": "First date, YYYY-MM-DD; default 30 days ago",
                  "type": "string"
                },
                "symbol": {
                  "description": "Supported ticker, e.g. BTC, AAPL, GOLD or EUR",
                  "type": "string"
                }
              },
              "required": [
                "symbol"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "History markets"
            }
          },
          {
            "name": "markets_list",
            "title": "Browse markets",
            "description": "Get live prices for cryptocurrencies, stocks, commodities (oil, gold, silver, copper and crops), futures and currencies",
            "inputSchema": {
              "properties": {
                "category": {
                  "description": "crypto (BTC, ETH, SOL…), stocks, commodities (OIL, GOLD, SILVER, COPPER, COFFEE, WHEAT, CORN, SOYBEANS, OATS), futures (the metals and oil alone) or currencies (EUR, GBP, JPY…). Default crypto",
                  "type": "string"
                },
                "limit": {
                  "description": "Maximum instruments, default 20, max 100",
                  "type": "number"
                },
                "offset": {
                  "description": "Instruments to skip",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Browse markets"
            }
          },
          {
            "name": "markets_quote",
            "title": "Quote markets",
            "description": "Read one supported instrument price in USD, with source, timestamp and staleness",
            "inputSchema": {
              "properties": {
                "symbol": {
                  "description": "One supported ticker, e.g. BTC, AAPL, GOLD or EUR; prices are in USD",
                  "type": "string"
                }
              },
              "required": [
                "symbol"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Quote markets"
            }
          },
          {
            "name": "news_headlines",
            "title": "Headlines news",
            "description": "Read the home card headlines: latest story per topic, freshest first, at most ten",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "title": "Headlines news"
            }
          },
          {
            "name": "news_list",
            "title": "Browse news",
            "description": "Read recent news headlines with short summaries, balanced across topics",
            "inputSchema": {
              "properties": {
                "day": {
                  "description": "today to restrict headlines to the caller’s local calendar day",
                  "type": "string"
                },
                "limit": {
                  "description": "Optional max number of headlines (default 30)",
                  "type": "number"
                },
                "topic": {
                  "description": "Optional topic/category filter (e.g. tech, world, business)",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Browse news"
            }
          },
          {
            "name": "news_read",
            "title": "Read news",
            "description": "Read one news article in full by its id or URL",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "Article id (from Headlines) or article URL",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Read news"
            }
          },
          {
            "name": "news_search",
            "title": "Search news",
            "description": "Search indexed and live news for a topic",
            "inputSchema": {
              "properties": {
                "query": {
                  "description": "Search terms, e.g. latest AI news",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Search news"
            }
          },
          {
            "name": "notes_add",
            "title": "Add notes",
            "description": "Write a note under a title, so it is there next conversation. Writing a title that exists rewrites that note",
            "inputSchema": {
              "properties": {
                "text": {
                  "description": "What the note says",
                  "type": "string"
                },
                "title": {
                  "description": "What the note is called, e.g. \"location\" or \"project brief\". Writing a title that exists rewrites that note",
                  "type": "string"
                }
              },
              "required": [
                "title",
                "text"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Add notes"
            }
          },
          {
            "name": "notes_delete",
            "title": "Delete notes",
            "description": "Delete one note by title",
            "inputSchema": {
              "properties": {
                "title": {
                  "description": "The note to delete, as returned by notes_list",
                  "type": "string"
                }
              },
              "required": [
                "title"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "title": "Delete notes"
            }
          },
          {
            "name": "notes_get",
            "title": "Read notes",
            "description": "Read one note by title. Use it when you know the title; notes_list when you do not",
            "inputSchema": {
              "properties": {
                "title": {
                  "description": "The note's title, as given to notes_add",
                  "type": "string"
                }
              },
              "required": [
                "title"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Read notes"
            }
          },
          {
            "name": "notes_list",
            "title": "Browse notes",
            "description": "List every note the caller has written, with its text",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Browse notes"
            }
          },
          {
            "name": "notify_devices",
            "title": "Devices notify",
            "description": "Whether this account can be reached by notification at all, and on which devices. Worth asking before promising to tell somebody something",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "title": "Devices notify"
            }
          },
          {
            "name": "notify_send",
            "title": "Send notify",
            "description": "Interrupt yourself on your own devices — a phone, a laptop — with the page closed. For the thing that cannot wait until the next time somebody looks. An answer to a question belongs in the thread it was asked in, not here",
            "inputSchema": {
              "properties": {
                "body": {
                  "description": "A second line, up to about 300 characters. Optional",
                  "type": "string"
                },
                "title": {
                  "description": "The line on the lock screen. Short — this is the whole message on a watch",
                  "type": "string"
                },
                "url": {
                  "description": "Where tapping it goes, e.g. /inbox. A notification you cannot act on trains someone to ignore the next one",
                  "type": "string"
                }
              },
              "required": [
                "title"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Send notify"
            }
          },
          {
            "name": "places_address",
            "title": "Get an email address",
            "description": "Name the place at a latitude and longitude — the reverse of places_geocode. Use it whenever you have coordinates and need to say where that is",
            "inputSchema": {
              "properties": {
                "lat": {
                  "description": "Latitude, e.g. 51.5308",
                  "type": "number"
                },
                "lon": {
                  "description": "Longitude, e.g. -0.1238",
                  "type": "number"
                }
              },
              "required": [
                "lat",
                "lon"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Get an email address"
            }
          },
          {
            "name": "places_elevation",
            "title": "Elevation places",
            "description": "How high a place is above sea level, in metres and feet. Sampled from a 90-metre global elevation model, so a summit reads a little under its surveyed height",
            "inputSchema": {
              "properties": {
                "lat": {
                  "description": "Optional latitude, if the location is already known",
                  "type": "number"
                },
                "lon": {
                  "description": "Optional longitude, if the location is already known",
                  "type": "number"
                },
                "place": {
                  "description": "A place name or address, e.g. 'Denver' or 'Ben Nevis'",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Elevation places"
            }
          },
          {
            "name": "places_geocode",
            "title": "Geocode places",
            "description": "Resolve a place name or address to coordinates",
            "inputSchema": {
              "properties": {
                "address": {
                  "description": "A place name or address to locate",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Geocode places"
            }
          },
          {
            "name": "places_nearby",
            "title": "Find nearby places",
            "description": "List points of interest near a location. Each one says whether it is open right now where that is known, so \"is anything open near me\" is one call",
            "inputSchema": {
              "properties": {
                "lat": {
                  "description": "Optional latitude",
                  "type": "number"
                },
                "lon": {
                  "description": "Optional longitude",
                  "type": "number"
                },
                "near": {
                  "description": "Place to look around, e.g. 'Camden, London' (or give lat/lon)",
                  "type": "string"
                },
                "query": {
                  "description": "Optional keyword to filter by, e.g. 'cafe'",
                  "type": "string"
                },
                "radius": {
                  "description": "Optional radius in metres (default 1000)",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Find nearby places"
            }
          },
          {
            "name": "places_search",
            "title": "Search places",
            "description": "Find places by name or category, optionally near a location. Each one says whether it is open right now where that is known, rather than raw opening-hours text to interpret",
            "inputSchema": {
              "properties": {
                "lat": {
                  "description": "Optional latitude, if the location is already known",
                  "type": "number"
                },
                "lon": {
                  "description": "Optional longitude, if the location is already known",
                  "type": "number"
                },
                "near": {
                  "description": "Optional place to search near, e.g. 'Shoreditch, London' or 'SF'",
                  "type": "string"
                },
                "query": {
                  "description": "What to look for, e.g. 'ramen', 'pharmacy', 'Blue Bottle Coffee'",
                  "type": "string"
                },
                "radius": {
                  "description": "Optional search radius in metres (default 2000)",
                  "type": "number"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Search places"
            }
          },
          {
            "name": "prayer_qibla",
            "title": "Qibla for prayer",
            "description": "Get the qibla — the compass bearing to face for Islamic prayer from a location",
            "inputSchema": {
              "properties": {
                "lat": {
                  "description": "Latitude of the location",
                  "type": "number"
                },
                "lon": {
                  "description": "Longitude of the location",
                  "type": "number"
                }
              },
              "required": [
                "lat",
                "lon"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Qibla for prayer"
            }
          },
          {
            "name": "prayer_reflection",
            "title": "Prayer times for prayer",
            "description": "Get today's Islamic reflection — a verse of the Quran with its surah, a saying of the Prophet, and a name of Allah",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Prayer times for prayer"
            }
          },
          {
            "name": "prayer_saying",
            "title": "Prayer times for prayer",
            "description": "Look up a hadith from Sahih al-Bukhari, optionally from a given book",
            "inputSchema": {
              "properties": {
                "book": {
                  "description": "Book number within Sahih al-Bukhari. Omit for a saying from any book",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Prayer times for prayer"
            }
          },
          {
            "name": "prayer_search",
            "title": "Search prayer",
            "description": "Search the Quran, the hadith and the names of Allah by meaning — ask a question in plain language rather than naming a reference",
            "inputSchema": {
              "properties": {
                "query": {
                  "description": "A question in plain language, e.g. \"what is said about patience\"",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Search prayer"
            }
          },
          {
            "name": "prayer_times",
            "title": "Prayer times for prayer",
            "description": "Get today's Islamic prayer times (salah) for a location, and which prayer is next",
            "inputSchema": {
              "properties": {
                "lat": {
                  "description": "Latitude of the location",
                  "type": "number"
                },
                "lon": {
                  "description": "Longitude of the location",
                  "type": "number"
                },
                "method": {
                  "description": "Calculation convention: isna, mwl, egypt, karachi, gulf, diyanet, muis or jakim (defaults to isna)",
                  "type": "string"
                },
                "tz": {
                  "description": "IANA timezone of the location, e.g. Europe/London (defaults to UTC)",
                  "type": "string"
                }
              },
              "required": [
                "lat",
                "lon"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Prayer times for prayer"
            }
          },
          {
            "name": "prayer_verse",
            "title": "Prayer times for prayer",
            "description": "Look up a chapter of the Quran, or one verse within it, by number. Use prayer_search to ask a question instead of naming a reference",
            "inputSchema": {
              "properties": {
                "chapter": {
                  "description": "Chapter (surah) number, 1-114",
                  "type": "number"
                },
                "verse": {
                  "description": "Verse number within the chapter. Omit for the whole chapter",
                  "type": "number"
                }
              },
              "required": [
                "chapter"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Prayer times for prayer"
            }
          },
          {
            "name": "recall_conversation",
            "title": "Conversation recall",
            "description": "Read one whole conversation back by id, as recall_search and recall_list report it",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "The conversation's id, as recall_search reports it",
                  "type": "string"
                },
                "limit": {
                  "description": "Max messages, most recent kept (default 50)",
                  "type": "number"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Conversation recall"
            }
          },
          {
            "name": "recall_list",
            "title": "Browse recall",
            "description": "List the caller's conversations, most recently active first, with what each is about and where it happened",
            "inputSchema": {
              "properties": {
                "client": {
                  "description": "Only conversations on one client: web, mail, cli",
                  "type": "string"
                },
                "limit": {
                  "description": "Max conversations (default 20)",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Browse recall"
            }
          },
          {
            "name": "recall_search",
            "title": "Search recall",
            "description": "Search everything the caller has said to an agent and been told, wherever they said it — the browser, email, or the command line. Use it when something was mentioned and you need to find where; notes_get is for a fact somebody wrote down on purpose",
            "inputSchema": {
              "properties": {
                "client": {
                  "description": "Narrow to where it was said: web, mail, cli. Omit for everywhere",
                  "type": "string"
                },
                "limit": {
                  "description": "Max results (default 20, max 200)",
                  "type": "number"
                },
                "query": {
                  "description": "What to look for — a word or phrase that was said",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Search recall"
            }
          },
          {
            "name": "routes_directions",
            "title": "Directions routes",
            "description": "The turn-by-turn route between two places, with the distance for each instruction. Use ETA instead when only the travel time is wanted — this asks the provider for more and costs more",
            "inputSchema": {
              "properties": {
                "arrive_by": {
                  "description": "Be there by this time, as RFC3339. Cannot be combined with depart_at",
                  "type": "string"
                },
                "depart_at": {
                  "description": "When the journey starts, as RFC3339. Defaults to now",
                  "type": "string"
                },
                "from": {
                  "description": "Where the journey starts, e.g. 'King's Cross, London' (or give from_lat/from_lon)",
                  "type": "string"
                },
                "from_lat": {
                  "description": "Optional start latitude, if already known",
                  "type": "number"
                },
                "from_lon": {
                  "description": "Optional start longitude, if already known",
                  "type": "number"
                },
                "mode": {
                  "description": "How to travel: drive (default), walk, cycle or transit",
                  "type": "string"
                },
                "to": {
                  "description": "Where the journey ends, e.g. 'Heathrow Airport'",
                  "type": "string"
                },
                "to_lat": {
                  "description": "Optional end latitude, if already known",
                  "type": "number"
                },
                "to_lon": {
                  "description": "Optional end longitude, if already known",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Directions routes"
            }
          },
          {
            "name": "routes_eta",
            "title": "Travel time",
            "description": "How long it takes to travel between two places, by road rather than as the crow flies. Can be asked about a future departure, or told when you need to arrive and answer when to leave",
            "inputSchema": {
              "properties": {
                "arrive_by": {
                  "description": "Be there by this time, as RFC3339. Answers when to leave. Cannot be combined with depart_at",
                  "type": "string"
                },
                "depart_at": {
                  "description": "When the journey starts, as RFC3339 (e.g. 2026-08-13T08:00:00Z). Defaults to now. Traffic and timetables are read for this time",
                  "type": "string"
                },
                "from": {
                  "description": "Where the journey starts, e.g. 'King's Cross, London' (or give from_lat/from_lon)",
                  "type": "string"
                },
                "from_lat": {
                  "description": "Optional start latitude, if already known",
                  "type": "number"
                },
                "from_lon": {
                  "description": "Optional start longitude, if already known",
                  "type": "number"
                },
                "mode": {
                  "description": "How to travel: drive (default), walk, cycle or transit",
                  "type": "string"
                },
                "to": {
                  "description": "Where the journey ends, e.g. 'Heathrow Airport'",
                  "type": "string"
                },
                "to_lat": {
                  "description": "Optional end latitude, if already known",
                  "type": "number"
                },
                "to_lon": {
                  "description": "Optional end longitude, if already known",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Travel time"
            }
          },
          {
            "name": "routes_nearest",
            "title": "Nearest routes",
            "description": "Given a starting point and several destinations, say which is quickest to reach and put them in order. Each destination is a separate routing lookup, so ask about the places you are actually choosing between rather than a long list",
            "inputSchema": {
              "properties": {
                "from": {
                  "description": "Where you are starting from, e.g. 'Shoreditch, London' (or give from_lat/from_lon)",
                  "type": "string"
                },
                "from_lat": {
                  "description": "Optional start latitude, if already known",
                  "type": "number"
                },
                "from_lon": {
                  "description": "Optional start longitude, if already known",
                  "type": "number"
                },
                "mode": {
                  "description": "How to travel: drive (default), walk, cycle or transit",
                  "type": "string"
                },
                "to": {
                  "description": "The places to compare, e.g. ['Heathrow', 'Gatwick', 'Stansted']",
                  "type": "array"
                }
              },
              "required": [
                "to"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Nearest routes"
            }
          },
          {
            "name": "shell_run",
            "title": "Run shell",
            "description": "Run a shell command in your account's container sandbox and get back what it wrote. A real shell in a container: pipes, redirection and \u0026\u0026 all work, the working directory is /work and files there persist between calls. Use it to build, test, run scripts and move files about. A non-zero exit code comes back in the response rather than as an error, so read the output — a failing build is an answer",
            "inputSchema": {
              "properties": {
                "command": {
                  "description": "A shell command to run, e.g. 'go test ./... 2\u003e\u00261 | tail -40'",
                  "type": "string"
                },
                "dir": {
                  "description": "Directory to run it in, under /work. Defaults to /work",
                  "type": "string"
                },
                "timeout": {
                  "description": "Seconds to allow, up to the instance's maximum. Defaults to 120",
                  "type": "number"
                }
              },
              "required": [
                "command"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Run shell"
            }
          },
          {
            "name": "shell_write",
            "title": "Write shell",
            "description": "Put a file in your account's container sandbox, creating any missing directories. The only file operation that is not a shell command, because it is the one a shell is bad at: source is full of quotes and backticks and a heredoc will mangle it. The content arrives as a string and reaches the file without a shell seeing it. To read, list, search or change a file, use the shell — cat, ls, grep and sed are right there",
            "inputSchema": {
              "properties": {
                "content": {
                  "description": "The whole file. This replaces what was there",
                  "type": "string"
                },
                "path": {
                  "description": "Where to put it, relative to /work — not to the directory your last command left you in. Missing directories are created",
                  "type": "string"
                }
              },
              "required": [
                "path",
                "content"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Write shell"
            }
          },
          {
            "name": "sms_history",
            "title": "History sms",
            "description": "Read the texts this account has sent and received, newest first. Both directions, which is why it is not called an inbox",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "How many messages to return, newest first (default 50, max 200)",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "History sms"
            }
          },
          {
            "name": "sms_number",
            "title": "Number sms",
            "description": "The number texts are sent from, which numbers are verified as yours, and how many messages are left today",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "title": "Number sms"
            }
          },
          {
            "name": "sms_send",
            "title": "Send sms",
            "description": "Message somebody from this instance's number, by text or on WhatsApp. A text is charged per 160-character segment; WhatsApp is charged per 24-hour conversation and only reaches somebody who wrote in within the last day. Capped per day either way, and the recipient can stop it with STOP",
            "inputSchema": {
              "properties": {
                "channel": {
                  "description": "How to send it: 'sms' (the default) or 'whatsapp'. WhatsApp only works with somebody who messaged this instance in the last 24 hours — reply on the channel they used",
                  "type": "string"
                },
                "text": {
                  "description": "What to say. A text is charged per 160-character segment, so brevity is not only good manners",
                  "type": "string"
                },
                "to": {
                  "description": "The number to message, in international format, e.g. +447700900123. Use contacts_find to turn a name into one",
                  "type": "string"
                }
              },
              "required": [
                "to",
                "text"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "title": "Send sms"
            }
          },
          {
            "name": "sms_source",
            "title": "Source sms",
            "description": "Read one stored message owned by the caller, by id",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "Stored message id",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Source sms"
            }
          },
          {
            "name": "sms_sources",
            "title": "Sources sms",
            "description": "List stored message ids owned by the caller",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "",
                  "type": "number"
                },
                "offset": {
                  "description": "",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Sources sms"
            }
          },
          {
            "name": "sms_verify",
            "title": "Verify sms",
            "description": "Claim a number as your own, so texts arriving from it reach this account. Call it with just the number to have a code texted there, then again with the code",
            "inputSchema": {
              "properties": {
                "code": {
                  "description": "The code that was texted to that number. Omit to have one sent",
                  "type": "string"
                },
                "number": {
                  "description": "Your own number, in international format",
                  "type": "string"
                }
              },
              "required": [
                "number"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Verify sms"
            }
          },
          {
            "name": "social_list",
            "title": "Browse social",
            "description": "Read the latest social posts from the network",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "Optional max number of posts (default all recent)",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Browse social"
            }
          },
          {
            "name": "social_search",
            "title": "Search social",
            "description": "Search public posts on this instance by keyword. This is the instance's own feed, not the wider internet — use web_search for that",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "Max results (default 20)",
                  "type": "number"
                },
                "query": {
                  "description": "What to look for in posts on this instance",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Search social"
            }
          },
          {
            "name": "stream_list",
            "title": "Browse stream",
            "description": "Read what has happened here recently",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "How many entries to return (default 20, max 100)",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Browse stream"
            }
          },
          {
            "name": "tasks_create",
            "title": "Create tasks",
            "description": "Add a task. Assign it to the agent and it can pick the task up itself",
            "inputSchema": {
              "properties": {
                "assignee": {
                  "description": "me (default) or agent — assign to the agent and it can pick the task up",
                  "type": "string"
                },
                "detail": {
                  "description": "Anything the doer needs to know: context, links, constraints",
                  "type": "string"
                },
                "due": {
                  "description": "Optional deadline, RFC3339 or 2006-01-02 15:04",
                  "type": "string"
                },
                "title": {
                  "description": "What is to be done",
                  "type": "string"
                }
              },
              "required": [
                "title"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Create tasks"
            }
          },
          {
            "name": "tasks_delete",
            "title": "Delete tasks",
            "description": "Remove a task",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "The task's id",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "title": "Delete tasks"
            }
          },
          {
            "name": "tasks_list",
            "title": "Browse tasks",
            "description": "List the caller's tasks, open ones first; optionally filtered by state",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "Maximum tasks, default 20, max 100",
                  "type": "number"
                },
                "offset": {
                  "description": "Tasks to skip",
                  "type": "number"
                },
                "status": {
                  "description": "Optional filter: todo, doing, done, failed or blocked",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Browse tasks"
            }
          },
          {
            "name": "tasks_next",
            "title": "Next tasks",
            "description": "The next task assigned to the agent — what to work on now",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "title": "Next tasks"
            }
          },
          {
            "name": "tasks_read",
            "title": "Read tasks",
            "description": "Read one task owned by the caller",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "The task's id",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Read tasks"
            }
          },
          {
            "name": "tasks_update",
            "title": "Update tasks",
            "description": "Change a task: its state, or the result of doing it",
            "inputSchema": {
              "properties": {
                "detail": {
                  "description": "New detail",
                  "type": "string"
                },
                "id": {
                  "description": "The task's id",
                  "type": "string"
                },
                "result": {
                  "description": "What came of it — the answer, the outcome, what was found",
                  "type": "string"
                },
                "status": {
                  "description": "todo, doing, done, failed or blocked",
                  "type": "string"
                },
                "title": {
                  "description": "New title",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Update tasks"
            }
          },
          {
            "name": "text_classify",
            "title": "Classify text",
            "description": "Sort text into one of the labels you give, with a confidence. For routing, triage and moderation. Capped at 30,000 characters",
            "inputSchema": {
              "properties": {
                "labels": {
                  "description": "Comma-separated labels to choose between",
                  "type": "string"
                },
                "text": {
                  "description": "The text to sort",
                  "type": "string"
                }
              },
              "required": [
                "text",
                "labels"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Classify text"
            }
          },
          {
            "name": "text_extract",
            "title": "Extract text",
            "description": "Turn text into JSON matching a schema you give. Pass the fields you want as a JSON schema or a plain description; returns JSON only. Capped at 30,000 characters",
            "inputSchema": {
              "properties": {
                "schema": {
                  "description": "A JSON schema, or a plain description of the fields wanted",
                  "type": "string"
                },
                "text": {
                  "description": "The text to read",
                  "type": "string"
                }
              },
              "required": [
                "text",
                "schema"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Extract text"
            }
          },
          {
            "name": "text_summarise",
            "title": "Summarise text",
            "description": "Summarise text into a few sentences. Pass style=bullets for a list, or a sentence count. Capped at 30,000 characters",
            "inputSchema": {
              "properties": {
                "lines": {
                  "description": "Optional: roughly how many sentences or bullets",
                  "type": "number"
                },
                "style": {
                  "description": "Optional: 'bullets' for a list, otherwise prose",
                  "type": "string"
                },
                "text": {
                  "description": "The text to summarise",
                  "type": "string"
                }
              },
              "required": [
                "text"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Summarise text"
            }
          },
          {
            "name": "text_translate",
            "title": "Translate text",
            "description": "Translate text into another language, preserving formatting. Capped at 30,000 characters",
            "inputSchema": {
              "properties": {
                "text": {
                  "description": "The text to translate",
                  "type": "string"
                },
                "to": {
                  "description": "Target language, e.g. 'French' or 'ar'",
                  "type": "string"
                }
              },
              "required": [
                "text",
                "to"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Translate text"
            }
          },
          {
            "name": "transit_arrivals",
            "title": "Arrivals transit",
            "description": "What is due at a stop and when. Takes a stop name or an id. In London this is live from TfL — buses, tube, DLR, Overground and Elizabeth line. Elsewhere it is the published timetable, and says so",
            "inputSchema": {
              "properties": {
                "stop": {
                  "description": "Stop name or id, e.g. 'Oxford Circus' or 940GZZLUOXC",
                  "type": "string"
                }
              },
              "required": [
                "stop"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Arrivals transit"
            }
          },
          {
            "name": "transit_buses",
            "title": "Buses transit",
            "description": "Where the buses actually are near a point right now — line, where each is heading and how far away, nearest first. England, from the Bus Open Data Service. This is position rather than prediction: it says what is moving, not when it reaches you",
            "inputSchema": {
              "properties": {
                "lat": {
                  "description": "Latitude of the point to look around",
                  "type": "number"
                },
                "limit": {
                  "description": "How many to list, default 10",
                  "type": "number"
                },
                "lon": {
                  "description": "Longitude of the point",
                  "type": "number"
                },
                "within_km": {
                  "description": "How far to look, in kilometres — default 2, most 25",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Buses transit"
            }
          },
          {
            "name": "transit_feeds",
            "title": "Feeds transit",
            "description": "Which published timetables this instance carries, and which others it could — with the size of each, so an operator can see what switching one on costs. Also names the feeds that look right but whose timetables have run out",
            "inputSchema": {
              "properties": {
                "country": {
                  "description": "Optional two-letter code to narrow the list: GB, US, ES…",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Feeds transit"
            }
          },
          {
            "name": "transit_nearby",
            "title": "Find nearby transit",
            "description": "Bus stops and stations near a point, nearest first, with the id each one is called by. London live from TfL; elsewhere from whichever published timetables this instance has loaded",
            "inputSchema": {
              "properties": {
                "lat": {
                  "description": "Latitude",
                  "type": "number"
                },
                "lon": {
                  "description": "Longitude",
                  "type": "number"
                },
                "radius": {
                  "description": "Metres to search, default 400, max 2000",
                  "type": "number"
                }
              },
              "required": [
                "lat",
                "lon"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Find nearby transit"
            }
          },
          {
            "name": "transit_status",
            "title": "Status transit",
            "description": "Which lines are delayed, part-suspended or closed right now, and why. London only",
            "inputSchema": {
              "properties": {
                "modes": {
                  "description": "Optional: tube, dlr, overground, elizabeth-line, tram — comma separated",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Status transit"
            }
          },
          {
            "name": "transit_trains",
            "title": "Trains transit",
            "description": "The live departure or arrival board at a British station, by its three-letter code — KGX, MAN, EDB. Scheduled and expected time, platform, operator and where it is going, plus any disruption notice. From National Rail",
            "inputSchema": {
              "properties": {
                "arrivals": {
                  "description": "Show what is coming in rather than what is leaving",
                  "type": "boolean"
                },
                "rows": {
                  "description": "How many services, 1 to 20, default 10",
                  "type": "number"
                },
                "station": {
                  "description": "Three-letter station code — KGX, MAN, EDB",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Trains transit"
            }
          },
          {
            "name": "users_find",
            "title": "Find users",
            "description": "Look somebody up by username or display name. Use this to turn a name somebody mentioned into an address you can write to",
            "inputSchema": {
              "properties": {
                "query": {
                  "description": "A username or part of a display name",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Find users"
            }
          },
          {
            "name": "users_get",
            "title": "Read users",
            "description": "One user, by username",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "Their username",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Read users"
            }
          },
          {
            "name": "users_list",
            "title": "Browse users",
            "description": "Everyone on this instance, online first and then newest. Agents are included and marked; an agent account is a user here like any other",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "How many to return, newest first. Default 100",
                  "type": "number"
                },
                "online": {
                  "description": "Only those seen in the last three minutes",
                  "type": "boolean"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Browse users"
            }
          },
          {
            "name": "video_list",
            "title": "Browse video",
            "description": "Read the latest videos from curated channels",
            "inputSchema": {
              "properties": {
                "category": {
                  "description": "Optional curated category",
                  "type": "string"
                },
                "limit": {
                  "description": "Maximum videos per page, default 20, maximum 100",
                  "type": "number"
                },
                "offset": {
                  "description": "Videos to skip",
                  "type": "number"
                }
              },
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Browse video"
            }
          },
          {
            "name": "video_read",
            "title": "Read video",
            "description": "Read the metadata and description of one video already discovered by this instance. No transcript is available",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "Video id or video_ archive id from List or Search",
                  "type": "string"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Read video"
            }
          },
          {
            "name": "video_search",
            "title": "Search video",
            "description": "Search YouTube by keyword using this instance's search quota. Results are not restricted to the curated channels",
            "inputSchema": {
              "properties": {
                "channel": {
                  "description": "Exact YouTube channel ID when the user requests a particular channel; obtain it from search results",
                  "type": "string"
                },
                "query": {
                  "description": "What to search for",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Search video"
            }
          },
          {
            "name": "wallet_address",
            "title": "Get an email address",
            "description": "Your own address on Base, to receive USDC. Created the first time you ask. Funds sent on any other chain land at the same address there and cannot be reached from here",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Get an email address"
            }
          },
          {
            "name": "wallet_balance",
            "title": "Check wallet",
            "description": "What your wallet holds in USDC on Base. Says so plainly when the chain could not be reached, because that is not the same as holding nothing",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Check wallet"
            }
          },
          {
            "name": "weather_air",
            "title": "Air weather",
            "description": "Air quality at a location right now — AQI, PM2.5, PM10, ozone, nitrogen dioxide, UV index, and pollen where it is counted",
            "inputSchema": {
              "properties": {
                "lat": {
                  "description": "Latitude of the location",
                  "type": "number"
                },
                "lon": {
                  "description": "Longitude of the location",
                  "type": "number"
                }
              },
              "required": [
                "lat",
                "lon"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Air weather"
            }
          },
          {
            "name": "weather_forecast",
            "title": "Forecast weather",
            "description": "Get the weather forecast for a location — current conditions, the days ahead, and today's sunrise, sunset and how much daylight is left, which is the fact that decides an afternoon outdoors",
            "inputSchema": {
              "properties": {
                "lat": {
                  "description": "Latitude of the location",
                  "type": "number"
                },
                "lon": {
                  "description": "Longitude of the location",
                  "type": "number"
                }
              },
              "required": [
                "lat",
                "lon"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Forecast weather"
            }
          },
          {
            "name": "weather_history",
            "title": "History weather",
            "description": "What the weather actually was at a location between two dates — average high and low, total rainfall and the extremes. Records run a few days behind today",
            "inputSchema": {
              "properties": {
                "end": {
                  "description": "Last day, as 2025-08-31",
                  "type": "string"
                },
                "lat": {
                  "description": "Latitude of the location",
                  "type": "number"
                },
                "lon": {
                  "description": "Longitude of the location",
                  "type": "number"
                },
                "start": {
                  "description": "First day, as 2025-08-01",
                  "type": "string"
                }
              },
              "required": [
                "lat",
                "lon",
                "start",
                "end"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "History weather"
            }
          },
          {
            "name": "weather_lookup",
            "title": "Lookup weather",
            "description": "Look up the weather by town or city name",
            "inputSchema": {
              "properties": {
                "day": {
                  "description": "today or tomorrow; empty returns the current multi-day forecast",
                  "type": "string"
                },
                "focus": {
                  "description": "rain for a rain-focused answer, otherwise a general forecast",
                  "type": "string"
                },
                "place": {
                  "description": "Town or city to look up",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "title": "Lookup weather"
            }
          },
          {
            "name": "weather_marine",
            "title": "Marine weather",
            "description": "Sea state at a coastal or offshore point — wave height, period and direction now and for the days ahead, with sea temperature",
            "inputSchema": {
              "properties": {
                "days": {
                  "description": "How many days ahead, 1 to 7 — default 3",
                  "type": "number"
                },
                "lat": {
                  "description": "Latitude of a coastal or offshore point",
                  "type": "number"
                },
                "lon": {
                  "description": "Longitude of a coastal or offshore point",
                  "type": "number"
                }
              },
              "required": [
                "lat",
                "lon"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Marine weather"
            }
          },
          {
            "name": "web_fetch",
            "title": "Fetch web",
            "description": "Fetch a web page by URL and return its cleaned readable content, stripping ads, popups and navigation. Needs an account",
            "inputSchema": {
              "properties": {
                "url": {
                  "description": "The URL to fetch",
                  "type": "string"
                }
              },
              "required": [
                "url"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Fetch web"
            }
          },
          {
            "name": "web_images",
            "title": "Images web",
            "description": "Search the web for images, thumbnails and original source pages",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "Maximum results, default 24",
                  "type": "number"
                },
                "query": {
                  "description": "Images to find on the web",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "annotations": {
              "title": "Images web"
            }
          },
          {
            "name": "web_search",
            "title": "Search web",
            "description": "Search the web for current information and news",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "Optional max number of results",
                  "type": "number"
                },
                "query": {
                  "description": "Search query",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "annotations": {
              "idempotentHint": true,
              "readOnlyHint": true,
              "title": "Search web"
            }
          }
        ]
      },
      "name": "mu",
      "note": "Indexed from the official MCP registry: facts and our own checks, not reviewed, so no score, grade or rank.",
      "packages": null,
      "pageJsonUrl": "https://www.anchorterminal.com/tools/micro-mu.json",
      "popularity": {
        "githubStars": 437
      },
      "registryName": "mu.micro/mu",
      "remotes": [
        {
          "type": "streamable-http",
          "url": "https://micro.mu/mcp"
        }
      ],
      "repository": "https://github.com/micro/mu",
      "reviewed": false,
      "slug": "micro-mu",
      "source": "the official MCP registry",
      "sourceUrl": "https://registry.modelcontextprotocol.io/v0.1/servers?search=mu.micro/mu",
      "summary": "News, web search, mail, markets, weather, places, files, calendar, contacts. 67 tools, one endpoint.",
      "updatedAt": "2026-08-03T07:56:09Z",
      "url": "https://www.anchorterminal.com/tools/micro-mu",
      "vendor": "micro.mu",
      "vendorUrl": "https://micro.mu",
      "version": "1.0.0",
      "websiteUrl": "https://micro.mu",
      "where": "hosted",
      "why": [
        "vendor",
        "popular"
      ]
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/tools/micro-mu",
    "json": "https://www.anchorterminal.com/tools/micro-mu.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/tools/micro-mu.md",
    "slim": "https://www.anchorterminal.com/tools/micro-mu.min.md"
  },
  "markdown": "# mu\n\n\u003e Indexed, not reviewed: facts from the official MCP registry and our own checks. No score, grade or rank, and not in the rankings until the panel reviews it. How the index works: https://www.anchorterminal.com/indexed/\n\n- Kind: MCP server, by micro.mu (https://micro.mu)\n- Category: Weather \u0026 climate data (https://www.anchorterminal.com/categories/weather.md)\n- Listed because: It's published in the registry under micro.mu, a namespace the registry only gives to whoever proves they control that domain. It's in real use: 437 GitHub stars.\n- What the official MCP registry says: News, web search, mail, markets, weather, places, files, calendar, contacts. 67 tools, one endpoint.\n\n## Facts\n\n- MCP registry: `mu.micro/mu` 1.0.0\n- Endpoint: https://micro.mu/mcp (streamable HTTP)\n- Source: https://github.com/micro/mu\n- Website: https://micro.mu\n- GitHub stars: 437\n- Registry entry updated: 2026-08-03\n\n## Tools\n\n- Tools it lists (162, about 20,294 tokens of context, `tools/list` without credentials, checked 2026-10-04 22:25 UTC):\n  - `apps_build`: Queue a durable app build and immediately return its ID and status URL. Use BuildStatus to retrieve progress and the completed app. Reuse request_key on…\n  - `apps_builds`: List your app build jobs and outcomes\n  - `apps_buildstatus`: Read your saved app build status by ID. Poll until complete or failed; the same ID survives restarts.\n  - `apps_collection`: List your saved apps and their source references\n  - `apps_create`: Create an app — a small, self-contained HTML tool hosted here. Takes the HTML; apps_build writes it for you from a description Apps run in a sandbox. Use…\n  - `apps_edit`: Edit an app you own — its name, description, tags, icon, HTML or price. Fields left out keep their value Apps run in a sandbox. Use…\n  - `apps_embed`: Show a saved micro app in the conversation. Embedding preserves access permissions and does not publish the app\n  - `apps_fork`: Fork an app into your own account, to change independently of the original\n  - `apps_read` (read-only): Read an app or build status by slug, including source HTML for apps you own\n  - `apps_search` (read-only): Find your saved private micro apps by name, description or tag\n  - `apps_test`: Test an app by checking its HTML and checking supported SDK calls; this is not browser execution, so an author finds out what is broken without opening it\n  - `archive_list` (read-only): With a kind, the most recent entries of it. Without one, what kinds are archived and how much of each\n  - `archive_search` (read-only): Search everything this instance has collected, across news, video, markets and posts at once. Use it when the question crosses a service, or when you do not…\n  - `blog_create`: Publish a post to the caller's blog. For anything meant to be read later by other people — notes, write-ups, announcements. For a private note to yourself,…\n  - `blog_delete`: Delete one of the caller's own blog posts, by id or title. Refuses posts written by anyone else, and refuses an ambiguous title rather than guessing.…\n  - `blog_list` (read-only): Read recent blog posts — titles, snippets and ids\n  - `blog_read` (read-only): Read one blog post in full, by id or by title. Use after blog_list has found a candidate and the summary is not enough\n  - `blog_update`: Edit one of the caller's own posts. Fields left out keep their current value\n  - `bookmarks_add`: Save an article, video, blog post or link privately. Re-saving preserves its note\n  - `bookmarks_annotate`: Set or clear a private note on one saved item\n  - `bookmarks_delete`: Remove one of your saved items\n  - `bookmarks_get` (read-only): Read one saved item and its private note, with available archived text. Videos have descriptions, not transcripts\n  - `bookmarks_list` (read-only): Find your saved reading by text or kind, newest first. Private notes are searched too\n  - `browser_read` (read-only): Open a page in a real browser and read it after its JavaScript has run. Use it when web_fetch comes back empty or with only a nav bar, which is what a page…\n  - `browser_shot`: Photograph a page and get back a URL for the picture. What it looks like, rather than what it says — a chart, a layout, a page whose content is an image. Ask…\n  - `chat_messages`: Read the recent conversation in a discussion room\n  - `chat_rooms`: List discussion rooms that currently have activity\n  - `chat_send`: Say something in a discussion room, as the caller. Use chat_rooms to find the room id\n  - `chat_source`: Read one stored message owned by the caller, by id\n  - `chat_sources`: List stored message ids owned by the caller\n  - `contacts_add`: Save someone to the address book. Adding a name already there updates it rather than making a second card\n  - `contacts_delete`: Remove someone from the address book\n  - `contacts_find` (read-only): Look someone up in the address book by name, part of a name, or address. Use this before sending mail to a person named rather than addressed\n  - `contacts_list` (read-only): List everyone in the caller's address book\n  - `docs_delete`: Delete one of your documents, by id\n  - `docs_list` (read-only): List your documents, most recently changed first, with an optional search over titles and bodies. Use this to find an id\n  - `docs_read` (read-only): Read one of your documents in full, by id or by exact title\n  - `docs_write`: Write a document — a title and a markdown body. Pass an id to replace one you already have. Private unless you set public. For something long enough to…\n  - `events_create`: Schedule a reminder or event at a given time; optionally repeating, and optionally running a prompt through the agent when it fires\n  - `events_delete`: Cancel an event by id\n  - `events_free` (read-only): Find when the caller has nothing booked — open slots of a given length, within working hours\n  - `events_list` (read-only): List the caller's upcoming events and reminders, each with its id\n  - `events_read` (read-only): Read one schedule owned by the caller\n  - `events_update`: Update one of your scheduled events without changing its id. Omitted fields stay unchanged; empty notes, prompts or recurrence clear them\n  - `files_delete`: Delete a file you own\n  - `files_driveread`: Read the caller's connected Google Drive. Read-only; connect in Account first.\n  - `files_drivesearch`: Search the caller's connected Google Drive. Read-only; connect in Account first.\n  - `files_get` (read-only): Read a stored file back by its id\n  - `files_list` (read-only): List the caller's stored files, newest first\n  - `files_put`: Store a file and get a URL for it — a report, a CSV, a transcript\n  - `files_share`: Make a file readable by anyone with its URL, or private again\n  - `flights_airport`: Report what is happening at an airport right now: what is on the ground, what is on approach and what is climbing out. Live positions, not the timetable, so it…\n  - `flights_overhead`: List the aircraft flying near a location right now, nearest first, with altitude, speed, heading and distance. Live positions broadcast by the aircraft…\n  - `flights_status`: Scheduled, estimated and actual flight arrival/departure times from Aviationstack. Requires a configured provider.\n  - `flights_track`: Find where an aircraft is right now by flight number ('BA117'), radio callsign ('BAW117') or registration ('G-ZBKL'). Only sees aeroplanes that are airborne…\n  - `food_hygiene`: Food hygiene ratings for UK businesses, from the Food Standards Agency inspections. Takes a business name, a town or postcode, or a lat/lon to look around\n  - `food_product`: Look up a packaged food by its barcode — name, brand, ingredients, allergens, nutrition per 100g, Nutri-Score and how processed it is\n  - `food_search` (read-only): Find packaged foods by name or brand, with the barcode of each so one can then be looked up in full\n  - `groups_create`: Create a private group\n  - `groups_list` (read-only): List your groups and pending invitations\n  - `groups_read` (read-only): Read a group you belong to and open its chat\n  - `groups_update`: Manage invitations, membership and roles. Accept invitations before accessing a group. Removing yourself leaves; owners must transfer ownership first. Delete…\n  - `hazards_alerts`: Current disasters worldwide from GDACS — cyclones, floods, volcanoes, wildfires and earthquakes — with an alert level of green, orange or red. Pass lat/lon to…\n  - `hazards_floods`: Flood warnings and alerts in force in England, most severe first, from the Environment Agency. The one hazard here that is a forecast rather than a record — a…\n  - `hazards_quakes`: Recent earthquakes worldwide from the USGS, with magnitude, place and how long ago. Pass lat/lon to ask about somewhere in particular, min for a magnitude…\n  - `images_daily`: Retrieve the current daily image or a date\n  - `images_delete`: Delete an image you own\n  - `images_generate`: Generate an image from a text prompt and return its URL\n  - `images_get` (read-only): Retrieve accessible image metadata and URL\n  - `images_list` (read-only): List stored images or the daily archive with pagination\n  - `images_search` (read-only): Search accessible stored images by title, description, prompt and tags; public by default\n  - `images_share`: Explicitly publish or unpublish your image\n  - `images_update`: Edit metadata on an image you own\n  - `images_upload`: Upload a private raster image\n  - `islam_read` (read-only): Read the full Islamic source passage from an islam_search result, with its source and reference. Preserve distinctions between original text, translation and…\n  - `islam_search` (read-only): Search Aslam.org's Quran, hadith, names of Allah, Seerah, Ghazali, IslamQA, adhkar and Riyad us-Salihin. Returns reference excerpts, not generated answers.…\n  - `mail_gmailread`: Read the caller's connected Gmail. Read-only; connect in Account first.\n  - `mail_gmailsearch`: Search the caller's connected Gmail. Read-only; connect in Account first.\n  - `mail_inbox` (read-only): List the account's most recent messages — read my mail, check my inbox\n  - `mail_info`: How to reach the caller here: the handle, the email address if this instance has a mail domain, and whether mail from outside can arrive at all. Pass a tag for…\n  - `mail_markread`: Mark specified inbox message IDs, or explicitly all current inbox messages, as read. Changes read status only; does not read, summarize or triage the content.\n  - `mail_read` (read-only): Read your correspondence by id in bounded body-character pages, including attachment names. Follow the returned next offset for the rest. Omitting id retains…\n  - `mail_search` (read-only): Search the account's mail and return matching messages\n  - `mail_send`: Write to somebody, as you. A username reaches them on this instance and is free; a full email address leaves over SMTP under this instance's domain, so a reply…\n  - `mail_source`: Read one stored message owned by the caller, by id\n  - `mail_sources`: List stored message ids owned by the caller\n  - `maps_area`: Every tile covering a bounding box at a zoom level, as URLs, row by row from the north-west, and how many are already held. What to ask for when you want the…\n  - `maps_tile`: The URL for one map tile, by zoom, column and row. Styles: road, outdoor (rights of way and contours), light (a quiet basemap to draw on). Free. Britain only\n  - `markets_convert`: Convert an amount from one currency to another — 250 GBP in JPY. Uses European Central Bank reference rates, and takes a past date back to 1999. Crypto…\n  - `markets_history`: Read daily closing prices for a supported instrument over a range of up to 366 days. Missing trading days are omitted. Uses Yahoo Finance\n  - `markets_list` (read-only): Get live prices for cryptocurrencies, stocks, commodities (oil, gold, silver, copper and crops), futures and currencies\n  - `markets_quote`: Read one supported instrument price in USD, with source, timestamp and staleness\n  - `news_headlines`: Read the home card headlines: latest story per topic, freshest first, at most ten\n  - `news_list` (read-only): Read recent news headlines with short summaries, balanced across topics\n  - `news_read` (read-only): Read one news article in full by its id or URL\n  - `news_search` (read-only): Search indexed and live news for a topic\n  - `notes_add`: Write a note under a title, so it is there next conversation. Writing a title that exists rewrites that note\n  - `notes_delete`: Delete one note by title\n  - `notes_get` (read-only): Read one note by title. Use it when you know the title; notes_list when you do not\n  - `notes_list` (read-only): List every note the caller has written, with its text\n  - `notify_devices`: Whether this account can be reached by notification at all, and on which devices. Worth asking before promising to tell somebody something\n  - `notify_send`: Interrupt yourself on your own devices — a phone, a laptop — with the page closed. For the thing that cannot wait until the next time somebody looks. An answer…\n  - `places_address` (read-only): Name the place at a latitude and longitude — the reverse of places_geocode. Use it whenever you have coordinates and need to say where that is\n  - `places_elevation`: How high a place is above sea level, in metres and feet. Sampled from a 90-metre global elevation model, so a summit reads a little under its surveyed height\n  - `places_geocode`: Resolve a place name or address to coordinates\n  - `places_nearby` (read-only): List points of interest near a location. Each one says whether it is open right now where that is known, so \"is anything open near me\" is one call\n  - `places_search` (read-only): Find places by name or category, optionally near a location. Each one says whether it is open right now where that is known, rather than raw opening-hours text…\n  - `prayer_qibla` (read-only): Get the qibla — the compass bearing to face for Islamic prayer from a location\n  - `prayer_reflection` (read-only): Get today's Islamic reflection — a verse of the Quran with its surah, a saying of the Prophet, and a name of Allah\n  - `prayer_saying` (read-only): Look up a hadith from Sahih al-Bukhari, optionally from a given book\n  - `prayer_search` (read-only): Search the Quran, the hadith and the names of Allah by meaning — ask a question in plain language rather than naming a reference\n  - `prayer_times` (read-only): Get today's Islamic prayer times (salah) for a location, and which prayer is next\n  - `prayer_verse` (read-only): Look up a chapter of the Quran, or one verse within it, by number. Use prayer_search to ask a question instead of naming a reference\n  - `recall_conversation`: Read one whole conversation back by id, as recall_search and recall_list report it\n  - `recall_list` (read-only): List the caller's conversations, most recently active first, with what each is about and where it happened\n  - `recall_search` (read-only): Search everything the caller has said to an agent and been told, wherever they said it — the browser, email, or the command line. Use it when something was…\n  - `routes_directions`: The turn-by-turn route between two places, with the distance for each instruction. Use ETA instead when only the travel time is wanted — this asks the provider…\n  - `routes_eta` (read-only): How long it takes to travel between two places, by road rather than as the crow flies. Can be asked about a future departure, or told when you need to arrive…\n  - `routes_nearest`: Given a starting point and several destinations, say which is quickest to reach and put them in order. Each destination is a separate routing lookup, so ask…\n  - `shell_run`: Run a shell command in your account's container sandbox and get back what it wrote. A real shell in a container: pipes, redirection and \u0026\u0026 all work, the…\n  - `shell_write`: Put a file in your account's container sandbox, creating any missing directories. The only file operation that is not a shell command, because it is the one a…\n  - `sms_history`: Read the texts this account has sent and received, newest first. Both directions, which is why it is not called an inbox\n  - `sms_number`: The number texts are sent from, which numbers are verified as yours, and how many messages are left today\n  - `sms_send`: Message somebody from this instance's number, by text or on WhatsApp. A text is charged per 160-character segment; WhatsApp is charged per 24-hour conversation…\n  - `sms_source`: Read one stored message owned by the caller, by id\n  - `sms_sources`: List stored message ids owned by the caller\n  - `sms_verify`: Claim a number as your own, so texts arriving from it reach this account. Call it with just the number to have a code texted there, then again with the code\n  - `social_list` (read-only): Read the latest social posts from the network\n  - `social_search` (read-only): Search public posts on this instance by keyword. This is the instance's own feed, not the wider internet — use web_search for that\n  - `stream_list` (read-only): Read what has happened here recently\n  - `tasks_create`: Add a task. Assign it to the agent and it can pick the task up itself\n  - `tasks_delete`: Remove a task\n  - `tasks_list` (read-only): List the caller's tasks, open ones first; optionally filtered by state\n  - `tasks_next`: The next task assigned to the agent — what to work on now\n  - `tasks_read` (read-only): Read one task owned by the caller\n  - `tasks_update`: Change a task: its state, or the result of doing it\n  - `text_classify`: Sort text into one of the labels you give, with a confidence. For routing, triage and moderation. Capped at 30,000 characters\n  - `text_extract`: Turn text into JSON matching a schema you give. Pass the fields you want as a JSON schema or a plain description; returns JSON only. Capped at 30,000 characters\n  - `text_summarise`: Summarise text into a few sentences. Pass style=bullets for a list, or a sentence count. Capped at 30,000 characters\n  - `text_translate`: Translate text into another language, preserving formatting. Capped at 30,000 characters\n  - `transit_arrivals`: What is due at a stop and when. Takes a stop name or an id. In London this is live from TfL — buses, tube, DLR, Overground and Elizabeth line. Elsewhere it is…\n  - `transit_buses`: Where the buses actually are near a point right now — line, where each is heading and how far away, nearest first. England, from the Bus Open Data Service.…\n  - `transit_feeds`: Which published timetables this instance carries, and which others it could — with the size of each, so an operator can see what switching one on costs. Also…\n  - `transit_nearby` (read-only): Bus stops and stations near a point, nearest first, with the id each one is called by. London live from TfL; elsewhere from whichever published timetables this…\n  - `transit_status`: Which lines are delayed, part-suspended or closed right now, and why. London only\n  - `transit_trains`: The live departure or arrival board at a British station, by its three-letter code — KGX, MAN, EDB. Scheduled and expected time, platform, operator and where…\n  - `users_find` (read-only): Look somebody up by username or display name. Use this to turn a name somebody mentioned into an address you can write to\n  - `users_get` (read-only): One user, by username\n  - `users_list` (read-only): Everyone on this instance, online first and then newest. Agents are included and marked; an agent account is a user here like any other\n  - `video_list` (read-only): Read the latest videos from curated channels\n  - `video_read` (read-only): Read the metadata and description of one video already discovered by this instance. No transcript is available\n  - `video_search` (read-only): Search YouTube by keyword using this instance's search quota. Results are not restricted to the curated channels\n  - `wallet_address` (read-only): Your own address on Base, to receive USDC. Created the first time you ask. Funds sent on any other chain land at the same address there and cannot be reached…\n  - `wallet_balance` (read-only): What your wallet holds in USDC on Base. Says so plainly when the chain could not be reached, because that is not the same as holding nothing\n  - `weather_air`: Air quality at a location right now — AQI, PM2.5, PM10, ozone, nitrogen dioxide, UV index, and pollen where it is counted\n  - `weather_forecast` (read-only): Get the weather forecast for a location — current conditions, the days ahead, and today's sunrise, sunset and how much daylight is left, which is the fact that…\n  - `weather_history`: What the weather actually was at a location between two dates — average high and low, total rainfall and the extremes. Records run a few days behind today\n  - `weather_lookup`: Look up the weather by town or city name\n  - `weather_marine`: Sea state at a coastal or offshore point — wave height, period and direction now and for the days ahead, with sea temperature\n  - `web_fetch`: Fetch a web page by URL and return its cleaned readable content, stripping ads, popups and navigation. Needs an account\n  - `web_images`: Search the web for images, thumbnails and original source pages\n  - `web_search` (read-only): Search the web for current information and news\n- How its tools read to an agent (0 errors, 109 warnings, 1 note, about 20,294 tokens; rules at https://www.anchorterminal.com/check.md; not part of the score):\n  - warn TC06 events_delete: the description is \"Cancel an event by id\"\n  - warn TC06 files_delete: the description is \"Delete a file you own\"\n  - warn TC06 groups_create: the description is \"Create a private group\"\n  - warn TC06 images_delete: the description is \"Delete an image you own\"\n  - warn TC06 notes_delete: the description is \"Delete one note by title\"\n  - warn TC06 tasks_delete: the description is \"Remove a task\"\n  - warn TC06 users_get: the description is \"One user, by username\"\n  - warn TC13 events_create: advance (object with no properties)\n  - warn TC13 events_update: advance (object with no properties)\n  - warn TC13 images_update: tags (array with no items)\n  - warn TC13 mail_markread: ids (array with no items)\n  - warn TC13 routes_nearest: to (array with no items)\n  - warn TC16 apps_build: no readOnlyHint or destructiveHint\n  - warn TC16 apps_builds: no readOnlyHint or destructiveHint\n  - warn TC16 apps_buildstatus: no readOnlyHint or destructiveHint\n  - warn TC16 apps_collection: no readOnlyHint or destructiveHint\n  - warn TC16 apps_create: no readOnlyHint or destructiveHint\n  - warn TC16 apps_edit: no readOnlyHint or destructiveHint\n  - warn TC16 apps_embed: no readOnlyHint or destructiveHint\n  - warn TC16 apps_fork: no readOnlyHint or destructiveHint\n  - warn TC16 apps_test: no readOnlyHint or destructiveHint\n  - warn TC16 blog_create: no readOnlyHint or destructiveHint\n  - warn TC16 blog_update: no readOnlyHint or destructiveHint\n  - warn TC16 bookmarks_add: no readOnlyHint or destructiveHint\n\n- JSON: https://www.anchorterminal.com/api/v1/tools/micro-mu.json\n- Being indexed says nothing about quality, and nobody can pay for it. Ask for a review: https://www.anchorterminal.com/builders/#claiming\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-04",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.3",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Terminal",
        "url": "https://www.anchorterminal.com/tools/"
      },
      {
        "name": "Indexed",
        "url": "https://www.anchorterminal.com/indexed/"
      },
      {
        "name": "mu",
        "url": ""
      }
    ],
    "description": "mu, an MCP server by micro.mu, listed from the official MCP registry. Indexed, not reviewed: facts and our own checks, no score or ranking. News, web search, mail, markets, weather, places, files, calendar, contacts. 67 tools, one endpoint.",
    "facts": [
      "not reviewed",
      "not ranked",
      "facts only"
    ],
    "h1": "mu",
    "image": "https://www.anchorterminal.com/assets/og/indexed.png",
    "path": "/tools/micro-mu",
    "published": "",
    "section": "indexed",
    "title": "mu: MCP server, indexed from the official MCP registry",
    "toc": null,
    "updated": "2026-10-04",
    "url": "https://www.anchorterminal.com/tools/micro-mu"
  },
  "tokens": {
    "markdown": 6000,
    "slim": 5930
  },
  "version": 1
}
