{
  "live": {
    "slug": "meteosource-mcp",
    "probe": {
      "target": "https://mcp.meteosource.com/mcp",
      "method": "mcp-initialize",
      "lastAt": "2026-11-09T02:17:01.658659899Z",
      "lastOk": true,
      "lastStatus": 200,
      "lastMs": 169,
      "lastNote": "initialize answered",
      "authRequired": false,
      "uptime24h": 100,
      "uptime30d": 100,
      "p50ms24h": 129,
      "p95ms24h": 213,
      "samples24h": 244,
      "samples30d": 320,
      "days": [
        {
          "date": "2026-11-07",
          "probes": 53,
          "ok": 53
        },
        {
          "date": "2026-11-08",
          "probes": 243,
          "ok": 243
        },
        {
          "date": "2026-11-09",
          "probes": 24,
          "ok": 24
        }
      ],
      "since": "2026-11-07T00:00:00Z"
    },
    "versions": [
      {
        "registry": "github",
        "name": "Meteosource/meteosource-weather-mcp",
        "version": "v0.1.2",
        "released": "2026-10-26",
        "seenAt": "2026-11-08T01:16:11.310565545Z"
      },
      {
        "registry": "mcp-registry",
        "name": "com.meteosource/weather",
        "version": "0.1.2",
        "seenAt": "2026-11-08T18:37:59.431193162Z"
      }
    ],
    "githubStars": 0,
    "securityTxt": {
      "url": "https://meteosource.com/.well-known/security.txt",
      "state": "none",
      "checkedAt": "2026-11-08T16:04:21.775410289Z"
    },
    "domain": {
      "domain": "meteosource.com",
      "registered": "2020-08-21",
      "source": "https://rdap.verisign.com/com/v1/domain/meteosource.com",
      "checkedAt": "2026-11-08T15:06:28.416333949Z"
    },
    "mcpTools": {
      "url": "https://mcp.meteosource.com/mcp",
      "checkedAt": "2026-11-09T02:14:49.686798437Z",
      "status": "ok",
      "protocol": "2026-07-28",
      "tools": [
        {
          "name": "search_places",
          "description": "Find locations and their Meteosource place_id.\n\n    Use this first to resolve city names, postal codes or coordinates into\n    place_id values for the other weather tools. Provide either `query`\n    (place name or postal code) to search, or `lat` + `lon` to find the\n    nearest known place. Returns up to 10 matches ordered by relevance,\n    each with place_id, administrative area, country, coordinates and\n    timezone. Note: lat/lon are returned in degree-letter format\n    (e.g. \"50.08804N\").\n    ",
          "inputSchema": {
            "properties": {
              "language": {
                "default": "en",
                "title": "Language",
                "type": "string"
              },
              "lat": {
                "default": null,
                "maximum": 90,
                "minimum": -90,
                "title": "Lat",
                "type": "number"
              },
              "lon": {
                "default": null,
                "maximum": 180,
                "minimum": -180,
                "title": "Lon",
                "type": "number"
              },
              "query": {
                "default": null,
                "title": "Query",
                "type": "string"
              }
            },
            "title": "search_placesArguments",
            "type": "object"
          }
        },
        {
          "name": "get_forecast",
          "description": "Weather forecast for up to 20 locations in one call.\n\n    Sections (comma-separated): 'current' (now), 'hourly' (up to 168 h ahead,\n    trimmed to `hours`), 'daily' (up to 30 days ahead, trimmed to `days`),\n    'minutely' (precipitation minute-by-minute, higher tiers), 'alerts'\n    (official weather warnings, startup tier and above), or 'all'.\n    Use `variables` to keep only specific fields (e.g. [\"temperature\", \"wind\",\n    \"precipitation\", \"probability\", \"irradiance\"]) and reduce output size —\n    recommended when querying many locations. Timezone defaults to each\n    location's local time; units default per-country ('metric' forces SI).\n    Forecast horizon depends on the subscription tier (free: 7 days).\n\n    Output: time series (hourly, daily, minutely) are tables — `columns`\n    listed once and `rows` as arrays in column order; nested API groups are\n    flattened with underscores (wind_speed, probability_storm,\n    cloud_cover_total). `units` is given once at the top level when it is\n    the same for every location.\n    ",
          "inputSchema": {
            "$defs": {
              "LocationIn": {
                "description": "A single location: either a Meteosource place_id (from search_places)\nor a lat/lon pair. An optional label is echoed back in results.",
                "properties": {
                  "label": {
                    "default": null,
                    "description": "Optional human-readable name echoed in results",
                    "title": "Label",
                    "type": "string"
                  },
                  "lat": {
                    "default": null,
                    "description": "Latitude in decimal degrees",
                    "maximum": 90,
                    "minimum": -90,
                    "title": "Lat",
                    "type": "number"
                  },
                  "lon": {
                    "default": null,
                    "description": "Longitude in decimal degrees",
                    "maximum": 180,
                    "minimum": -180,
                    "title": "Lon",
                    "type": "number"
                  },
                  "place_id": {
                    "default": null,
                    "description": "Meteosource place identifier",
                    "title": "Place Id",
                    "type": "string"
                  }
                },
                "title": "LocationIn",
                "type": "object"
              }
            },
            "properties": {
              "days": {
                "default": 7,
                "title": "Days",
                "type": "integer"
              },
              "hours": {
                "default": 48,
                "title": "Hours",
                "type": "integer"
              },
              "language": {
                "default": "en",
                "title": "Language",
                "type": "string"
              },
              "locations": {
                "items": {
                  "$ref": "#/$defs/LocationIn"
                },
                "title": "Locations",
                "type": "array"
              },
              "sections": {
                "default": "current,daily",
                "title": "Sections",
                "type": "string"
              },
              "timezone": {
                "default": "auto",
                "title": "Timezone",
                "type": "string"
              },
              "units": {
                "default": "auto",
                "title": "Units",
                "type": "string"
              },
              "variables": {
                "default": null,
                "items": {
                  "type": "string"
                },
                "title": "Variables",
                "type": "array"
              }
            },
            "required": [
              "locations"
            ],
            "title": "get_forecastArguments",
            "type": "object"
          }
        },
        {
          "name": "get_alerts",
          "description": "Official weather warnings (severe weather alerts) for up to 20 locations.\n\n    Returns only locations that currently have an active alert, with event\n    type, severity, validity window and headline — an empty list means all\n    clear. Cheap to call frequently; designed for monitoring/polling.\n    Coverage: USA, EU countries and Canada. Requires the startup tier or\n    higher (not available on the free tier).\n    ",
          "inputSchema": {
            "$defs": {
              "LocationIn": {
                "description": "A single location: either a Meteosource place_id (from search_places)\nor a lat/lon pair. An optional label is echoed back in results.",
                "properties": {
                  "label": {
                    "default": null,
                    "description": "Optional human-readable name echoed in results",
                    "title": "Label",
                    "type": "string"
                  },
                  "lat": {
                    "default": null,
                    "description": "Latitude in decimal degrees",
                    "maximum": 90,
                    "minimum": -90,
                    "title": "Lat",
                    "type": "number"
                  },
                  "lon": {
                    "default": null,
                    "description": "Longitude in decimal degrees",
                    "maximum": 180,
                    "minimum": -180,
                    "title": "Lon",
                    "type": "number"
                  },
                  "place_id": {
                    "default": null,
                    "description": "Meteosource place identifier",
                    "title": "Place Id",
                    "type": "string"
                  }
                },
                "title": "LocationIn",
                "type": "object"
              }
            },
            "properties": {
              "language": {
                "default": "en",
                "title": "Language",
                "type": "string"
              },
              "locations": {
                "items": {
                  "$ref": "#/$defs/LocationIn"
                },
                "title": "Locations",
                "type": "array"
              }
            },
            "required": [
              "locations"
            ],
            "title": "get_alertsArguments",
            "type": "object"
          }
        },
        {
          "name": "get_weather_history",
          "description": "Historical weather (archive) with server-side aggregation.\n\n    The archive holds 20 years, but how much of it a key may read depends on\n    its plan: startup includes the last 7 days, standard the last year,\n    premium and flexi all 20 years; byvalue reaches 366 days back and no\n    further. Older days need Meteosource's paid historical add-on (billed per\n    location and day); without it the API refuses such a day with \"not\n    allowed to access historical data this old\", reported per location, so\n    start inside the plan's range. Dates are YYYY-MM-DD, inclusive.\n    Granularity: 'hourly' (raw hours, max 14 days per call), 'daily'\n    (per-day min/max/avg/sum statistics, max 366 days) or 'monthly'\n    (folded from daily, max 366 days per call — call repeatedly for\n    multi-year analyses; results are cached so repeats are cheap).\n    Variables (default: temperature, precipitation, wind): cape, cloud_cover,\n    dew_point, evaporation, feels_like, humidity, irradiance, ozone,\n    precipitation, precipitation_type, pressure, soil_temperature,\n    surface_temperature, temperature, weather, wind, wind_distribution.\n    Aggregations per variable: temperature min/max/avg, precipitation sum,\n    wind speed avg + gusts max, irradiance sum in Wh/m2 (useful for PV\n    analysis), weather = most frequent code of the day, precipitation_types =\n    kinds seen that day (e.g. \"rain,snow\"; \"none\" when dry) — use weather and\n    precipitation_type to document what happened (snow, fog, thunderstorm).\n    wind_distribution (daily/monthly; for wind-turbine siting) = hours per\n    10 m wind-speed bin (wind_hours_0_2 … wind_hours_10_plus) and\n    wind_power_density_w_m2 = 1/2 * 1.225 * mean(v^3) at 10 m — scale to hub\n    height yourself (the API has no hub-height wind).\n    `normals=true` (daily/monthly) adds long-term columns for each calendar\n    day: temperature_normal_avg/min/max, temperature_record_min/max,\n    wind_normal_speed, wind_record_gusts, precipitation_normal_sum and\n    precipitation_normal_probability — compare a period with its normal in\n    one call. Each location+day costs one API request on first fetch;\n    a single call is capped at 400 location-days — split longer ranges\n    into multiple calls. Not available on the free tier (startup+).\n\n    Output: `columns` once at the top level; each location has `rows` as\n    arrays in column order (a year of daily rows is ~15 kB).\n    ",
          "inputSchema": {
            "$defs": {
              "LocationIn": {
                "description": "A single location: either a Meteosource place_id (from search_places)\nor a lat/lon pair. An optional label is echoed back in results.",
                "properties": {
                  "label": {
                    "default": null,
                    "description": "Optional human-readable name echoed in results",
                    "title": "Label",
                    "type": "string"
                  },
                  "lat": {
                    "default": null,
                    "description": "Latitude in decimal degrees",
                    "maximum": 90,
                    "minimum": -90,
                    "title": "Lat",
                    "type": "number"
                  },
                  "lon": {
                    "default": null,
                    "description": "Longitude in decimal degrees",
                    "maximum": 180,
                    "minimum": -180,
                    "title": "Lon",
                    "type": "number"
                  },
                  "place_id": {
                    "default": null,
                    "description": "Meteosource place identifier",
                    "title": "Place Id",
                    "type": "string"
                  }
                },
                "title": "LocationIn",
                "type": "object"
              }
            },
            "properties": {
              "date_from": {
                "title": "Date From",
                "type": "string"
              },
              "date_to": {
                "title": "Date To",
                "type": "string"
              },
              "granularity": {
                "default": "daily",
                "title": "Granularity",
                "type": "string"
              },
              "locations": {
                "items": {
                  "$ref": "#/$defs/LocationIn"
                },
                "title": "Locations",
                "type": "array"
              },
              "normals": {
                "default": false,
                "title": "Normals",
                "type": "boolean"
              },
              "timezone": {
                "default": "auto",
                "title": "Timezone",
                "type": "string"
              },
              "units": {
                "default": "metric",
                "title": "Units",
                "type": "string"
              },
              "variables": {
                "default": null,
                "items": {
                  "type": "string"
                },
                "title": "Variables",
                "type": "array"
              }
            },
            "required": [
              "locations",
              "date_from",
              "date_to"
            ],
            "title": "get_weather_historyArguments",
            "type": "object"
          }
        },
        {
          "name": "get_air_quality",
          "description": "Hourly air-quality (smog) forecast for up to 20 locations, about 4 days ahead.\n\n    Columns: `air_quality` (index, 1 = good, higher = worse) and pollutant\n    surface concentrations — default pm10, pm25, no2_surface, so2_surface,\n    ozone_surface; also available via `variables`: co_surface, no_surface,\n    ozone_total, aerosol_550, dust_550nm, dust_mixing_ratio_05. Output is a\n    table per location (`columns` once, `rows` as arrays), trimmed to `hours`.\n    Not available on the free tier.\n    ",
          "inputSchema": {
            "$defs": {
              "LocationIn": {
                "description": "A single location: either a Meteosource place_id (from search_places)\nor a lat/lon pair. An optional label is echoed back in results.",
                "properties": {
                  "label": {
                    "default": null,
                    "description": "Optional human-readable name echoed in results",
                    "title": "Label",
                    "type": "string"
                  },
                  "lat": {
                    "default": null,
                    "description": "Latitude in decimal degrees",
                    "maximum": 90,
                    "minimum": -90,
                    "title": "Lat",
                    "type": "number"
                  },
                  "lon": {
                    "default": null,
                    "description": "Longitude in decimal degrees",
                    "maximum": 180,
                    "minimum": -180,
                    "title": "Lon",
                    "type": "number"
                  },
                  "place_id": {
                    "default": null,
                    "description": "Meteosource place identifier",
                    "title": "Place Id",
                    "type": "string"
                  }
                },
                "title": "LocationIn",
                "type": "object"
              }
            },
            "properties": {
              "hours": {
                "default": 48,
                "title": "Hours",
                "type": "integer"
              },
              "locations": {
                "items": {
                  "$ref": "#/$defs/LocationIn"
                },
                "title": "Locations",
                "type": "array"
              },
              "timezone": {
                "default": "auto",
                "title": "Timezone",
                "type": "string"
              },
              "variables": {
                "default": null,
                "items": {
                  "type": "string"
                },
                "title": "Variables",
                "type": "array"
              }
            },
            "required": [
              "locations"
            ],
            "title": "get_air_qualityArguments",
            "type": "object"
          }
        },
        {
          "name": "get_solar_production",
          "description": "Production of photovoltaic systems, past and forecast, for up to 20 sites.\n\n    Each site is lat + lon plus the installation: module_kw (installed kWp;\n    use 1 to get specific yield per kWp), inverter_kw (defaults to module_kw),\n    tilt (degrees from horizontal, default 30) and orientation (azimuth the\n    modules face, clockwise from north: 180 = south, the default). Dates are\n    YYYY-MM-DD, inclusive, from up to 20 years back to 4 days ahead, so one\n    call can cover last week's actual weather and the coming days. The\n    renewables plan includes the last 3 years; older days need the paid\n    historical add-on, otherwise the API refuses them (\"historical data this\n    old\"), reported per site.\n    Granularity: 'hourly' (power at each full hour, max 14 days per call),\n    'daily' or 'monthly' (energy, max 366 days per call — call repeatedly for\n    multi-year yield; past days are cached so repeats are cheap).\n    Columns: production_kw = output of the system at that hour (an\n    instantaneous value); production_kwh = energy of the day or month, summed\n    from those hourly values; production_max_kw = its peak.\n    `variables` adds the weather behind the production: irradiance (ghi, dni,\n    dhi in W/m2 hourly; ghi/dni/dhi_sum_wh_m2 daily and monthly), temperature,\n    cloud_cover, humidity, dew_point, pressure, snowfall (flag per hour;\n    snowfall_hours daily and monthly).\n    Each site+day costs one API request on first fetch; a single call is\n    capped at 400 site-days — split longer ranges into multiple calls.\n    Needs a key on the renewables tier.\n\n    Output: `columns` once at the top level; each site has `rows` as arrays\n    in column order.\n    ",
          "inputSchema": {
            "$defs": {
              "SolarSiteIn": {
                "description": "A photovoltaic installation: where it stands and how it is built.\nThe defaults of tilt and orientation are the API's own; they are always\nsent, so a cached day can never depend on a default the API changed.",
                "properties": {
                  "inverter_kw": {
                    "default": null,
                    "description": "Inverter power in kW; defaults to module_kw",
                    "exclusiveMinimum": 0,
                    "title": "Inverter Kw",
                    "type": "number"
                  },
                  "label": {
                    "default": null,
                    "description": "Optional human-readable name echoed in results",
                    "title": "Label",
                    "type": "string"
                  },
                  "lat": {
                    "description": "Latitude in decimal degrees",
                    "maximum": 90,
                    "minimum": -90,
                    "title": "Lat",
                    "type": "number"
                  },
                  "lon": {
                    "description": "Longitude in decimal degrees",
                    "maximum": 180,
                    "minimum": -180,
                    "title": "Lon",
                    "type": "number"
                  },
                  "module_kw": {
                    "description": "Installed module power in kW (kWp); use 1 for specific yield per kWp",
                    "exclusiveMinimum": 0,
                    "title": "Module Kw",
                    "type": "number"
                  },
                  "orientation": {
                    "default": 180,
                    "description": "Azimuth the modules face, in degrees clockwise from north: 90 = east, 180 = south, 270 = west",
                    "maximum": 360,
                    "minimum": 0,
                    "title": "Orientation",
                    "type": "integer"
                  },
                  "tilt": {
                    "default": 30,
                    "description": "Tilt of the modules from horizontal in degrees: 0 = flat, 90 = vertical",
                    "maximum": 90,
                    "minimum": 0,
                    "title": "Tilt",
                    "type": "integer"
                  }
                },
                "required": [
                  "lat",
                  "lon",
                  "module_kw"
                ],
                "title": "SolarSiteIn",
                "type": "object"
              }
            },
            "properties": {
              "date_from": {
                "title": "Date From",
                "type": "string"
              },
              "date_to": {
                "title": "Date To",
                "type": "string"
              },
              "granularity": {
                "default": "daily",
                "title": "Granularity",
                "type": "string"
              },
              "sites": {
                "items": {
                  "$ref": "#/$defs/SolarSiteIn"
                },
                "title": "Sites",
                "type": "array"
              },
              "timezone": {
                "default": "auto",
                "title": "Timezone",
                "type": "string"
              },
              "units": {
                "default": "metric",
                "title": "Units",
                "type": "string"
              },
              "variables": {
                "default": null,
                "items": {
                  "type": "string"
                },
                "title": "Variables",
                "type": "array"
              }
            },
            "required": [
              "sites",
              "date_from",
              "date_to"
            ],
            "title": "get_solar_productionArguments",
            "type": "object"
          }
        },
        {
          "name": "get_wind_production",
          "description": "Production of wind farms, past and forecast, for up to 20 sites.\n\n    Each site is lat + lon plus the farm: turbine_model (catalogue below),\n    exactly one of turbine_count or total_capacity (MW), hub_height (metres,\n    default 100) and roughness of the surrounding terrain (water, open,\n    farmland — the default, suburban, urban). Dates are YYYY-MM-DD, inclusive,\n    from up to 20 years back to 4 days ahead, so one call can cover last\n    week's actual weather and the coming days. The renewables plan includes\n    the last 3 years; older days need the paid historical add-on, otherwise\n    the API refuses them (\"historical data this old\"), reported per site.\n    Granularity: 'hourly' (power at each full hour, max 14 days per call),\n    'daily' or 'monthly' (energy, max 366 days per call — call repeatedly for\n    multi-year yield; past days are cached so repeats are cheap).\n    Columns: production_mw = output of the whole farm at that hour (an\n    instantaneous value); production_mwh = energy of the day or month, summed\n    from those hourly values; production_max_mw = its peak.\n    `variables` adds the weather behind the production: wind (10 m above\n    ground, not hub height: wind_10m_speed, wind_10m_gusts and wind_10m_angle\n    hourly; speed avg/max and gusts max daily and monthly), temperature,\n    dew_point, pressure.\n    Turbine catalogue (series + rotor diameter in m / rated power in kW):\n    Adwen AD116/5000; Enercon E48/800, E-53/800, E-70/2000, E-70/2300,\n    E-82/2000, E-82/2300, E-82/2350, E-82/3000, E-92/2350, E-101/3050,\n    E-101/3500, E-115/3000, E-115/3200, E-126/4200, E-126/7500, E-126/7580,\n    E-141/4200; Eno ENO100/2200, ENO114/3500, ENO126/3500; GE GE100/2500,\n    GE103/2750, GE120/2500, GE120/2750, GE130/3200; Nordex N90/2500,\n    N100/2500, N117/2400, N131/3000, N131/3300, N131/3600; Senvion MM92/2050,\n    MM100/2000, S104/3400, S114/3200, S114/3400, S122/3000, S122/3200,\n    S126/6150, S152/6330; aerodyn SCD168/8000; Siemens SWT113/2300,\n    SWT113/3200, SWT120/3600 (the default), SWT130/3300, SWT130/3600,\n    SWT142/3150; Vestas V80/2000, V90/2000, V90/2000/GS, V90/3000, V100/1800,\n    V100/1800/GS, V112/3000, V112/3075, V112/3300, V112/3450, V117/3300,\n    V117/3450, V117/3600, V126/3000, V126/3300, V126/3450, V164/8000,\n    V164/9500; Vensys VS112/2500.\n    Each site+day costs one API request on first fetch; a single call is\n    capped at 400 site-days — split longer ranges into multiple calls.\n    Needs a key on the renewables tier.\n\n    Output: `columns` once at the top level; each site has `rows` as arrays\n    in column order.\n    ",
          "inputSchema": {
            "$defs": {
              "WindSiteIn": {
                "description": "A wind farm: where it stands and which turbines it runs. The farm's\nsize is either a number of turbines or a total capacity, never both (the\nAPI takes exactly one). Defaults are the API's own and are always sent,\nfor the same reason as on SolarSiteIn.",
                "properties": {
                  "hub_height": {
                    "default": 100,
                    "description": "Hub height in metres",
                    "exclusiveMinimum": 0,
                    "title": "Hub Height",
                    "type": "integer"
                  },
                  "label": {
                    "default": null,
                    "description": "Optional human-readable name echoed in results",
                    "title": "Label",
                    "type": "string"
                  },
                  "lat": {
                    "description": "Latitude in decimal degrees",
                    "maximum": 90,
                    "minimum": -90,
                    "title": "Lat",
                    "type": "number"
                  },
                  "lon": {
                    "description": "Longitude in decimal degrees",
                    "maximum": 180,
                    "minimum": -180,
                    "title": "Lon",
                    "type": "number"
                  },
                  "roughness": {
                    "default": "farmland",
                    "description": "Terrain around the site",
                    "enum": [
                      "water",
                      "open",
                      "farmland",
                      "suburban",
                      "urban"
                    ],
                    "title": "Roughness",
                    "type": "string"
                  },
                  "total_capacity": {
                    "default": null,
                    "description": "Total capacity of the farm in MW; give this or turbine_count, not both",
                    "exclusiveMinimum": 0,
                    "title": "Total Capacity",
                    "type": "number"
                  },
                  "turbine_count": {
                    "default": null,
                    "description": "Number of turbines; give this or total_capacity, not both",
                    "minimum": 1,
                    "title": "Turbine Count",
                    "type": "integer"
                  },
                  "turbine_model": {
                    "default": "SWT120/3600",
                    "description": "Turbine model from the catalogue in the tool description",
                    "title": "Turbine Model",
                    "type": "string"
                  }
                },
                "required": [
                  "lat",
                  "lon"
                ],
                "title": "WindSiteIn",
                "type": "object"
              }
            },
            "properties": {
              "date_from": {
                "title": "Date From",
                "type": "string"
              },
              "date_to": {
                "title": "Date To",
                "type": "string"
              },
              "granularity": {
                "default": "daily",
                "title": "Granularity",
                "type": "string"
              },
              "sites": {
                "items": {
                  "$ref": "#/$defs/WindSiteIn"
                },
                "title": "Sites",
                "type": "array"
              },
              "timezone": {
                "default": "auto",
                "title": "Timezone",
                "type": "string"
              },
              "units": {
                "default": "metric",
                "title": "Units",
                "type": "string"
              },
              "variables": {
                "default": null,
                "items": {
                  "type": "string"
                },
                "title": "Variables",
                "type": "array"
              }
            },
            "required": [
              "sites",
              "date_from",
              "date_to"
            ],
            "title": "get_wind_productionArguments",
            "type": "object"
          }
        }
      ],
      "schemaTokens": 4735,
      "changedAt": "2026-11-08T02:00:00.39940184Z",
      "check": {
        "checker": "anchor-check/1.0",
        "totalTokens": 4735,
        "counts": {
          "error": 0,
          "note": 2,
          "warn": 22
        },
        "findings": [
          {
            "rule": "TC07",
            "severity": "warn",
            "tool": "get_weather_history",
            "message": "the description is about 607 tokens",
            "fix": "Keep the description to what a model needs to choose and call the tool; move the manual to a resource or the docs."
          },
          {
            "rule": "TC07",
            "severity": "warn",
            "tool": "get_wind_production",
            "message": "the description is about 653 tokens",
            "fix": "Keep the description to what a model needs to choose and call the tool; move the manual to a resource or the docs."
          },
          {
            "rule": "TC11",
            "severity": "warn",
            "tool": "get_air_quality",
            "message": "none of its 4 parameters has a description",
            "fix": "Describe each one: format, units, an example, and what happens when it's left out."
          },
          {
            "rule": "TC11",
            "severity": "warn",
            "tool": "get_alerts",
            "message": "none of its 2 parameters has a description",
            "fix": "Describe each one: format, units, an example, and what happens when it's left out."
          },
          {
            "rule": "TC11",
            "severity": "warn",
            "tool": "get_forecast",
            "message": "none of its 8 parameters has a description",
            "fix": "Describe each one: format, units, an example, and what happens when it's left out."
          },
          {
            "rule": "TC11",
            "severity": "warn",
            "tool": "get_solar_production",
            "message": "none of its 7 parameters has a description",
            "fix": "Describe each one: format, units, an example, and what happens when it's left out."
          },
          {
            "rule": "TC11",
            "severity": "warn",
            "tool": "get_weather_history",
            "message": "none of its 8 parameters has a description",
            "fix": "Describe each one: format, units, an example, and what happens when it's left out."
          },
          {
            "rule": "TC11",
            "severity": "warn",
            "tool": "get_wind_production",
            "message": "none of its 7 parameters has a description",
            "fix": "Describe each one: format, units, an example, and what happens when it's left out."
          },
          {
            "rule": "TC11",
            "severity": "warn",
            "tool": "search_places",
            "message": "none of its 4 parameters has a description",
            "fix": "Describe each one: format, units, an example, and what happens when it's left out."
          },
          {
            "rule": "TC15",
            "severity": "warn",
            "tool": "get_air_quality",
            "message": "inputSchema uses $ref/$defs",
            "fix": "Inline the referenced schemas. Pydantic and zod-to-json-schema emit $defs for nested models; most can be told not to."
          },
          {
            "rule": "TC15",
            "severity": "warn",
            "tool": "get_alerts",
            "message": "inputSchema uses $ref/$defs",
            "fix": "Inline the referenced schemas. Pydantic and zod-to-json-schema emit $defs for nested models; most can be told not to."
          },
          {
            "rule": "TC15",
            "severity": "warn",
            "tool": "get_forecast",
            "message": "inputSchema uses $ref/$defs",
            "fix": "Inline the referenced schemas. Pydantic and zod-to-json-schema emit $defs for nested models; most can be told not to."
          },
          {
            "rule": "TC15",
            "severity": "warn",
            "tool": "get_solar_production",
            "message": "inputSchema uses $ref/$defs",
            "fix": "Inline the referenced schemas. Pydantic and zod-to-json-schema emit $defs for nested models; most can be told not to."
          },
          {
            "rule": "TC15",
            "severity": "warn",
            "tool": "get_weather_history",
            "message": "inputSchema uses $ref/$defs",
            "fix": "Inline the referenced schemas. Pydantic and zod-to-json-schema emit $defs for nested models; most can be told not to."
          },
          {
            "rule": "TC15",
            "severity": "warn",
            "tool": "get_wind_production",
            "message": "inputSchema uses $ref/$defs",
            "fix": "Inline the referenced schemas. Pydantic and zod-to-json-schema emit $defs for nested models; most can be told not to."
          },
          {
            "rule": "TC16",
            "severity": "warn",
            "tool": "get_air_quality",
            "message": "no readOnlyHint or destructiveHint",
            "fix": "Its name starts with \"get\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
          },
          {
            "rule": "TC16",
            "severity": "warn",
            "tool": "get_alerts",
            "message": "no readOnlyHint or destructiveHint",
            "fix": "Its name starts with \"get\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
          },
          {
            "rule": "TC16",
            "severity": "warn",
            "tool": "get_forecast",
            "message": "no readOnlyHint or destructiveHint",
            "fix": "Its name starts with \"get\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
          },
          {
            "rule": "TC16",
            "severity": "warn",
            "tool": "get_solar_production",
            "message": "no readOnlyHint or destructiveHint",
            "fix": "Its name starts with \"get\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
          },
          {
            "rule": "TC16",
            "severity": "warn",
            "tool": "get_weather_history",
            "message": "no readOnlyHint or destructiveHint",
            "fix": "Its name starts with \"get\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
          },
          {
            "rule": "TC16",
            "severity": "warn",
            "tool": "get_wind_production",
            "message": "no readOnlyHint or destructiveHint",
            "fix": "Its name starts with \"get\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
          },
          {
            "rule": "TC16",
            "severity": "warn",
            "tool": "search_places",
            "message": "no readOnlyHint or destructiveHint",
            "fix": "Its name starts with \"search\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
          },
          {
            "rule": "TC24",
            "severity": "note",
            "message": "7 of 7 tools have no outputSchema",
            "fix": "Declare outputSchema for tools that return structured data, and return structuredContent that matches it."
          },
          {
            "rule": "TC29",
            "severity": "note",
            "message": "about 399 tokens (8% of the definitions) are titles that repeat property or function names",
            "fix": "Strip \"title\" keys that only restate a name before listing tools."
          }
        ]
      }
    },
    "updatedAt": "2026-11-09T02:17:01.658659899Z"
  },
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "attributionRequired": true,
    "credit": "CC BY 4.0, credit Anchor Terminal and link the page or API address you took it from (https://www.anchorterminal.com/terms/#data)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-11-09",
    "license": "CC-BY-4.0",
    "live": true,
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.7",
    "note": "Live from anchor-server.",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run",
    "snapshotAt": "2026-11-09T02:18:19Z",
    "terms": "https://www.anchorterminal.com/terms/#data"
  },
  "slug": "meteosource-mcp"
}
