Skip to main content
Glama

Server Details

Search, compare, and analyze U.S. college data — costs, earnings, programs, and outcomes.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
99.8% over 23 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/college-scorecard-mcp-server
GitHub Stars
1
Server Listing
College Scorecard MCP Server
ChatGPT
–
Claude
–

TDQS

A4.1/5.0

Scored across 9 tools

Disambiguation4/5

Most tools have clearly distinct scopes: search_schools finds schools, get_school retrieves profiles, compare_schools compares schools, and search_programs vs get_programs separates cross-institution from single-school program queries. There is some conceptual overlap between get_earnings, get_programs earnings, and value_analysis, but the descriptions give enough guidance to choose correctly.

Naming Consistency4/5

All tools use a consistent scorecard_ prefix and snake_case, and nearly all follow a verb_noun pattern such as get_school, search_programs, lookup_cip, and compare_schools. The main deviation is scorecard_value_analysis, which is a noun phrase rather than a verb-led tool name, but it remains readable and predictable.

Tool Count5/5

Nine tools is well within the appropriate range for a domain as broad as College Scorecard data. The set covers lookup, search, retrieval, comparison, programs, earnings, fields, and value analysis without feeling bloated.

Completeness5/5

The tool surface covers the main College Scorecard workflows: school discovery, profiles, comparison, field catalog exploration, CIP lookup, program search/retrieval, earnings, and value analysis. Custom field access through get_school plus list_fields also provides an extensibility path for less common data needs.

Available Tools

9 tools
scorecard_compare_schoolsCompare SchoolsA
Read-only
Inspect

Side-by-side comparison of the first five distinct normalized school IDs, accepting up to 1,000 raw IDs. Remaining IDs are unprocessed; request them separately. Ordinal competition ranks share ties; shared OPEID6 outcomes and mixed-period price rows are unranked. Topics: costs, admissions, outcomes, aid. Use scorecard_get_school for full profiles.

NameRequiredDescriptionDefault
idsYes2–1,000 raw school IDs; first five distinct normalized IDs compared.
topicYesComparison topic: costs, admissions, outcomes, or aid.

Output Schema

NameRequiredDescription
rowsNoComparison rows — one per metric, with per-school values and ranks.
errorNoPresent when the call failed. Absent on success.
topicNoThe comparison topic used.
noticeNoWarning if some requested IDs returned no record.
schoolsNoSchools in the comparison set, in the same order as the ids input.
summaryNoBrief interpretive summary highlighting the most notable relative differences.
missing_idsNoProcessed IDs without records.
unprocessed_idsNoDistinct normalized IDs beyond the five-school serving cap.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the read-only and open-world annotations, it discloses that only the first five distinct normalized IDs are processed and all remaining IDs are left unprocessed. It also explains non-obvious ranking behavior: ordinal competition ranks share ties, while shared OPEID6 outcomes and mixed-period price rows are unranked.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loads the comparison scope and processing limit before covering ranking caveats and the alternative tool. The topic list duplicates the schema enum, and the ranking sentence is dense, but there is little overall waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a comparison tool with several edge cases, it covers processing limits, leftover-ID handling, ranking exceptions, topic scope, and the full-profile alternative. Combined with the complete input schema, output schema, and annotations, this provides sufficient context to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already documents accepted ID forms, the 2–1,000 range, first-five behavior, and the topic enum. The description reiterates normalization, truncation, and topics but adds little parameter-specific meaning beyond those structured fields, so the high-coverage baseline applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a side-by-side school comparison, its five-distinct-ID scope, and the available comparison topics. It also distinguishes the tool from scorecard_get_school, which is intended for full profiles.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit alternative and selection condition: use scorecard_get_school for full profiles rather than comparison. It also tells the agent to request IDs beyond the first five separately, providing clear guidance for oversized inputs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scorecard_get_earningsGet School EarningsA
Read-onlyIdempotent
Inspect

Institution-level earnings of federally aided undergraduate entrants working and not enrolled, regardless of completion. Reports medians at 6/8/10 years after entry, 6/10-year percentiles, and non-male/male 6-year medians. For graduate program earnings use scorecard_get_programs. years selects API data-file start years (1996–2025), including files without earnings observations. Per-metric availability and official cohort/measurement/dollar context accompany values; unknown metadata stays absent. No re-inflation is performed.

NameRequiredDescriptionDefault
idYesSchool ID from scorecard_search_schools.
yearsNoOptional API data-file start years from 1996–2025 (e.g. [2003, 2011, 2020]); valid files may lack observations. Omit or pass [] for snapshot only.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
trendNoHistorical rows by API data-file start year. Present only when nonempty years were supplied.
currentNoMost recent available earnings snapshot.
ope6_idNoProvider OPEID6 identifier, preserving leading zeros.
school_idNoSchool unit ID.
suppressedNoTrue only when every supported current metric has an explicit privacy marker.
school_nameNoInstitution name.
metric_scopeNoEarnings, debt and repayment are pooled at OPEID6; completion is campus-specific.
current_contextNoOfficial latest provenance keyed by metric, independent of returned values.
suppression_noteNoExplains suppression when suppressed=true.
current_availabilityNoAvailability keyed by every supported current earnings metric.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered; the description adds genuine context beyond that. It warns that years can select data files with no earnings observations, that per-metric availability and official cohort/measurement/dollar framing accompany values, that unknown metadata is omitted rather than inferred, and that no re-inflation is applied — all material to interpreting sparse or missing results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Content is front-loaded: what is reported, then the sibling alternative, then parameter and data-quality caveats. Sentences are dense but each carries substantive information; the metric enumeration is long yet necessary to describe the output shape, with only minor redundancy between the description and the schema on years.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the description still covers cohort definition, metric set, availability caveats, and sibling routing. What remains thin is edge behavior — e.g., failure modes for invalid ids or how sparse results are represented — leaving it strong but not exhaustive for a read tool with dual id formats.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both id and years are already documented in detail, including the 1996–2025 year bounds and the note that valid files may lack observations. The description's statement that years selects 'API data-file start years' largely restates the schema, adding only marginal emphasis on empty-file behavior, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource and scope — institution-level earnings for federally aided undergraduate entrants who are working and not enrolled, regardless of completion — and enumerates exactly what is reported (6/8/10-year medians, 6/10-year percentiles, non-male/male 6-year medians). It also explicitly routes graduate-level earnings to scorecard_get_programs, so an agent can separate it from that sibling without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear routing rule ('For graduate program earnings use scorecard_get_programs') and explains how the optional years array changes behavior, including the caveat that some files lack observations. It stops short of stating broader exclusions, such as when to prefer scorecard_value_analysis or compare tools, but the primary alternative is named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scorecard_get_programsGet School ProgramsA
Read-onlyIdempotent
Inspect

Page through field-of-study programs at one school, ranked and filtered by completion-based one-year earnings. Legacy highest-credential earnings remain separate from current one- and four-year completion series, with dictionary provenance. Earnings and debt pool across campuses sharing OPEID6 within CIP/credential; awards are campus-specific. Use scorecard_lookup_cip to find CIP codes by name.

NameRequiredDescriptionDefault
idYesSchool ID from scorecard_search_schools.
limitNoProgram rows per response; values above 100 normalize to 100.
offsetNoZero-based program row offset after filtering and stable earnings ordering.
cip_codeNoFilter 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.
min_earningsNoMinimum completion-based one-year median earnings; no legacy fallback.
credential_levelNoFilter 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.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
limitNoEffective program row limit, at most 100.
queryNoNormalized effective school ID and program selectors.
shownNoProgram rows returned on this page.
totalNoTotal matching programs before row pagination.
noticeNoGuidance when no programs match or some earnings are unavailable or privacy-suppressed.
offsetNoEffective zero-based program offset.
ope6_idNoProvider OPEID6 group identifier, preserving leading zeros; null when absent.
programsNoOne page of matching programs, stably sorted by completion-based one-year earnings descending, with unavailable current earnings last.
school_idNoSchool unit ID.
truncatedNoMore matching program rows remain.
nextOffsetNoNext program row offset, or null when exhausted.
provenanceNoDictionary cohort, measurement, and dollar provenance for each population.
school_nameNoInstitution name.
metric_scopeNoMetric aggregation scope within CIP and credential.
suppressed_countNoMatching programs with confirmed privacy-suppressed legacy highest-credential earnings, before row paging.
unavailable_countNoMatching programs with unavailable legacy highest-credential earnings of unknown cause, before row paging.

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint/openWorldHint/idempotentHint annotations, the description discloses important data behavior: legacy highest-credential earnings are separate from current completion series, earnings and debt pool across campuses sharing OPEID6 within CIP/credential, and awards remain campus-specific. These caveats materially affect interpretation of the results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and then layers in relevant caveats without filler. It is somewhat dense, especially 'dictionary provenance,' but every sentence contributes useful context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the full input schema, output schema, and annotations, the definition covers the essential data semantics an agent needs for correct interpretation. The main remaining gap is explicit routing against sibling program-search tools, but the core behavior is otherwise well specified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all six parameters, including CIP format, credential levels, and offset behavior. The description reinforces the completion-based earnings filter and points to CIP lookup, but adds little parameter-level meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: 'Page through field-of-study programs at one school,' with scope 'ranked and filtered by completion-based one-year earnings.' This is clear, but it does not explicitly distinguish this tool from sibling scorecard_search_programs except through the 'one school' constraint.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a useful pointer to scorecard_lookup_cip for finding CIP codes, which clarifies one supporting workflow. However, it does not say when to use this tool versus scorecard_search_programs or scorecard_get_earnings, and it provides no explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scorecard_get_schoolGet School ProfileA
Read-onlyIdempotent
Inspect

