Search, compare, and analyze U.S. college data — costs, earnings, programs, and outcomes.
One address for any MCP client. No sign-in needed on this server.
8 read1 other
Grouped by tool name. At most: only reads or looks up information.
Odel charges nothing per call. The publisher may charge for its own service.
Search, compare, and analyze U.S. college data — costs, earnings, programs, and outcomes — via MCP. STDIO or Streamable HTTP.
Public Hosted Server: https://college-scorecard.caseyjhand.com/mcp
US college data from the Department of Education College Scorecard: costs, earnings, programs, and outcomes across roughly 6,500 institutions. Search and compare schools, look up earnings by field of study, and compute ROI metrics like debt-to-earnings ratio.
| Tool | Description |
|---|---|
scorecard_search_schools | Search institutions by name, location, type, size, acceptance rate, and single-sex flags; sort by supported API fields. Returns core identity and cost metrics. |
scorecard_get_school | Full institutional profiles — costs, admissions, outcomes, aid, demographics, single-sex flags, and completion rates. |
scorecard_compare_schools | Normalized side-by-side comparison of 2–5 schools on a named topic. Returns metric values, ordinal ranks, and a comparison summary. |
scorecard_get_programs | Field-of-study programs at one school: median 1-year earnings, cumulative Stafford/Grad PLUS debt, and IPEDS awards in the two pooled debt-cohort years. |
scorecard_search_programs | Find programs by CIP and credential or keyword, retain degree identity, and rank earnings within each fetched school page. |
scorecard_get_earnings | Earnings of federally aided undergraduate entrants working and not enrolled, regardless of completion: 6/8/10-year medians, 6/10-year P25/P75, and non-male/male 6-year medians. |
scorecard_value_analysis | Workflow tool: parallel-fetches cost, debt, repayment, and earnings data, then computes ROI metrics — debt-to-earnings ratio and net price to earnings ratio. |
scorecard_lookup_cip | Search 186 curated NCES CIP 2020 four-digit groups by code, keyword, or related program name. Served offline. |
scorecard_list_fields | Search the Scorecard field catalog by keyword. Returns matching field paths, descriptions, data types, and sort support. Use before passing custom fields parameters. |
| Resource | Description |
|---|---|
scorecard://school/{id} | Institutional profile by unit ID — injectable context for school-specific conversations |
scorecard://programs/{id} | Program-level outcomes for a school |
All resource data is also reachable via tools. Use scorecard_search_schools or scorecard_get_school to discover school IDs before constructing resource URIs.
| Prompt | Description |
|---|---|
scorecard_compare_prompt | Structures a multi-school comparison analysis using Scorecard data |
scorecard_search_schools toolkm). per_page is capped at 100; page is zero-indexed. State lists accept WA,CA.sort takes an API expression such as latest.cost.avg_net_price.overall:asc (:desc reverses it). men_only and women_only accept true or false.scorecard_get_school toolmissing_ids lists fetched IDs with no record and unprocessed_ids lists the excess.fields returns selected_fields with the requested values, and absent_fields lists requested paths missing from the response.scorecard_compare_schools toolcosts, admissions, outcomes, or aid.availability distinguishes available, unavailable, and privacy-suppressed values.scorecard_get_programs toolcredential_level, and minimum earnings filters. A school with no matching programs returns an empty collection; a nonexistent school is a lookup error.earnings_availability is available, unavailable, or privacy_suppressed, with suppressed_count and unavailable_count.median_debt is completers' cumulative Stafford/Grad PLUS borrowing. ipeds_awards_year1 and ipeds_awards_year2 count awards in each year of the pooled debt cohort, not students.scorecard_search_programs toolcredential_level (1–8 and 99), state, ownership, net price, earnings, and debt filters. Zero-indexed page and per_page (up to 100) paginate schools, so returned program rows may exceed per_page.credential_level, and credential_title. Available earnings sort first; availability, debt, and award fields match scorecard_get_programs.min_earnings filters locally, so totals and pagination are upstream school counts before filtering. Earnings and debt thresholds are inclusive and exclude unknown values.scorecard_get_earnings toolyears from 1996–2025 (file vintages, not entry years). Omit years or pass [] for the snapshot only.current_availability and trend[].availability classify each metric. current_context and trend[].context give data_file_year, entry_cohorts, measurement_years, and dollar_year; values keep the provider's dollar basis, so check it before comparing across vintages.scorecard_value_analysis toolfamily_income selects the applicable net price bracket ($0–30k, $30k–48k, $48k–75k, $75k–110k, or $110k+).effective_net_price is the price used, and net_price_basis is income_bracket, overall, or unavailable.data_notes says so. Ratios require positive annual earnings.scorecard_lookup_cip tool11.07 and undotted 1107 are equivalent.scorecard_list_fields toolfields to scorecard_get_school.tip flags results containing unsortable fields.scorecard://school/{id} resourceapplication/json — identity, cost, admissions, outcomes, aid, and completion dataid is the school unit ID (integer as string) from scorecard_search_schoolslist returns a handful of example school URIs; use scorecard_search_schools to discover othersscorecard://programs/{id} resourceapplication/json — CIP code, title, credential level, 1-year earnings, cumulative Stafford/Grad PLUS debt, and ipeds_awards_year1 / ipeds_awards_year2 with the same meanings as the program tools; missing metrics are nullid is the school unit ID from scorecard_search_schoolslist returns a handful of example school URIs; use scorecard_search_schools to discover othersscorecard_compare_prompt promptschool_names (comma-separated list) and focus (costs | outcomes | programs), both requiredcosts and outcomes run school discovery, scorecard_compare_schools, profiles, and value analysis. programs runs school discovery, CIP lookup, and scorecard_get_programs per school, then compares earnings, debt, and IPEDS awards for matching credentials.Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
College Scorecard-specific:
fields override for custom queriesAgent-friendly output:
PS / PrivacySuppressed provider markersscorecard_value_analysis, and scorecard_compare_schools adds ordinal ranksscorecard_list_fields before choosing a sort expression. Six-year earnings does not support API sorting.api_error and cancellation remains RequestCancelledA public instance is available at https://college-scorecard.caseyjhand.com/mcp — no installation required. No API key needed; the instance supplies its own. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"college-scorecard-mcp-server": {
"type": "streamable-http",
"url": "https://college-scorecard.caseyjhand.com/mcp"
}
}
}
Add the following to your MCP client configuration file. See api.data.gov/signup for a free API key.
{
"mcpServers": {
"college-scorecard-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/college-scorecard-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"SCORECARD_API_KEY": "your-api-key"
}
}
}
}
Or with npx (no Bun required):
{
"mcpServers": {
"college-scorecard-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/college-scorecard-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"SCORECARD_API_KEY": "your-api-key"
}
}
}
}
Or with Docker:
{
"mcpServers": {
"college-scorecard-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"-e", "SCORECARD_API_KEY=your-api-key",
"ghcr.io/cyanheads/college-scorecard-mcp-server:latest"
]
}
}
}
For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 SCORECARD_API_KEY=... bun run start:http
# Server listens at http://localhost:3010/mcp
git clone https://github.com/cyanheads/college-scorecard-mcp-server.git
cd college-scorecard-mcp-server
bun install
cp .env.example .env
# edit .env and set SCORECARD_API_KEY
All configuration is validated at startup via Zod schemas in src/config/server-config.ts. Key environment variables:
| Variable | Description | Default |
|---|---|---|
SCORECARD_API_KEY | Required. API key from api.data.gov (1,000 req/hour). | — |
MCP_TRANSPORT_TYPE | Transport: stdio or http | stdio |
MCP_HTTP_PORT | HTTP server port | 3010 |
MCP_HTTP_ENDPOINT_PATH | HTTP endpoint path where the MCP server is mounted | /mcp |
MCP_PUBLIC_URL | Public origin override for TLS-terminating reverse-proxy deployments | none |
MCP_SESSION_MODE | HTTP session mode: stateless, stateful, or auto | stateless |
MCP_AUTH_MODE | Authentication: none, jwt, or oauth | none |
MCP_LOG_LEVEL | Log level (debug, info, warning, error, etc.) | info |
MCP_GC_PRESSURE_INTERVAL_MS | Opt-in forced-GC loop interval in ms (Bun only); try 60000 if heap grows under HTTP load | 0 (disabled) |
LOGS_DIR | Directory for log files (Node.js only) | <project-root>/logs |
STORAGE_PROVIDER_TYPE | Storage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1 | in-memory |
OTEL_ENABLED | Enable OpenTelemetry instrumentation | false |
See .env.example for the full list of optional overrides.
Build and run:
# One-time build
bun run rebuild
# Run the built server
bun run start:stdio
# or
bun run start:http
Run checks and tests:
bun run devcheck # Lint, format, typecheck, security
bun run test # Vitest test suite
bun run lint:mcp # Validate MCP definitions against spec
docker build -t college-scorecard-mcp-server .
docker run --rm -e SCORECARD_API_KEY=your-key -p 3010:3010 college-scorecard-mcp-server
The Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/college-scorecard-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
| Directory | Purpose |
|---|---|
src/index.ts | createApp() entry point — registers tools/resources/prompts and inits services. |
src/config | Server-specific environment variable parsing and validation with Zod. |
src/mcp-server/tools | Tool definitions (*.tool.ts). Nine tools across search, profile, programs, earnings, and analysis. |
src/mcp-server/resources | Resource definitions. School profile and program outcomes resources. |
src/mcp-server/prompts | Prompt definitions. Multi-school comparison prompt. |
src/services | ScorecardService — fetch wrapper with retry, field selection, and pagination against the College Scorecard API. |
tests/ | Unit and integration tests mirroring src/. |
See CLAUDE.md for development guidelines and architectural rules. The short version:
try/catch in tool logicctx.log for request-scoped logging, ctx.state for tenant-scoped storagecreateApp() arrays in src/index.tsIssues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
Apache-2.0 — see LICENSE for details.