college-scorecard-mcp-server

v0.2.0 pre-1.0

Search, compare, and analyze U.S. college data — costs, earnings, programs, and outcomes — via MCP. STDIO or Streamable HTTP.

college-scorecard.caseyjhand.com/mcp
claude mcp add --transport http college-scorecard-mcp-server https://college-scorecard.caseyjhand.com/mcp
codex mcp add college-scorecard-mcp-server --url https://college-scorecard.caseyjhand.com/mcp
{
  "mcpServers": {
    "college-scorecard-mcp-server": {
      "url": "https://college-scorecard.caseyjhand.com/mcp"
    }
  }
}
gemini mcp add --transport http college-scorecard-mcp-server https://college-scorecard.caseyjhand.com/mcp
{
  "mcpServers": {
    "college-scorecard-mcp-server": {
      "command": "bunx",
      "args": [
        "mcp-remote",
        "https://college-scorecard.caseyjhand.com/mcp"
      ]
    }
  }
}
{
  "mcpServers": {
    "college-scorecard-mcp-server": {
      "type": "http",
      "url": "https://college-scorecard.caseyjhand.com/mcp"
    }
  }
}
curl -X POST https://college-scorecard.caseyjhand.com/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1.0.0"}}}'

Tools

9

scorecard_lookup_cip

Search the Classification of Instructional Programs (CIP) taxonomy by keyword or partial name. Returns matching CIP codes with standard titles. Use this before passing cip_code filters to scorecard_search_programs or scorecard_get_programs when you know a program by name but not its code. Served entirely from embedded static data — no API call, no rate limit impact.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scorecard_lookup_cip",
    "arguments": {
      "query": "<query>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "minLength": 1,
      "description": "Search term — program name keyword (e.g. \"computer science\", \"nursing\", \"business\"). Matches against CIP titles and family names."
    },
    "limit": {
      "default": 20,
      "description": "Maximum number of matching codes to return.",
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    }
  },
  "required": [
    "query",
    "limit"
  ],
  "additionalProperties": false
}
view source ↗

scorecard_list_fields

Search the College Scorecard field catalog by keyword. Returns matching field paths, descriptions, data types, and whether each field supports API-side sorting. Use before passing custom field paths to the fields parameter on scorecard_search_schools or scorecard_get_school to verify a path is valid. Served entirely from embedded static data — no API call, no rate limit impact.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scorecard_list_fields",
    "arguments": {
      "query": "<query>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "minLength": 1,
      "description": "Keyword to search the field catalog (e.g. \"tuition\", \"earnings\", \"admissions\", \"debt\"). Matches against field paths, descriptions, and category names."
    },
    "limit": {
      "default": 30,
      "description": "Maximum number of matching fields to return.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "required": [
    "query",
    "limit"
  ],
  "additionalProperties": false
}
view source ↗

scorecard_search_schools

open-world

Search and filter U.S. colleges and universities by name, location, type, size, and acceptance rate. Returns a list with core identity and cost metrics for each match. For a full institutional profile use scorecard_get_school; for cross-institution program rankings use scorecard_search_programs. Geographic filtering requires a U.S. zip code and a distance string (e.g. "50mi"). State filter uses two-letter codes (e.g. "WA", "CA"). Ownership: 1=public, 2=private nonprofit, 3=for-profit. Degree level: 0=non-degree, 1=certificate, 2=associate, 3=bachelor, 4=graduate.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scorecard_search_schools",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "query": {
      "description": "School name search — partial or full name; all words must appear.",
      "type": "string"
    },
    "state": {
      "description": "Filter to schools in this state (two-letter code, e.g. \"WA\").",
      "type": "string",
      "minLength": 2,
      "maxLength": 2
    },
    "ownership": {
      "description": "Control type: 1=public, 2=private nonprofit, 3=private for-profit.",
      "type": "integer",
      "minimum": 1,
      "maximum": 3
    },
    "degree_level": {
      "description": "Predominant degree: 0=non-degree/certificate, 1=certificate, 2=associate, 3=bachelor, 4=graduate.",
      "type": "integer",
      "minimum": 0,
      "maximum": 4
    },
    "size_range": {
      "description": "Undergraduate enrollment size range. Omit for no size filter.",
      "type": "object",
      "properties": {
        "min": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991,
          "description": "Minimum enrollment size."
        },
        "max": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991,
          "description": "Maximum enrollment size."
        }
      },
      "required": [
        "min",
        "max"
      ],
      "additionalProperties": false
    },
    "acceptance_rate_range": {
      "description": "Acceptance rate range as decimals (0–1). Omit for no filter.",
      "type": "object",
      "properties": {
        "min": {
          "type": "number",
          "minimum": 0,
          "maximum": 1,
          "description": "Minimum acceptance rate as a decimal (e.g. 0.1 for 10%)."
        },
        "max": {
          "type": "number",
          "minimum": 0,
          "maximum": 1,
          "description": "Maximum acceptance rate as a decimal (e.g. 0.9 for 90%)."
        }
      },
      "required": [
        "min",
        "max"
      ],
      "additionalProperties": false
    },
    "zip": {
      "description": "U.S. zip code for geographic center. Requires distance to be set.",
      "type": "string"
    },
    "distance": {
      "description": "Search radius around zip (e.g. \"25mi\", \"50km\"). Requires zip to be set.",
      "type": "string"
    },
    "cip_code": {
      "description": "Filter to schools offering this CIP 4-digit program code (e.g. \"11.07\"). Use scorecard_lookup_cip to find codes.",
      "type": "string"
    },
    "sort": {
      "description": "Upstream sort expression on an indexed field, e.g. \"latest.cost.avg_net_price.overall:asc\" or \":desc\" for reverse order. Use scorecard_list_fields for sort support; omission keeps API ordering.",
      "type": "string"
    },
    "men_only": {
      "description": "True selects men-only institutions; false selects institutions explicitly marked not men-only. Omit to include unknown values.",
      "type": "boolean"
    },
    "women_only": {
      "description": "True selects women-only institutions; false selects institutions explicitly marked not women-only. Omit to include unknown values.",
      "type": "boolean"
    },
    "per_page": {
      "default": 20,
      "description": "Results per page (max 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "page": {
      "default": 0,
      "description": "Zero-indexed page number for pagination.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "per_page",
    "page"
  ],
  "additionalProperties": false
}
view source ↗