Institutional profiles for one or more school IDs. Accepts up to 1,000 elements, deduplicates normalized IDs, serves the first 100 distinct IDs, and reports missing and unprocessed IDs separately. Use scorecard_compare_schools for comparisons. Custom fields return requested paths and their JSON values in selected_fields, absent paths in absent_fields, and real identity; default profiles include costs, admissions, outcomes, aid, and completion rates.

NameRequiredDescriptionDefault
idYesPositive safe integer school ID or up to 1,000 raw elements. First 100 distinct normalized IDs served; discover IDs with scorecard_search_schools.
fieldsNoOptional comma-separated list of custom field paths from scorecard_list_fields. Overrides the default field set.
program_limitNoProjected program positions per parent array; values above 100 are clamped to 100.
program_offsetNoZero-based position in each projected program parent array.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoWarning when some requested IDs returned no record.
schoolsNoFull profiles for the requested school(s).
truncatedNoTrue when any projected program parent has remaining positions.
missing_idsNoProcessed distinct IDs with no returned record.
total_foundNoNumber of records returned.
total_requestedNoNumber of IDs requested.
unprocessed_idsNoDistinct IDs beyond the 100-ID serving cap, in caller order.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so safety is covered; the description adds the genuinely important batch semantics — 1,000 accepted, deduplication of normalized IDs, only the first 100 distinct IDs served, and missing versus unprocessed reported separately. The phrase 'real identity' is unexplained jargon, keeping this short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the resource and the batch limits, then the sibling alternative, then field semantics — a logical ordering with no wasted clauses. It is dense and a few phrases ('real identity') are opaque rather than concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-parameter, read-only lookup with a full schema and an output schema, the description supplies the batching, truncation, and field-override behavior an agent needs to call it correctly. Remaining gaps (pagination of program arrays, return shape) are covered by the structured fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description earns above that by explaining what the fields parameter produces (requested paths and their JSON values in selected_fields, absent paths in absent_fields) and by enumerating the default field set. It does not cover program_limit clamping, but that is documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific resource and scope ('Institutional profiles for one or more school IDs') and immediately distinguishes itself from the sibling compare tool. An agent can tell what it returns without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes comparisons to scorecard_compare_schools and explains that custom fields require scorecard_list_fields while omitting the argument yields the default profile. It does not restate the schema's guidance about discovering IDs via scorecard_search_schools, but the when-to-use context is otherwise clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scorecard_list_fieldsList Scorecard FieldsA
Read-onlyIdempotent
Inspect

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_get_school to find a supported path. Served entirely from embedded static data — no API call, no rate limit impact.

NameRequiredDescriptionDefault
limitNoRequested limit; serving cap 100, hard ceiling 1,000.
queryYesKeyword to search the field catalog (e.g. "tuition", "earnings", "admissions", "debt"). Matches against field paths, descriptions, and category names.

Output Schema

NameRequiredDescription
capNoThe limit that was applied.
tipNoUsage tip for unsortable fields when relevant.
errorNoPresent when the call failed. Absent on success.
queryNoThe search query used.
shownNoNumber of fields returned.
noticeNoNo-match guidance.
resultsNoMatching field entries ranked by relevance.
guidanceNoConcrete narrowing guidance when matches remain.
truncatedNoTrue when results were capped at the limit.
queryContextNoEffective selectors.
totalMatchesNoNumber of matching fields found.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so safety is covered structurally. The description adds genuinely new operational context: it is served from embedded static data with no API call and no rate limit impact, which affects whether an agent should worry about throttling. Minor remaining gap: it doesn't say how results are ranked or truncated when many fields match.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each doing distinct work: what it searches, what it returns, and when/how to use it. The no-API-call caveat is placed last where it belongs as a secondary reassurance rather than burying the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't enumerate return fields, yet it still summarizes them helpfully. Purpose, workflow placement, and cost profile are all covered, leaving nothing an agent needs in order to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both the query keyword semantics and the limit's serving cap vs. hard ceiling are already documented in the schema. The description mentions 'by keyword' but adds no format, matching, or limit guidance beyond what the schema provides — the baseline 3 for full coverage applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — search the College Scorecard field catalog by keyword — and distinguishes itself from data-returning siblings like scorecard_get_school by being a catalog lookup. The follow-on sentence describing returned attributes (field paths, descriptions, data types, sortability) sharpens the scope further.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the downstream use case and the sibling it feeds: 'Use before passing custom field paths to the fields parameter on scorecard_get_school to find a supported path.' The agent gets both a precondition and an ordering relationship, not just an implied purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scorecard_lookup_cipLookup CIP CodeA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
limitNoRequested limit; serving cap 50, hard ceiling 1,000.
queryYesSearch term — program name keyword (e.g. "computer science", "nursing", "business"). Matches against CIP titles and family names.
offsetNoZero-based offset into the complete relevance-ordered matches.

Output Schema

NameRequiredDescription
capNoThe limit that was applied.
errorNoPresent when the call failed. Absent on success.
queryNoThe search query used.
shownNoNumber of CIP codes returned.
noticeNoNo-match guidance.
offsetNoZero-based offset of this result page.
resultsNoMatching CIP entries ranked by relevance.
guidanceNoConcrete narrowing guidance when matches remain.
truncatedNoTrue when results were capped at the limit.
nextOffsetNoOffset to request next; absent when no matches remain.
queryContextNoEffective selectors.
totalMatchesNoNumber of matches found.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, but the description adds genuinely new operational context: results are served entirely from embedded static data with no API call and no rate-limit impact, which tells an agent it can call this freely. It does not discuss match ordering or how relevance ranking behaves across pages, which would round this out.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each carrying distinct information: what it searches, what it returns, when to use it versus siblings, and its cost profile. The usage guidance is front-loaded after the purpose statement with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and full parameter documentation, the description covers purpose, routing, and cost. The only thin area is result-set behavior for broad queries — it doesn't hint that matches may exceed the serving cap and require offset paging, though the schema does note the cap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so query, limit, and offset are each documented in the schema, including the 50-item serving cap versus the 1,000 hard ceiling. The description restates the keyword/partial-name matching behavior that the schema already specifies, adding little beyond it, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource — search the CIP taxonomy by keyword or partial name — and states exactly what comes back (matching CIP codes with standard titles). It is clearly distinguishable from the sibling lookup/search tools because it operates on a code taxonomy, not on institutions or programs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit use case and names the two alternatives it feeds into: '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.' The condition that selects this tool over those siblings is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scorecard_search_programsSearch ProgramsA
Read-only
Inspect

Find programs across institutions, ranked and filtered by completion-based one-year median earnings within the fetched school page. Legacy highest-credential values remain separate with their own provenance. Earnings and debt pool across campuses sharing OPEID6 within CIP/credential; awards are campus-specific. School page/per_page/total count schools; limit/offset page the matching program rows. Follow next to drain this school page before advancing to the next school page. Use scorecard_lookup_cip to find CIP codes.

NameRequiredDescriptionDefault
pageNoZero-indexed page number.
limitNoProgram rows per response; values above 100 normalize to 100.
stateNoComma-separated two-letter state codes; case and whitespace normalized, blanks unset.
offsetNoZero-based row offset within the filtered and sorted school page.
cip_codeNoCIP 4-digit code to search for (e.g. "11.07" for Computer Science). Use scorecard_lookup_cip to find codes.
max_debtNoMaximum median cumulative Stafford/Grad PLUS debt across institutions at the same academic level, inclusive; excludes unavailable debt.
per_pageNoSchools per page (max 100); program rows may exceed this count.
ownershipNoRestrict to school type: 1=public, 2=private nonprofit, 3=for-profit.
min_earningsNoMinimum completion-based one-year median earnings, inclusive, without legacy fallback; filters this school page locally while school totals remain unchanged.
program_nameNoCase-insensitive title substring matched within the fetched school page. Ignored when cip_code is provided; use cip_code for upstream program matching.
max_net_priceNoMaximum average net price at the school.
credential_levelNoProvider credential selector: 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; other integer levels may return no matches.

Output Schema

