Releases: cyanheads/fcc-broadband-mcp-server
Release list
v0.1.12: Fail-fast live provider-search timeout
Fail-fast live provider-search timeout
Stops fcc_search_providers from retrying a deterministic 30s live GROUP BY timeout 4x (#14).
Fixed:
- OpenDataService.fetchJson classifies deadline aborts into McpError(Timeout) at the fetch choke point; the grouped provider search passes a retryable:false factory so it fails once instead of ~2min of amplified retries, while cheap point queries keep transient retries (#14)
- New non-retryable live_search_timeout errors[] contract entry on fcc_search_providers with a recovery hint (state filter, longer name fragment, or FCC_MIRROR_ENABLED=true)
Changed:
- Live name searches drop the 10x grouped-row headroom ($limit min(limit,200)*10 → min(limit,200)) so Socrata's GROUP BY short-circuits inside the 30s budget; on the live path statesServed/techCodes can be partial for multi-state providers — the mirror path keeps full fidelity
161 tests pass; bun run devcheck clean.
v0.1.11: Opt-in local SQLite mirror of the frozen Form 477 corpus
Opt-in local SQLite mirror of the frozen Form 477 corpus
Form 477 queries can now be served from a local mirror instead of the live Socrata API (#8); the mirror is off by default and everything falls back to live behavior when disabled or uncovered.
Added:
FCC_MIRROR_ENABLED/FCC_MIRROR_PATHenv vars — off by default; path defaults todata/fcc-mirrormirror:initscript — state-scoped (--states 11,53) or full-corpus (--full) one-time ingest; idempotent and resumablemirror:verifyscript — per-store sync state, row counts, integrity checks, coverage roster- Coverage-gated serving with silent live-API fallback; provider search/summary and cbsa/tribal/nation geographies require a full ingest
- FTS5 provider dimension backing
fcc_search_providers(word-prefix name matching on the mirror) better-sqlite3^12.0.0 optional peer dependency for the Node runtime; Bun uses the built-inbun:sqlite
Changed:
- Dockerfile ships the mirror lifecycle scripts and a writable
data/directory for in-container bootstrap
156 tests pass; bun run devcheck clean.
v0.1.10: GEOID shape validation, area name resolution, audit refresh
GEOID shape validation, area name resolution, audit refresh
Fail-fast input validation and readable geography names on the coverage-analysis tools, plus a dependency/security refresh.
Added:
invalid_geography_id_shape—fcc_get_coverage_summary+fcc_compare_areasreject GEOIDs whose digit count doesn't matchgeography_type(state=2, county=5, cd=4, cbsa=5, place=7) before any upstream call; county-FIPS-as-state gets a cross-hint.nation/tribalexempt. (#13)getGeographyNames()— batched GEOID→name resolution;fcc_find_underserved+fcc_compare_areasrows gain an optionalnamefield and aName (GEOID)table column; resolution failure never fails the call. (#12)
Fixed:
- README:
fcc-broadband://providers/listdocumented as hoconum-only;fcc_search_providersresolves names. (#5)
Security:
- Lock refresh cleared 8 transitive advisories (2 high, 6 moderate): 7 hono, 1 js-yaml.
bun auditclean.
Dependency bumps:
@cyanheads/mcp-ts-core^0.10.9 → ^0.10.10hono4.12.26 → 4.12.27 (transitive)js-yaml3.14.2 → 3.15.0 (transitive, depcheck path)@hono/node-server2.0.5 → 2.0.6 (transitive)
129 tests pass; bun run devcheck clean.
v0.1.9: mcp-ts-core ^0.10.9 adoption
mcp-ts-core ^0.10.9 adoption
Framework maintenance — no server-side behavior change.
Changed:
- mcp-ts-core ^0.10.6 → ^0.10.9: adds the ctx.content media collector, classifies SELECT-shaped Canvas SQL prepare failures as invalid_sql with DuckDB binder detail, fixes the DuckdbProvider.describe() ambiguous-column error, and skips git-dependent devcheck steps cleanly on fresh scaffolds.
- devcheck toolchain synced to 0.10.9 — adds check-dependency-specifiers (floating latest/*/dist-tag specifiers) and plugin-manifest checks in lint:packaging; enabled via devcheck.config.json packaging.pluginManifests.
- Vendored skills (13) and devcheck scripts (6) re-synced to the framework.
Dependency bumps:
@cyanheads/mcp-ts-core^0.10.6 → ^0.10.9@biomejs/biome^2.4.16 → ^2.5.0@types/node^25.9.3 → ^26.0.0vitest^4.1.8 → ^4.1.9
106 tests pass; bun run devcheck clean.
v0.1.8: mcp-ts-core ^0.10.6, BDC/Open Data credentials, MCPB bundle hardening
mcp-ts-core ^0.10.6, BDC/Open Data credentials, MCPB bundle hardening
Maintenance release: framework adoption, in-code identity, optional API
credentials, and bundle/packaging hardening.
Added:
- fcc_find_underserved, fcc_search_providers: truncation enrichment (truncated/shown/cap) when results are capped at the limit.
- Optional FCC_BDC_USERNAME, FCC_BDC_HASH_VALUE, FCC_OPENDATA_APP_TOKEN env vars in server.json and manifest.json — Form 477 stays keyless; BDC tools and higher Open Data rate limits opt in.
- scripts/clean-mcpb.ts: strips dependency-shipped agent-docs from the MCPB bundle that root-anchored .mcpbignore cannot reach.
- Docker /healthz HEALTHCHECK and image.version label.
Changed:
- createApp() name/title set to the unscoped machine name fcc-broadband-mcp-server.
- lint-packaging.ts: bundle-content and identity guards; check-framework-antipatterns.ts flags z.coerce.boolean() env flags.
- .mcpbignore root dev-dir patterns anchored with a leading slash.
- Vendored skills synced to mcp-ts-core 0.10.6.
Dependencies:
- @cyanheads/mcp-ts-core ^0.9.21 → ^0.10.6
- @types/node ^25.9.1 → ^25.9.3
106 tests pass; bun run devcheck clean.
v0.1.7: Error-contract fixes: recovery hints for block_not_found, geography_not_found, provider_not_found, and missing_geography_ids
Error-contract fixes: recovery hints for block_not_found, geography_not_found, provider_not_found, and missing_geography_ids
Service-layer notFound() throws omitted data.recovery.hint — agents received the correct error code but no structured recovery guidance. Handlers now own the guard via ctx.fail() + ctx.recoveryFor() so the full wire shape is always populated.
Fixed:
- fcc_compare_areas: wrong reason invalid_all_states_combo reused when no geography_ids provided — now missing_geography_ids (#7)
- fcc_search_availability, fcc_get_coverage_summary, fcc_get_provider: not-found guards moved from service to handler; recovery hints now on the wire (#9)
- fcc_geocode_block: service returns null for off-US/water coords; handler throws block_not_found with recovery hint (#10)
106 tests pass; bun run devcheck clean.
v0.1.6: mcp-ts-core framework adoption ^0.9.21
mcp-ts-core framework adoption ^0.9.21
Adopts @cyanheads/mcp-ts-core ^0.9.16 → ^0.9.21. Key changes in this range:
Changed:
- HTTP transport per-request log context fix — logs and traces now carry fresh request + trace/span IDs instead of the frozen boot context.
- fetchWithTimeout strips query-string secrets (e.g. ?api_key=) from error messages and logs.
- withRetry fails fast on non-retryable errors; ctx.fail auto-populates the retryable flag.
Dependencies:
@cyanheads/mcp-ts-core^0.9.16 → ^0.9.21vitest^4.1.7 → ^4.1.8
105 tests pass; bun run devcheck clean.
v0.1.5: Enrichment adoption across search/coverage tools
Enrichment adoption across search/coverage tools
Query echoes, result totals, and empty-result guidance now surface in a typed
enrichment block that reaches both the structuredContent JSON and the
content[] markdown trailer on all search, list, and coverage tools.
Changed:
- fcc_search_availability, fcc_search_providers, fcc_find_underserved, fcc_get_coverage_summary, fcc_compare_areas, fcc_list_downloads — enrichment block with appliedFilters, totalFound (where applicable), and notice on empty results
- fcc_find_underserved structuredContent — totalFound and notice moved from output to enrichment; value/presence preserved in both channels
- fcc_search_providers structuredContent — notice moved from output to enrichment; value/presence preserved in both channels
Dependency bumps:
@cyanheads/mcp-ts-core^0.9.13 → ^0.9.16
48 tests pass; bun run devcheck clean.
v0.1.4: mcp-ts-core ^0.9.9 → ^0.9.13, error-code reclassifications
mcp-ts-core ^0.9.9 → ^0.9.13, error-code reclassifications
Adopts @cyanheads/mcp-ts-core ^0.9.13 from ^0.9.9, picking up HTTP transport hardening, quieter logging for expected client errors, and GET /mcp keyword surfacing. Four error codes reclassified from InvalidParams to ValidationError on client-observable paths.
Changed:
@cyanheads/mcp-ts-core^0.9.9 → ^0.9.13 (HTTP 413 body cap via MCP_HTTP_MAX_BODY_BYTES; session-init gate rejects non-initialize requests without Mcp-Session-Id; 401/403/400/404 log at warning instead of error; GET /mcp surfaces package.json keywords)fcc_compare_areasreasoninvalid_all_states_combo— code InvalidParams → ValidationErrorfcc_get_coverage_summaryreasoninvalid_geography_combo— code InvalidParams → ValidationErrorfcc_list_downloadsreasoninvalid_as_of_date— code InvalidParams → ValidationErrorgeography-summaryresource invalid-type path —invalidParamsfactory →validationErrorlanding.requireAuth: falseset in createApp() for public-catalog behavior under 0.9.13 default change
Dependency bumps:
@cyanheads/mcp-ts-core^0.9.9 → ^0.9.13@biomejs/biome^2.4.15 → ^2.4.16
47 tests pass; bun run devcheck clean.
v0.1.3: package metadata, install badges, bun scripts
package metadata, install badges, bun scripts
Aligns package.json and README to ecosystem standard.
Added:
.github/FUNDING.yml— GitHub Sponsors and Buy Me a Coffeeauthorandfundingfields in package.jsonbugsandhomepagefields in package.json- Install badges (Claude Desktop, Cursor, VS Code) in README
- Docker and MCP SDK badges in README badge row
Changed:
- Scripts migrated from
tsxtobun run scripts/*.ts start:stdio/start:httpnow usebun ./dist/index.jstsxremoved from devDependenciespackageManager: bun@1.3.2added
47 tests pass; bun run devcheck clean.