scorecard_get_school

open-world

Full institutional profile for one or more school IDs — costs, admissions, outcomes, aid, demographics, and completion rates. Pass a single ID or an array of up to 100 IDs. For side-by-side comparison on a specific dimension (costs, admissions, outcomes, or aid) use scorecard_compare_schools. The fields parameter accepts a comma-separated list of field paths from scorecard_list_fields to override the default field set.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scorecard_get_school",
    "arguments": {
      "id": "<id>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Single school unit ID as string."
        },
        {
          "type": "number",
          "description": "Single school unit ID as number."
        },
        {
          "type": "array",
          "items": {
            "anyOf": [
              {
                "type": "string",
                "description": "School unit ID as string."
              },
              {
                "type": "number",
                "description": "School unit ID as number."
              }
            ],
            "description": "School unit ID (string or number)."
          },
          "description": "Array of school unit IDs (up to 100)."
        }
      ],
      "description": "School unit ID or array of unit IDs (up to 100). IDs are integers from scorecard_search_schools."
    },
    "fields": {
      "description": "Optional comma-separated list of custom field paths from scorecard_list_fields. Overrides the default field set.",
      "type": "string"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
view source ↗

scorecard_get_programs

open-world

All field-of-study programs at one school with median earnings 1 year after the highest credential, cumulative Stafford/Grad PLUS debt, and IPEDS award counts for each year of the pooled debt cohort. This is the primary source for program-level earnings — institution-level 6/8/10-year earnings are available via scorecard_get_earnings. Earnings may be suppressed (null) for programs with small cohorts due to FERPA privacy protection; suppressed=true flags this explicitly. Use scorecard_lookup_cip to find CIP codes by name.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scorecard_get_programs",
    "arguments": {
      "id": "<id>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "anyOf": [
        {
          "type": "string",
          "description": "School unit ID as string."
        },
        {
          "type": "number",
          "description": "School unit ID as number."
        }
      ],
      "description": "School unit ID from scorecard_search_schools."
    },
    "cip_code": {
      "description": "Filter to one 4-digit CIP code, dotted or undotted (e.g. \"11.07\" or \"1107\" for Computer Science). Returns one row per credential level the school offers in that program.",
      "type": "string"
    },
    "min_earnings": {
      "description": "Minimum 1-year post-graduation median earnings filter.",
      "type": "number"
    },
    "credential_level": {
      "description": "Filter by credential level: 1=undergraduate certificate, 2=associate, 3=bachelor, 4=post-baccalaureate certificate, 5=master, 6=doctoral, 7=first professional, 8=graduate/professional certificate, 99=non-credential.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
view source ↗

scorecard_get_earnings

open-world

Institution-level post-graduation earnings for one school — median and percentiles at 6, 8, and 10 years after entry, with optional gender breakdown. This reflects outcomes across all graduates, not broken down by program. For program-specific earnings use scorecard_get_programs. For ROI analysis combining cost and debt data use scorecard_value_analysis. The years parameter accepts a list of cohort entry years for historical trend queries — omit for current snapshot only.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scorecard_get_earnings",
    "arguments": {
      "id": "<id>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "anyOf": [
        {
          "type": "string",
          "description": "School unit ID as string."
        },
        {
          "type": "number",
          "description": "School unit ID as number."
        }
      ],
      "description": "School unit ID from scorecard_search_schools."
    },
    "years": {
      "description": "Optional list of cohort entry years for historical trend data (e.g. [2011, 2012, 2013]). Omit for current snapshot.",
      "type": "array",
      "items": {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
      }
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
view source ↗

scorecard_search_programs

open-world

Find programs by CIP code across institutions, ranked by median earnings within the fetched school page. Accepts school-side filters (state, ownership, max cost). Minimum earnings is applied locally; totals and pagination count schools before local program filtering. Use scorecard_lookup_cip to convert program names to CIP codes. Returns school names and IDs alongside program earnings, cumulative Stafford/Grad PLUS debt, and IPEDS awards for follow-up calls to scorecard_get_school or scorecard_get_programs.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scorecard_search_programs",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "cip_code": {
      "description": "CIP 4-digit code to search for (e.g. \"11.07\" for Computer Science). Use scorecard_lookup_cip to find codes.",
      "type": "string"
    },
    "program_name": {
      "description": "Case-insensitive title substring matched within the fetched school page. Ignored when cip_code is provided; use cip_code for upstream program matching.",
      "type": "string"
    },
    "state": {
      "description": "Restrict to schools in this state (two-letter code).",
      "type": "string",
      "minLength": 2,
      "maxLength": 2
    },
    "ownership": {
      "description": "Restrict to school type: 1=public, 2=private nonprofit, 3=for-profit.",
      "type": "integer",
      "minimum": 1,
      "maximum": 3
    },
    "max_net_price": {
      "description": "Maximum average net price at the school.",
      "type": "number"
    },
    "min_earnings": {
      "description": "Minimum 1-year median earnings, inclusive. Filters this school page locally and excludes unavailable earnings; school totals are unchanged.",
      "type": "number"
    },
    "max_debt": {
      "description": "Maximum median cumulative Stafford/Grad PLUS debt across institutions at the same academic level, inclusive; excludes unavailable debt.",
      "type": "number"
    },
    "per_page": {
      "default": 20,
      "description": "Schools per page (max 100); program rows may exceed this count.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "page": {
      "default": 0,
      "description": "Zero-indexed page number.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "per_page",
    "page"
  ],
  "additionalProperties": false
}
view source ↗

