Skip to main content
Glama

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+

  • uv

Related MCP server: edp-mcp

Installation

git clone https://github.com/UrbanInstitute/education-to-workforce-mcp.git
cd education-to-workforce-mcp
uv sync

Tools

Tool

Purpose

search

Browse essential questions, or find an indicator/metric by concept

describe

Explain one metric, indicator, essential question, or disaggregate — or the framework itself

resolve_place

Find the state/county/district geoid used by the data, from a name

get_data

Fetch metric values for places, or rank places on a metric

Typical workflow: search → describe → resolve_place → get_data.

Tool reference

Browse the framework, or find a metric by concept.

Parameter

Type

Description

query

string (optional)

A concept — "gifted", "student debt", "chronic absence". Omit to list the 20 essential questions

describe

Explain one metric, indicator, essential question, disaggregate, or the framework overview.

Parameter

Type

Description

target

string

"m47" (metric), "i5" (indicator), "eq12" (essential question), "disaggregates", or "framework"

resolve_place

Find the geoid for a state, county, or school district, from a name.

Parameter

Type

Description

name

string

Place name — "Cook County", "Illinois", "Chicago Public Schools"

geo_level

string (optional)

"state", "county", or "district"

get_data

Fetch metric values for places, or rank places on a metric.

Parameter

Type

Description

metric_ids

string

Comma-separated ids: "47" or "47,51"

geo_level

string

"national", "state", "county", or "district"

geo_ids

string (optional)

Comma-separated geoids from resolve_place

state

string (optional)

2-digit state FIPS — every place at geo_level in that state

years

string (optional)

Comma-separated years: "2022" or "2013,2022". Omit for all

disaggregate

string (optional)

A dimension ("race", "gender", "disability", "income") or one group code ("d1_hispanic")

rank

string (optional)

"highest" or "lowest" to rank places instead of listing values

limit

integer (default: 10)

How many places to return when ranking


Running it

MCP Inspector (interactive testing)

uv run mcp dev src/ew_mcp/server.py

Opens 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_desktop_config.json — macOS: ~/Library/Application Support/Claude/; Windows: %APPDATA%\Claude\

Claude Code

.claude/settings.json, or claude mcp add ew-mcp -- uv run --directory /absolute/path/to/education-to-workforce-mcp NAME

VS Code (Copilot)

.vscode/settings.json, nested as {"mcp": {"servers": {...}}}

stdio (direct)

uv run ew-mcp

Streamable HTTP (hosted)

MCP_TRANSPORT=streamable-http PORT=8080 uv run ew-mcp

MCP is served at POST /mcp; GET /health is a plain unauthenticated health check for a load balancer or orchestrator.

Variable

Default

Purpose

MCP_TRANSPORT

stdio

stdio or streamable-http

PORT

8080

Listen port

MCP_HOST

0.0.0.0

Bind address

MCP_ALLOWED_HOSTS

(unset)

Comma-separated Host allow-list

MCP_ALLOWED_ORIGINS

(unset)

Comma-separated Origin allow-list

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 -q

Tests 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 tools
describeDescribe a metric or indicatorA
Read-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 valuesA
Read-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 geoidA
Read-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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.3/5.0

    Scored across 4 tools

    Disambiguation4/5

    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.

    Naming Consistency3/5

    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.

    Tool Count4/5

    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.

    Completeness4/5

    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

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      C
      maintenance
      Enables 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.
      6
      MIT
    • F
      license
      Not graded
      quality
      B
      maintenance
      Enables 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.
      -