NameRequiredDescription
capNoThe effective program row limit that was applied.
nextNoContinuation using the same selectors and limits; null when exhausted.
pageNoCurrent page (zero-indexed).
errorNoPresent when the call failed. Absent on success.
limitNoEffective program row limit, at most 100.
queryNoNormalized effective selectors and pagination defaults.
shownNoProgram rows returned in this response.
totalNoTotal schools matching upstream filters, before pagination and local program filtering.
noticeNoRecovery hint when no programs match or earnings data is unavailable.
offsetNoEffective zero-based row offset within this school page.
per_pageNoResults per page used.
programsNoOne page of program rows retaining credential identities, stably sorted by completion-based one-year earnings descending, with unavailable current earnings last.
truncatedNoTrue when more program rows or a later school page remain.
nextOffsetNoNext row offset on this school page, or null when drained.
provenanceNoDictionary provenance for each distinct program population.
totalCountNoTotal schools matching upstream filters, before pagination and local program filtering.
metric_scopeNoAggregation scope within CIP and credential identity.
schools_shownNoSchools returned on this school page.
total_programsNoMatching program rows on the fetched school page before row pagination.
suppressed_countNoMatching programs with confirmed privacy-suppressed legacy highest-credential earnings, before row paging.
unavailable_countNoMatching programs with unavailable legacy highest-credential earnings of unknown cause, before row paging.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint and openWorldHint; the description adds substantial non-obvious behavior — earnings/debt pool across campuses sharing OPEID6 while awards are campus-specific, legacy credential values carry separate provenance, and min_earnings filters only the local school page without changing school totals. It stops short of noting rate limits or output shape, but this is well beyond what the annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded and every sentence carries information, but some phrasing is terse to the point of opacity ('Legacy highest-credential values remain separate with their own provenance') and the pagination-tier sentence is dense. No filler, though it could be ordered more cleanly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter tool with an output schema, the description covers the genuinely hard parts: two-tier pagination, cross-campus pooling, and local filtering semantics. The main remaining gap is sibling disambiguation against scorecard_get_programs and scorecard_search_schools, which an agent would still have to guess.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning the schema does not: it explains that page/per_page/total govern the school tier while limit/offset page the matching program rows within that tier, which is essential to using 12 parameters correctly. The 'without legacy fallback' note on min_earnings also clarifies a subtlety the schema only hints at.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Find programs across institutions, ranked and filtered by completion-based one-year median earnings'), so the agent knows exactly what the tool returns. It does not distinguish itself from the sibling scorecard_get_programs, which is the closest-looking alternative, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides two concrete usage instructions: use scorecard_lookup_cip to resolve CIP codes, and follow 'next' to drain a school page before advancing. However, it never says when to prefer this over scorecard_get_programs or scorecard_search_schools, so the core selection decision is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scorecard_search_schoolsSearch SchoolsA
Read-only
Inspect

Search and filter U.S. colleges and universities by name, location, type, size, and acceptance rate. Returns core identity and cost metrics. Use scorecard_get_school for profiles or scorecard_search_programs for programs. Geographic distance requires a U.S. ZIP; ZIP alone uses the provider default radius. State accepts comma-separated two-letter codes (e.g. WA,CA). Ownership: 1=public, 2=private nonprofit, 3=for-profit. Degree level: 0=Not classified, 1=certificate, 2=associate, 3=bachelor, 4=Entirely graduate-degree granting.

NameRequiredDescriptionDefault
zipNoFive-digit U.S. ZIP or ZIP+4. Alone uses the provider default radius; blank is unset.
pageNoZero-indexed page number for pagination.
sortNoUpstream 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.
queryNoSchool name search — partial or full name; all words must appear.
stateNoComma-separated two-letter state codes; case and whitespace normalized, blanks unset.
cip_codeNoFilter to schools offering this CIP 4-digit program code (e.g. "11.07"). Use scorecard_lookup_cip to find codes.
distanceNoNonnegative radius: bare miles, mi, or km, including decimals. Requires meaningful zip.
men_onlyNoTrue selects men-only institutions; false selects institutions explicitly marked not men-only. Omit to include unknown values.
per_pageNoResults per page (max 100).
ownershipNoControl type: 1=public, 2=private nonprofit, 3=private for-profit.
size_rangeNoUndergraduate enrollment size range. Omit for no size filter.
women_onlyNoTrue selects women-only institutions; false selects institutions explicitly marked not women-only. Omit to include unknown values.
degree_levelNoPredominant degree: 0=Not classified, 1=certificate, 2=associate, 3=bachelor, 4=Entirely graduate-degree granting.
acceptance_rate_rangeNoAcceptance rate range as decimals (0–1). Omit for no filter.

Output Schema