scorecard_compare_schools

open-world

Normalized side-by-side comparison of 2–5 schools on a named topic. Returns percentile-ranked rows and relative deltas within the result set — structured output an agent cannot reconstruct from raw profiles. Topics: costs (tuition, net price by income bracket, debt), admissions (acceptance rate, SAT/ACT, enrollment), outcomes (graduation rate, earnings, repayment), aid (Pell grants, federal loans, debt, repayment). This is different from scorecard_get_school with multiple IDs — compare_schools adds within-set normalization.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scorecard_compare_schools",
    "arguments": {
      "ids": "<ids>",
      "topic": "<topic>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "ids": {
      "minItems": 2,
      "maxItems": 5,
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "string",
            "description": "School unit ID as string."
          },
          {
            "type": "number",
            "description": "School unit ID as number."
          }
        ],
        "description": "School unit ID (string or number)."
      },
      "description": "Array of 2–5 school unit IDs to compare."
    },
    "topic": {
      "type": "string",
      "enum": [
        "costs",
        "admissions",
        "outcomes",
        "aid"
      ],
      "description": "Comparison topic: costs, admissions, outcomes, or aid."
    }
  },
  "required": [
    "ids",
    "topic"
  ],
  "additionalProperties": false
}
view source ↗

scorecard_value_analysis

open-world

Analyze costs, debt, repayment progress, and earnings for one school. Returns debt-to-earnings and net-price-to-annual-earnings ratios alongside the source figures. family_income selects the applicable net-price bracket. Repayment progress is the share of borrowers paying down principal 3 years after entering repayment.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "scorecard_value_analysis",
    "arguments": {
      "id": "<id>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "anyOf": [
        {
          "type": "string",
          "description": "School unit ID as string."
        },
        {
          "type": "number",
          "description": "School unit ID as number."
        }
      ],
      "description": "School unit ID from scorecard_search_schools."
    },
    "family_income": {
      "description": "Annual family income in dollars. When provided, net price is shown for the applicable income bracket.",
      "type": "number"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
view source ↗

Resources

2

Institutional profile by unit ID — injectable context for school-specific conversations. Returns core identity, cost, admissions, and outcomes data.

uri scorecard://school/{id} mime application/json

Program-level outcomes by CIP code: median earnings of graduates working and not enrolled 1 year after their highest credential, median cumulative Stafford/Grad PLUS borrowing across institutions at the same academic level, and IPEDS awards in each of the two pooled debt-cohort years (not enrollment or unique students).

uri scorecard://programs/{id} mime application/json

Prompts

1

Structures a multi-school comparison analysis using College Scorecard data. Provide comma-separated school names and a focus area (costs, outcomes, or programs) to generate a research-ready comparison framework.

  • school_namesrequired — Comma-separated list of school names to compare (e.g. "University of Washington, University of Oregon, Oregon State University").
  • focusrequired — Comparison focus: costs (tuition, net price, debt), outcomes (earnings, completion, repayment), or programs (program-level earnings by field of study).