{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-06T02:11:45.648Z","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp","markdownUrl":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp.md","server":{"slug":"chenweilie-cleanairdata","name":"CleanAirData","registryName":"io.github.chenweilie/cleanairdata","description":"Historical PM2.5 and Clean Air Score for US cities; copied records name their source city.","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"api-mcp","type":"remote","identifier":"https://cleanairdata.org/api/mcp","withdrawn":false,"url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp","version":"0.1.0","transport":null,"scoredAt":"2026-11-05T09:20:43.815Z"},"score":{"total":35,"tier":"low","status":"scored","weekDelta":0,"history":[{"date":"2026-11-05","total":35},{"date":"2026-11-04","total":35},{"date":"2026-11-03","total":35},{"date":"2026-11-02","total":35},{"date":"2026-11-01","total":35},{"date":"2026-10-31","total":35},{"date":"2026-10-30","total":35},{"date":"2026-10-29","total":35},{"date":"2026-10-28","total":75},{"date":"2026-10-27","total":74},{"date":"2026-10-26","total":74},{"date":"2026-10-25","total":73},{"date":"2026-10-24","total":73},{"date":"2026-10-23","total":72},{"date":"2026-10-22","total":72},{"date":"2026-10-21","total":71},{"date":"2026-10-20","total":71},{"date":"2026-10-19","total":71},{"date":"2026-10-18","total":70},{"date":"2026-10-17","total":70},{"date":"2026-10-16","total":25}]},"categories":[{"name":"Endpoint Security","score":63,"verdict":"fail","reasons":["The endpoint's TLS certificate is valid, in date, and uses a strong key.","Authorisation not fully verified: no authorisation is required to connect, but we couldn't read the whole tool list to see what that exposes.","HTTPS is enforced; there's no plaintext access path.","The HSTS (Strict-Transport-Security) header is present.","DNSSEC check failed: this domain isn't protected by DNSSEC."],"codes":[{"code":"tls.valid","args":{}},{"code":"auth.none_unlisted","args":{}},{"code":"https.enforced","args":{}},{"code":"headers.hsts_present","args":{}},{"code":"dnssec.absent","args":{}}]},{"name":"Transport & Reachability","score":100,"verdict":"pass","reasons":["Verified streamable-http transport via a live MCP handshake."],"codes":[{"code":"transport.verified","args":{"transport":"streamable-http"}}]},{"name":"Schema Quality & AI Usability","score":0,"verdict":"unverified","reasons":["Schema blocked by authentication: the endpoint requires auth we don't have to read it."],"codes":[{"code":"schema.auth_gated","args":{}}]},{"name":"Stability & Change Management","score":0,"verdict":"unverified","reasons":["Stability not yet verified: not enough scan history yet (needs a 30-day window)."],"codes":[{"code":"stability.insufficient_history","args":{}}]},{"name":"Tool Coverage","score":0,"verdict":"unverified","reasons":["Tool coverage blocked by authentication: the endpoint requires auth we don't have to read its tools."],"codes":[{"code":"toolquality.auth_gated","args":{}}]},{"name":"Tool Safety","score":0,"verdict":"unverified","reasons":["Tool safety blocked by authentication: the endpoint requires auth we don't have to read its tools."],"codes":[{"code":"toolsafety.auth_gated","args":{}}]},{"name":"Capabilities","score":0,"verdict":"unverified","reasons":["Capabilities blocked by authentication: the endpoint requires auth we don't have to read them."],"codes":[{"code":"cap.auth_gated","args":{}}]}],"inconclusive":["Authorisation not fully verified: no authorisation is required to connect, but we couldn't read the whole tool list to see what that exposes.","Schema blocked by authentication: the endpoint requires auth we don't have to read it.","Stability not yet verified: not enough scan history yet (needs a 30-day window).","Tool coverage blocked by authentication: the endpoint requires auth we don't have to read its tools.","Tool safety blocked by authentication: the endpoint requires auth we don't have to read its tools.","Capabilities blocked by authentication: the endpoint requires auth we don't have to read them."],"malware":[],"components":[{"slug":"api-mcp","type":"remote","identifier":"https://cleanairdata.org/api/mcp","withdrawn":false,"score":35,"current":true,"url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp","markdownUrl":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp.md"}],"facts":[{"label":"Endpoint","value":"https://cleanairdata.org/api/mcp"},{"label":"Transports","value":"streamable-http"},{"label":"Auth","value":"none"},{"label":"Version","value":"0.1.0"}],"install":{"available":true,"bundleSha256":null},"tools":[{"name":"get_city_air_quality","title":"Get city air quality record","description":"Historical Clean Air Score, grade, latest annual PM2.5 mean, unhealthy-day share, trend and yearly PM2.5 for one US city. Each city is either an own_record (scored from its own data) or a copied_record (the full record of the nearest scored city, named in source_city, source_state and source_distance_miles). A copied_record describes the source city, not measurements taken in the named city. Values are historical annual data, not the current AQI.","inputs":[{"name":"city","type":"string","required":true,"description":"City name, for example \"Phoenix\"."},{"name":"state","type":"string","required":true,"description":"Two-letter state code, for example \"AZ\"."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":141},{"name":"compare_cities","title":"Compare two cities","description":"Side-by-side historical records for two US cities with the difference in Clean Air Score and PM2.5. Warnings list any copied record. Each city is either an own_record (scored from its own data) or a copied_record (the full record of the nearest scored city, named in source_city, source_state and source_distance_miles). A copied_record describes the source city, not measurements taken in the named city. Values are historical annual data, not the current AQI.","inputs":[{"name":"city_a","type":"string","required":true,"description":null},{"name":"city_b","type":"string","required":true,"description":null},{"name":"state_a","type":"string","required":true,"description":"Two-letter state code."},{"name":"state_b","type":"string","required":true,"description":"Two-letter state code."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":148},{"name":"rank_cities","title":"Rank cities by Clean Air Score","description":"Cities with the highest Clean Air Score (cleanest first), optionally within one state. By default only cities with their own record are ranked, so copied records do not crowd the list. Each city is either an own_record (scored from its own data) or a copied_record (the full record of the nearest scored city, named in source_city, source_state and source_distance_miles). A copied_record describes the source city, not measurements taken in the named city. Values are historical annual data, not the current AQI.","inputs":[{"name":"limit","type":"integer","required":false,"description":"Number of cities, default 10, maximum 25."},{"name":"own_records_only","type":"boolean","required":false,"description":"Default true. Set false to include copied records."},{"name":"state","type":"string","required":false,"description":"Optional two-letter state code."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":164}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-05T09:20:43.000Z","track":"remote","endpoint":"https://cleanairdata.org/api/mcp","declaredUrl":null,"truncated":false,"tls":{"outcome":"valid","label":"Valid","version":"TLS 1.3","cipherSuite":"TLS_AES_128_GCM_SHA256","chainError":null,"certificates":[{"subject":"CN=cleanairdata.org","issuer":"CN=WE1,O=Google Trust Services,C=US","notBefore":"2026-10-08T17:11:43Z","notAfter":"2027-01-06T18:11:40Z","keyType":"ECDSA","keyBits":256,"isCa":false},{"subject":"CN=WE1,O=Google Trust Services,C=US","issuer":"CN=GTS Root R4,O=Google Trust Services LLC,C=US","notBefore":"2023-12-13T09:00:00Z","notAfter":"2029-02-20T14:00:00Z","keyType":"ECDSA","keyBits":256,"isCa":true},{"subject":"CN=GTS Root R4,O=Google Trust Services LLC,C=US","issuer":"CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE","notBefore":"2023-11-15T03:43:21Z","notAfter":"2028-01-28T00:00:42Z","keyType":"ECDSA","keyBits":384,"isCa":true}]},"dnssec":{"result":"insecure","label":"Not signed","name":"cleanairdata.org.","steps":[{"zone":".","outcome":"verified","label":"Verified"},{"zone":"org.","outcome":"verified","label":"Verified"},{"zone":"cleanairdata.org.","outcome":"insecure_proven","label":"Unsigned (proven)"}]},"auth":{"outcome":"none","label":"No authorisation required","gate":null,"gateLabel":null,"status":200,"authorizationServers":[]},"httpsRedirect":{"outcome":"https_enforced","label":"HTTPS enforced","status":301},"transports":[{"transport":"streamable-http","outcome":"verified","label":"Verified","status":200,"followed":false}],"provenance":null,"installScripts":[],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":null},"mismatches":[],"changelog":{"trackingSince":"2026-10-16","recent":[{"id":"chg_01a186f1-4fe9-7b1e-95e5-dde84afef5ee","kind":"check.unverifiable","summary":"Stability (0.37 → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-10-29","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp#chg-chg_01a186f1-4fe9-7b1e-95e5-dde84afef5ee"},{"id":"chg_01a186f1-4fea-78a1-8e26-5795593ee6a6","kind":"check.unverifiable","summary":"Tool safety (pass → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-10-29","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp#chg-chg_01a186f1-4fea-78a1-8e26-5795593ee6a6"},{"id":"chg_01a186f1-4fea-7e09-bb8c-1b1580381c6e","kind":"check.unverifiable","summary":"Authorization (partial → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-10-29","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp#chg-chg_01a186f1-4fea-7e09-bb8c-1b1580381c6e"},{"id":"chg_01a186f1-4feb-7368-bcb7-166dd02de802","kind":"check.unverifiable","summary":"Capabilities (fail → unverified)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-10-29","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp#chg-chg_01a186f1-4feb-7368-bcb7-166dd02de802"},{"id":"chg_01a186f1-4feb-780b-9e89-22862454f659","kind":"check.unverifiable","summary":"Tool coverage (100 → unverified)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-10-29","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp#chg-chg_01a186f1-4feb-780b-9e89-22862454f659"},{"id":"chg_01a186f1-4feb-7d87-b80c-289ab474f8fb","kind":"check.reason","summary":"Schema quality (Schema blocked by authentication: the endpoint requires auth we don't have to read it.)","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-29","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp#chg-chg_01a186f1-4feb-7d87-b80c-289ab474f8fb"},{"id":"chg_01a186f1-4fec-733e-b209-f737e8873d6f","kind":"capture.status_changed","summary":"Endpoint reachability (reachable → behind authorisation)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-10-29","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp#chg-chg_01a186f1-4fec-733e-b209-f737e8873d6f"},{"id":"chg_01a186f1-4fec-7de4-9940-211e06d77c8c","kind":"score.total_changed","summary":"Trust score (75 → 35)","materiality":"functional","direction":"regression","scoreDelta":-40,"occurredOn":"2026-10-29","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp#chg-chg_01a186f1-4fec-7de4-9940-211e06d77c8c"},{"id":"chg_01a181c8-5c81-78eb-b818-5f62a8c33ad3","kind":"score.total_changed","summary":"Trust score (74 → 75)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-28","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp#chg-chg_01a181c8-5c81-78eb-b818-5f62a8c33ad3"},{"id":"chg_01a17779-dad6-7223-b44e-b9da79caae30","kind":"score.total_changed","summary":"Trust score (73 → 74)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-26","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp#chg-chg_01a17779-dad6-7223-b44e-b9da79caae30"},{"id":"chg_01a16d2d-9306-7974-bead-aa9b5b12dfd3","kind":"score.total_changed","summary":"Trust score (72 → 73)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-24","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp#chg-chg_01a16d2d-9306-7974-bead-aa9b5b12dfd3"},{"id":"chg_01a162df-d0bd-7bba-a1ce-e109c122a265","kind":"score.total_changed","summary":"Trust score (71 → 72)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-22","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp#chg-chg_01a162df-d0bd-7bba-a1ce-e109c122a265"},{"id":"chg_01a1536b-ec09-7baa-a1b9-873bcd48b3ef","kind":"score.total_changed","summary":"Trust score (70 → 71)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-19","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp#chg-chg_01a1536b-ec09-7baa-a1b9-873bcd48b3ef"},{"id":"chg_01a14e47-994d-70fe-b10a-8fdc97e48f02","kind":"check.reverified","summary":"Stability (unverified → 0.03)","materiality":"functional","direction":"improvement","scoreDelta":null,"occurredOn":"2026-10-18","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp#chg-chg_01a14e47-994d-70fe-b10a-8fdc97e48f02"},{"id":"chg_01a1491e-9b47-7b9a-bafa-3edc8ef2bdc7","kind":"check.reverified","summary":"Authorization (unverified → partial)","materiality":"security","direction":"improvement","scoreDelta":null,"occurredOn":"2026-10-17","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp#chg-chg_01a1491e-9b47-7b9a-bafa-3edc8ef2bdc7"},{"id":"chg_01a1491e-9b49-7d36-aa1d-5f2414720c94","kind":"check.verdict","summary":"Transport (fail → pass)","materiality":"security","direction":"improvement","scoreDelta":null,"occurredOn":"2026-10-17","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp#chg-chg_01a1491e-9b49-7d36-aa1d-5f2414720c94"},{"id":"chg_01a1491e-9b4a-74b4-8e90-53baf2e9c4fd","kind":"check.reverified","summary":"Injection markers (unverified → pass)","materiality":"security","direction":"improvement","scoreDelta":null,"occurredOn":"2026-10-17","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp#chg-chg_01a1491e-9b4a-74b4-8e90-53baf2e9c4fd"},{"id":"chg_01a1491e-9b4a-7eba-a710-8e177a24bafa","kind":"check.appeared","summary":"First check of Judged manipulation (pass)","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-17","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp#chg-chg_01a1491e-9b4a-7eba-a710-8e177a24bafa"},{"id":"chg_01a1491e-9b4b-7b10-b039-d3fc70ba30ba","kind":"check.reverified","summary":"MCP protocol (unverified → fail)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-10-17","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp#chg-chg_01a1491e-9b4b-7b10-b039-d3fc70ba30ba"},{"id":"chg_01a1491e-9b4c-72d3-8afa-793cf59a4da4","kind":"check.reverified","summary":"Tool coverage (unverified → 100)","materiality":"functional","direction":"improvement","scoreDelta":null,"occurredOn":"2026-10-17","url":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp#chg-chg_01a1491e-9b4c-72d3-8afa-793cf59a4da4"}],"truncated":true,"feedUrl":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp/changelog.json"},"links":{"html":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp","markdown":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp.md","changelogJson":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp/changelog.json","changelogRss":"https://verifymcp.io/servers/chenweilie-cleanairdata/api-mcp.xml","external":[{"label":"Remote endpoint","href":"https://cleanairdata.org/api/mcp"},{"label":"Website","href":"https://cleanairdata.org/developers/api"}]}}