CityAlert

Free live public-safety incident map: global crime, fire, disaster, weather and news feeds

Should I use this

Quality & Safety

A
Description quality
90%
Schema completeness
76%
Naming quality
100%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (2)

  • LOWTool 'get_crime_year' description lacks action verbin get_crime_year
  • LOWTool 'get_news' description lacks action verbin get_news

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,180Tokens (tool definitions)
~3.9 KBTypical response size
Significant attention impact (2.48% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "cityalert": {
      "url": "https://cityalert.live/api/mcp"
    }
  }
}

Remote endpoints

https://cityalert.live/api/mcpstreamable-http
https://cityalert.live/.well-known/mcpstreamable-http

What it can do

Tool inventory

Tools (8)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢list_regions

List CityAlert focus regions (key, label, center, zoom, bbox). Use region keys with get_incidents.

Input Schema

{
  "type": "object",
  "properties": {}
}

Output Schema

{
  "type": "object",
  "properties": {
    "regions": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "center": {
            "type": "array",
            "prefixItems": [
              {
                "type": "number"
              },
              {
                "type": "number"
              }
            ],
            "items": false,
            "minItems": 2,
            "maxItems": 2
          },
          "zoom": {
            "type": "number"
          },
          "bbox": {
            "type": "array",
            "prefixItems": [
              {
                "type": "number"
              },
              {
                "type": "number"
              },
              {
                "type": "number"
              },
              {
                "type": "number"
              }
            ],
            "items": false,
            "minItems": 4,
            "maxItems": 4
          },
          "quakeStats": {
            "type": "boolean"
          },
          "major": {
            "type": "boolean"
          },
          "country": {
            "type": "boolean"
          },
          "state": {
            "type": "boolean"
          }
        },
        "required": [
          "key",
          "label",
          "center",
          "zoom",
          "bbox"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "regions"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}
🟢get_incidents(region, category, groups, minSeverity, q, ...)

Merged live incidents from all feeds plus manual reports. Filter by region key, category, group, severity, source, or bbox. Results come from a shared ~15-minute snapshot; real-time refresh requires an API key with that entitlement (details: cityalert.live/developers).

Input Schema

{
  "type": "object",
  "properties": {
    "region": {
      "description": "Focus-region key, e.g. 'vancouver' (see list_regions)",
      "type": "string"
    },
    "category": {
      "description": "Incident category",
      "type": "string",
      "enum": [
        "crime",
        "fire",
        "disaster",
        "weather",
        "unrest",
        "health",
        "infra",
        "alert",
        "report"
      ]
    },
    "groups": {
      "description": "Normalized subtypes to include, e.g. ['violent','property','collision','wildfire']. See group keys in the /api/incidents OpenAPI doc.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "minSeverity": {
      "description": "Minimum severity (low < medium < high < critical)",
      "type": "string",
      "enum": [
        "low",
        "medium",
        "high",
        "critical"
      ]
    },
    "q": {
      "description": "Case-insensitive substring match on type/title/neighbourhood",
      "type": "string",
      "maxLength": 100
    },
    "source": {
      "description": "Feed source, e.g. 'usgs', 'gdacs', 'eccc', 'vpd', 'bcws', 'vernon-media', 'manual'",
      "type": "string"
    },
    "bbox": {
      "description": "[minLon, minLat, maxLon, maxLat]",
      "minItems": 4,
      "maxItems": 4,
      "type": "array",
      "items": {
        "type": "number"
      }
    },
    "limit": {
      "description": "Max incidents to return (default 50)",
      "type": "integer",
      "minimum": 1,
      "maximum": 5000
    },
    "detail": {
      "description": "Response detail. 'full' (default): every field incl. description, neighbourhood and reporter/vote metadata. 'compact': id/type/title/coords/time/severity/url only — about half the tokens, for list-style answers.",
      "type": "string",
      "enum": [
        "compact",
        "full"
      ]
    },
    "refresh": {
      "description": "Re-fetch upstream feeds instead of returning the shared ~15-minute snapshot. Only honored for API keys with real-time entitlement; ignored otherwise.",
      "type": "boolean"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Output Schema

{
  "type": "object",
  "properties": {
    "total": {
      "type": "number"
    },
    "returned": {
      "type": "number"
    },
    "incidents": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "source": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "group": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "lat": {
            "type": "number"
          },
          "lon": {
            "type": "number"
          },
          "time": {
            "type": "string"
          },
          "severity": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "region": {
            "type": "string"
          },
          "nhood": {
            "type": "string"
          },
          "approximate": {
            "type": "boolean"
          },
          "count": {
            "type": "number"
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "active",
              "resolved",
              "hidden"
            ]
          },
          "confirms": {
            "type": "number"
          },
          "resolves": {
            "type": "number"
          },
          "flags": {
            "type": "number"
          },
          "reporter": {
            "type": "object",
            "properties": {
              "handle": {
                "type": "string"
              },
              "role": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "curator",
                      "moderator"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "reports": {
                "type": "number"
              },
              "confirmed": {
                "type": "number"
              }
            },
            "required": [
              "handle",
              "role",
              "reports",
              "confirmed"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "id",
          "source",
          "category",
          "type",
          "title",
          "lat",
          "lon",
          "time",
          "severity"
        ],
        "additionalProperties": false
      }
    },
    "feeds": {
      "type": "object",
      "properties": {
        "count": {
          "type": "number"
        },
        "failed": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "source": {
                "type": "string"
              },
              "error": {
                "type": "string"
              }
            },
            "required": [
              "source"
            ],
            "additionalProperties": false
          }
        }
      },
      "required": [
        "count",
        "failed"
      ],
      "additionalProperties": false
    },
    "region": {
      "type": "string"
    },
    "delayed": {
      "type": "boolean"
    },
    "delayMinutes": {
      "type": "number"
    },
    "textTruncated": {
      "type": "string"
    }
  },
  "required": [
    "total",
    "returned",
    "incidents",
    "feeds"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}
