MCP server for accessing City of Chattanooga government information via web scraping
Server has 4 tools with complete input schemas and descriptions. Naming follows verb_noun convention (search_*, list_*, get_*). Descriptions are present and contextual (avg ~150 chars), exceeding the 10-char minimum but below the 50-200 char LLM-optimized range. All parameters have type definitions and descriptions. However, output schemas are not documented, responses are JSON-stringified text blobs rather than structured objects with typed fields. Error handling returns generic messages without recovery guidance. No parameter constraints (enums, ranges) despite opportunities (e.g., limit should have min/max). Missing tool annotations (readOnlyHint, idempotentHint). Composition is sound, each tool has one responsibility and tools chain via URLs/IDs.
Scrape content from a specific chattanooga.gov page and convert to markdown
List pages from chattanooga.gov sitemap with optional filtering
Search events and calendar items from the chattanooga.gov RSS feed (rss.xml is the city events/calendar feed). Returns event titles, links, dates, and summaries.
Search City of Chattanooga news articles (from chattanooga.gov/stay-informed/latest-news, discovered via the sitemap). Returns article URLs, slug-derived titles, and last-modified dates, newest first. Use get_page to fetch an article's full text and exact headline.
Output schemas not documented. Tools return JSON-stringified text in a single 'text' field rather than structured objects with typed fields. LLMs cannot infer what fields to expect or plan downstream calls.
Error handling lacks recovery guidance. Errors return generic messages ('Error fetching news: ...') without actionable next steps. LLMs cannot determine if the error is retryable, user-fixable, or fatal.
No parameter constraints. 'limit' parameters lack min/max bounds (e.g., limit could be 0 or 999999). 'query' parameters accept any string without validation. Enums or pattern constraints would prevent invalid LLM inputs.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2026-07-28+ | v2 |
Tool annotations missing. No readOnlyHint, idempotentHint, or destructiveHint declared. All tools are read-only and idempotent, but LLMs cannot infer this without explicit annotations.
Pagination not implemented. search_news and search_events accept 'limit' but do not return total_count or next_cursor. Large result sets could exhaust context window without pagination support.