About college-scorecard-mcp-server
An MCP server for exploring U.S. Department of Education College Scorecard data. It helps students, researchers, and advisers search and compare institutions, examine program outcomes, and calculate education-value ratios.
Key features
- 01Search and compare U.S. colleges
- 02Retrieve institution profiles and outcomes
- 03Explore program earnings and debt
- 04Calculate debt and price-to-earnings ratios
- 05Look up CIP groups and data fields
Use cases
- 01Compare costs and admissions across schools
- 02Review earnings for a field of study
- 03Assess a school’s price relative to earnings
MCP support
Exposes College Scorecard search, comparison, profile, program, and analysis tools, along with school and program resources and a comparison prompt. Supports STDIO and Streamable HTTP, including a hosted endpoint.
Configuration
Remote servers need no local install. Pick your client, then copy the config or install in one click.
https://college-scorecard.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-college-scorecard https://college-scorecard.caseyjhand.com/mcp{"mcpServers":{"cyanheads-college-scorecard":{"type":"http","url":"https://college-scorecard.caseyjhand.com/mcp"}}}Open in Cursor{"servers":{"cyanheads-college-scorecard":{"type":"http","url":"https://college-scorecard.caseyjhand.com/mcp"}}}Open in VS Code{"mcpServers":{"cyanheads-college-scorecard":{"type":"http","url":"https://college-scorecard.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-college-scorecard":{"serverUrl":"https://college-scorecard.caseyjhand.com/mcp"}}}Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.
Tools
9| Parameter | Type | Required | Description |
|---|---|---|---|
| limit | integer | No | Maximum number of matching codes to return. |
| query | string | Yes | Search term — program name keyword (e.g. "computer science", "nursing", "business"). Matches against CIP titles and family names. |
Details
From the project README@cyanheads/college-scorecard-mcp-server
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
Overview
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.
Tools
| 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. |
Resources
| 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.
Prompts
| Prompt | Description |
|---|---|
scorecard_compare_prompt | Structures a multi-school comparison analysis using Scorecard data |
Capability reference
scorecard_search_schools tool
- Search by name, state, ownership, degree level, size, acceptance rate, CIP code, or ZIP and distance (miles or
km).per_pageis capped at 100;pageis zero-indexed. State lists acceptWA,CA. - Returns core identity and cost metrics for quick scanning.
sorttakes an API expression such aslatest.cost.avg_net_price.overall:asc(:descreverses it).men_onlyandwomen_onlyaccept true or false.
scorecard_get_school tool
- Accepts a school ID or an array of up to 1,000. The first 100 distinct IDs are fetched;
missing_idslists fetched IDs with no record andunprocessed_idslists the excess. - Default profiles cover costs, admissions, outcomes, financial aid, demographics, and completion rates. Custom
fieldsreturnsselected_fieldswith the requested values, andabsent_fieldslists requested paths missing from the response. - HBCU and single-sex flags are true/false when known and unknown when absent.
scorecard_compare_schools tool
- Accepts 2–5 school unit IDs and one topic:
costs,admissions,outcomes, oraid. - Returns metric values and ranks from one API call: equal values share a rank (1, 1, 3) and unavailable values are unranked.
- Each cell's
availabilitydistinguishes available, unavailable, and privacy-suppressed values.
scorecard_get_programs tool
- Accepts one school ID, with optional CIP code (dotted or undotted),
credential_level, and minimum earnings filters. A school with no matching programs returns an empty collection; a nonexistent school is a lookup error. - Returns median earnings and graduate counts 1 year after the highest credential.
earnings_availabilityisavailable,unavailable, orprivacy_suppressed, withsuppressed_countandunavailable_count. median_debtis completers' cumulative Stafford/Grad PLUS borrowing.ipeds_awards_year1andipeds_awards_year2count awards in each year of the pooled debt cohort, not students.
scorecard_search_programs tool
- Search by CIP code or program name, with optional integer
credential_level(1–8 and 99), state, ownership, net price, earnings, and debt filters. Zero-indexedpageandper_page(up to 100) paginate schools, so returned program rows may exceedper_page. - Returns school IDs and names with program metrics,
credential_level, andcredential_title. Available earnings sort first; availability, debt, and award fields matchscorecard_get_programs. min_earningsfilters locally, so totals and pagination are upstream school counts before filtering. Earnings and debt thresholds are inclusive and exclude unknown values.
scorecard_get_earnings tool
- Accepts one school ID and optional data-file start
yearsfrom 1996–2025 (file vintages, not entry years). Omityearsor pass[]for the snapshot only. - Covers federally aided undergraduate entrants working and not enrolled, regardless of completion: medians at 6/8/10 years after entry, 6/10-year P25/P75, and non-male/male 6-year medians.
current_availabilityandtrend[].availabilityclassify each metric.current_contextandtrend[].contextgivedata_file_year,entry_cohorts,measurement_years, anddollar_year; values keep the provider's dollar basis, so check it before comparing across vintages.
scorecard_value_analysis tool
- Accepts one school ID; optional
family_incomeselects the applicable net price bracket ($0–30k, $30k–48k, $48k–75k, $75k–110k, or $110k+). - Returns ratios alongside their source figures.
effective_net_priceis the price used, andnet_price_basisisincome_bracket,overall, orunavailable. - If the bracket is missing, the overall price is used and
data_notessays so. Ratios require positive annual earnings.
scorecard_lookup_cip tool
- Search by nonblank keyword or partial name (default limit 20, capped at 50). Dotted
11.07and undotted1107are equivalent. - Returns exact group titles and family identities from 186 current NCES CIP 2020 four-digit groups, a subset of the full taxonomy. Related six-digit program names also match and return their group; no matches return an empty collection with guidance.
scorecard_list_fields tool
- Search 78 curated offline field entries by nonblank query (default limit 30, capped at 100). Use before passing custom
fieldstoscorecard_get_school. - Returns field paths, descriptions, data types, categories, and API sorting support;
tipflags results containing unsortable fields.
scorecard://school/{id} resource
- Institutional profile as
application/json— identity, cost, admissions, outcomes, aid, and completion data idis the school unit ID (integer as string) fromscorecard_search_schoolslistreturns a handful of example school URIs; usescorecard_search_schoolsto discover others
scorecard://programs/{id} resource
- Program-level outcomes as
application/json— CIP code, title, credential level, 1-year earnings, cumulative Stafford/Grad PLUS debt, andipeds_awards_year1/ipeds_awards_year2with the same meanings as the program tools; missing metrics are null idis the school unit ID fromscorecard_search_schoolslistreturns a handful of example school URIs; usescorecard_search_schoolsto discover others
scorecard_compare_prompt prompt
- Arguments:
school_names(comma-separated list) andfocus(costs|outcomes|programs), both required costsandoutcomesrun school discovery,scorecard_compare_schools, profiles, and value analysis.programsruns school discovery, CIP lookup, andscorecard_get_programsper school, then compares earnings, debt, and IPEDS awards for matching credentials.
Features
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:
- Full College Scorecard API coverage: ~6,500 Title IV institutions, ~2,800 data fields spanning costs, outcomes, demographics, financial aid, and field-of-study earnings
- Program-level earnings: median earnings of graduates working and not enrolled 1 year after their highest credential, per school × CIP code × credential level
- Field pre-selection per tool — curated field sets appropriate to each tool's purpose; optional
fieldsoverride for custom queries - Embedded CIP taxonomy (186 groups) and field catalog (78 fields) served offline
- Geographic filtering via U.S. zip code + distance radius
Agent-friendly output:
- Availability distinguishes numbers (including zero), missing values, and explicit
PS/PrivacySuppressedprovider markers - Derived metrics sit alongside source figures in
scorecard_value_analysis, andscorecard_compare_schoolsadds ordinal ranks - School sorting uses indexed API fields; check
scorecard_list_fieldsbefore choosing a sort expression. Six-year earnings does not support API sorting. - Provider failures report distinct validation, authentication, throttling, timeout, and availability reasons; availability uses
api_errorand cancellation remainsRequestCancelled
Getting started
Public Hosted Instance
A 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"
}
}
}
Self-Hosted / Local
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
Prerequisites
- Bun v1.4.0 or higher (or Node.js v24+).
- A College Scorecard API key — free registration at api.data.gov/signup. Rate limit: 1,000 requests/hour per key.
Installation
- Clone the repository:
git clone https://github.com/cyanheads/college-scorecard-mcp-server.git
- Navigate into the directory:
cd college-scorecard-mcp-server
- Install dependencies:
bun install
- Configure environment:
cp .env.example .env
# edit .env and set SCORECARD_API_KEY
Configuration
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.
Running the server
Local development
-
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
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.
Project structure
| 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/. |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
- Handlers throw, framework catches — no
try/catchin tool logic - Use
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storage - Register new tools, resources, and prompts in the
createApp()arrays insrc/index.ts - Wrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
License
Apache-2.0 — see LICENSE for details.
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.