🟢get_trends

Historical aggregates: VPD crime by year/month/type (6y), USGS M4+ quakes per region (10y), GDACS global events (3y), report and live snapshot stats. Use for questions about patterns over time — crime trends, quake frequency, disaster cadence. For what's happening right now, use get_incidents.

Input Schema

{
  "type": "object",
  "properties": {}
}

Output Schema

{
  "type": "object",
  "properties": {
    "generatedAt": {
      "type": "string"
    },
    "crime": {
      "anyOf": [
        {
          "type": "object",
          "properties": {},
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ]
    },
    "history": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    "quakes": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    "gdacs": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      }
    },
    "statcan": {
      "anyOf": [
        {
          "type": "object",
          "properties": {},
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ]
    },
    "reports": {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    },
    "snapshot": {
      "type": "object",
      "properties": {},
      "additionalProperties": false
    },
    "errors": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}
🟢get_crime_year(year, includeIncidents)

Full-year VPD crime data: totals and ranked neighbourhood stats. Vancouver only, 2003-present.

Input Schema

{
  "type": "object",
  "properties": {
    "year": {
      "type": "integer",
      "minimum": 2003,
      "maximum": 2026,
      "description": "Year, 2003 to present"
    },
    "includeIncidents": {
      "description": "Include every incident point (large; default false)",
      "type": "boolean"
    }
  },
  "required": [
    "year"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Output Schema

{
  "type": "object",
  "properties": {
    "year": {
      "type": "number"
    },
    "total": {
      "type": "number"
    },
    "byType": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "number"
      }
    },
    "byNeighbourhood": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "count": {
            "type": "number"
          },
          "lat": {
            "type": "number"
          },
          "lon": {
            "type": "number"
          }
        },
        "required": [
          "name",
          "count",
          "lat",
          "lon"
        ],
        "additionalProperties": false
      }
    },
    "incidents": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "source": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "group": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "lat": {
            "type": "number"
          },
          "lon": {
            "type": "number"
          },
          "time": {
            "type": "string"
          },
          "severity": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "region": {
            "type": "string"
          },
          "nhood": {
            "type": "string"
          },
          "approximate": {
            "type": "boolean"
          },
          "count": {
            "type": "number"
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "active",
              "resolved",
              "hidden"
            ]
          },
          "confirms": {
            "type": "number"
          },
          "resolves": {
            "type": "number"
          },
          "flags": {
            "type": "number"
          },
          "reporter": {
            "type": "object",
            "properties": {
              "handle": {
                "type": "string"
              },
              "role": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "curator",
                      "moderator"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "reports": {
                "type": "number"
              },
              "confirmed": {
                "type": "number"
              }
            },
            "required": [
              "handle",
              "role",
              "reports",
              "confirmed"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "id",
          "source",
          "category",
          "type",
          "title",
          "lat",
          "lon",
          "time",
          "severity"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "year",
    "total",
    "byType",
    "byNeighbourhood"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}
🟢get_news(place, refresh)

Per-region safety news items, or news for an arbitrary place name.

Input Schema

{
  "type": "object",
  "properties": {
    "place": {
      "description": "Place name for ad-hoc news, e.g. 'Kelowna'",
      "type": "string",
      "maxLength": 60
    },
    "refresh": {
      "description": "Bypass the news cache (API keys with real-time entitlement only)",
      "type": "boolean"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Output Schema

{
  "type": "object",
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "link": {
            "type": "string"
          },
          "source": {
            "type": "string"
          },
          "published": {
            "type": "string"
          },
          "region": {
            "type": "string"
          },
          "regionLabel": {
            "type": "string"
          },
          "image": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "title",
          "link",
          "source",
          "published"
        ],
        "additionalProperties": false
      }
    },
    "place": {
      "type": "string"
    },
    "fetchedAt": {
      "type": "string"
    }
  },
  "required": [
    "items"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}
🟡submit_report(title, lat, lon, category, severity, ...)

File a manual geolocated incident report (same as POST /api/reports). Reports are moderated before they appear publicly. Errors: 'report submission disabled' if the caller is blocked; 'rate limited' past 20 reports/hour via MCP.

Input Schema

{
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "Short headline, 1–200 chars"
    },
    "lat": {
      "type": "number",
      "minimum": -90,
      "maximum": 90,
      "description": "Latitude, -90 to 90"
    },
    "lon": {
      "type": "number",
      "minimum": -180,
      "maximum": 180,
      "description": "Longitude, -180 to 180"
    },
    "category": {
      "description": "Incident category (default 'report')",
      "type": "string",
      "enum": [
        "crime",
        "fire",
        "disaster",
        "weather",
        "unrest",
        "health",
        "infra",
        "alert",
        "report"
      ]
    },
    "severity": {
      "description": "low | medium | high | critical (default 'medium')",
      "type": "string",
      "enum": [
        "low",
        "medium",
        "high",
        "critical"
      ]
    },
    "description": {
      "description": "Details, up to 2000 chars",
      "type": "string",
      "maxLength": 2000
    }
  },
  "required": [
    "title",
    "lat",
    "lon"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Output Schema

{
  "type": "object",
  "properties": {
    "report": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "source": {
          "type": "string"
        },
        "category": {
          "type": "string"
        },
        "group": {
          "type": "string"
        },
        "type": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "lat": {
          "type": "number"
        },
        "lon": {
          "type": "number"
        },
        "time": {
          "type": "string"
        },
        "severity": {
          "type": "string"
        },
        "url": {
          "type": "string"
        },
        "region": {
          "type": "string"
        },
        "nhood": {
          "type": "string"
        },
        "approximate": {
          "type": "boolean"
        },
        "count": {
          "type": "number"
        },
        "sources": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "status": {
          "type": "string",
          "enum": [
            "pending",
            "active",
            "resolved",
            "hidden"
          ]
        },
        "confirms": {
          "type": "number"
        },
        "resolves": {
          "type": "number"
        },
        "flags": {
          "type": "number"
        },
        "reporter": {
          "type": "object",
          "properties": {
            "handle": {
              "type": "string"
            },
            "role": {
              "anyOf": [
                {
                  "type": "string",
                  "enum": [
                    "curator",
                    "moderator"
                  ]
                },
                {
                  "type": "null"
                }
              ]
            },
            "reports": {
              "type": "number"
            },
            "confirmed": {
              "type": "number"
            }
          },
          "required": [
            "handle",
            "role",
            "reports",
            "confirmed"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "id",
        "source",
        "category",
        "type",
        "title",
        "lat",
        "lon",
        "time",
        "severity"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "report"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}
🟢get_dashboard(id)

Read a saved dashboard by id (shareable, read-only).

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    }
  },
  "required": [
    "id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Output Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "name": {
      "type": "string"
    }
  },
  "required": [
    "id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}
🟡create_dashboard(name, config)

Create a shareable dashboard. Returns {id, token} — the token grants write access via PUT /api/dashboards, so save it.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 100
    },
    "config": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {},
      "description": "Dashboard config object, e.g. {areas, categories, defaultTab}"
    }
  },
  "required": [
    "config"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Output Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "token": {
      "type": "string"
    }
  },
  "required": [
    "id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}

Recommended Prompts

retrieve_data
Get details about [item] from CityAlert
Expected tools: get_incidents
fetch_info
Fetch [information type] using CityAlert
Expected tools: get_incidents
list_items
List all [items] available in CityAlert
Expected tools: list_regions
browse_collection
Show me the [collection] from CityAlert
Expected tools: list_regions
explore_workflow
List available [items], then get details for each one using CityAlert
Expected tools: list_regionsget_incidents

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded8 tools
verifiedversion not recorded8 tools
verifiedversion not recorded8 tools
verifiedversion not recorded8 tools
verifiedversion not recorded8 tools
verifiedversion not recorded8 tools
verifiedversion not recorded8 tools
verifiedversion not recorded8 tools
verifiedversion not recorded8 tools
verifiedversion not recorded8 tools