@cyanheads/college-scorecard-mcp-server 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +405 -0
- package/Dockerfile +98 -0
- package/README.md +356 -0
- package/changelog/0.1.x/0.1.0.md +24 -0
- package/changelog/0.1.x/0.1.1.md +14 -0
- package/changelog/template.md +119 -0
- package/dist/config/server-config.d.ts +12 -0
- package/dist/config/server-config.d.ts.map +1 -0
- package/dist/config/server-config.js +17 -0
- package/dist/config/server-config.js.map +1 -0
- package/dist/data/cip-codes.d.ts +23 -0
- package/dist/data/cip-codes.d.ts.map +1 -0
- package/dist/data/cip-codes.js +274 -0
- package/dist/data/cip-codes.js.map +1 -0
- package/dist/data/field-catalog.d.ts +25 -0
- package/dist/data/field-catalog.d.ts.map +1 -0
- package/dist/data/field-catalog.js +122 -0
- package/dist/data/field-catalog.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/format-helpers.d.ts +9 -0
- package/dist/mcp-server/format-helpers.d.ts.map +1 -0
- package/dist/mcp-server/format-helpers.js +24 -0
- package/dist/mcp-server/format-helpers.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/compare.prompt.d.ts +15 -0
- package/dist/mcp-server/prompts/definitions/compare.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/compare.prompt.js +55 -0
- package/dist/mcp-server/prompts/definitions/compare.prompt.js.map +1 -0
- package/dist/mcp-server/resources/definitions/programs.resource.d.ts +10 -0
- package/dist/mcp-server/resources/definitions/programs.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/programs.resource.js +42 -0
- package/dist/mcp-server/resources/definitions/programs.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/school.resource.d.ts +10 -0
- package/dist/mcp-server/resources/definitions/school.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/school.resource.js +43 -0
- package/dist/mcp-server/resources/definitions/school.resource.js.map +1 -0
- package/dist/mcp-server/tools/definitions/compare-schools.tool.d.ts +46 -0
- package/dist/mcp-server/tools/definitions/compare-schools.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/compare-schools.tool.js +367 -0
- package/dist/mcp-server/tools/definitions/compare-schools.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-earnings.tool.d.ts +43 -0
- package/dist/mcp-server/tools/definitions/get-earnings.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-earnings.tool.js +183 -0
- package/dist/mcp-server/tools/definitions/get-earnings.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-programs.tool.d.ts +46 -0
- package/dist/mcp-server/tools/definitions/get-programs.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-programs.tool.js +194 -0
- package/dist/mcp-server/tools/definitions/get-programs.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-school.tool.d.ts +67 -0
- package/dist/mcp-server/tools/definitions/get-school.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-school.tool.js +324 -0
- package/dist/mcp-server/tools/definitions/get-school.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/list-fields.tool.d.ts +28 -0
- package/dist/mcp-server/tools/definitions/list-fields.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/list-fields.tool.js +92 -0
- package/dist/mcp-server/tools/definitions/list-fields.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/lookup-cip.tool.d.ts +26 -0
- package/dist/mcp-server/tools/definitions/lookup-cip.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/lookup-cip.tool.js +71 -0
- package/dist/mcp-server/tools/definitions/lookup-cip.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/search-programs.tool.d.ts +49 -0
- package/dist/mcp-server/tools/definitions/search-programs.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/search-programs.tool.js +188 -0
- package/dist/mcp-server/tools/definitions/search-programs.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/search-schools.tool.d.ts +57 -0
- package/dist/mcp-server/tools/definitions/search-schools.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/search-schools.tool.js +223 -0
- package/dist/mcp-server/tools/definitions/search-schools.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/value-analysis.tool.d.ts +37 -0
- package/dist/mcp-server/tools/definitions/value-analysis.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/value-analysis.tool.js +227 -0
- package/dist/mcp-server/tools/definitions/value-analysis.tool.js.map +1 -0
- package/dist/services/scorecard/scorecard-service.d.ts +44 -0
- package/dist/services/scorecard/scorecard-service.d.ts.map +1 -0
- package/dist/services/scorecard/scorecard-service.js +376 -0
- package/dist/services/scorecard/scorecard-service.js.map +1 -0
- package/dist/services/scorecard/types.d.ts +131 -0
- package/dist/services/scorecard/types.d.ts.map +1 -0
- package/dist/services/scorecard/types.js +6 -0
- package/dist/services/scorecard/types.js.map +1 -0
- package/package.json +80 -0
- package/server.json +99 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Shared label helpers for formatting Scorecard API integer codes.
|
|
3
|
+
* @module mcp-server/format-helpers
|
|
4
|
+
*/
|
|
5
|
+
/** Map ownership integer to human-readable label */
|
|
6
|
+
export declare function ownershipLabel(v: number | null | undefined): string;
|
|
7
|
+
/** Map degree level integer to label */
|
|
8
|
+
export declare function degreeLevelLabel(v: number | null | undefined): string;
|
|
9
|
+
//# sourceMappingURL=format-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-helpers.d.ts","sourceRoot":"","sources":["../../src/mcp-server/format-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,oDAAoD;AACpD,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAGnE;AAED,wCAAwC;AACxC,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAUrE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Shared label helpers for formatting Scorecard API integer codes.
|
|
3
|
+
* @module mcp-server/format-helpers
|
|
4
|
+
*/
|
|
5
|
+
/** Map ownership integer to human-readable label */
|
|
6
|
+
export function ownershipLabel(v) {
|
|
7
|
+
if (v == null)
|
|
8
|
+
return 'Unknown';
|
|
9
|
+
return v === 1 ? 'Public' : v === 2 ? 'Private nonprofit' : v === 3 ? 'For-profit' : String(v);
|
|
10
|
+
}
|
|
11
|
+
/** Map degree level integer to label */
|
|
12
|
+
export function degreeLevelLabel(v) {
|
|
13
|
+
if (v == null)
|
|
14
|
+
return 'Unknown';
|
|
15
|
+
const map = {
|
|
16
|
+
0: 'Non-degree',
|
|
17
|
+
1: 'Certificate',
|
|
18
|
+
2: "Associate's",
|
|
19
|
+
3: "Bachelor's",
|
|
20
|
+
4: 'Graduate',
|
|
21
|
+
};
|
|
22
|
+
return map[v] ?? String(v);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=format-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-helpers.js","sourceRoot":"","sources":["../../src/mcp-server/format-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,oDAAoD;AACpD,MAAM,UAAU,cAAc,CAAC,CAA4B;IACzD,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACjG,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,gBAAgB,CAAC,CAA4B;IAC3D,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,GAAG,GAA2B;QAClC,CAAC,EAAE,YAAY;QACf,CAAC,EAAE,aAAa;QAChB,CAAC,EAAE,aAAa;QAChB,CAAC,EAAE,YAAY;QACf,CAAC,EAAE,UAAU;KACd,CAAC;IACF,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview School comparison prompt. Structures a multi-school comparison analysis
|
|
3
|
+
* using Scorecard data.
|
|
4
|
+
* @module mcp-server/prompts/definitions/compare.prompt
|
|
5
|
+
*/
|
|
6
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
7
|
+
export declare const comparePrompt: import("@cyanheads/mcp-ts-core").PromptDefinition<z.ZodObject<{
|
|
8
|
+
school_names: z.ZodString;
|
|
9
|
+
focus: z.ZodEnum<{
|
|
10
|
+
costs: "costs";
|
|
11
|
+
outcomes: "outcomes";
|
|
12
|
+
programs: "programs";
|
|
13
|
+
}>;
|
|
14
|
+
}, z.core.$strip>>;
|
|
15
|
+
//# sourceMappingURL=compare.prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare.prompt.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/compare.prompt.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAU,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAEnD,eAAO,MAAM,aAAa;;;;;;;kBAwDxB,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview School comparison prompt. Structures a multi-school comparison analysis
|
|
3
|
+
* using Scorecard data.
|
|
4
|
+
* @module mcp-server/prompts/definitions/compare.prompt
|
|
5
|
+
*/
|
|
6
|
+
import { prompt, z } from '@cyanheads/mcp-ts-core';
|
|
7
|
+
export const comparePrompt = prompt('scorecard_compare_prompt', {
|
|
8
|
+
description: 'Structures a multi-school comparison analysis using College Scorecard data. Provide comma-separated school names and a focus area (costs, outcomes, or programs) to generate a research-ready comparison framework.',
|
|
9
|
+
args: z.object({
|
|
10
|
+
school_names: z
|
|
11
|
+
.string()
|
|
12
|
+
.describe('Comma-separated list of school names to compare (e.g. "University of Washington, University of Oregon, Oregon State University").'),
|
|
13
|
+
focus: z
|
|
14
|
+
.enum(['costs', 'outcomes', 'programs'])
|
|
15
|
+
.describe('Comparison focus: costs (tuition, net price, debt), outcomes (earnings, completion, repayment), or programs (program-level earnings by field of study).'),
|
|
16
|
+
}),
|
|
17
|
+
generate: (args) => {
|
|
18
|
+
const schools = args.school_names.split(',').map((s) => s.trim());
|
|
19
|
+
const focusGuide = {
|
|
20
|
+
costs: 'net price by income bracket, median debt, tuition (in-state and out-of-state), and total cost of attendance',
|
|
21
|
+
outcomes: 'graduation rates, median earnings at 6 and 10 years, 3-year loan repayment rate, and debt-to-earnings ratio',
|
|
22
|
+
programs: 'program-level 1-year post-graduation median earnings by CIP code, median debt per program, and enrollment',
|
|
23
|
+
};
|
|
24
|
+
const guide = focusGuide[args.focus] ?? args.focus;
|
|
25
|
+
return [
|
|
26
|
+
{
|
|
27
|
+
role: 'user',
|
|
28
|
+
content: {
|
|
29
|
+
type: 'text',
|
|
30
|
+
text: [
|
|
31
|
+
`Compare the following schools on ${args.focus}: ${schools.join(', ')}.`,
|
|
32
|
+
'',
|
|
33
|
+
`Focus the analysis on: ${guide}.`,
|
|
34
|
+
'',
|
|
35
|
+
'Steps:',
|
|
36
|
+
`1. Use scorecard_search_schools to find the unit IDs for each school.`,
|
|
37
|
+
`2. Use scorecard_compare_schools with the topic "${args.focus}" to get a normalized side-by-side comparison.`,
|
|
38
|
+
`3. For deeper context, use scorecard_get_school to retrieve full profiles.`,
|
|
39
|
+
...(args.focus === 'programs'
|
|
40
|
+
? [
|
|
41
|
+
`4. Use scorecard_get_programs for program-level earnings at each school.`,
|
|
42
|
+
`5. Use scorecard_lookup_cip if you need to find CIP codes for specific fields of study.`,
|
|
43
|
+
]
|
|
44
|
+
: [
|
|
45
|
+
`4. Use scorecard_value_analysis for ROI metrics (debt-to-earnings ratio, net price by income bracket).`,
|
|
46
|
+
]),
|
|
47
|
+
'',
|
|
48
|
+
`Present a clear comparison table with ranks within this set, followed by a brief interpretation of the most meaningful differences.`,
|
|
49
|
+
].join('\n'),
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
//# sourceMappingURL=compare.prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare.prompt.js","sourceRoot":"","sources":["../../../../src/mcp-server/prompts/definitions/compare.prompt.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,0BAA0B,EAAE;IAC9D,WAAW,EACT,qNAAqN;IACvN,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,CACP,mIAAmI,CACpI;QACH,KAAK,EAAE,CAAC;aACL,IAAI,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;aACvC,QAAQ,CACP,yJAAyJ,CAC1J;KACJ,CAAC;IACF,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAClE,MAAM,UAAU,GAA2B;YACzC,KAAK,EACH,6GAA6G;YAC/G,QAAQ,EACN,6GAA6G;YAC/G,QAAQ,EACN,2GAA2G;SAC9G,CAAC;QACF,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC;QAEnD,OAAO;YACL;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE;wBACJ,oCAAoC,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;wBACxE,EAAE;wBACF,0BAA0B,KAAK,GAAG;wBAClC,EAAE;wBACF,QAAQ;wBACR,uEAAuE;wBACvE,oDAAoD,IAAI,CAAC,KAAK,gDAAgD;wBAC9G,4EAA4E;wBAC5E,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,UAAU;4BAC3B,CAAC,CAAC;gCACE,0EAA0E;gCAC1E,yFAAyF;6BAC1F;4BACH,CAAC,CAAC;gCACE,wGAAwG;6BACzG,CAAC;wBACN,EAAE;wBACF,qIAAqI;qBACtI,CAAC,IAAI,CAAC,IAAI,CAAC;iBACb;aACF;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Programs resource. Provides program-level outcomes for a school
|
|
3
|
+
* as injectable context.
|
|
4
|
+
* @module mcp-server/resources/definitions/programs.resource
|
|
5
|
+
*/
|
|
6
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
7
|
+
export declare const programsResource: import("@cyanheads/mcp-ts-core").ResourceDefinition<z.ZodObject<{
|
|
8
|
+
id: z.ZodString;
|
|
9
|
+
}, z.core.$strip>, undefined, undefined>;
|
|
10
|
+
//# sourceMappingURL=programs.resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"programs.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/programs.resource.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAY,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAIrD,eAAO,MAAM,gBAAgB;;wCA6C3B,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Programs resource. Provides program-level outcomes for a school
|
|
3
|
+
* as injectable context.
|
|
4
|
+
* @module mcp-server/resources/definitions/programs.resource
|
|
5
|
+
*/
|
|
6
|
+
import { resource, z } from '@cyanheads/mcp-ts-core';
|
|
7
|
+
import { notFound } from '@cyanheads/mcp-ts-core/errors';
|
|
8
|
+
import { getScorecardService } from '../../../services/scorecard/scorecard-service.js';
|
|
9
|
+
export const programsResource = resource('scorecard://programs/{id}', {
|
|
10
|
+
name: 'scorecard-programs',
|
|
11
|
+
title: 'School Programs',
|
|
12
|
+
description: 'Program-level outcomes for a school — 1-year post-graduation earnings, debt, and enrollment by CIP code. Injectable context for program-focused conversations.',
|
|
13
|
+
mimeType: 'application/json',
|
|
14
|
+
params: z.object({
|
|
15
|
+
id: z.string().describe('School unit ID (integer as string).'),
|
|
16
|
+
}),
|
|
17
|
+
async handler(params, ctx) {
|
|
18
|
+
ctx.log.info('Fetching programs resource', { id: params.id });
|
|
19
|
+
const service = getScorecardService();
|
|
20
|
+
const response = await service.getSchoolPrograms(params.id, undefined, undefined, undefined, ctx);
|
|
21
|
+
const record = response.results[0];
|
|
22
|
+
if (!record) {
|
|
23
|
+
throw notFound(`School ${params.id} not found.`, { id: params.id });
|
|
24
|
+
}
|
|
25
|
+
const rawPrograms = record['latest.programs.cip_4_digit'] ?? [];
|
|
26
|
+
const programs = rawPrograms.map((p) => ({
|
|
27
|
+
code: p.code,
|
|
28
|
+
title: p.title,
|
|
29
|
+
credential_level: p.credential?.level ?? null,
|
|
30
|
+
earnings_1yr_median: p.earnings?.highest?.['1_yr']?.overall_median_earnings ?? null,
|
|
31
|
+
median_debt: p.debt?.median_debt ?? null,
|
|
32
|
+
enrollment: p.counts?.ipeds_enrollment ?? null,
|
|
33
|
+
}));
|
|
34
|
+
return {
|
|
35
|
+
school_id: record.id,
|
|
36
|
+
school_name: record['school.name'],
|
|
37
|
+
programs,
|
|
38
|
+
total: programs.length,
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=programs.resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"programs.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/programs.resource.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAEhF,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC,2BAA2B,EAAE;IACpE,IAAI,EAAE,oBAAoB;IAC1B,KAAK,EAAE,iBAAiB;IACxB,WAAW,EACT,gKAAgK;IAClK,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;KAC/D,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG;QACvB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;QAEtC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAC9C,MAAM,CAAC,EAAE,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,GAAG,CACJ,CAAC;QAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,QAAQ,CAAC,UAAU,MAAM,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,6BAA6B,CAAC,IAAI,EAAE,CAAC;QAEhE,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,gBAAgB,EAAE,CAAC,CAAC,UAAU,EAAE,KAAK,IAAI,IAAI;YAC7C,mBAAmB,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,uBAAuB,IAAI,IAAI;YACnF,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,IAAI,IAAI;YACxC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,gBAAgB,IAAI,IAAI;SAC/C,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,SAAS,EAAE,MAAM,CAAC,EAAE;YACpB,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC;YAClC,QAAQ;YACR,KAAK,EAAE,QAAQ,CAAC,MAAM;SACvB,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview School profile resource. Provides institutional profile by unit ID
|
|
3
|
+
* as injectable context for school-specific conversations.
|
|
4
|
+
* @module mcp-server/resources/definitions/school.resource
|
|
5
|
+
*/
|
|
6
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
7
|
+
export declare const schoolResource: import("@cyanheads/mcp-ts-core").ResourceDefinition<z.ZodObject<{
|
|
8
|
+
id: z.ZodString;
|
|
9
|
+
}, z.core.$strip>, undefined, undefined>;
|
|
10
|
+
//# sourceMappingURL=school.resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"school.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/school.resource.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAY,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAIrD,eAAO,MAAM,cAAc;;wCAsCzB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview School profile resource. Provides institutional profile by unit ID
|
|
3
|
+
* as injectable context for school-specific conversations.
|
|
4
|
+
* @module mcp-server/resources/definitions/school.resource
|
|
5
|
+
*/
|
|
6
|
+
import { resource, z } from '@cyanheads/mcp-ts-core';
|
|
7
|
+
import { notFound } from '@cyanheads/mcp-ts-core/errors';
|
|
8
|
+
import { getScorecardService } from '../../../services/scorecard/scorecard-service.js';
|
|
9
|
+
export const schoolResource = resource('scorecard://school/{id}', {
|
|
10
|
+
name: 'scorecard-school',
|
|
11
|
+
title: 'School Profile',
|
|
12
|
+
description: 'Institutional profile by unit ID — injectable context for school-specific conversations. Returns core identity, cost, admissions, and outcomes data.',
|
|
13
|
+
mimeType: 'application/json',
|
|
14
|
+
params: z.object({
|
|
15
|
+
id: z.string().describe('School unit ID (integer as string).'),
|
|
16
|
+
}),
|
|
17
|
+
async handler(params, ctx) {
|
|
18
|
+
ctx.log.info('Fetching school resource', { id: params.id });
|
|
19
|
+
const service = getScorecardService();
|
|
20
|
+
const response = await service.getSchoolProfiles([params.id], undefined, ctx);
|
|
21
|
+
const record = response.results[0];
|
|
22
|
+
if (!record) {
|
|
23
|
+
throw notFound(`School ${params.id} not found.`, { id: params.id });
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
id: record.id,
|
|
27
|
+
name: record['school.name'],
|
|
28
|
+
city: record['school.city'],
|
|
29
|
+
state: record['school.state'],
|
|
30
|
+
ownership: record['school.ownership'],
|
|
31
|
+
tuition_in_state: record['latest.cost.tuition.in_state'],
|
|
32
|
+
tuition_out_of_state: record['latest.cost.tuition.out_of_state'],
|
|
33
|
+
net_price_overall: record['latest.cost.avg_net_price.overall'],
|
|
34
|
+
admission_rate: record['latest.admissions.admission_rate.overall'],
|
|
35
|
+
enrollment: record['latest.student.size'],
|
|
36
|
+
median_debt: record['latest.aid.median_debt.completers.overall'],
|
|
37
|
+
completion_rate: record['latest.completion.rate_suppressed.overall'],
|
|
38
|
+
earnings_6yr_median: record['latest.earnings.6_yrs_after_entry.median'],
|
|
39
|
+
earnings_10yr_median: record['latest.earnings.10_yrs_after_entry.median'],
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=school.resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"school.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/school.resource.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAEhF,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC,yBAAyB,EAAE;IAChE,IAAI,EAAE,kBAAkB;IACxB,KAAK,EAAE,gBAAgB;IACvB,WAAW,EACT,sJAAsJ;IACxJ,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;KAC/D,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG;QACvB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;QAEtC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QAE9E,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,QAAQ,CAAC,UAAU,MAAM,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC;YAC3B,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC;YAC3B,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC;YAC7B,SAAS,EAAE,MAAM,CAAC,kBAAkB,CAAC;YACrC,gBAAgB,EAAE,MAAM,CAAC,8BAA8B,CAAC;YACxD,oBAAoB,EAAE,MAAM,CAAC,kCAAkC,CAAC;YAChE,iBAAiB,EAAE,MAAM,CAAC,mCAAmC,CAAC;YAC9D,cAAc,EAAE,MAAM,CAAC,0CAA0C,CAAC;YAClE,UAAU,EAAE,MAAM,CAAC,qBAAqB,CAAC;YACzC,WAAW,EAAE,MAAM,CAAC,2CAA2C,CAAC;YAChE,eAAe,EAAE,MAAM,CAAC,2CAA2C,CAAC;YACpE,mBAAmB,EAAE,MAAM,CAAC,0CAA0C,CAAC;YACvE,oBAAoB,EAAE,MAAM,CAAC,2CAA2C,CAAC;SAC1E,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview School comparison tool. Returns normalized side-by-side comparison
|
|
3
|
+
* of 2–5 schools with percentile ranks and relative deltas within the result set.
|
|
4
|
+
* @module mcp-server/tools/definitions/compare-schools.tool
|
|
5
|
+
*/
|
|
6
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
7
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
8
|
+
export declare const compareSchoolsTool: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
9
|
+
ids: z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
|
|
10
|
+
topic: z.ZodEnum<{
|
|
11
|
+
costs: "costs";
|
|
12
|
+
outcomes: "outcomes";
|
|
13
|
+
admissions: "admissions";
|
|
14
|
+
aid: "aid";
|
|
15
|
+
}>;
|
|
16
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
17
|
+
schools: z.ZodArray<z.ZodObject<{
|
|
18
|
+
id: z.ZodNumber;
|
|
19
|
+
name: z.ZodString;
|
|
20
|
+
}, z.core.$strip>>;
|
|
21
|
+
topic: z.ZodString;
|
|
22
|
+
rows: z.ZodArray<z.ZodObject<{
|
|
23
|
+
metric: z.ZodString;
|
|
24
|
+
values: z.ZodArray<z.ZodObject<{
|
|
25
|
+
school_id: z.ZodNumber;
|
|
26
|
+
value: z.ZodOptional<z.ZodNumber>;
|
|
27
|
+
rank: z.ZodOptional<z.ZodNumber>;
|
|
28
|
+
suppressed: z.ZodBoolean;
|
|
29
|
+
}, z.core.$strip>>;
|
|
30
|
+
unit: z.ZodOptional<z.ZodString>;
|
|
31
|
+
note: z.ZodOptional<z.ZodString>;
|
|
32
|
+
}, z.core.$strip>>;
|
|
33
|
+
summary: z.ZodOptional<z.ZodString>;
|
|
34
|
+
notice: z.ZodOptional<z.ZodString>;
|
|
35
|
+
}, z.core.$strip>, readonly [{
|
|
36
|
+
readonly reason: "schools_not_found";
|
|
37
|
+
readonly code: JsonRpcErrorCode.NotFound;
|
|
38
|
+
readonly when: "None of the requested school IDs returned records.";
|
|
39
|
+
readonly recovery: "Verify school IDs with scorecard_search_schools and retry with valid IDs.";
|
|
40
|
+
}, {
|
|
41
|
+
readonly reason: "api_error";
|
|
42
|
+
readonly code: JsonRpcErrorCode.ServiceUnavailable;
|
|
43
|
+
readonly when: "The College Scorecard API returned an error.";
|
|
44
|
+
readonly recovery: "Check SCORECARD_API_KEY validity and retry after a brief delay.";
|
|
45
|
+
}]>;
|
|
46
|
+
//# sourceMappingURL=compare-schools.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-schools.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/compare-schools.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAuCjE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoW7B,CAAC"}
|