Search, compare, and analyze U.S. college data — costs, earnings, programs, and outcomes.
Search, compare, and analyze U.S. college data — costs, earnings, programs, and outcomes — via MCP. STDIO or Streamable HTTP.
U.S. college data from the Department of Education College Scorecard API — costs, earnings, programs, and outcomes across roughly 6,500 Title IV institutions. Search and compare schools, look up program-level earnings by field of study, and compute ROI metrics like debt-to-earnings ratio from any MCP client. Runs as a stdio process or a local Streamable HTTP server.
| Tool | Description |
|---|---|
scorecard_search_schools | Search and filter institutions by name, location, type, size, and acceptance rate range. Returns core identity and cost metrics. |
scorecard_get_school | Full institutional profile for one or more school IDs — costs, admissions, outcomes, aid, demographics, and completion rates. |
scorecard_compare_schools | Normalized side-by-side comparison of 2–5 schools on a named topic. Returns percentile-ranked rows and relative deltas within the result set. |
scorecard_get_programs | All field-of-study programs at one school: median 1-year post-graduation earnings, debt at graduation, and enrollment figures. |
scorecard_search_programs | Find programs by CIP code or keyword across all institutions, ranked by median earnings. Accepts school-side filters (state, ownership, max cost). |
scorecard_get_earnings | Institution-level post-graduation earnings for one school — median at 6, 8, and 10 years after entry (P25/P75 at 6 and 10 years), with optional gender breakdown. |
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 a curated ~160-code Classification of Instructional Programs (CIP) taxonomy by keyword or partial name. Served from embedded static data — no API call or rate-limit impact. |
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 toolper_page up to 100, zero-indexed page)scorecard_get_school toolfields override for callers who need a narrower or broader field setscorecard_compare_schoolsscorecard_compare_schools toolcosts, admissions, outcomes, aid — each pulls a curated topic-specific field setscorecard_get_school with multiple IDs: output shape is rows, not profilesscorecard_get_programs toolcredential_level (certificate through doctoral/professional) and minimum earnings thresholdscorecard_get_earningssuppressed: true flag with suppression_note, not bare nullscorecard_search_programs toolper_page up to 100, zero-indexed page) is at the school level — a school with multiple matching programs can return more rows than per_pagescorecard_get_school or scorecard_get_programsscorecard_get_earnings toolearnings_6yr_female_median / earnings_6yr_male_median) when reportedyears array of cohort entry years returns a per-year trend row (6yr and 10yr median) alongside the current snapshotscorecard_get_programs, for ROI analysis use scorecard_value_analysissuppressed / suppression_note flags when earnings are unavailable at every time pointscorecard_value_analysis toolfamily_income parameter selects the applicable net price bracket ($0–30k, $30k–48k, $48k–75k, $75k–110k, $110k+)data_notes array flags any suppressed or missing fields with plain-language explanationsscorecard_lookup_cip toollimit, default 20)scorecard_list_fields toollimit, default 30)fields parameters to scorecard_search_schools or scorecard_get_school; a tip field flags when results include unsortable fieldsscorecard://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, debt, and enrollment per programid 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 requiredscorecard_search_schools → scorecard_compare_schools → scorecard_get_school, plus scorecard_get_programs/scorecard_lookup_cip when focus is programs or scorecard_value_analysis otherwiseBuilt 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:
suppressed: true flag with suppression_note — prevents hallucination of missing earnings data at selective schools with small cohortsscorecard_value_analysis — agents can verify arithmetic and branch on computed values, not raw numbersscorecard_compare_schools — structured output an agent cannot reconstruct from raw profiles without knowing the full comparison setAdd 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 rate limit. | — |
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. The server declares stateless in code; an explicit env value overrides it. | 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 pressure loop (ms, Bun only). Try 60000 if heap growth is observed under sustained 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.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
npx -y @cyanheads/college-scorecard-mcp-serverMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-cyanheads-college-scorecard-mcp-server": {
"command": "npx",
"args": [
"-y",
"@cyanheads/college-scorecard-mcp-server"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup referenceio.github.cyanheads/college-scorecard-mcp-server works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.