Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.cyanheads/census-mcp-server

REMOTE · CENSUS.CASEYJHAND.COM · 2 COMPONENTS · SCANNED SEP 26

Query U.S. Census Bureau data, variables, and geography via MCP.

+1 this week 66 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security66
  • The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
  • Authorisation not fully verified: no authorisation is required to call this server, and 8 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe. See how to fix → View diagnostics → Unverified
  • HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
  • The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
  • DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
Schema Quality & AI Usability59
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 6261 tokens (~782/item across 8 items; 8 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management5
  • Stability check failed: schema churn in the 7 days we've observed: 0 tool removals, 3 breaking changes, 0 auth/transport breaks, 0 additions. See how to fix → Fail
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 8 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 9 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Install

How do I install the io.github.cyanheads/census-mcp-server server?

io.github.cyanheads/census-mcp-server is a hosted endpoint at https://census.caseyjhand.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · census.caseyjhand.com

# add to Claude Code
claude mcp add --transport http cyanheads-census-mcp-server 'https://census.caseyjhand.com/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "cyanheads-census-mcp-server": {
      "url": "https://census.caseyjhand.com/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "cyanheads-census-mcp-server": {
      "type": "http",
      "url": "https://census.caseyjhand.com/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.cyanheads-census-mcp-server]
url = "https://census.caseyjhand.com/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "cyanheads-census-mcp-server": {
      "type": "remote",
      "url": "https://census.caseyjhand.com/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add cyanheads-census-mcp-server --url 'https://census.caseyjhand.com/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  cyanheads-census-mcp-server:
    url: "https://census.caseyjhand.com/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "cyanheads-census-mcp-server": {
      "Transport": "http",
      "Url": "https://census.caseyjhand.com/mcp"
    }
  }
}
# add to Vellum
assistant mcp add cyanheads-census-mcp-server -t streamable-http -u 'https://census.caseyjhand.com/mcp'
// mcp.json
{
  "mcpServers": {
    "cyanheads-census-mcp-server": {
      "type": "http",
      "url": "https://census.caseyjhand.com/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 26 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 1 to 5.

  • 25 Sept 26 −3
    • Stability: 0.17 → fail ▼ security
    • Tool “census_list_datasets” rewrote its description, which is the text the model reads security
    • Tool “census_get_variable” rewrote its description, which is the text the model reads security
    • Tool “census_resolve_geography” rewrote its description, which is the text the model reads security
    • Tool “census_compare_geographies” rewrote its description, which is the text the model reads security
    • Tool “census_query_data” rewrote its description, which is the text the model reads security
    • Tool “census_search_variables” rewrote its description, which is the text the model reads security
    • Schema quality: 538 → 782 ▼ functional
    • Schema quality: 538 → 690 ▼ functional
    • Schema quality: 538 → 635 ▼ functional
    • “census_compare_geographies” changed the type of “limit”: number → integer ▼ functional
    • “census_list_predicate_values” changed the type of “limit”: number → integer ▼ functional
    • “census_search_variables” changed the type of “limit”: number → integer ▼ functional
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
    • Server version: 0.5.0 → 0.6.0 functional
    • Server version: 0.4.0 → 0.5.0 functional
    • Server version: 0.3.4 → 0.4.0 functional
    • “census_query_data” added an optional parameter “tract_fips” cosmetic
    • “census_query_data” added an optional parameter “limit” cosmetic
    • “census_query_data” added an optional parameter “offset” cosmetic
    • “census_search_variables” reworded the description of “dataset” cosmetic
    • “census_query_data” reworded the description of “dataset” cosmetic
    • “census_list_predicate_values” reworded the description of “dataset” cosmetic
    • “census_list_predicate_values” reworded the description of “predicate” cosmetic
    • “census_search_variables” reworded the description of “query” cosmetic
    • “census_compare_geographies” reworded the description of “dataset” cosmetic
    • “census_get_variable” reworded the description of “dataset” cosmetic
    • “census_get_variable” reworded the description of “variables” cosmetic
    • “census_list_geographies” reworded the description of “dataset” cosmetic
    • “census_resolve_geography” reworded the description of “name” cosmetic
    • “census_resolve_geography” reworded the description of “geography_type” cosmetic
    • “census_query_data” reworded the description of “predicates” cosmetic
    • “census_compare_geographies” reworded the description of “limit” cosmetic
    • “census_compare_geographies” reworded the description of “predicates” cosmetic
    • “census_compare_geographies” reworded the description of “sort_by” cosmetic
    • “census_compare_geographies” reworded the description of “variables” cosmetic
    • “census_list_predicate_values” reworded the description of “limit” cosmetic
    • “census_query_data” reworded the description of “geography_fips” cosmetic
    • “census_query_data” reworded the description of “variables” cosmetic
    • “census_search_variables” reworded the description of “limit” cosmetic
  • 24 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

  • 22 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

  • 20 Sept 26 +1
    • Stability: unverified → 0.03 ▲ functional
  • 19 Sept 26 65

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 26 Sept 2026 · Probed https://census.caseyjhand.com/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=caseyjhand.com CN=WE1,O=Google Trust Services,C=US 4 Sept 2026 3 Dec 2026 ECDSA 256 ECDSA-SHA256 a6985204ed51ae050e7738aa6be668e9
SANs: caseyjhand.com, *.caseyjhand.com
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC secure

Validation of census.caseyjhand.com. — Secure

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
com. present 19718 13 Verified
caseyjhand.com. present 2371 13 Verified
census.caseyjhand.com. Verified address RRset verified with the apex keys
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
strict-transport-security max-age=63072000; includeSubDomains; preload
x-content-type-options nosniff

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://census.caseyjhand.com/mcp Verified 200
http (plaintext) http://census.caseyjhand.com/mcp HTTPS enforced 301 https://census.caseyjhand.com/mcp
MCP tools · 8 exposed · ~6,146 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
census_compare_geographies ~1,586

Compare one or more variables across multiple geographies at the same level — all counties in a state, all states nationally, or a named set of specific geographies — ranked on the value of one of them. Covers queries like "compare median income across WA counties" or "which states have the most people below the poverty line." A count ranks geographies by size, not by rate, so to rank a rate, rank a published percentage: S1701_C03_001E (percent below the poverty level, dataset acs/acs5/subject), DP03_0128PE (the same percentage, acs/acs5/profile), or DP04_0047PE (percent of occupied housing units that are renter-occupied, acs/acs5/profile). Profile and subject tables reach tracts but not block groups. Omit within to compare all geographies nationally at the level. Suppressed values are decoded to human-readable labels rather than passed through as raw negative sentinels. On the business datasets (cbp, ecnbasic, nonemp), pep/charv, dec/ddhca, and acs/acs1/spp, use predicates to rank within one industry, size class, or population group — a comparison that omits one ranks on a default the Census API picks, which is an all-categories total on some dimensions and a single category on others. Each row names the defaults that were applied in applied_filters, and census_list_predicate_values enumerates the codes a dimension accepts. A dataset that publishes several records per geography cannot be ranked until one is pinned: pep/charv publishes an April estimates base and a July estimate, so a comparison that pins neither fails with ambiguous_rows rather than giving every geography two ranks — pass predicates {"MONTH": "7"} for the July estimate.

NameTypeReqDescription
datasetstring–Dataset to query (default: "acs/acs5"). Use census_list_datasets for valid values. Case is ignored, and a two-part code can be given by its last part alone — "acs5" is acs/acs5, "pl" is dec/pl. Three…
geographiesarray–Optional list of specific geographies to include; only these are returned. Prefer full GEOIDs — the level concatenated with its parents, e.g. "53033" for King County WA and "06037" for Los Angeles Co…
geography_levelstringyesThe level to compare across (e.g., "state", "county", "tract"). Use census_list_geographies to see valid values for the dataset.
limitinteger–Maximum geographies to return (default: 50, max: 500). When results are truncated, totalCount says how many matched.
predicatesobject–Filter values keyed by variable code, applied to every geography in the comparison — e.g. {"NAICS2017": "5112"} to rank counties by their software-publisher establishment count in cbp. The business d…
sort_bystring–Variable code to rank on (default: the first code in variables), uppercased like the variables. Must be one of the requested codes, or the call fails with sort_by_not_requested. Geographies rank on t…
sort_dirstring–Sort direction (default: "desc" — highest value first).
variablesarrayyesVariable codes to compare (e.g., ["B19013_001E", "B19013_001M"]); the ranking is on one of them, set by sort_by. Codes are uppercased before the request, and each row is keyed by the uppercase code.…
within––State FIPS to constrain results (e.g., "53" to compare counties or tracts within WA only). Omit to compare all geographies at the level nationally. Use census_resolve_geography to get state_fips. Pas…
within_county––County FIPS to constrain tract or block-group comparisons to a single county within the state specified by within (e.g., "033" for King County). Required when geography_level is "tract" or "block gro…
yearnumber–Vintage year (default: latest available for the dataset).
NameTypeReqDescription
datasetstring–Dataset queried.
errorobject–Present when the call failed. Absent on success.
noticestring–Guidance when results were truncated, when the sort column holds no number on any row (so the rows are in the order the Census returned them rather than ranked), when geographies entries matched no r…
rowsarray–Geographies sorted by the requested variable. Suppressed values are labeled.
sortVariablestring–Variable code the rows are ranked on, uppercased as it appears in variables.
totalCountnumber–Total number of geographies matched before the limit was applied.
truncatedboolean–True when totalCount exceeds the limit and results were cut off.
yearnumber–Vintage year queried.

No examples provided.

census_get_variable ~405

Fetch full metadata for one or more Census variable codes — label, concept group, predicate type, the table's universe, and margin-of-error sibling references. Use to confirm a variable code before building a query, or to look up what a known code means. On ACS datasets it returns estimate_code and moe_code sibling references so you can request both without a separate search, and a margin-of-error code carries attribute_of and attribute_type MARGIN_OF_ERROR as the Census publishes them; the ACS comparison profiles (acs/acs5/cprofile, acs/acs1/cprofile) and the other dataset families publish no margins of error and carry none of these fields. It also resolves the annotation and flag columns the data tools accept, such as B19013_001EA or EMP_F, naming the column each one belongs to, and predicate codes such as NAICS2017 or SEX, confirming a filter dimension exists in a dataset before a query uses it — for the values a dimension accepts rather than the dimension itself, call census_list_predicate_values.

NameTypeReqDescription
datasetstring–Dataset the variables belong to (default: "acs/acs5"). Use census_list_datasets to discover valid values. Case is ignored, and a two-part code can be given by its last part alone — "acs5" is acs/acs5…
variablesarrayyesOne or more variable codes to look up (e.g., ["B19013_001E", "B19013_001M"]). Codes are trimmed and matched regardless of case, and the response echoes the dataset's own spelling — uppercase everywhe…
yearnumber–Vintage year (default: latest available for the dataset).
NameTypeReqDescription
datasetstring–Dataset queried.
errorobject–Present when the call failed. Absent on success.
variablesarray–Variable metadata in the same order as the input array.
yearnumber–Vintage year queried.

No examples provided.

census_list_datasets ~138

Browse available Census Bureau datasets with their supported vintage years. Use as the starting point when the right dataset is unknown — ACS5, ACS1, and their profile, subject, and comparison tables, population estimates, the decennial census files, and the business datasets (County Business Patterns, Economic Census, Nonemployer Statistics) serve different use cases. Pass the dataset_id value to the dataset parameter in other census tools. Each description names the predicates a dataset requires and the geography levels it publishes, both of which vary by dataset.

NameTypeReqDescription
filterstring–Keyword to filter datasets by name or description. Omit to list all datasets.
NameTypeReqDescription
datasetsarray–Matching Census datasets.
errorobject–Present when the call failed. Absent on success.
filterAppliedstring–Filter keyword applied to the dataset list, when provided.
noticestring–Guidance when no datasets matched the filter keyword.
totalCountnumber–Total number of matching datasets.

No examples provided.

census_list_geographies ~203

List the geography levels available for a given Census dataset and year, along with the parent geographies each level requires. Use before querying to confirm that the target geography level exists — ACS1 omits many sub-state levels, and not all datasets support tracts or block groups. The geography_level values returned here are the valid inputs to the geography_level parameter in census_query_data and census_compare_geographies.

NameTypeReqDescription
datasetstringyesDataset code (e.g., "acs/acs5", "acs/acs1"). Use census_list_datasets to discover valid values. Case is ignored, and a two-part code can be given by its last part alone — "acs5" is acs/acs5, "pl" is…
yearnumber–Vintage year. Defaults to the latest available year for the dataset.
NameTypeReqDescription
datasetstring–Dataset queried.
errorobject–Present when the call failed. Absent on success.
geography_levelsarray–Geography levels supported by this dataset and year.
totalLevelsnumber–Total number of geography levels available for this dataset and year.
yearnumber–Vintage year queried.

No examples provided.

census_list_predicate_values ~645

List the codes a Census filter dimension accepts, so a predicates map can be written without guessing. Answers the question left open when census_query_data or census_compare_geographies reports that a dimension was left unset. Which route a dimension takes depends on the vintage: NAICS and POPGROUP always publish a value list in the dataset dictionary, and on the current vintages EMPSZES, LFO, RCPSZES, TAXSTAT, and TYPOP publish none and are enumerated here against the live data endpoint instead. A dictionary value list is a classification shared across Census products rather than a list of what one dataset serves, and roughly half of its codes typically return no rows anywhere — those are checked against the dataset's own published rows and dropped, and the response source field says whether that check ran. The dictionary lists run to thousands of codes and are best narrowed with query. Pass the returned code as the dimension's value in predicates.

NameTypeReqDescription
datasetstringyesDataset the dimension belongs to (e.g., "cbp", "nonemp", "ecnbasic", "dec/ddhca", "pep/charv", "acs/acs1/spp"). Use census_list_datasets to discover valid values. Case is ignored, and a two-part code…
limitinteger–Maximum codes to return (default: 50, max: 500). totalCount says how many matched.
predicatestringyesFilter dimension code to enumerate (e.g., "EMPSZES", "LFO", "POPGROUP", "NAICS2017"). Trimmed and uppercased, and the response echoes that spelling. The response notice of census_query_data names the…
querystring–Keyword to narrow the list, matched case-insensitively against each code and label (e.g., "software" against NAICS2017, "exempt" against TAXSTAT). Omit to list from the start. NAICS and POPGROUP run…
within_naics––Industry code to scope the enumeration by, for dimensions the Census publishes per industry. On ecnbasic, TAXSTAT and TYPOP return only the all-establishments row until a NAICS sector is named — pass…
yearnumber–Vintage year (default: latest available for the dataset).
NameTypeReqDescription
datasetstring–Dataset queried.
errorobject–Present when the call failed. Absent on success.
noticestring–Guidance when the list was truncated, when query matched no published code, when codes from the dataset dictionary could not be checked against its published rows, or when the codes returned are comp…
predicatestring–Filter dimension enumerated.
predicate_labelstring–Label of the dimension itself (e.g., "Employment size of establishments code").
sourcestring–Where the codes came from. "live_query" is a wildcard group-by against the data endpoint, which returns only codes the dataset publishes. "dataset_dictionary_verified" is the dataset's published valu…
totalCountnumber–Codes matched before the limit was applied.
truncatedboolean–True when totalCount exceeds the limit and the list was cut.
valuesarray–Codes the dimension accepts, sorted by code.
yearnumber–Vintage year queried.

No examples provided.

census_query_data ~1,796

Query a Census dataset for one or more variables at a specific geography. Accepts FIPS codes for the target geography — use census_resolve_geography to convert place names to FIPS when needed. On ACS datasets, labeled estimates and margin-of-error values are returned together (the comparison profiles publish no margins), and the negative sentinel values the Census writes for an estimate or margin of error it cannot publish are decoded into the meanings the Census gives them rather than passed through as raw numbers. A value cbp, ecnbasic, or nonemp withheld is stored as 0 beside a flag, and is reported as withheld, with the meaning of its flag, rather than as a zero. Pass geography_fips as "*" for every geography at the level within the parent: rows come back in GEOID order, up to limit per call (default 50, max 500), with totalCount giving how many matched and offset reaching the rest — the order is not a ranking, so use census_compare_geographies to rank. On the business datasets (cbp, ecnbasic, nonemp), pep/charv, dec/ddhca, and acs/acs1/spp, use predicates to filter by industry, size class, or population group — a query that omits one is answered with a default the Census API picks, which is an all-categories total on some dimensions and a single category on others. Each row names the defaults that were applied in applied_filters, and census_list_predicate_values enumerates the codes a dimension accepts. One geography can also come back on more than one row: pep/charv publishes an April estimates base alongside its July estimate, and each row carries a record field saying which it is.

NameTypeReqDescription
county_fips––County FIPS code when querying tracts or block groups within a specific county (e.g., "033" for King County within WA). Required for tract and block-group queries scoped to a county — use alongside p…
datasetstring–Dataset to query (default: "acs/acs5"). Use census_list_datasets to discover valid values. Case is ignored, and a two-part code can be given by its last part alone — "acs5" is acs/acs5, "pl" is dec/p…
geography_fipsstringyesFIPS code for the target geography (e.g., "033" for a county, "*" for every geography at the level within the parent, returned up to limit rows per call and paged with offset). Use census_resolve_geo…
geography_levelstringyesLevel of the target geography (e.g., "county", "tract", "state", "zip code tabulation area"). Use census_list_geographies to see valid values for the dataset.
limitinteger–Most rows to return (default: 50, max: 500). Rows come in GEOID order, a geography's records or categories in code order, and each one counts, so a geography returned as several records (pep/charv Ap…
offsetinteger–Rows to skip before returning up to limit (default: 0). Pages run in GEOID order, so offset 50 with limit 50 returns rows 51–100, and the notice names the offset of the next page. An offset at or pas…
parent_fips––State FIPS code when querying sub-state levels (e.g., "53" for Washington). Required for county, tract, and block-group queries. census_resolve_geography returns this as state_fips. Pass "*" to span…
predicatesobject–Filter values keyed by variable code, sent as extra query parameters — e.g. {"NAICS2017": "5112"} to count only software publishers in cbp. The business datasets (cbp, ecnbasic, nonemp), pep/charv, d…
tract_fips––Census tract code scoping the query to one tract (e.g., "007101" for Census Tract 71.01), for the levels that sit within a tract — block group on acs/acs5, block group and block on dec/pl. census_res…
variablesarrayyesVariable codes to retrieve (e.g., ["B19013_001E", "B19013_001M"]). Codes are uppercased before the request, so "b19013_001e" reads as B19013_001E and the response is keyed by the uppercase code. At m…
yearnumber–Vintage year (default: latest available for the dataset).
NameTypeReqDescription
datasetstring–Dataset queried.
errorobject–Present when the call failed. Absent on success.
noticestring–Warning that the dataset declares filter dimensions the query left unset, naming each one alongside the label of the default the Census API applied to it. That default is an all-categories total on s…
rowsarray–One row per geography, or per record or category where a geography has several. When geography_fips is "*", the rows from offset up to limit of every geography at the level within the parent, in GEOI…
totalCountnumber–Number of rows the query matched, before offset and limit were applied.
totalRowsnumber–Number of rows returned.
truncatedboolean–True when rows were left out by offset or limit — totalCount exceeds the rows returned.
yearnumber–Vintage year queried.

No examples provided.

census_resolve_geography ~946

Resolve a place name, ZIP code, or street address to Census FIPS identifiers. Converts names like "King County, WA", "Seattle, WA", or "Seattle-Tacoma-Bellevue, WA", and ZIPs like "98109", to the codes required by census_query_data and census_compare_geographies. Use before querying when you have a place name rather than raw FIPS codes — state_fips maps to parent_fips and fips_summary maps to geography_fips in downstream tools, and geography_type is itself the geography_level to query at.

NameTypeReqDescription
county_fipsstring–County FIPS code to resolve within — 1 to 3 digits, zero-padded here to the 3 the Census stores. A tract name is unique only inside its county, so a bare tract name matching two counties comes back a…
geography_typestring–Geography level to resolve to, named exactly as census_query_data's geography_level and census_list_geographies name it. Auto-detection covers only state, county, place, tract, and zip code tabulatio…
namestringyesPlace name (e.g., "King County, WA", "Seattle, WA", "California"), 5-digit ZIP code (e.g., "98109", resolved to its ZIP Code Tabulation Area), or street address (e.g., "1600 Pennsylvania Ave NW, Wash…
NameTypeReqDescription
block_group_fipsstring–1-digit block group within tract_fips, for a street address only. Query it as geography_level "block group" with this as geography_fips, alongside parent_fips, county_fips, and tract_fips. geography_…
census_designated_placeboolean–Present (true) when the resolved place or economic place is a census-designated place (CDP): an unincorporated community the Census delineates for statistics, with no municipal government. Its code i…
county_fipsstring–3-digit county FIPS code when the resolved geography is a county or sub-county level.
errorobject–Present when the call failed. Absent on success.
fips_summarystring–Pre-formatted FIPS value ready to use as geography_fips in census_query_data (e.g., "033" for King County with state_fips "53" as parent_fips, "42660" for the Seattle-Tacoma-Bellevue metro area with…
geography_typestring–Resolved geography level. Pass this straight through as geography_level in census_query_data and census_compare_geographies.
namestring–Canonical name of the resolved geography.
place_fipsstring–5-digit place FIPS code when the resolved geography is a place — incorporated or census-designated. For an economic place, the place part of its 8-digit code, which is also the place code the 2017 an…
state_fipsstring–2-digit state FIPS code. Use as parent_fips in census_query_data for sub-state queries. Absent for a metropolitan/micropolitan or combined statistical area, which can span several states and needs no…
tract_fipsstring–6-digit census tract FIPS code when the resolved geography is a tract — from a street address, or from a tract name.

No examples provided.

census_search_variables ~427

Search Census variables by keyword across variable labels and concept groups. Returns variable codes with human-readable labels — use this to go from a concept like "median household income" to the variable code B19013_001E needed for data queries. On ACS datasets it returns both estimate (E suffix) and margin-of-error (M suffix) codes so you can request both; the ACS comparison profiles (acs/acs5/cprofile, acs/acs1/cprofile) and the other dataset families publish no margins of error. Also use it to find the predicate codes a dataset filters on, such as NAICS2017 in cbp. Adding a word narrows the results, since every word must match; when totalMatches exceeds the limit, a more specific query reaches the rest.

NameTypeReqDescription
datasetstring–Dataset to search within (default: "acs/acs5"). Use census_list_datasets to discover options. Case is ignored, and a two-part code can be given by its last part alone — "acs5" is acs/acs5, "pl" is de…
limitinteger–Maximum results to return (default: 20, max: 100). Increase if totalMatches greatly exceeds the limit.
querystringyesKeywords to search (e.g., "median household income", "poverty", "bachelor's degree"). Each word must match a whole word of the label or of the concept, ignoring case and punctuation, so "rate" does n…
yearnumber–Vintage year to search (default: latest available for the dataset).
NameTypeReqDescription
capnumber–The limit that was applied.
datasetstring–Dataset that was searched.
effectiveQuerystring–Query as the server parsed it.
errorobject–Present when the call failed. Absent on success.
noticestring–Guidance when no variables matched, when no variable contained every query word and the results hold only some of them, or when results were truncated — suggests other keywords, a narrower query, or…
shownnumber–Number of variables returned after the limit.
totalMatchesnumber–Variables that contain every query word, before the limit was applied — or, when none does, the variables that contain the most words.
truncatedboolean–True when totalMatches exceeded the limit and results were cut off.
variablesarray–Matching variables, best first: a variable whose label's last !!-separated segment or whose whole concept equals the query, then the query as a phrase in both label and concept, in the label only, in…
yearnumber–Vintage year that was searched.

No examples provided.

Common questions

What is the io.github.cyanheads/census-mcp-server server?

io.github.cyanheads/census-mcp-server is listed in the public MCP registry as io.github.cyanheads/census-mcp-server. Query U.S. Census Bureau data, variables, and geography via MCP. This page covers its hosted endpoint (https://census.caseyjhand.com/mcp).

Is the io.github.cyanheads/census-mcp-server server safe to use?

io.github.cyanheads/census-mcp-server scores 66 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the io.github.cyanheads/census-mcp-server server expose?

io.github.cyanheads/census-mcp-server exposes 8 tools: census_list_datasets, census_list_geographies, census_search_variables, census_get_variable, census_list_predicate_values, and 3 more. Their descriptions and schemas cost roughly 6,146 tokens of context every time the server is loaded.

Does the io.github.cyanheads/census-mcp-server server require authentication?

No. We connected to io.github.cyanheads/census-mcp-server without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the io.github.cyanheads/census-mcp-server server still maintained?

io.github.cyanheads/census-mcp-server is still listed as active in the MCP registry. We last reached this channel on 26 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.