@mcp-gen-ui/core 0.2.0
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/LICENSE +202 -0
- package/README.md +32 -0
- package/dist/consistency.d.ts +19 -0
- package/dist/consistency.d.ts.map +1 -0
- package/dist/consistency.js +53 -0
- package/dist/consistency.js.map +1 -0
- package/dist/deadlines.d.ts +10 -0
- package/dist/deadlines.d.ts.map +1 -0
- package/dist/deadlines.js +29 -0
- package/dist/deadlines.js.map +1 -0
- package/dist/fixtures.d.ts +8 -0
- package/dist/fixtures.d.ts.map +1 -0
- package/dist/fixtures.js +96 -0
- package/dist/fixtures.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/personas.d.ts +100 -0
- package/dist/personas.d.ts.map +1 -0
- package/dist/personas.js +88 -0
- package/dist/personas.js.map +1 -0
- package/dist/recommender.d.ts +15 -0
- package/dist/recommender.d.ts.map +1 -0
- package/dist/recommender.js +222 -0
- package/dist/recommender.js.map +1 -0
- package/dist/repository.d.ts +18 -0
- package/dist/repository.d.ts.map +1 -0
- package/dist/repository.js +16 -0
- package/dist/repository.js.map +1 -0
- package/dist/sqlite-store.d.ts +19 -0
- package/dist/sqlite-store.d.ts.map +1 -0
- package/dist/sqlite-store.js +103 -0
- package/dist/sqlite-store.js.map +1 -0
- package/dist/tool-service.d.ts +29 -0
- package/dist/tool-service.d.ts.map +1 -0
- package/dist/tool-service.js +140 -0
- package/dist/tool-service.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { ApplicationGuideResponseSchema, BenefitSearchRequestSchema, BenefitSearchResponseSchema, ChangeLogResponseSchema, ChecklistResponseSchema, UpcomingDeadlinesRequestSchema, UpcomingDeadlinesResponseSchema } from "@mcp-gen-ui/schema";
|
|
2
|
+
import { recommendBenefits } from "./recommender.js";
|
|
3
|
+
import { defaultPersonaRegistry, listPersonaPresets } from "./personas.js";
|
|
4
|
+
export const NON_ELIGIBILITY_DISCLAIMER = "Recommendations are candidates, not eligibility decisions, and users must verify final requirements on the official source.";
|
|
5
|
+
/**
|
|
6
|
+
* Transport-neutral entry point for the gateway tools. The MCP server (or any
|
|
7
|
+
* other transport) calls these methods; there is no LLM here — orchestration is
|
|
8
|
+
* the host's responsibility. Every input and output is validated against the
|
|
9
|
+
* shared Zod contracts.
|
|
10
|
+
*/
|
|
11
|
+
export class BenefitToolService {
|
|
12
|
+
repository;
|
|
13
|
+
snapshots;
|
|
14
|
+
personas;
|
|
15
|
+
constructor(repository, snapshots, options = {}) {
|
|
16
|
+
this.repository = repository;
|
|
17
|
+
this.snapshots = snapshots;
|
|
18
|
+
this.personas = options.personas ?? defaultPersonaRegistry;
|
|
19
|
+
}
|
|
20
|
+
async listPersonas() {
|
|
21
|
+
return listPersonaPresets(this.personas);
|
|
22
|
+
}
|
|
23
|
+
async searchBenefits(input) {
|
|
24
|
+
const request = BenefitSearchRequestSchema.parse(input);
|
|
25
|
+
const benefits = await this.repository.search();
|
|
26
|
+
const results = recommendBenefits(benefits, request, { personas: this.personas });
|
|
27
|
+
this.recordSnapshots(benefits);
|
|
28
|
+
return BenefitSearchResponseSchema.parse({
|
|
29
|
+
query: request.query,
|
|
30
|
+
profile: request.profile,
|
|
31
|
+
results,
|
|
32
|
+
generatedAt: new Date().toISOString()
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
async getBenefitDetail(id) {
|
|
36
|
+
const benefit = await this.repository.getById(id);
|
|
37
|
+
if (!benefit) {
|
|
38
|
+
throw new Error(`Benefit not found: ${id}`);
|
|
39
|
+
}
|
|
40
|
+
this.snapshots?.recordBenefitSnapshot(benefit);
|
|
41
|
+
return benefit;
|
|
42
|
+
}
|
|
43
|
+
async getUpcomingDeadlines(input) {
|
|
44
|
+
const request = UpcomingDeadlinesRequestSchema.parse(input ?? {});
|
|
45
|
+
const benefits = await this.repository.search();
|
|
46
|
+
const now = Date.now();
|
|
47
|
+
const maxDeadline = request.withinDays === undefined
|
|
48
|
+
? undefined
|
|
49
|
+
: now + request.withinDays * 24 * 60 * 60 * 1000;
|
|
50
|
+
const recommended = recommendBenefits(benefits, {
|
|
51
|
+
query: "혜택 지원 신청 마감",
|
|
52
|
+
profile: request.profile,
|
|
53
|
+
weights: { query: 0 }
|
|
54
|
+
}, { personas: this.personas });
|
|
55
|
+
const recommendationById = new Map(recommended.map((summary) => [summary.id, summary]));
|
|
56
|
+
const results = benefits
|
|
57
|
+
.filter((benefit) => benefit.applicationDeadline)
|
|
58
|
+
.map((benefit) => ({
|
|
59
|
+
benefit,
|
|
60
|
+
deadlineTime: Date.parse(benefit.applicationDeadline),
|
|
61
|
+
recommendation: recommendationById.get(benefit.id)
|
|
62
|
+
}))
|
|
63
|
+
.filter(({ deadlineTime, recommendation }) => Number.isFinite(deadlineTime) &&
|
|
64
|
+
deadlineTime >= now &&
|
|
65
|
+
(maxDeadline === undefined || deadlineTime <= maxDeadline) &&
|
|
66
|
+
recommendation?.status !== "not_applicable")
|
|
67
|
+
.sort((a, b) => a.deadlineTime - b.deadlineTime)
|
|
68
|
+
.map(({ benefit, recommendation }) => ({
|
|
69
|
+
id: benefit.id,
|
|
70
|
+
title: benefit.title,
|
|
71
|
+
provider: benefit.provider,
|
|
72
|
+
category: benefit.category,
|
|
73
|
+
summary: benefit.summary,
|
|
74
|
+
status: recommendation?.status ?? "needs_more_info",
|
|
75
|
+
score: recommendation?.score ?? 0,
|
|
76
|
+
scoreBreakdown: recommendation?.scoreBreakdown ?? [],
|
|
77
|
+
reasons: recommendation?.reasons ?? [],
|
|
78
|
+
missingInfo: recommendation?.missingInfo ?? [],
|
|
79
|
+
applicationDeadline: benefit.applicationDeadline
|
|
80
|
+
}));
|
|
81
|
+
this.recordSnapshots(benefits);
|
|
82
|
+
return UpcomingDeadlinesResponseSchema.parse({
|
|
83
|
+
profile: request.profile,
|
|
84
|
+
withinDays: request.withinDays,
|
|
85
|
+
results,
|
|
86
|
+
generatedAt: new Date().toISOString()
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
async buildChecklist(benefitId) {
|
|
90
|
+
const benefit = await this.getBenefitDetail(benefitId);
|
|
91
|
+
return ChecklistResponseSchema.parse({
|
|
92
|
+
benefitId,
|
|
93
|
+
items: benefit.documents,
|
|
94
|
+
caveats: [NON_ELIGIBILITY_DISCLAIMER]
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
async getApplicationGuide(benefitId) {
|
|
98
|
+
const benefit = await this.getBenefitDetail(benefitId);
|
|
99
|
+
return ApplicationGuideResponseSchema.parse({
|
|
100
|
+
benefitId,
|
|
101
|
+
steps: [
|
|
102
|
+
{
|
|
103
|
+
order: 1,
|
|
104
|
+
title: "대상 조건 확인",
|
|
105
|
+
description: `${benefit.target} 조건과 본인의 비식별 조건이 맞는지 확인합니다.`,
|
|
106
|
+
requiresUserAction: true
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
order: 2,
|
|
110
|
+
title: "준비물 확인",
|
|
111
|
+
description: "필수 서류와 추가 확인 조건을 체크리스트로 점검합니다.",
|
|
112
|
+
requiresUserAction: true
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
order: 3,
|
|
116
|
+
title: "공식 신청 경로 이동",
|
|
117
|
+
description: benefit.applicationUrl
|
|
118
|
+
? `공식 신청 경로에서 직접 로그인하고 신청합니다: ${benefit.applicationUrl}`
|
|
119
|
+
: "공식 안내 페이지에서 최신 신청 경로를 확인합니다.",
|
|
120
|
+
requiresUserAction: true
|
|
121
|
+
}
|
|
122
|
+
],
|
|
123
|
+
safetyNotice: "MCP 서버는 로그인, 본인인증, 민감정보 입력, 제출을 대신 수행하지 않습니다."
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
async getChangeLog(entityId) {
|
|
127
|
+
return ChangeLogResponseSchema.parse({
|
|
128
|
+
entityId,
|
|
129
|
+
entries: this.snapshots?.getChangeLog(entityId) ?? []
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
recordSnapshots(benefits) {
|
|
133
|
+
if (!this.snapshots)
|
|
134
|
+
return;
|
|
135
|
+
for (const benefit of benefits) {
|
|
136
|
+
this.snapshots.recordBenefitSnapshot(benefit);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=tool-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-service.js","sourceRoot":"","sources":["../src/tool-service.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mcp-gen-ui/core",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Transport-neutral public-benefit repository, recommender, and tool service for mcp-gen-ui.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"author": "Team KOI",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/orca-svg/mcp-gateway-genui.git",
|
|
10
|
+
"directory": "packages/core"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/orca-svg/mcp-gateway-genui#readme",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/orca-svg/mcp-gateway-genui/issues"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public",
|
|
21
|
+
"provenance": true
|
|
22
|
+
},
|
|
23
|
+
"sideEffects": false,
|
|
24
|
+
"type": "module",
|
|
25
|
+
"main": "./dist/index.js",
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"import": "./dist/index.js"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@mcp-gen-ui/schema": "0.2.0"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"prebuild": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
|
|
38
|
+
"build": "tsc -p tsconfig.json",
|
|
39
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
40
|
+
"test": "vitest run"
|
|
41
|
+
}
|
|
42
|
+
}
|