bps-mcp-server 0.1.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 +21 -0
- package/README.md +197 -0
- package/dist/auth/api-key.provider.d.ts +12 -0
- package/dist/auth/api-key.provider.d.ts.map +1 -0
- package/dist/auth/api-key.provider.js +28 -0
- package/dist/auth/api-key.provider.js.map +1 -0
- package/dist/auth/factory.d.ts +4 -0
- package/dist/auth/factory.d.ts.map +1 -0
- package/dist/auth/factory.js +13 -0
- package/dist/auth/factory.js.map +1 -0
- package/dist/auth/oauth2.provider.d.ts +22 -0
- package/dist/auth/oauth2.provider.d.ts.map +1 -0
- package/dist/auth/oauth2.provider.js +64 -0
- package/dist/auth/oauth2.provider.js.map +1 -0
- package/dist/auth/types.d.ts +13 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/client/bps-client.d.ts +93 -0
- package/dist/client/bps-client.d.ts.map +1 -0
- package/dist/client/bps-client.js +255 -0
- package/dist/client/bps-client.js.map +1 -0
- package/dist/client/endpoints.d.ts +57 -0
- package/dist/client/endpoints.d.ts.map +1 -0
- package/dist/client/endpoints.js +166 -0
- package/dist/client/endpoints.js.map +1 -0
- package/dist/client/types.d.ts +273 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/config/defaults.d.ts +24 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +26 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/domain-aliases.d.ts +6 -0
- package/dist/config/domain-aliases.d.ts.map +1 -0
- package/dist/config/domain-aliases.js +105 -0
- package/dist/config/domain-aliases.js.map +1 -0
- package/dist/config/index.d.ts +71 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +52 -0
- package/dist/config/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/analysis.prompts.d.ts +3 -0
- package/dist/prompts/analysis.prompts.d.ts.map +1 -0
- package/dist/prompts/analysis.prompts.js +171 -0
- package/dist/prompts/analysis.prompts.js.map +1 -0
- package/dist/resources/domain.resources.d.ts +5 -0
- package/dist/resources/domain.resources.d.ts.map +1 -0
- package/dist/resources/domain.resources.js +62 -0
- package/dist/resources/domain.resources.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +43 -0
- package/dist/server.js.map +1 -0
- package/dist/services/attribution.d.ts +3 -0
- package/dist/services/attribution.d.ts.map +1 -0
- package/dist/services/attribution.js +8 -0
- package/dist/services/attribution.js.map +1 -0
- package/dist/services/cache.d.ts +21 -0
- package/dist/services/cache.d.ts.map +1 -0
- package/dist/services/cache.js +47 -0
- package/dist/services/cache.js.map +1 -0
- package/dist/services/data-formatter.d.ts +13 -0
- package/dist/services/data-formatter.d.ts.map +1 -0
- package/dist/services/data-formatter.js +166 -0
- package/dist/services/data-formatter.js.map +1 -0
- package/dist/services/domain-resolver.d.ts +22 -0
- package/dist/services/domain-resolver.d.ts.map +1 -0
- package/dist/services/domain-resolver.js +101 -0
- package/dist/services/domain-resolver.js.map +1 -0
- package/dist/tools/census.tools.d.ts +4 -0
- package/dist/tools/census.tools.d.ts.map +1 -0
- package/dist/tools/census.tools.js +28 -0
- package/dist/tools/census.tools.js.map +1 -0
- package/dist/tools/csa.tools.d.ts +4 -0
- package/dist/tools/csa.tools.d.ts.map +1 -0
- package/dist/tools/csa.tools.js +77 -0
- package/dist/tools/csa.tools.js.map +1 -0
- package/dist/tools/domain.tools.d.ts +5 -0
- package/dist/tools/domain.tools.d.ts.map +1 -0
- package/dist/tools/domain.tools.js +44 -0
- package/dist/tools/domain.tools.js.map +1 -0
- package/dist/tools/dynamic-data.tools.d.ts +5 -0
- package/dist/tools/dynamic-data.tools.d.ts.map +1 -0
- package/dist/tools/dynamic-data.tools.js +136 -0
- package/dist/tools/dynamic-data.tools.js.map +1 -0
- package/dist/tools/glossary.tools.d.ts +4 -0
- package/dist/tools/glossary.tools.d.ts.map +1 -0
- package/dist/tools/glossary.tools.js +32 -0
- package/dist/tools/glossary.tools.js.map +1 -0
- package/dist/tools/infographic.tools.d.ts +4 -0
- package/dist/tools/infographic.tools.d.ts.map +1 -0
- package/dist/tools/infographic.tools.js +60 -0
- package/dist/tools/infographic.tools.js.map +1 -0
- package/dist/tools/news.tools.d.ts +4 -0
- package/dist/tools/news.tools.d.ts.map +1 -0
- package/dist/tools/news.tools.js +55 -0
- package/dist/tools/news.tools.js.map +1 -0
- package/dist/tools/publication.tools.d.ts +4 -0
- package/dist/tools/publication.tools.d.ts.map +1 -0
- package/dist/tools/publication.tools.js +101 -0
- package/dist/tools/publication.tools.js.map +1 -0
- package/dist/tools/reference.tools.d.ts +4 -0
- package/dist/tools/reference.tools.d.ts.map +1 -0
- package/dist/tools/reference.tools.js +20 -0
- package/dist/tools/reference.tools.js.map +1 -0
- package/dist/tools/search.tools.d.ts +4 -0
- package/dist/tools/search.tools.d.ts.map +1 -0
- package/dist/tools/search.tools.js +22 -0
- package/dist/tools/search.tools.js.map +1 -0
- package/dist/tools/static-table.tools.d.ts +4 -0
- package/dist/tools/static-table.tools.d.ts.map +1 -0
- package/dist/tools/static-table.tools.js +47 -0
- package/dist/tools/static-table.tools.js.map +1 -0
- package/dist/tools/trade.tools.d.ts +4 -0
- package/dist/tools/trade.tools.d.ts.map +1 -0
- package/dist/tools/trade.tools.js +25 -0
- package/dist/tools/trade.tools.js.map +1 -0
- package/dist/tools/utility.tools.d.ts +4 -0
- package/dist/tools/utility.tools.d.ts.map +1 -0
- package/dist/tools/utility.tools.js +10 -0
- package/dist/tools/utility.tools.js.map +1 -0
- package/dist/transport/stdio.d.ts +3 -0
- package/dist/transport/stdio.d.ts.map +1 -0
- package/dist/transport/stdio.js +9 -0
- package/dist/transport/stdio.js.map +1 -0
- package/dist/utils/error.d.ts +13 -0
- package/dist/utils/error.d.ts.map +1 -0
- package/dist/utils/error.js +38 -0
- package/dist/utils/error.js.map +1 -0
- package/dist/utils/logger.d.ts +12 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +47 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/pagination.d.ts +11 -0
- package/dist/utils/pagination.d.ts.map +1 -0
- package/dist/utils/pagination.js +19 -0
- package/dist/utils/pagination.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain-resolver.d.ts","sourceRoot":"","sources":["../../src/services/domain-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAIpD,qBAAa,cAAc;IAKb,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,MAAM,CAAS;gBAEM,MAAM,EAAE,SAAS;IAExC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;YAKrB,WAAW;IAkBzB;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAiDtF,6BAA6B;IAC7B,UAAU,IAAI,SAAS,EAAE;CAG1B"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { DOMAIN_ALIASES } from "../config/domain-aliases.js";
|
|
2
|
+
import { logger } from "../utils/logger.js";
|
|
3
|
+
export class DomainResolver {
|
|
4
|
+
client;
|
|
5
|
+
domains = [];
|
|
6
|
+
nameIndex = new Map(); // lowercase name → domain_id
|
|
7
|
+
loaded = false;
|
|
8
|
+
constructor(client) {
|
|
9
|
+
this.client = client;
|
|
10
|
+
}
|
|
11
|
+
async ensureLoaded() {
|
|
12
|
+
if (this.loaded)
|
|
13
|
+
return;
|
|
14
|
+
await this.loadDomains();
|
|
15
|
+
}
|
|
16
|
+
async loadDomains() {
|
|
17
|
+
try {
|
|
18
|
+
const result = await this.client.listDomains("all");
|
|
19
|
+
this.domains = result.data;
|
|
20
|
+
this.nameIndex.clear();
|
|
21
|
+
for (const d of this.domains) {
|
|
22
|
+
this.nameIndex.set(d.domain_name.toLowerCase(), d.domain_id);
|
|
23
|
+
}
|
|
24
|
+
this.loaded = true;
|
|
25
|
+
logger.info(`Domain resolver loaded ${this.domains.length} domains`);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
logger.error("Failed to load domains", error);
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Resolve a query (name, alias, or code) to a BPS domain code.
|
|
34
|
+
* Returns null if no match found.
|
|
35
|
+
*/
|
|
36
|
+
async resolve(query) {
|
|
37
|
+
await this.ensureLoaded();
|
|
38
|
+
const q = query.trim().toLowerCase();
|
|
39
|
+
// 1. Direct code match
|
|
40
|
+
const byCode = this.domains.find((d) => d.domain_id === q);
|
|
41
|
+
if (byCode)
|
|
42
|
+
return { domainId: byCode.domain_id, domainName: byCode.domain_name };
|
|
43
|
+
// 2. Alias match
|
|
44
|
+
const aliasId = DOMAIN_ALIASES[q];
|
|
45
|
+
if (aliasId) {
|
|
46
|
+
const byAlias = this.domains.find((d) => d.domain_id === aliasId);
|
|
47
|
+
if (byAlias)
|
|
48
|
+
return { domainId: byAlias.domain_id, domainName: byAlias.domain_name };
|
|
49
|
+
return { domainId: aliasId, domainName: query };
|
|
50
|
+
}
|
|
51
|
+
// 3. Exact name match
|
|
52
|
+
const exactId = this.nameIndex.get(q);
|
|
53
|
+
if (exactId) {
|
|
54
|
+
const d = this.domains.find((d) => d.domain_id === exactId);
|
|
55
|
+
return { domainId: d.domain_id, domainName: d.domain_name };
|
|
56
|
+
}
|
|
57
|
+
// 4. Partial/contains match
|
|
58
|
+
for (const [name, id] of this.nameIndex) {
|
|
59
|
+
if (name.includes(q) || q.includes(name)) {
|
|
60
|
+
const d = this.domains.find((d) => d.domain_id === id);
|
|
61
|
+
return { domainId: d.domain_id, domainName: d.domain_name };
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// 5. Fuzzy match (simple Levenshtein)
|
|
65
|
+
let bestMatch = null;
|
|
66
|
+
let bestDistance = Infinity;
|
|
67
|
+
const maxDistance = Math.max(3, Math.floor(q.length * 0.4));
|
|
68
|
+
for (const [name, id] of this.nameIndex) {
|
|
69
|
+
const dist = levenshtein(q, name);
|
|
70
|
+
if (dist < bestDistance && dist <= maxDistance) {
|
|
71
|
+
bestDistance = dist;
|
|
72
|
+
const d = this.domains.find((d) => d.domain_id === id);
|
|
73
|
+
bestMatch = { domainId: d.domain_id, domainName: d.domain_name };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return bestMatch;
|
|
77
|
+
}
|
|
78
|
+
/** Get all loaded domains */
|
|
79
|
+
getDomains() {
|
|
80
|
+
return this.domains;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function levenshtein(a, b) {
|
|
84
|
+
const m = a.length;
|
|
85
|
+
const n = b.length;
|
|
86
|
+
const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
|
|
87
|
+
for (let i = 0; i <= m; i++)
|
|
88
|
+
dp[i][0] = i;
|
|
89
|
+
for (let j = 0; j <= n; j++)
|
|
90
|
+
dp[0][j] = j;
|
|
91
|
+
for (let i = 1; i <= m; i++) {
|
|
92
|
+
for (let j = 1; j <= n; j++) {
|
|
93
|
+
dp[i][j] =
|
|
94
|
+
a[i - 1] === b[j - 1]
|
|
95
|
+
? dp[i - 1][j - 1]
|
|
96
|
+
: 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return dp[m][n];
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=domain-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain-resolver.js","sourceRoot":"","sources":["../../src/services/domain-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"census.tools.d.ts","sourceRoot":"","sources":["../../src/tools/census.tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAIzD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAwC9E"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { formatList } from "../services/data-formatter.js";
|
|
3
|
+
import { formatErrorForUser } from "../utils/error.js";
|
|
4
|
+
export function registerCensusTools(server, client) {
|
|
5
|
+
server.tool("list_census_events", "Daftar kegiatan sensus BPS (Sensus Penduduk, Sensus Ekonomi, Sensus Pertanian, dll). Gunakan ID kegiatan untuk mengambil topik dan data sensus.", {}, async () => {
|
|
6
|
+
try {
|
|
7
|
+
const result = await client.listCensusEvents();
|
|
8
|
+
const text = formatList(result, (e) => `**${e.kegiatan}** (ID: ${e.id}) — Tahun: ${e.tahun_kegiatan}`, "Daftar Kegiatan Sensus");
|
|
9
|
+
return { content: [{ type: "text", text }] };
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
return { content: [{ type: "text", text: formatErrorForUser(error) }], isError: true };
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
server.tool("list_census_topics", "Daftar topik data yang tersedia untuk kegiatan sensus tertentu. Gunakan list_census_events untuk mendapatkan ID kegiatan.", {
|
|
16
|
+
kegiatan: z.string().describe("ID kegiatan sensus (dari list_census_events)"),
|
|
17
|
+
}, async ({ kegiatan }) => {
|
|
18
|
+
try {
|
|
19
|
+
const result = await client.listCensusTopics(kegiatan);
|
|
20
|
+
const text = formatList(result, (t) => `**${t.topik}** (ID: ${t.id}) — ${t.topic}`, "Daftar Topik Sensus");
|
|
21
|
+
return { content: [{ type: "text", text }] };
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
return { content: [{ type: "text", text: formatErrorForUser(error) }], isError: true };
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=census.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"census.tools.js","sourceRoot":"","sources":["../../src/tools/census.tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAiB;IACtE,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,iJAAiJ,EACjJ,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,UAAU,CACrB,MAAM,EACN,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,WAAW,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,cAAc,EAAE,EACrE,wBAAwB,CACzB,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACzF,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,2HAA2H,EAC3H;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;KAC9E,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,UAAU,CACrB,MAAM,EACN,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAClD,qBAAqB,CACtB,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACzF,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csa.tools.d.ts","sourceRoot":"","sources":["../../src/tools/csa.tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAKzD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAqG3E"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { formatList } from "../services/data-formatter.js";
|
|
3
|
+
import { appendAttribution } from "../services/attribution.js";
|
|
4
|
+
import { formatErrorForUser } from "../utils/error.js";
|
|
5
|
+
export function registerCsaTools(server, client) {
|
|
6
|
+
server.tool("list_csa_categories", "Daftar kategori CSA (Classification of Statistical Activities) BPS. CSA adalah klasifikasi aktivitas statistik internasional.", {
|
|
7
|
+
domain: z.string().default("0000").describe("Kode domain BPS"),
|
|
8
|
+
}, async ({ domain }) => {
|
|
9
|
+
try {
|
|
10
|
+
const result = await client.listCsaSubjectCategories(domain);
|
|
11
|
+
const text = formatList(result, (c) => `**${c.title}** (ID: ${c.subcat_id})`, "Daftar Kategori CSA");
|
|
12
|
+
return { content: [{ type: "text", text }] };
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
return { content: [{ type: "text", text: formatErrorForUser(error) }], isError: true };
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
server.tool("list_csa_subjects", "Daftar subjek CSA untuk domain dan kategori tertentu.", {
|
|
19
|
+
domain: z.string().default("0000").describe("Kode domain BPS"),
|
|
20
|
+
subcat: z.number().optional().describe("Filter berdasarkan ID kategori CSA"),
|
|
21
|
+
}, async ({ domain, subcat }) => {
|
|
22
|
+
try {
|
|
23
|
+
const result = await client.listCsaSubjects(domain, subcat);
|
|
24
|
+
const text = formatList(result.data, (s) => `**${s.title}** (ID: ${s.sub_id}) — Kategori: ${s.subcat} — ${s.ntabel} tabel`, "Daftar Subjek CSA");
|
|
25
|
+
return { content: [{ type: "text", text }] };
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
return { content: [{ type: "text", text: formatErrorForUser(error) }], isError: true };
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
server.tool("list_csa_tables", "Daftar tabel CSA untuk domain dan subjek tertentu.", {
|
|
32
|
+
domain: z.string().default("0000").describe("Kode domain BPS"),
|
|
33
|
+
subject: z.number().optional().describe("Filter berdasarkan ID subjek CSA"),
|
|
34
|
+
page: z.number().optional().describe("Nomor halaman"),
|
|
35
|
+
}, async ({ domain, subject, page }) => {
|
|
36
|
+
try {
|
|
37
|
+
const result = await client.listCsaTables(domain, subject, page);
|
|
38
|
+
const text = formatList(result.data, (t) => {
|
|
39
|
+
let desc = `**${t.title}** (ID: ${t.id})`;
|
|
40
|
+
if (t.latest_period)
|
|
41
|
+
desc += ` — Periode terbaru: ${t.latest_period}`;
|
|
42
|
+
desc += ` — Update: ${t.last_update}`;
|
|
43
|
+
return desc;
|
|
44
|
+
}, "Daftar Tabel CSA");
|
|
45
|
+
return { content: [{ type: "text", text }] };
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return { content: [{ type: "text", text: formatErrorForUser(error) }], isError: true };
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
server.tool("get_csa_table", "Ambil detail satu tabel CSA (termasuk konten tabel dalam format HTML).", {
|
|
52
|
+
domain: z.string().describe("Kode domain BPS"),
|
|
53
|
+
id: z.string().describe("ID tabel CSA"),
|
|
54
|
+
}, async ({ domain, id }) => {
|
|
55
|
+
try {
|
|
56
|
+
const detail = await client.getCsaTable(domain, id);
|
|
57
|
+
const lines = [
|
|
58
|
+
`## ${detail.title}`,
|
|
59
|
+
"",
|
|
60
|
+
`**ID:** ${detail.table_id}`,
|
|
61
|
+
`**Kategori CSA:** ${detail.subcsa}`,
|
|
62
|
+
`**Update:** ${detail.updt_date}`,
|
|
63
|
+
"",
|
|
64
|
+
detail.table,
|
|
65
|
+
];
|
|
66
|
+
if (detail.excel) {
|
|
67
|
+
lines.push("", `**Download Excel:** ${detail.excel}`);
|
|
68
|
+
}
|
|
69
|
+
const text = appendAttribution(lines.join("\n"));
|
|
70
|
+
return { content: [{ type: "text", text }] };
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
return { content: [{ type: "text", text: formatErrorForUser(error) }], isError: true };
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=csa.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csa.tools.js","sourceRoot":"","sources":["../../src/tools/csa.tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { BpsClient } from "../client/bps-client.js";
|
|
3
|
+
import type { DomainResolver } from "../services/domain-resolver.js";
|
|
4
|
+
export declare function registerDomainTools(server: McpServer, client: BpsClient, resolver: DomainResolver): void;
|
|
5
|
+
//# sourceMappingURL=domain.tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain.tools.d.ts","sourceRoot":"","sources":["../../src/tools/domain.tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAKrE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,cAAc,GACvB,IAAI,CAqDN"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { formatList } from "../services/data-formatter.js";
|
|
3
|
+
import { appendAttribution } from "../services/attribution.js";
|
|
4
|
+
import { formatErrorForUser } from "../utils/error.js";
|
|
5
|
+
export function registerDomainTools(server, client, resolver) {
|
|
6
|
+
server.tool("list_domains", "Daftar domain/wilayah BPS (provinsi, kabupaten/kota). Gunakan type='prov' untuk provinsi, 'kab' untuk semua kabupaten, 'kabbyprov' untuk kabupaten per provinsi.", {
|
|
7
|
+
type: z.enum(["all", "prov", "kab", "kabbyprov"]).default("all").describe("Tipe domain: all, prov (provinsi), kab (kabupaten), kabbyprov (kabupaten per provinsi)"),
|
|
8
|
+
prov: z.string().optional().describe("ID provinsi (wajib jika type=kabbyprov). Contoh: '35' untuk Jawa Timur"),
|
|
9
|
+
}, async ({ type, prov }) => {
|
|
10
|
+
try {
|
|
11
|
+
const result = await client.listDomains(type, prov);
|
|
12
|
+
const text = formatList(result.data, (d) => `**${d.domain_name}** (kode: ${d.domain_id})`, "Daftar Domain/Wilayah");
|
|
13
|
+
return { content: [{ type: "text", text }] };
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
return { content: [{ type: "text", text: formatErrorForUser(error) }], isError: true };
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
server.tool("resolve_domain", "Konversi nama wilayah ke kode domain BPS. Mendukung nama resmi, singkatan (Jatim, Jabar, Jogja), dan fuzzy matching.", {
|
|
20
|
+
query: z.string().describe("Nama wilayah yang ingin di-resolve. Contoh: 'Surabaya', 'Jawa Timur', 'Jatim', '3578'"),
|
|
21
|
+
}, async ({ query }) => {
|
|
22
|
+
try {
|
|
23
|
+
const result = await resolver.resolve(query);
|
|
24
|
+
if (!result) {
|
|
25
|
+
return {
|
|
26
|
+
content: [{
|
|
27
|
+
type: "text",
|
|
28
|
+
text: appendAttribution(`Wilayah "${query}" tidak ditemukan. Coba gunakan nama resmi atau kode BPS.`),
|
|
29
|
+
}],
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
content: [{
|
|
34
|
+
type: "text",
|
|
35
|
+
text: appendAttribution(`**${result.domainName}**\nKode domain: ${result.domainId}\n\nGunakan kode "${result.domainId}" sebagai parameter 'domain' di tool lainnya.`),
|
|
36
|
+
}],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
return { content: [{ type: "text", text: formatErrorForUser(error) }], isError: true };
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=domain.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain.tools.js","sourceRoot":"","sources":["../../src/tools/domain.tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,UAAU,mBAAmB,CACjC,MAAiB,EACjB,MAAiB,EACjB,QAAwB;IAExB,MAAM,CAAC,IAAI,CACT,cAAc,EACd,kKAAkK,EAClK;QACE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,wFAAwF,CAAC;QACnK,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wEAAwE,CAAC;KAC/G,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACpD,MAAM,IAAI,GAAG,UAAU,CACrB,MAAM,CAAC,IAAI,EACX,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,WAAW,aAAa,CAAC,CAAC,SAAS,GAAG,EACpD,uBAAuB,CACxB,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACzF,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,sHAAsH,EACtH;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uFAAuF,CAAC;KACpH,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,iBAAiB,CAAC,YAAY,KAAK,2DAA2D,CAAC;yBACtG,CAAC;iBACH,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,iBAAiB,CACrB,KAAK,MAAM,CAAC,UAAU,oBAAoB,MAAM,CAAC,QAAQ,qBAAqB,MAAM,CAAC,QAAQ,+CAA+C,CAC7I;qBACF,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACzF,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { BpsClient } from "../client/bps-client.js";
|
|
3
|
+
import type { Config } from "../config/index.js";
|
|
4
|
+
export declare function registerDynamicDataTools(server: McpServer, client: BpsClient, config: Config): void;
|
|
5
|
+
//# sourceMappingURL=dynamic-data.tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-data.tools.d.ts","sourceRoot":"","sources":["../../src/tools/dynamic-data.tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAIjD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA4MnG"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { formatDynamicData, formatList } from "../services/data-formatter.js";
|
|
3
|
+
import { formatErrorForUser } from "../utils/error.js";
|
|
4
|
+
export function registerDynamicDataTools(server, client, config) {
|
|
5
|
+
server.tool("list_subjects", "Daftar subjek data statistik yang tersedia di BPS untuk domain tertentu. Subjek adalah kategori utama data (misal: Kependudukan, Kemiskinan, Perdagangan).", {
|
|
6
|
+
domain: z.string().default("0000").describe("Kode domain BPS. '0000' untuk nasional. Gunakan resolve_domain untuk mendapatkan kode."),
|
|
7
|
+
subcat: z.number().optional().describe("Filter berdasarkan kategori subjek (opsional)"),
|
|
8
|
+
}, async ({ domain, subcat }) => {
|
|
9
|
+
try {
|
|
10
|
+
const result = await client.listSubjects(domain, subcat);
|
|
11
|
+
const text = formatList(result.data, (s) => `**${s.title}** (ID: ${s.sub_id}) — ${s.ntabel ?? 0} tabel, ${s.nvar ?? 0} variabel`, "Daftar Subjek Statistik");
|
|
12
|
+
return { content: [{ type: "text", text }] };
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
return { content: [{ type: "text", text: formatErrorForUser(error) }], isError: true };
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
server.tool("list_subject_categories", "Daftar kategori subjek statistik BPS. Kategori mengelompokkan subjek-subjek terkait.", {
|
|
19
|
+
domain: z.string().default("0000").describe("Kode domain BPS"),
|
|
20
|
+
}, async ({ domain }) => {
|
|
21
|
+
try {
|
|
22
|
+
const result = await client.listSubjectCategories(domain);
|
|
23
|
+
const text = formatList(result, (c) => `**${c.title}** (ID: ${c.subcat_id})`, "Daftar Kategori Subjek");
|
|
24
|
+
return { content: [{ type: "text", text }] };
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
return { content: [{ type: "text", text: formatErrorForUser(error) }], isError: true };
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
server.tool("list_variables", "Daftar variabel data di tabel dinamis BPS. Variabel menentukan data spesifik yang bisa diambil (misal: Jumlah Penduduk, Angka Kemiskinan).", {
|
|
31
|
+
domain: z.string().default("0000").describe("Kode domain BPS"),
|
|
32
|
+
subject: z.number().optional().describe("Filter berdasarkan ID subjek"),
|
|
33
|
+
year: z.number().optional().describe("Filter berdasarkan tahun"),
|
|
34
|
+
page: z.number().optional().describe("Nomor halaman (default: 1)"),
|
|
35
|
+
}, async ({ domain, subject, year, page }) => {
|
|
36
|
+
try {
|
|
37
|
+
const result = await client.listVariables(domain, subject, year, page);
|
|
38
|
+
const text = formatList(result.data, (v) => {
|
|
39
|
+
let desc = `**${v.title}** (ID: ${v.var_id})`;
|
|
40
|
+
if (v.sub_name)
|
|
41
|
+
desc += ` — Subjek: ${v.sub_name}`;
|
|
42
|
+
if (v.unit)
|
|
43
|
+
desc += ` — Satuan: ${v.unit}`;
|
|
44
|
+
if (v.def)
|
|
45
|
+
desc += `\n ${v.def}`;
|
|
46
|
+
return desc;
|
|
47
|
+
}, "Daftar Variabel");
|
|
48
|
+
return { content: [{ type: "text", text }] };
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
return { content: [{ type: "text", text: formatErrorForUser(error) }], isError: true };
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
server.tool("list_vertical_variables", "Daftar variabel vertikal (breakdown/disaggregasi) untuk variabel tertentu. Contoh: jenis kelamin, kelompok umur.", {
|
|
55
|
+
domain: z.string().default("0000").describe("Kode domain BPS"),
|
|
56
|
+
var: z.number().optional().describe("ID variabel untuk melihat vertikal variabelnya"),
|
|
57
|
+
}, async ({ domain, var: varId }) => {
|
|
58
|
+
try {
|
|
59
|
+
const result = await client.listVerticalVariables(domain, varId);
|
|
60
|
+
const text = formatList(result, (v) => `**${v.label_vervar}** (ID: ${v.kode_vervar}) — Grup: ${v.name_group_vervar}`, "Daftar Variabel Vertikal");
|
|
61
|
+
return { content: [{ type: "text", text }] };
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
return { content: [{ type: "text", text: formatErrorForUser(error) }], isError: true };
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
server.tool("list_derived_variables", "Daftar turunan variabel (derived/aggregated categories). Contoh: total, rata-rata.", {
|
|
68
|
+
domain: z.string().default("0000").describe("Kode domain BPS"),
|
|
69
|
+
var: z.number().optional().describe("ID variabel"),
|
|
70
|
+
}, async ({ domain, var: varId }) => {
|
|
71
|
+
try {
|
|
72
|
+
const result = await client.listDerivedVariables(domain, varId);
|
|
73
|
+
const text = formatList(result, (v) => `**${v.label_turvar}** (ID: ${v.kode_turvar}) — Grup: ${v.name_group_turvar}`, "Daftar Turunan Variabel");
|
|
74
|
+
return { content: [{ type: "text", text }] };
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
return { content: [{ type: "text", text: formatErrorForUser(error) }], isError: true };
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
server.tool("list_periods", "Daftar periode data yang tersedia untuk variabel tertentu. Periode bisa berupa tahun, semester, triwulan, atau bulan.", {
|
|
81
|
+
domain: z.string().default("0000").describe("Kode domain BPS"),
|
|
82
|
+
var: z.number().optional().describe("ID variabel"),
|
|
83
|
+
}, async ({ domain, var: varId }) => {
|
|
84
|
+
try {
|
|
85
|
+
const result = await client.listPeriods(domain, varId);
|
|
86
|
+
const text = formatList(result, (p) => `**${p.th_name}** (ID: ${p.th_id})`, "Daftar Periode Data");
|
|
87
|
+
return { content: [{ type: "text", text }] };
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
return { content: [{ type: "text", text: formatErrorForUser(error) }], isError: true };
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
server.tool("list_derived_periods", "Daftar turunan periode untuk variabel tertentu.", {
|
|
94
|
+
domain: z.string().default("0000").describe("Kode domain BPS"),
|
|
95
|
+
var: z.number().optional().describe("ID variabel"),
|
|
96
|
+
}, async ({ domain, var: varId }) => {
|
|
97
|
+
try {
|
|
98
|
+
const result = await client.listDerivedPeriods(domain, varId);
|
|
99
|
+
const text = formatList(result, (p) => `**${p.turth_name}** (ID: ${p.turth_id})`, "Daftar Turunan Periode");
|
|
100
|
+
return { content: [{ type: "text", text }] };
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
return { content: [{ type: "text", text: formatErrorForUser(error) }], isError: true };
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
server.tool("list_units", "Daftar satuan data yang digunakan di domain tertentu. Contoh: Jiwa, Persen, Rupiah.", {
|
|
107
|
+
domain: z.string().default("0000").describe("Kode domain BPS"),
|
|
108
|
+
}, async ({ domain }) => {
|
|
109
|
+
try {
|
|
110
|
+
const result = await client.listUnits(domain);
|
|
111
|
+
const text = formatList(result, (u) => `**${u.unit}** (ID: ${u.unit_id})`, "Daftar Satuan Data");
|
|
112
|
+
return { content: [{ type: "text", text }] };
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
return { content: [{ type: "text", text: formatErrorForUser(error) }], isError: true };
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
server.tool("get_dynamic_data", "Ambil data dari tabel dinamis BPS. Ini adalah tool utama untuk mendapatkan data statistik. Gunakan list_variables untuk menemukan ID variabel, dan list_periods untuk menemukan kode periode.", {
|
|
119
|
+
domain: z.string().describe("Kode domain BPS. '0000' untuk nasional."),
|
|
120
|
+
var: z.string().describe("ID variabel (bisa beberapa, pisahkan dengan koma). Contoh: '1452' atau '1452,1453'"),
|
|
121
|
+
th: z.string().optional().describe("Kode periode/tahun (bisa beberapa). Contoh: '2023' atau '2020,2021,2022,2023'"),
|
|
122
|
+
turvar: z.string().optional().describe("Kode turunan variabel"),
|
|
123
|
+
vervar: z.string().optional().describe("Kode variabel vertikal"),
|
|
124
|
+
turth: z.string().optional().describe("Kode turunan periode"),
|
|
125
|
+
}, async ({ domain, var: varId, th, turvar, vervar, turth }) => {
|
|
126
|
+
try {
|
|
127
|
+
const result = await client.getDynamicData(domain, varId, th, turvar, vervar, turth);
|
|
128
|
+
const text = formatDynamicData(result, domain, config.defaultLang);
|
|
129
|
+
return { content: [{ type: "text", text }] };
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
return { content: [{ type: "text", text: formatErrorForUser(error) }], isError: true };
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=dynamic-data.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-data.tools.js","sourceRoot":"","sources":["../../src/tools/dynamic-data.tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glossary.tools.d.ts","sourceRoot":"","sources":["../../src/tools/glossary.tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAIzD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAiChF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { formatList } from "../services/data-formatter.js";
|
|
3
|
+
import { formatErrorForUser } from "../utils/error.js";
|
|
4
|
+
export function registerGlossaryTools(server, client) {
|
|
5
|
+
server.tool("list_glossary", "Cari istilah di glosarium statistik BPS. Berguna untuk memahami definisi dan pengertian indikator statistik.", {
|
|
6
|
+
domain: z.string().default("0000").describe("Kode domain BPS"),
|
|
7
|
+
keyword: z.string().optional().describe("Kata kunci pencarian istilah"),
|
|
8
|
+
page: z.number().optional().describe("Nomor halaman"),
|
|
9
|
+
}, async ({ domain, keyword, page }) => {
|
|
10
|
+
try {
|
|
11
|
+
const result = await client.listGlossary(domain, keyword, page);
|
|
12
|
+
const text = formatList(result.data, (g) => {
|
|
13
|
+
const src = g._source;
|
|
14
|
+
let desc = `**${src.judulIndikator}**`;
|
|
15
|
+
const definisi = src.definisi?.trim();
|
|
16
|
+
if (definisi && definisi !== "." && definisi !== ". Produsen data oleh") {
|
|
17
|
+
desc += `\n ${definisi.substring(0, 300)}`;
|
|
18
|
+
}
|
|
19
|
+
if (src.satuan && src.satuan !== "-")
|
|
20
|
+
desc += ` (satuan: ${src.satuan})`;
|
|
21
|
+
if (src.sumberData)
|
|
22
|
+
desc += `\n _Sumber: ${src.sumberData}_`;
|
|
23
|
+
return desc;
|
|
24
|
+
}, "Glosarium Statistik BPS");
|
|
25
|
+
return { content: [{ type: "text", text }] };
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
return { content: [{ type: "text", text: formatErrorForUser(error) }], isError: true };
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=glossary.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glossary.tools.js","sourceRoot":"","sources":["../../src/tools/glossary.tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,MAAiB;IACxE,MAAM,CAAC,IAAI,CACT,eAAe,EACf,8GAA8G,EAC9G;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAC9D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACvE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;KACtD,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAChE,MAAM,IAAI,GAAG,UAAU,CACrB,MAAM,CAAC,IAAI,EACX,CAAC,CAAC,EAAE,EAAE;gBACJ,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC;gBACtB,IAAI,IAAI,GAAG,KAAK,GAAG,CAAC,cAAc,IAAI,CAAC;gBACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;gBACtC,IAAI,QAAQ,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,sBAAsB,EAAE,CAAC;oBACxE,IAAI,IAAI,QAAQ,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;gBAC/C,CAAC;gBACD,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;oBAAE,IAAI,IAAI,aAAa,GAAG,CAAC,MAAM,GAAG,CAAC;gBACzE,IAAI,GAAG,CAAC,UAAU;oBAAE,IAAI,IAAI,iBAAiB,GAAG,CAAC,UAAU,GAAG,CAAC;gBAC/D,OAAO,IAAI,CAAC;YACd,CAAC,EACD,yBAAyB,CAC1B,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACzF,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { BpsClient } from "../client/bps-client.js";
|
|
3
|
+
export declare function registerInfographicTools(server: McpServer, client: BpsClient): void;
|
|
4
|
+
//# sourceMappingURL=infographic.tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infographic.tools.d.ts","sourceRoot":"","sources":["../../src/tools/infographic.tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAKzD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAuEnF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { formatList } from "../services/data-formatter.js";
|
|
3
|
+
import { appendAttribution } from "../services/attribution.js";
|
|
4
|
+
import { formatErrorForUser } from "../utils/error.js";
|
|
5
|
+
export function registerInfographicTools(server, client) {
|
|
6
|
+
server.tool("list_infographics", "Daftar infografis dari BPS. Infografis berisi visualisasi data statistik yang mudah dipahami.", {
|
|
7
|
+
domain: z.string().default("0000").describe("Kode domain BPS"),
|
|
8
|
+
keyword: z.string().optional().describe("Kata kunci pencarian"),
|
|
9
|
+
page: z.number().optional().describe("Nomor halaman"),
|
|
10
|
+
}, async ({ domain, keyword, page }) => {
|
|
11
|
+
try {
|
|
12
|
+
const result = await client.listInfographics(domain, keyword, page);
|
|
13
|
+
const pageInfo = result.page ? `\n\n*Halaman ${result.page.page} dari ${result.page.pages} (total: ${result.page.total})*` : "";
|
|
14
|
+
const text = formatList(result.data, (inf) => `**${inf.title.replace(/\(\d\)\d{4}-\d{2}-\d{2}$/, "").trim()}** (ID: ${inf.inf_id}) — ${inf.date}`, "Daftar Infografis BPS") + pageInfo;
|
|
15
|
+
return { content: [{ type: "text", text }] };
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
return { content: [{ type: "text", text: formatErrorForUser(error) }], isError: true };
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
server.tool("get_infographic", "Ambil detail satu infografis BPS termasuk deskripsi lengkap dan link download.", {
|
|
22
|
+
domain: z.string().describe("Kode domain BPS"),
|
|
23
|
+
id: z.number().describe("ID infografis"),
|
|
24
|
+
}, async ({ domain, id }) => {
|
|
25
|
+
try {
|
|
26
|
+
const inf = await client.getInfographic(domain, id);
|
|
27
|
+
const cleanTitle = inf.title.replace(/\(\d\)\d{4}-\d{2}-\d{2}$/, "").trim();
|
|
28
|
+
// Strip HTML tags from description
|
|
29
|
+
const cleanDesc = inf.desc
|
|
30
|
+
.replace(/<\/?[^>]+(>|$)/g, "")
|
|
31
|
+
.replace(/</g, "<")
|
|
32
|
+
.replace(/>/g, ">")
|
|
33
|
+
.replace(/&/g, "&")
|
|
34
|
+
.trim();
|
|
35
|
+
const lines = [
|
|
36
|
+
`## ${cleanTitle}`,
|
|
37
|
+
"",
|
|
38
|
+
`**Tanggal:** ${inf.date}`,
|
|
39
|
+
"",
|
|
40
|
+
"### Deskripsi",
|
|
41
|
+
cleanDesc,
|
|
42
|
+
"",
|
|
43
|
+
`**Gambar:** ${inf.img}`,
|
|
44
|
+
`**Download:** ${inf.dl}`,
|
|
45
|
+
];
|
|
46
|
+
if (inf.related && inf.related.length > 0) {
|
|
47
|
+
lines.push("", "### Infografis Terkait");
|
|
48
|
+
for (const r of inf.related) {
|
|
49
|
+
lines.push(`- ${r.title.replace(/\(\d\)\d{4}-\d{2}-\d{2}$/, "").trim()} (ID: ${r.id})`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const text = appendAttribution(lines.join("\n"));
|
|
53
|
+
return { content: [{ type: "text", text }] };
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
return { content: [{ type: "text", text: formatErrorForUser(error) }], isError: true };
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=infographic.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infographic.tools.js","sourceRoot":"","sources":["../../src/tools/infographic.tools.ts"],"names":[],"mappings":"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"}
|