NameRequiredDescription
capNoThe per_page limit that was applied.
pageNoCurrent page (zero-indexed).
errorNoPresent when the call failed. Absent on success.
queryNoNormalized effective selectors and pagination defaults.
shownNoInstitutions returned on this page.
totalNoTotal institutions matching the filters (before pagination).
noticeNoRecovery hint when results are empty — echoes applied filters and suggests how to broaden.
schoolsNoMatching institutions.
per_pageNoResults per page used.
truncatedNoTrue when school pagination metadata indicates a later page exists.
totalCountNoTotal institutions matching the filters, before pagination.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds useful behavioral context beyond them: the result scope (core identity and cost metrics) and the silent default-radius behavior when only a ZIP is supplied. It does not discuss pagination limits or empty-result behavior, which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then alternatives, then parameter notes, with no filler sentences. It loses a little by restating the ownership and degree-level code tables that the schema already carries verbatim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-parameter search tool with nested range objects and an output schema, the description covers purpose, sibling routing, geographic and state syntax, and the coded filters. Return values can be left to the output schema, so nothing an agent needs in order to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is already documented, and the numeric code mappings for ownership and degree_level are repeated almost verbatim from the schema. The ZIP/distance interaction is the one place it adds meaning beyond the schema, so this sits at the baseline for a fully-covered schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (search/filter U.S. colleges and universities) plus the filterable dimensions, and explicitly distinguishes itself from two siblings (scorecard_get_school for profiles, scorecard_search_programs for programs). An agent can route correctly without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative tools and what each is for, and adds a real usage constraint (geographic distance requires a U.S. ZIP; ZIP alone falls back to the provider default radius). It does not state the inverse case (when not to use this tool if e.g. you already have a school ID), so it stops just short of fully explicit exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scorecard_value_analysisValue AnalysisA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
idYesSchool ID from scorecard_search_schools.
family_incomeNoAnnual family income in dollars. When provided, net price is shown for the applicable income bracket.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
ope6_idNoProvider OPEID6 identifier, preserving leading zeros.
school_idNoSchool unit ID.
data_notesNoFlags for suppressed, missing, or potentially unreliable data fields. Empty when all data is available.
list_priceNoEffective tuition and fees; see tuition_basis for academic-year or program-year period.
median_debtNoMedian debt at graduation (completers).
school_nameNoInstitution name.
metric_scopeNoEarnings, debt and repayment are pooled at OPEID6; completion is campus-specific.
family_incomeNoRequested annual family income in dollars.
tuition_basisNoPeriod of the effective tuition.
graduation_rateNoCompletion rate at 150% normal time (0–1).
net_price_basisNoSource of the effective price; unavailable means no estimate exists.
attendance_basisNoPeriod of the effective attendance cost, selected independently of tuition.
effective_tuitionNoAvailable academic-year tuition, otherwise program-year tuition.
net_price_overallNoAverage net price across all income levels.
cost_of_attendanceNoAvailable academic-year attendance cost, otherwise program-year cost.
earnings_6yr_medianNoMedian earnings 6 years after entry.
effective_net_priceNoPrice used in the annual-earnings ratio: available income bracket, otherwise overall net price.
earnings_10yr_medianNoMedian earnings 10 years after entry.
net_price_for_incomeNoNet price for the provided family income bracket. Omitted when family_income not provided.
tuition_program_yearNoReported program-year tuition and fees.
debt_to_earnings_ratioNoDebt-to-earnings ratio: median_debt / earnings_6yr_median. Values >1 indicate debt exceeds annual earnings.
repayment_progress_3yrNoShare of borrowers paying down principal (declining loan balance) 3 years after entering repayment (0–1).
attendance_program_yearNoReported program-year cost of attendance.
applicable_income_bracketNoRequested income bracket, retained even when its estimate is unavailable.
net_price_to_annual_earningsNoNet price divided by median annual earnings measured 6 years after entry. Uses the family-income net price when available, otherwise the overall net price.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so safety is covered; the description adds real value on top by naming the returned ratios and source figures and by defining the otherwise-ambiguous 'repayment progress' as the share of borrowers paying down principal 3 years after entering repayment. It stops short of covering data vintage, coverage gaps, or error behavior for unknown IDs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with purpose then outputs, with no filler. The family_income sentence is mildly redundant with the schema, keeping it just below top marks.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return-value documentation is not required, yet the description still summarizes what comes back and defines the one metric whose meaning an agent could not infer. For a 2-parameter read-only tool with full schema coverage, nothing needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters and the ID format in detail. The description's note that family_income selects the applicable net-price bracket largely restates the schema's own wording, adding little meaning beyond it; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Analyze') plus the exact resource set (costs, debt, repayment progress, earnings) scoped to 'one school', which cleanly separates it from scorecard_compare_schools (multi-school) and scorecard_get_earnings (earnings only). The second sentence further pins down the outputs (debt-to-earnings, net-price-to-annual-earnings ratios).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the single-school scope and the listed metrics suggest when to reach for this over compare_schools or get_earnings, but there is no explicit when-to-use, when-not, or named alternative. The one conditional behavior stated (family_income selects the net-price bracket) is parameter guidance rather than tool-selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 8 tool updates
    • Changedscorecard_compare_schools7 fields changed
      • changedInput schema / properties / ids / description
        Previous value: -"Array of 2–5 school unit IDs to compare."New value: +"2–1,000 raw school IDs; first five distinct normalized IDs compared."
      • changedInput schema / properties / ids / maxItems
        Previous value: -5New value: +1000
      • addedOutput schema / properties / missing_ids
        Added value: +{
        +  "description": "Processed IDs without records.",
        +  "items": {
        +    "type": "number"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / rows / items / properties / values / items / properties / basis
        Added value: +{
        +  "description": "Period of an effective price.",
        +  "enum": [
        +    "academic_year",
        +    "program_year"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / schools / items / properties / metric_scope
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Earnings, debt and repayment are pooled at OPEID6; completion is campus-specific.",
        +  "properties": {
        +    "completion": {
        +      "const": "campus",
        +      "description": "Completion is campus-specific.",
        +      "type": "string"
        +    },
        +    "debt": {
        +      "const": "opeid6",
        +      "description": "Debt is OPEID6-pooled.",
        +      "type": "string"
        +    },
        +    "earnings": {
        +      "const": "opeid6",
        +      "description": "Earnings are OPEID6-pooled.",
        +      "type": "string"
        +    },
        +    "repayment": {
        +      "const": "opeid6",
        +      "description": "Repayment is OPEID6-pooled.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "earnings",
        +    "debt",
        +    "repayment",
        +    "completion"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / schools / items / properties / ope6_id
        Added value: +{
        +  "description": "Provider OPEID6 identifier, preserving leading zeros.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / unprocessed_ids
        Added value: +{
        +  "description": "Distinct normalized IDs beyond the five-school serving cap.",
        +  "items": {
        +    "type": "number"
        +  },
        +  "type": "array"
        +}
    • Changedscorecard_get_earnings2 fields changed
      • addedOutput schema / properties / metric_scope
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Earnings, debt and repayment are pooled at OPEID6; completion is campus-specific.",
        +  "properties": {
        +    "completion": {
        +      "const": "campus",
        +      "description": "Completion is campus-specific.",
        +      "type": "string"
        +    },
        +    "debt": {
        +      "const": "opeid6",
        +      "description": "Debt is OPEID6-pooled.",
        +      "type": "string"
        +    },
        +    "earnings": {
        +      "const": "opeid6",
        +      "description": "Earnings are OPEID6-pooled.",
        +      "type": "string"
        +    },
        +    "repayment": {
        +      "const": "opeid6",
        +      "description": "Repayment is OPEID6-pooled.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "earnings",
        +    "debt",
        +    "repayment",
        +    "completion"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / ope6_id
        Added value: +{
        +  "description": "Provider OPEID6 identifier, preserving leading zeros.",
        +  "type": "string"
        +}
    • Changedscorecard_get_programs28 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 20,
        +  "description": "Program rows per response; values above 100 normalize to 100.",
        +  "maximum": 1000,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / min_earnings / description
        Previous value: -"Minimum 1-year post-graduation median earnings filter."New value: +"Minimum completion-based one-year median earnings; no legacy fallback."
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Zero-based program row offset after filtering and stable earnings ordering.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "school_id",
        -      "school_name",
        -      "programs",
        -      "total",
        -      "suppressed_count",
        -      "unavailable_count",
        -      "query"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "ope6_id",
        +      "metric_scope",
        +      "provenance",
        +      "shown",
        +      "offset",
        +      "limit",
        +      "nextOffset",
        +      "truncated",
        +      "school_id",
        +      "school_name",
        +      "programs",
        +      "total",
        +      "suppressed_count",
        +      "unavailable_count",
        +      "query"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / limit
        Added value: +{
        +  "description": "Effective program row limit, at most 100.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / metric_scope
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Metric aggregation scope within CIP and credential.",
        +  "properties": {
        +    "debt": {
        +      "const": "opeid6",
        +      "description": "Debt pools across campuses sharing OPEID6.",
        +      "type": "string"
        +    },
        +    "earnings": {
        +      "const": "opeid6",
        +      "description": "Earnings pool across campuses sharing OPEID6.",
        +      "type": "string"
        +    },
        +    "ipeds_awards": {
        +      "const": "campus",
        +      "description": "Awards belong to the campus.",
        +      "type": "string"
        +    },
        +    "program_identity": {
        +      "description": "Program dimensions retained within each pooled group.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "earnings",
        +    "debt",
        +    "ipeds_awards",
        +    "program_identity"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Next program row offset, or null when exhausted.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Effective zero-based program offset.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / ope6_id
        Added value: +{
        +  "description": "Provider OPEID6 group identifier, preserving leading zeros; null when absent.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / programs / description
        Previous value: -"All programs matching the filters, sorted by earnings descending with unavailable or privacy-suppressed earnings last."New value: +"One page of matching programs, stably sorted by completion-based one-year earnings descending, with unavailable current earnings last."
      • addedOutput schema / properties / programs / items / properties / completion_1yr_availability
        Added value: +{
        +  "description": "Availability of completion-based one-year median earnings.",
        +  "enum": [
        +    "available",
        +    "unavailable",
        +    "privacy_suppressed"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / programs / items / properties / completion_1yr_count
        Added value: +{
        +  "description": "Working and not enrolled completers in the one-year earnings population.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / programs / items / properties / completion_1yr_count_availability
        Added value: +{
        +  "description": "Availability of the matching one-year population count.",
        +  "enum": [
        +    "available",
        +    "unavailable",
        +    "privacy_suppressed"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / programs / items / properties / completion_1yr_median
        Added value: +{
        +  "description": "Median earnings one year after completion, in the stated dollar year.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / programs / items / properties / completion_4yr_availability
        Added value: +{
        +  "description": "Availability of completion-based four-year median earnings.",
        +  "enum": [
        +    "available",
        +    "unavailable",
        +    "privacy_suppressed"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / programs / items / properties / completion_4yr_count
        Added value: +{
        +  "description": "Working and not enrolled completers in the four-year earnings population.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / programs / items / properties / completion_4yr_count_availability
        Added value: +{
        +  "description": "Availability of the matching four-year population count.",
        +  "enum": [
        +    "available",
        +    "unavailable",
        +    "privacy_suppressed"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / programs / items / properties / completion_4yr_median
        Added value: +{
        +  "description": "Median earnings four years after completion, in the stated dollar year.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / programs / items / properties / credential_level_code
        Added value: +{
        +  "description": "Provider numeric credential identity; the legacy credential_level field remains a display label.",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / programs / items / properties / credential_title
        Added value: +{
        +  "description": "Provider credential title when reported.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / programs / items / properties / earnings_count_availability
        Added value: +{
        +  "description": "Availability of the legacy highest-credential population count.",
        +  "enum": [
        +    "available",
        +    "unavailable",
        +    "privacy_suppressed"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / programs / items / required
        Previous value: -[
        -  "code",
        -  "credential_level",
        -  "suppressed",
        -  "earnings_availability"
        -]New value: +[
        +  "completion_1yr_availability",
        +  "completion_1yr_count_availability",
        +  "completion_4yr_availability",
        +  "completion_4yr_count_availability",
        +  "earnings_count_availability",
        +  "code",
        +  "credential_level",
        +  "suppressed",
        +  "earnings_availability"
        +]
      • addedOutput schema / properties / provenance
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Dictionary cohort, measurement, and dollar provenance for each population.",
        +  "properties": {
        +    "completion_1yr": {
        +      "additionalProperties": false,
        +      "description": "Current completion-based one-year series.",
        +      "properties": {
        +        "cohort": {
        +          "description": "Pooled completion academic years.",
        +          "items": {
        +            "description": "Academic year.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "count_cell": {
        +          "description": "Most-recent count map cell.",
        +          "type": "string"
        +        },
        +        "count_variable": {
        +          "description": "Dictionary count variable.",
        +          "type": "string"
        +        },
        +        "dollar_year": {
        +          "description": "Inflation-adjusted dollar year.",
        +          "type": "number"
        +        },
        +        "measurement_years": {
        +          "description": "Earnings measurement calendar years.",
        +          "items": {
        +            "description": "Calendar year.",
        +            "type": "number"
        +          },
        +          "type": "array"
        +        },
        +        "median_cell": {
        +          "description": "Most-recent median map cell.",
        +          "type": "string"
        +        },
        +        "median_variable": {
        +          "description": "Dictionary median variable.",
        +          "type": "string"
        +        },
        +        "population": {
        +          "description": "Population represented.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "cohort",
        +        "measurement_years",
        +        "dollar_year",
        +        "median_variable",
        +        "count_variable",
        +        "median_cell",
        +        "count_cell",
        +        "population"
        +      ],
        +      "type": "object"
        +    },
        +    "completion_4yr": {
        +      "additionalProperties": false,
        +      "description": "Current completion-based four-year series.",
        +      "properties": {
        +        "cohort": {
        +          "description": "Pooled completion academic years.",
        +          "items": {
        +            "description": "Academic year.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "count_cell": {
        +          "description": "Most-recent count map cell.",
        +          "type": "string"
        +        },
        +        "count_variable": {
        +          "description": "Dictionary count variable.",
        +          "type": "string"
        +        },
        +        "dollar_year": {
        +          "description": "Inflation-adjusted dollar year.",
        +          "type": "number"
        +        },
        +        "measurement_years": {
        +          "description": "Earnings measurement calendar years.",
        +          "items": {
        +            "description": "Calendar year.",
        +            "type": "number"
        +          },
        +          "type": "array"
        +        },
        +        "median_cell": {
        +          "description": "Most-recent median map cell.",
        +          "type": "string"
        +        },
        +        "median_variable": {
        +          "description": "Dictionary median variable.",
        +          "type": "string"
        +        },
        +        "population": {
        +          "description": "Population represented.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "cohort",
        +        "measurement_years",
        +        "dollar_year",
        +        "median_variable",
        +        "count_variable",
        +        "median_cell",
        +        "count_cell",
        +        "population"
        +      ],
        +      "type": "object"
        +    },
        +    "debt": {
        +      "additionalProperties": false,
        +      "description": "Debt provenance distinct from earnings.",
        +      "properties": {
        +        "cell": {
        +          "description": "Most-recent map cell.",
        +          "type": "string"
        +        },
        +        "cohort": {
        +          "description": "Pooled debt academic years.",
        +          "items": {
        +            "description": "Academic year.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "population": {
        +          "description": "Borrower population.",
        +          "type": "string"
        +        },
        +        "variable": {
        +          "description": "Dictionary variable.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "cohort",
        +        "variable",
        +        "cell",
        +        "population"
        +      ],
        +      "type": "object"
        +    },
        +    "highest_credential_1yr": {
        +      "additionalProperties": false,
        +      "description": "Legacy highest-credential series.",
        +      "properties": {
        +        "cohort": {
        +          "description": "Pooled completion academic years.",
        +          "items": {
        +            "description": "Academic year.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "count_cell": {
        +          "description": "Most-recent count map cell.",
        +          "type": "string"
        +        },
        +        "count_variable": {
        +          "description": "Dictionary count variable.",
        +          "type": "string"
        +        },
        +        "dollar_year": {
        +          "description": "Inflation-adjusted dollar year.",
        +          "type": "number"
        +        },
        +        "measurement_years": {
        +          "description": "Earnings measurement calendar years.",
        +          "items": {
        +            "description": "Calendar year.",
        +            "type": "number"
        +          },
        +          "type": "array"
        +        },
        +        "median_cell": {
        +          "description": "Most-recent median map cell.",
        +          "type": "string"
        +        },
        +        "median_variable": {
        +          "description": "Dictionary median variable.",
        +          "type": "string"
        +        },
        +        "population": {
        +          "description": "Population represented.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "cohort",
        +        "measurement_years",
        +        "dollar_year",
        +        "median_variable",
        +        "count_variable",
        +        "median_cell",
        +        "count_cell",
        +        "population"
        +      ],
        +      "type": "object"
        +    },
        +    "ipeds_awards_year1": {
        +      "additionalProperties": false,
        +      "description": "First debt-cohort year awards.",
        +      "properties": {
        +        "academic_year": {
        +          "description": "Academic year of awards.",
        +          "type": "string"
        +        },
        +        "cell": {
        +          "description": "Most-recent map cell.",
        +          "type": "string"
        +        },
        +        "population": {
        +          "description": "Awards population.",
        +          "type": "string"
        +        },
        +        "variable": {
        +          "description": "Dictionary variable.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "academic_year",
        +        "variable",
        +        "cell",
        +        "population"
        +      ],
        +      "type": "object"
        +    },
        +    "ipeds_awards_year2": {
        +      "additionalProperties": false,
        +      "description": "Second debt-cohort year awards.",
        +      "properties": {
        +        "academic_year": {
        +          "description": "Academic year of awards.",
        +          "type": "string"
        +        },
        +        "cell": {
        +          "description": "Most-recent map cell.",
        +          "type": "string"
        +        },
        +        "population": {
        +          "description": "Awards population.",
        +          "type": "string"
        +        },
        +        "variable": {
        +          "description": "Dictionary variable.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "academic_year",
        +        "variable",
        +        "cell",
        +        "population"
        +      ],
        +      "type": "object"
        +    },
        +    "source": {
        +      "description": "Official dictionary URL.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "source",
        +    "highest_credential_1yr",
        +    "completion_1yr",
        +    "completion_4yr",
        +    "debt",
        +    "ipeds_awards_year1",
        +    "ipeds_awards_year2"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Program rows returned on this page.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / suppressed_count / description
        Previous value: -"Number of programs with confirmed privacy-suppressed earnings."New value: +"Matching programs with confirmed privacy-suppressed legacy highest-credential earnings, before row paging."
      • changedOutput schema / properties / total / description
        Previous value: -"Total programs returned after filtering."New value: +"Total matching programs before row pagination."
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "More matching program rows remain.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / unavailable_count / description
        Previous value: -"Programs with unavailable earnings of unknown cause."New value: +"Matching programs with unavailable legacy highest-credential earnings of unknown cause, before row paging."
    • Changedscorecard_get_school12 fields changed
      • addedInput schema / properties / program_limit
        Added value: +{
        +  "default": 20,
        +  "description": "Projected program positions per parent array; values above 100 are clamped to 100.",
        +  "maximum": 1000,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / program_offset
        Added value: +{
        +  "default": 0,
        +  "description": "Zero-based position in each projected program parent array.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / schools / items / properties / attendance_basis
        Added value: +{
        +  "description": "Period of the effective attendance cost, selected independently of tuition.",
        +  "enum": [
        +    "academic_year",
        +    "program_year"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / schools / items / properties / attendance_program_year
        Added value: +{
        +  "description": "Reported program-year cost of attendance.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / schools / items / properties / cost_of_attendance / description
        Previous value: -"Total cost of attendance per year."New value: +"Available academic-year attendance cost, otherwise program-year cost."
      • addedOutput schema / properties / schools / items / properties / effective_tuition
        Added value: +{
        +  "description": "Available academic-year tuition, otherwise program-year tuition.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / schools / items / properties / metric_scope
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Earnings, debt and repayment are pooled at OPEID6; completion is campus-specific.",
        +  "properties": {
        +    "completion": {
        +      "const": "campus",
        +      "description": "Completion is campus-specific.",
        +      "type": "string"
        +    },
        +    "debt": {
        +      "const": "opeid6",
        +      "description": "Debt is OPEID6-pooled.",
        +      "type": "string"
        +    },
        +    "earnings": {
        +      "const": "opeid6",
        +      "description": "Earnings are OPEID6-pooled.",
        +      "type": "string"
        +    },
        +    "repayment": {
        +      "const": "opeid6",
        +      "description": "Repayment is OPEID6-pooled.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "earnings",
        +    "debt",
        +    "repayment",
        +    "completion"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / schools / items / properties / ope6_id
        Added value: +{
        +  "description": "Provider OPEID6 identifier, preserving leading zeros.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / schools / items / properties / program_pages
        Added value: +{
        +  "description": "Per-parent program array paging in provider order; continuation applies to this school.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "One projected program parent page.",
        +    "properties": {
        +      "continuation": {
        +        "additionalProperties": false,
        +        "description": "Selectors to request for this school next.",
        +        "properties": {
        +          "program_limit": {
        +            "description": "Effective page limit.",
        +            "type": "number"
        +          },
        +          "program_offset": {
        +            "description": "Next requested position.",
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "program_offset",
        +          "program_limit"
        +        ],
        +        "type": "object"
        +      },
        +      "nextOffset": {
        +        "description": "Next position when more remain.",
        +        "type": "number"
        +      },
        +      "offset": {
        +        "description": "Zero-based requested position.",
        +        "type": "number"
        +      },
        +      "parent_path": {
        +        "description": "Provider program parent path.",
        +        "type": "string"
        +      },
        +      "shown": {
        +        "description": "Positions returned.",
        +        "type": "number"
        +      },
        +      "total": {
        +        "description": "Total provider positions before paging.",
        +        "type": "number"
        +      },
        +      "truncated": {
        +        "description": "Whether positions remain after this page.",
        +        "type": "boolean"
        +      }
        +    },
        +    "required": [
        +      "parent_path",
        +      "total",
        +      "offset",
        +      "shown",
        +      "truncated"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / schools / items / properties / tuition_basis
        Added value: +{
        +  "description": "Period of the effective tuition.",
        +  "enum": [
        +    "academic_year",
        +    "program_year"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / schools / items / properties / tuition_program_year
        Added value: +{
        +  "description": "Reported program-year tuition and fees.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when any projected program parent has remaining positions.",
        +  "type": "boolean"
        +}
    • Changedscorecard_lookup_cip6 fields changed
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Zero-based offset into the complete relevance-ordered matches.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "query",
        -      "results",
        -      "totalMatches",
        -      "queryContext",
        -      "truncated",
        -      "shown",
        -      "cap"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "query",
        +      "results",
        +      "totalMatches",
        +      "offset",
        +      "queryContext",
        +      "truncated",
        +      "shown",
        +      "cap"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Offset to request next; absent when no matches remain.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Zero-based offset of this result page.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / queryContext / properties / offset
        Added value: +{
        +  "description": "Applied zero-based offset.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / queryContext / required
        Previous value: -[
        -  "query",
        -  "limit"
        -]New value: +[
        +  "query",
        +  "limit",
        +  "offset"
        +]
    • Changedscorecard_search_programs30 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 20,
        +  "description": "Program rows per response; values above 100 normalize to 100.",
        +  "maximum": 1000,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / min_earnings / description
        Previous value: -"Minimum 1-year median earnings, inclusive. Filters this school page locally and excludes unavailable earnings; school totals are unchanged."New value: +"Minimum completion-based one-year median earnings, inclusive, without legacy fallback; filters this school page locally while school totals remain unchanged."
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Zero-based row offset within the filtered and sorted school page.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "total",
        -      "page",
        -      "per_page",
        -      "programs",
        -      "total_programs",
        -      "suppressed_count",
        -      "unavailable_count",
        -      "query",
        -      "totalCount",
        -      "truncated",
        -      "shown",
        -      "cap"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "metric_scope",
        +      "provenance",
        +      "shown",
        +      "offset",
        +      "limit",
        +      "nextOffset",
        +      "next",
        +      "total",
        +      "page",
        +      "per_page",
        +      "programs",
        +      "total_programs",
        +      "suppressed_count",
        +      "unavailable_count",
        +      "query",
        +      "totalCount",
        +      "truncated",
        +      "schools_shown",
        +      "cap"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / cap / description
        Previous value: -"The per_page limit that was applied."New value: +"The effective program row limit that was applied."
      • addedOutput schema / properties / limit
        Added value: +{
        +  "description": "Effective program row limit, at most 100.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / metric_scope
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Aggregation scope within CIP and credential identity.",
        +  "properties": {
        +    "debt": {
        +      "const": "opeid6",
        +      "description": "Debt pools across campuses sharing OPEID6.",
        +      "type": "string"
        +    },
        +    "earnings": {
        +      "const": "opeid6",
        +      "description": "Earnings pool across campuses sharing OPEID6.",
        +      "type": "string"
        +    },
        +    "ipeds_awards": {
        +      "const": "campus",
        +      "description": "Awards belong to the campus.",
        +      "type": "string"
        +    },
        +    "program_identity": {
        +      "description": "Program dimensions retained within each pooled group.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "earnings",
        +    "debt",
        +    "ipeds_awards",
        +    "program_identity"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / next
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": false,
        +      "properties": {
        +        "offset": {
        +          "description": "Row offset to request on that school page.",
        +          "type": "number"
        +        },
        +        "page": {
        +          "description": "School page to request.",
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "page",
        +        "offset"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Continuation using the same selectors and limits; null when exhausted."
        +}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "description": "Next row offset on this school page, or null when drained.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Effective zero-based row offset within this school page.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / programs / description
        Previous value: -"Program rows retain separate credential identities, sorted by earnings descending with unavailable or privacy-suppressed earnings last."New value: +"One page of program rows retaining credential identities, stably sorted by completion-based one-year earnings descending, with unavailable current earnings last."
      • addedOutput schema / properties / programs / items / properties / completion_1yr_availability
        Added value: +{
        +  "description": "Availability of completion-based one-year median earnings.",
        +  "enum": [
        +    "available",
        +    "unavailable",
        +    "privacy_suppressed"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / programs / items / properties / completion_1yr_count
        Added value: +{
        +  "description": "Working and not enrolled completers in the one-year earnings population.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / programs / items / properties / completion_1yr_count_availability
        Added value: +{
        +  "description": "Availability of the matching one-year population count.",
        +  "enum": [
        +    "available",
        +    "unavailable",
        +    "privacy_suppressed"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / programs / items / properties / completion_1yr_median
        Added value: +{
        +  "description": "Median earnings one year after completion, in the stated dollar year.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / programs / items / properties / completion_4yr_availability
        Added value: +{
        +  "description": "Availability of completion-based four-year median earnings.",
        +  "enum": [
        +    "available",
        +    "unavailable",
        +    "privacy_suppressed"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / programs / items / properties / completion_4yr_count
        Added value: +{
        +  "description": "Working and not enrolled completers in the four-year earnings population.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / programs / items / properties / completion_4yr_count_availability
        Added value: +{
        +  "description": "Availability of the matching four-year population count.",
        +  "enum": [
        +    "available",
        +    "unavailable",
        +    "privacy_suppressed"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / programs / items / properties / completion_4yr_median
        Added value: +{
        +  "description": "Median earnings four years after completion, in the stated dollar year.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / programs / items / properties / earnings_count
        Added value: +{
        +  "description": "Legacy highest-credential working/not-enrolled population count.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / programs / items / properties / earnings_count_availability
        Added value: +{
        +  "description": "Availability of the legacy highest-credential count.",
        +  "enum": [
        +    "available",
        +    "unavailable",
        +    "privacy_suppressed"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / programs / items / properties / ope6_id
        Added value: +{
        +  "description": "Provider OPEID6 group identifier, preserving leading zeros; null when absent.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / programs / items / required
        Previous value: -[
        -  "school_id",
        -  "school_name",
        -  "school_ownership",
        -  "program_code",
        -  "suppressed",
        -  "earnings_availability"
        -]New value: +[
        +  "completion_1yr_availability",
        +  "completion_1yr_count_availability",
        +  "completion_4yr_availability",
        +  "completion_4yr_count_availability",
        +  "ope6_id",
        +  "earnings_count_availability",
        +  "school_id",
        +  "school_name",
        +  "school_ownership",
        +  "program_code",
        +  "suppressed",
        +  "earnings_availability"
        +]
      • addedOutput schema / properties / provenance
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Dictionary provenance for each distinct program population.",
        +  "properties": {
        +    "completion_1yr": {
        +      "additionalProperties": false,
        +      "description": "Current completion-based one-year series.",
        +      "properties": {
        +        "cohort": {
        +          "description": "Pooled completion academic years.",
        +          "items": {
        +            "description": "Academic year.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "count_cell": {
        +          "description": "Most-recent count map cell.",
        +          "type": "string"
        +        },
        +        "count_variable": {
        +          "description": "Dictionary count variable.",
        +          "type": "string"
        +        },
        +        "dollar_year": {
        +          "description": "Inflation-adjusted dollar year.",
        +          "type": "number"
        +        },
        +        "measurement_years": {
        +          "description": "Earnings measurement calendar years.",
        +          "items": {
        +            "description": "Calendar year.",
        +            "type": "number"
        +          },
        +          "type": "array"
        +        },
        +        "median_cell": {
        +          "description": "Most-recent median map cell.",
        +          "type": "string"
        +        },
        +        "median_variable": {
        +          "description": "Dictionary median variable.",
        +          "type": "string"
        +        },
        +        "population": {
        +          "description": "Population represented.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "cohort",
        +        "measurement_years",
        +        "dollar_year",
        +        "median_variable",
        +        "count_variable",
        +        "median_cell",
        +        "count_cell",
        +        "population"
        +      ],
        +      "type": "object"
        +    },
        +    "completion_4yr": {
        +      "additionalProperties": false,
        +      "description": "Current completion-based four-year series.",
        +      "properties": {
        +        "cohort": {
        +          "description": "Pooled completion academic years.",
        +          "items": {
        +            "description": "Academic year.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "count_cell": {
        +          "description": "Most-recent count map cell.",
        +          "type": "string"
        +        },
        +        "count_variable": {
        +          "description": "Dictionary count variable.",
        +          "type": "string"
        +        },
        +        "dollar_year": {
        +          "description": "Inflation-adjusted dollar year.",
        +          "type": "number"
        +        },
        +        "measurement_years": {
        +          "description": "Earnings measurement calendar years.",
        +          "items": {
        +            "description": "Calendar year.",
        +            "type": "number"
        +          },
        +          "type": "array"
        +        },
        +        "median_cell": {
        +          "description": "Most-recent median map cell.",
        +          "type": "string"
        +        },
        +        "median_variable": {
        +          "description": "Dictionary median variable.",
        +          "type": "string"
        +        },
        +        "population": {
        +          "description": "Population represented.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "cohort",
        +        "measurement_years",
        +        "dollar_year",
        +        "median_variable",
        +        "count_variable",
        +        "median_cell",
        +        "count_cell",
        +        "population"
        +      ],
        +      "type": "object"
        +    },
        +    "debt": {
        +      "additionalProperties": false,
        +      "description": "Debt provenance distinct from earnings.",
        +      "properties": {
        +        "cell": {
        +          "description": "Most-recent map cell.",
        +          "type": "string"
        +        },
        +        "cohort": {
        +          "description": "Pooled debt academic years.",
        +          "items": {
        +            "description": "Academic year.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "population": {
        +          "description": "Borrower population.",
        +          "type": "string"
        +        },
        +        "variable": {
        +          "description": "Dictionary variable.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "cohort",
        +        "variable",
        +        "cell",
        +        "population"
        +      ],
        +      "type": "object"
        +    },
        +    "highest_credential_1yr": {
        +      "additionalProperties": false,
        +      "description": "Legacy highest-credential series.",
        +      "properties": {
        +        "cohort": {
        +          "description": "Pooled completion academic years.",
        +          "items": {
        +            "description": "Academic year.",
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "count_cell": {
        +          "description": "Most-recent count map cell.",
        +          "type": "string"
        +        },
        +        "count_variable": {
        +          "description": "Dictionary count variable.",
        +          "type": "string"
        +        },
        +        "dollar_year": {
        +          "description": "Inflation-adjusted dollar year.",
        +          "type": "number"
        +        },
        +        "measurement_years": {
        +          "description": "Earnings measurement calendar years.",
        +          "items": {
        +            "description": "Calendar year.",
        +            "type": "number"
        +          },
        +          "type": "array"
        +        },
        +        "median_cell": {
        +          "description": "Most-recent median map cell.",
        +          "type": "string"
        +        },
        +        "median_variable": {
        +          "description": "Dictionary median variable.",
        +          "type": "string"
        +        },
        +        "population": {
        +          "description": "Population represented.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "cohort",
        +        "measurement_years",
        +        "dollar_year",
        +        "median_variable",
        +        "count_variable",
        +        "median_cell",
        +        "count_cell",
        +        "population"
        +      ],
        +      "type": "object"
        +    },
        +    "ipeds_awards_year1": {
        +      "additionalProperties": false,
        +      "description": "First debt-cohort year awards.",
        +      "properties": {
        +        "academic_year": {
        +          "description": "Academic year of awards.",
        +          "type": "string"
        +        },
        +        "cell": {
        +          "description": "Most-recent map cell.",
        +          "type": "string"
        +        },
        +        "population": {
        +          "description": "Awards population.",
        +          "type": "string"
        +        },
        +        "variable": {
        +          "description": "Dictionary variable.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "academic_year",
        +        "variable",
        +        "cell",
        +        "population"
        +      ],
        +      "type": "object"
        +    },
        +    "ipeds_awards_year2": {
        +      "additionalProperties": false,
        +      "description": "Second debt-cohort year awards.",
        +      "properties": {
        +        "academic_year": {
        +          "description": "Academic year of awards.",
        +          "type": "string"
        +        },
        +        "cell": {
        +          "description": "Most-recent map cell.",
        +          "type": "string"
        +        },
        +        "population": {
        +          "description": "Awards population.",
        +          "type": "string"
        +        },
        +        "variable": {
        +          "description": "Dictionary variable.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "academic_year",
        +        "variable",
        +        "cell",
        +        "population"
        +      ],
        +      "type": "object"
        +    },
        +    "source": {
        +      "description": "Official dictionary URL.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "source",
        +    "highest_credential_1yr",
        +    "completion_1yr",
        +    "completion_4yr",
        +    "debt",
        +    "ipeds_awards_year1",
        +    "ipeds_awards_year2"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / schools_shown
        Added value: +{
        +  "description": "Schools returned on this school page.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / shown / description
        Previous value: -"Schools returned on this page."New value: +"Program rows returned in this response."
      • changedOutput schema / properties / suppressed_count / description
        Previous value: -"Programs with suppressed earnings."New value: +"Matching programs with confirmed privacy-suppressed legacy highest-credential earnings, before row paging."
      • changedOutput schema / properties / total_programs / description
        Previous value: -"Total programs returned across all result schools."New value: +"Matching program rows on the fetched school page before row pagination."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when school pagination metadata indicates a later page exists."New value: +"True when more program rows or a later school page remain."
      • changedOutput schema / properties / unavailable_count / description
        Previous value: -"Programs with unavailable earnings of unknown cause."New value: +"Matching programs with unavailable legacy highest-credential earnings of unknown cause, before row paging."
    • Changedscorecard_search_schools9 fields changed
      • changedInput schema / properties / degree_level / description
        Previous value: -"Predominant degree: 0=non-degree/certificate, 1=certificate, 2=associate, 3=bachelor, 4=graduate."New value: +"Predominant degree: 0=Not classified, 1=certificate, 2=associate, 3=bachelor, 4=Entirely graduate-degree granting."
      • addedOutput schema / properties / schools / items / properties / attendance_basis
        Added value: +{
        +  "description": "Period of the effective attendance cost, selected independently of tuition.",
        +  "enum": [
        +    "academic_year",
        +    "program_year"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / schools / items / properties / attendance_program_year
        Added value: +{
        +  "description": "Reported program-year cost of attendance.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / schools / items / properties / cost_of_attendance
        Added value: +{
        +  "description": "Available academic-year attendance cost, otherwise program-year cost.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / schools / items / properties / effective_tuition
        Added value: +{
        +  "description": "Available academic-year tuition, otherwise program-year tuition.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / schools / items / properties / metric_scope
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Earnings, debt and repayment are pooled at OPEID6; completion is campus-specific.",
        +  "properties": {
        +    "completion": {
        +      "const": "campus",
        +      "description": "Completion is campus-specific.",
        +      "type": "string"
        +    },
        +    "debt": {
        +      "const": "opeid6",
        +      "description": "Debt is OPEID6-pooled.",
        +      "type": "string"
        +    },
        +    "earnings": {
        +      "const": "opeid6",
        +      "description": "Earnings are OPEID6-pooled.",
        +      "type": "string"
        +    },
        +    "repayment": {
        +      "const": "opeid6",
        +      "description": "Repayment is OPEID6-pooled.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "earnings",
        +    "debt",
        +    "repayment",
        +    "completion"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / schools / items / properties / ope6_id
        Added value: +{
        +  "description": "Provider OPEID6 identifier, preserving leading zeros.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / schools / items / properties / tuition_basis
        Added value: +{
        +  "description": "Period of the effective tuition.",
        +  "enum": [
        +    "academic_year",
        +    "program_year"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / schools / items / properties / tuition_program_year
        Added value: +{
        +  "description": "Reported program-year tuition and fees.",
        +  "type": "number"
        +}
    • Changedscorecard_value_analysis9 fields changed
      • addedOutput schema / properties / attendance_basis
        Added value: +{
        +  "description": "Period of the effective attendance cost, selected independently of tuition.",
        +  "enum": [
        +    "academic_year",
        +    "program_year"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / attendance_program_year
        Added value: +{
        +  "description": "Reported program-year cost of attendance.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / cost_of_attendance
        Added value: +{
        +  "description": "Available academic-year attendance cost, otherwise program-year cost.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / effective_tuition
        Added value: +{
        +  "description": "Available academic-year tuition, otherwise program-year tuition.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / list_price / description
        Previous value: -"Full tuition and fees (in-state, or out-of-state when no in-state exists)."New value: +"Effective tuition and fees; see tuition_basis for academic-year or program-year period."
      • addedOutput schema / properties / metric_scope
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Earnings, debt and repayment are pooled at OPEID6; completion is campus-specific.",
        +  "properties": {
        +    "completion": {
        +      "const": "campus",
        +      "description": "Completion is campus-specific.",
        +      "type": "string"
        +    },
        +    "debt": {
        +      "const": "opeid6",
        +      "description": "Debt is OPEID6-pooled.",
        +      "type": "string"
        +    },
        +    "earnings": {
        +      "const": "opeid6",
        +      "description": "Earnings are OPEID6-pooled.",
        +      "type": "string"
        +    },
        +    "repayment": {
        +      "const": "opeid6",
        +      "description": "Repayment is OPEID6-pooled.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "earnings",
        +    "debt",
        +    "repayment",
        +    "completion"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / ope6_id
        Added value: +{
        +  "description": "Provider OPEID6 identifier, preserving leading zeros.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / tuition_basis
        Added value: +{
        +  "description": "Period of the effective tuition.",
        +  "enum": [
        +    "academic_year",
        +    "program_year"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / tuition_program_year
        Added value: +{
        +  "description": "Reported program-year tuition and fees.",
        +  "type": "number"
        +}
  2. 5 tool updates
    • Changedscorecard_compare_schools3 fields changed
      • addedOutput schema / properties / rows / items / properties / values / items / properties / availability
        Added value: +{
        +  "description": "Available number, unavailable with unknown cause, or confirmed privacy suppression.",
        +  "enum": [
        +    "available",
        +    "unavailable",
        +    "privacy_suppressed"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / rows / items / properties / values / items / properties / suppressed / description
        Previous value: -"True when data is unavailable for this school/metric."New value: +"True only for explicit provider privacy markers."
      • changedOutput schema / properties / rows / items / properties / values / items / required
        Previous value: -[
        -  "school_id",
        -  "suppressed"
        -]New value: +[
        +  "school_id",
        +  "suppressed",
        +  "availability"
        +]
    • Changedscorecard_get_earnings18 fields changed
      • changedInput schema / properties / years / description
        Previous value: -"Optional list of cohort entry years for historical trend data (e.g. [2011, 2012, 2013]). Omit for current snapshot."New value: +"Optional API data-file start years from 1996–2025 (e.g. [2003, 2011, 2020]); valid files may lack observations. Omit or pass [] for snapshot only."
      • addedInput schema / properties / years / items / description
        Added value: +"Published API data-file start year (1996–2025)."
      • changedInput schema / properties / years / items / maximum
        Previous value: -9007199254740991New value: +2025
      • changedInput schema / properties / years / items / minimum
        Previous value: --9007199254740991New value: +1996
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "school_id",
        -      "school_name",
        -      "current",
        -      "suppressed"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "school_id",
        +      "school_name",
        +      "current_availability",
        +      "current_context",
        +      "current",
        +      "suppressed"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • removedOutput schema / properties / current / properties / earnings_6yr_female_median
        Removed value: -{
        -  "description": "Median earnings 6 years after entry for female students.",
        -  "type": "number"
        -}
      • addedOutput schema / properties / current / properties / earnings_6yr_non_male_median
        Added value: +{
        +  "description": "Median earnings 6 years after entry for non-male students.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / current_availability
        Added value: +{
        +  "additionalProperties": {
        +    "description": "Provider availability for one supported metric.",
        +    "enum": [
        +      "available",
        +      "unavailable",
        +      "privacy_suppressed"
        +    ],
        +    "type": "string"
        +  },
        +  "description": "Availability keyed by every supported current earnings metric.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / current_context
        Added value: +{
        +  "additionalProperties": {
        +    "additionalProperties": false,
        +    "description": "Official provenance for one metric.",
        +    "properties": {
        +      "data_file_year": {
        +        "description": "Start year of the API data file; not a cohort entry year.",
        +        "maximum": 9007199254740991,
        +        "minimum": -9007199254740991,
        +        "type": "integer"
        +      },
        +      "dollar_year": {
        +        "description": "Verified inflation dollar basis; returned values are not re-inflated.",
        +        "maximum": 9007199254740991,
        +        "minimum": -9007199254740991,
        +        "type": "integer"
        +      },
        +      "entry_cohorts": {
        +        "description": "Verified academic-year entry cohorts.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "measurement_years": {
        +        "description": "Verified calendar years when earnings were measured.",
        +        "items": {
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "data_file_year"
        +    ],
        +    "type": "object"
        +  },
        +  "description": "Official latest provenance keyed by metric, independent of returned values.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • changedOutput schema / properties / suppressed / description
        Previous value: -"True when earnings data is suppressed across all time points."New value: +"True only when every supported current metric has an explicit privacy marker."
      • changedOutput schema / properties / trend / description
        Previous value: -"Historical trend rows by cohort entry year. Present only when years parameter was supplied."New value: +"Historical rows by API data-file start year. Present only when nonempty years were supplied."
      • changedOutput schema / properties / trend / items / description
        Previous value: -"Earnings data point for one cohort entry year."New value: +"Earnings observations for one API data file."
      • addedOutput schema / properties / trend / items / properties / availability
        Added value: +{
        +  "additionalProperties": {
        +    "description": "Provider availability for one supported metric.",
        +    "enum": [
        +      "available",
        +      "unavailable",
        +      "privacy_suppressed"
        +    ],
        +    "type": "string"
        +  },
        +  "description": "Availability of the supported historical medians.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / trend / items / properties / context
        Added value: +{
        +  "additionalProperties": {
        +    "additionalProperties": false,
        +    "description": "Official provenance for one metric.",
        +    "properties": {
        +      "data_file_year": {
        +        "description": "Start year of the API data file; not a cohort entry year.",
        +        "maximum": 9007199254740991,
        +        "minimum": -9007199254740991,
        +        "type": "integer"
        +      },
        +      "dollar_year": {
        +        "description": "Verified inflation dollar basis; returned values are not re-inflated.",
        +        "maximum": 9007199254740991,
        +        "minimum": -9007199254740991,
        +        "type": "integer"
        +      },
        +      "entry_cohorts": {
        +        "description": "Verified academic-year entry cohorts.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "measurement_years": {
        +        "description": "Verified calendar years when earnings were measured.",
        +        "items": {
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "data_file_year"
        +    ],
        +    "type": "object"
        +  },
        +  "description": "Verified per-metric provenance; unknown metadata omitted.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • changedOutput schema / properties / trend / items / properties / earnings_10yr_median / description
        Previous value: -"Median earnings 10 years after entry for this cohort."New value: +"Median earnings 10 years after entry reported in this data file."
      • changedOutput schema / properties / trend / items / properties / earnings_6yr_median / description
        Previous value: -"Median earnings 6 years after entry for this cohort."New value: +"Median earnings 6 years after entry reported in this data file."
      • changedOutput schema / properties / trend / items / properties / year / description
        Previous value: -"Cohort entry year."New value: +"API data-file start year."
      • changedOutput schema / properties / trend / items / required
        Previous value: -[
        -  "year"
        -]New value: +[
        +  "year",
        +  "availability",
        +  "context"
        +]
    • Changedscorecard_get_programs8 fields changed
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "school_id",
        -      "school_name",
        -      "programs",
        -      "total",
        -      "suppressed_count",
        -      "query"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "school_id",
        +      "school_name",
        +      "programs",
        +      "total",
        +      "suppressed_count",
        +      "unavailable_count",
        +      "query"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no programs match the filters or all data is suppressed."New value: +"Guidance when no programs match or some earnings are unavailable or privacy-suppressed."
      • changedOutput schema / properties / programs / description
        Previous value: -"All programs at this school matching the filters. Sorted by median earnings descending (suppressed programs at end)."New value: +"All programs matching the filters, sorted by earnings descending with unavailable or privacy-suppressed earnings last."
      • addedOutput schema / properties / programs / items / properties / earnings_availability
        Added value: +{
        +  "description": "Available number, unavailable with unknown cause, or confirmed privacy suppression.",
        +  "enum": [
        +    "available",
        +    "unavailable",
        +    "privacy_suppressed"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / programs / items / properties / suppressed / description
        Previous value: -"True when earnings data is suppressed due to small cohort (FERPA)."New value: +"True only when the provider explicitly marks earnings as privacy-suppressed."
      • changedOutput schema / properties / programs / items / required
        Previous value: -[
        -  "code",
        -  "credential_level",
        -  "suppressed"
        -]New value: +[
        +  "code",
        +  "credential_level",
        +  "suppressed",
        +  "earnings_availability"
        +]
      • changedOutput schema / properties / suppressed_count / description
        Previous value: -"Number of programs with earnings suppressed due to small cohort."New value: +"Number of programs with confirmed privacy-suppressed earnings."
      • addedOutput schema / properties / unavailable_count
        Added value: +{
        +  "description": "Programs with unavailable earnings of unknown cause.",
        +  "type": "number"
        +}
    • Changedscorecard_search_programs9 fields changed
      • addedInput schema / properties / credential_level
        Added value: +{
        +  "description": "Provider credential selector: 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; other integer levels may return no matches.",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "total",
        -      "page",
        -      "per_page",
        -      "programs",
        -      "total_programs",
        -      "suppressed_count",
        -      "query",
        -      "totalCount",
        -      "truncated",
        -      "shown",
        -      "cap"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "total",
        +      "page",
        +      "per_page",
        +      "programs",
        +      "total_programs",
        +      "suppressed_count",
        +      "unavailable_count",
        +      "query",
        +      "totalCount",
        +      "truncated",
        +      "shown",
        +      "cap"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / programs / description
        Previous value: -"Program results — multiple programs per school if school matches multiple CIP codes. Sorted by earnings descending (suppressed last)."New value: +"Program rows retain separate credential identities, sorted by earnings descending with unavailable or privacy-suppressed earnings last."
      • addedOutput schema / properties / programs / items / properties / credential_level
        Added value: +{
        +  "description": "Provider credential level; unknown future numeric levels are retained.",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / programs / items / properties / credential_title
        Added value: +{
        +  "description": "Provider credential title, when reported.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / programs / items / properties / earnings_availability
        Added value: +{
        +  "description": "Available number, unavailable with unknown cause, or confirmed privacy suppression.",
        +  "enum": [
        +    "available",
        +    "unavailable",
        +    "privacy_suppressed"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / programs / items / properties / suppressed / description
        Previous value: -"True when earnings are suppressed due to small cohort."New value: +"True only for explicit provider privacy markers."
      • changedOutput schema / properties / programs / items / required
        Previous value: -[
        -  "school_id",
        -  "school_name",
        -  "school_ownership",
        -  "program_code",
        -  "suppressed"
        -]New value: +[
        +  "school_id",
        +  "school_name",
        +  "school_ownership",
        +  "program_code",
        +  "suppressed",
        +  "earnings_availability"
        +]
      • addedOutput schema / properties / unavailable_count
        Added value: +{
        +  "description": "Programs with unavailable earnings of unknown cause.",
        +  "type": "number"
        +}
    • Changedscorecard_value_analysis5 fields changed
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "school_id",
        -      "school_name",
        -      "data_notes"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "school_id",
        +      "school_name",
        +      "net_price_basis",
        +      "data_notes"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / applicable_income_bracket / description
        Previous value: -"Income bracket used for net_price_for_income."New value: +"Requested income bracket, retained even when its estimate is unavailable."
      • addedOutput schema / properties / effective_net_price
        Added value: +{
        +  "description": "Price used in the annual-earnings ratio: available income bracket, otherwise overall net price.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / family_income
        Added value: +{
        +  "description": "Requested annual family income in dollars.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / net_price_basis
        Added value: +{
        +  "description": "Source of the effective price; unavailable means no estimate exists.",
        +  "enum": [
        +    "income_bracket",
        +    "overall",
        +    "unavailable"
        +  ],
        +  "type": "string"
        +}
  3. 9 tool updates
    • First observedscorecard_compare_schools
    • First observedscorecard_get_earnings
    • First observedscorecard_get_programs
    • First observedscorecard_get_school
    • First observedscorecard_list_fields
    • First observedscorecard_lookup_cip
    • First observedscorecard_search_programs
    • First observedscorecard_search_schools
    • First observedscorecard_value_analysis

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.