ew-mcp
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ew-mcp Which counties have the lowest high school graduation rates?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
education-to-workforce-mcp
An MCP server over the Education-to-Workforce (E-W) Indicator Framework — 20 essential questions and 99 indicators covering how people progress from early education through the workforce, for the US, states, counties, and school districts.
The framework is Mathematica's, written with the Bill & Melinda Gates Foundation. The data tool that compiles federal data against it is the Urban Institute's. This server ships a compiled, pinned snapshot of that data — 12.2M observations in ~25 MB of Parquet — so it answers locally and makes no network calls.
No API key required. Read-only.
Prerequisites
Python 3.11+
Related MCP server: edp-mcp
Installation
git clone https://github.com/UrbanInstitute/education-to-workforce-mcp.git
cd education-to-workforce-mcp
uv syncTools
Tool | Purpose |
| Browse essential questions, or find an indicator/metric by concept |
| Explain one metric, indicator, essential question, or disaggregate — or the framework itself |
| Find the state/county/district geoid used by the data, from a name |
| Fetch metric values for places, or rank places on a metric |
Typical workflow: search → describe → resolve_place → get_data.
Tool reference
search
Browse the framework, or find a metric by concept.
Parameter | Type | Description |
| string (optional) | A concept — |
describe
Explain one metric, indicator, essential question, disaggregate, or the framework overview.
Parameter | Type | Description |
| string |
|
resolve_place
Find the geoid for a state, county, or school district, from a name.
Parameter | Type | Description |
| string | Place name — |
| string (optional) |
|
get_data
Fetch metric values for places, or rank places on a metric.
Parameter | Type | Description |
| string | Comma-separated ids: |
| string |
|
| string (optional) | Comma-separated geoids from |
| string (optional) | 2-digit state FIPS — every place at |
| string (optional) | Comma-separated years: |
| string (optional) | A dimension ( |
| string (optional) |
|
| integer (default: 10) | How many places to return when ranking |
Running it
MCP Inspector (interactive testing)
uv run mcp dev src/ew_mcp/server.pyOpens a browser at http://localhost:6274 — connect, open Tools, and run
any tool with parameters.
Claude Desktop / Claude Code / VS Code / Copilot CLI
{
"mcpServers": {
"ew-mcp": {
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/education-to-workforce-mcp", "ew-mcp"]
}
}
}Client | Where it goes |
Claude Desktop |
|
Claude Code |
|
VS Code (Copilot) |
|
stdio (direct)
uv run ew-mcpStreamable HTTP (hosted)
MCP_TRANSPORT=streamable-http PORT=8080 uv run ew-mcpMCP is served at POST /mcp; GET /health is a plain unauthenticated health
check for a load balancer or orchestrator.
Variable | Default | Purpose |
|
|
|
|
| Listen port |
|
| Bind address |
| (unset) | Comma-separated |
| (unset) | Comma-separated |
Set MCP_ALLOWED_HOSTS to the public hostname before exposing this beyond a
private network. Both are unset by default, which leaves the SDK's
DNS-rebinding protection off — setting either turns it on. Note that enabling it
with an allow-list that omits the real hostname rejects every request.
Hosted
Also available as a hosted streamable-HTTP server: https://educationdata.urban.org/mcp/ew
Tests
uv run pytest -qTests run against the compiled data in src/ew_mcp/data/ — no network. If the
store is absent they skip rather than fail.
Available Tools
4 toolsdescribeDescribe a metric or indicatorARead-onlyIdempotent
Explain one Education-to-Workforce metric, indicator, or essential question, with the years and geographies it actually covers and a link to the framework's own page for it.
Coverage is derived from the data rather than upstream metadata, which disagrees with reality for 22 metrics.
LINK PEOPLE TO THE SOURCE: every metric and indicator described here carries the framework's own page for it at educationtoworkforce.org. Pass that link on when someone wants the definition, the evidence or the measurement guidance rather than a number — it beats paraphrasing, and it is where the framework lives.
Args: target: "m47" (metric), "i5" (indicator), "eq12" (essential question); a bare number is read as a metric id. Also "framework" for the overview and citation, or "disaggregates" for the queryable breakdown dimensions.
Inputs: target (required). Returns: result
get_dataGet metric valuesARead-onlyIdempotent
Fetch Education-to-Workforce metric values for places, or rank places on
a metric. Choose places one of three ways: geo_ids for specific ones,
state for every place at that level in a state, or rank for the extremes.
State and national benchmarks are added automatically for a handful of places; demographic context is added for a whole state.
Coverage is uneven: districts carry ~35 metrics, counties ~62, and many places have no data for a given metric. "No data here" is a real finding — report it rather than substituting a different geography.
Every result carries its own reading notes and caveats. Use them: values are rendered for you, some metrics are signed representation gaps rather than rates, and there are NO margins of error, sample sizes or denominators anywhere in this dataset, so never call a difference significant.
Args: metric_ids: Comma-separated ids — "47" or "47,51". geo_level: "national", "state", "county", or "district". geo_ids: Comma-separated geoids from resolve_place. state: 2-digit state FIPS — every place at geo_level in that state. years: Comma-separated years — "2022" or "2013,2022". Omit for all. disaggregate: A dimension ("race", "gender", "disability", "ell", "income") for every group, or one group code ("d1_hispanic"). Ranking requires a single group code. rank: "highest" or "lowest" to rank places instead of listing values. limit: How many places to return when ranking.
Inputs: geo_level (required), metric_ids (required), rank, limit, +4 more. Returns: result
resolve_placeResolve a place name to a geoidARead-onlyIdempotent
Find the state, county, or school-district geoid used by get_data.
Returns ranked candidates and does NOT auto-pick: ~30 states have a "Washington County", and a silently wrong pick is indistinguishable from a right one once it reaches a number. Name the place and geoid you chose in your answer. When candidates span geo levels (a county and a district of the same name), ASK — they are different grains with different coverage, so the wrong pick changes what is answerable, not just the number.
For every place in a state, skip this and use get_data(state="12").
Args: name: Place name — "Cook County", "Illinois", "Chicago Public Schools". District names are official NCES names. geo_level: "state", "county", or "district".
Inputs: name (required), geo_level. Returns: result
searchSearch the frameworkARead-onlyIdempotent
Browse the Education-to-Workforce Framework, or find its metrics by concept. Searches metric and indicator names plus the framework's own definitions, so conceptual terms match even when a metric is worded differently. Matches per-word and ignores word order, so "neighborhood poverty" and "poverty in the neighborhood" hit the same records — try a short multi-word phrase before assuming something isn't covered.
NOT COVERED anywhere in this dataset: individual schools, individual colleges, and local labour market data. It stops at school district. Say so rather than answering from a different grain.
Args: query: A concept — "gifted", "student debt", "chronic absence". Omit to list the 20 essential questions, which is the best starting point.
Inputs: query. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 4 tools
The four tools form a clear pipeline: search finds metrics by concept, describe explains a specific metric/indicator/essential question, resolve_place turns a name into a geoid, and get_data fetches values. There is mild overlap between search and describe (both surface framework content), but the args and outputs make the boundary clear in practice.
Two tools use bare verbs (search, describe) while two use a verb_noun pattern (resolve_place, get_data). Individually readable and unambiguous, but the conventions are mixed rather than a single predictable pattern.
Four tools is a tight, well-scoped read-only set for a data framework: discover, explain, geocode, fetch. Nothing feels redundant, though it sits near the thin end where one more operation (e.g. an explicit metric enumeration) might round it out.
The surface covers the full read lifecycle for the domain — find a metric, understand it, resolve a place, retrieve or rank values, including automatic benchmarks and disaggregation options. Being a read-only data server, missing write ops are not gaps; the main absence is a direct way to enumerate all available metrics/geographies without a query.
Maintenance
Related MCP Connectors
Query 4,300+ ranked metros across sixteen dimensions: profiles, search, and head-to-head comparisons
Query, filter, aggregate, and link Georgia education, Census, immigration, and health datasets.
Query 29,500+ World Bank development indicators for 200+ countries across 60+ years.
Macroeconomic and other official data from 170+ publishers, resolved from natural language with provenance.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceFederated MCP server that routes K-12 education data requests to public sources like Urban Institute, EDC/Zelma, NAEP, and MA E2C, handling comparability and provenance automatically.MIT

edp-mcpofficial
AlicenseAqualityCmaintenanceEnables querying the Urban Institute's Education Data Portal — harmonized federal data on schools, school districts, and colleges — through a discovery-first set of tools that search and describe datasets, fetch raw records or aggregated statistics, decode coded values, and resolve institution names to IDs, with no API key required and read-only access to the live API.6MIT- AlicenseNot gradedqualityBmaintenanceEnables natural-language queries about US K-12 public schools, districts, per-pupil funding and spending, and child poverty estimates from keyless federal data.127 npmMIT
- FlicenseNot gradedqualityBmaintenanceEnables AI assistants to explore, compare, and engage with postsecondary education and training offerings—programs, courses, certifications, credit transfer, prior learning, and career transitions—with sourced, snapshot-dated answers and explicit statements of missing data.-