bps-mcp-server 0.3.2 → 0.5.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/README.md +157 -83
- package/dist/client/bps-client.d.ts.map +1 -1
- package/dist/client/bps-client.js +10 -11
- package/dist/client/bps-client.js.map +1 -1
- package/dist/config/defaults.js +11 -11
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/index.d.ts +20 -61
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +5 -5
- package/dist/config/index.js.map +1 -1
- package/dist/prompts/analysis.prompts.js +1 -1
- package/dist/prompts/analysis.prompts.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +3 -0
- package/dist/server.js.map +1 -1
- package/dist/tools/allstats.tools.js +1 -1
- package/dist/tools/allstats.tools.js.map +1 -1
- package/dist/tools/census.tools.js +1 -1
- package/dist/tools/census.tools.js.map +1 -1
- package/dist/tools/csa.tools.js +1 -1
- package/dist/tools/csa.tools.js.map +1 -1
- package/dist/tools/domain.tools.js +1 -1
- package/dist/tools/domain.tools.js.map +1 -1
- package/dist/tools/dynamic-data.tools.d.ts.map +1 -1
- package/dist/tools/dynamic-data.tools.js +14 -2
- package/dist/tools/dynamic-data.tools.js.map +1 -1
- package/dist/tools/glossary.tools.js +1 -1
- package/dist/tools/glossary.tools.js.map +1 -1
- package/dist/tools/infographic.tools.js +1 -1
- package/dist/tools/infographic.tools.js.map +1 -1
- package/dist/tools/news.tools.js +1 -1
- package/dist/tools/news.tools.js.map +1 -1
- package/dist/tools/publication.tools.js +1 -1
- package/dist/tools/publication.tools.js.map +1 -1
- package/dist/tools/reference.tools.d.ts.map +1 -1
- package/dist/tools/reference.tools.js +5 -2
- package/dist/tools/reference.tools.js.map +1 -1
- package/dist/tools/search.tools.d.ts.map +1 -1
- package/dist/tools/search.tools.js +13 -2
- package/dist/tools/search.tools.js.map +1 -1
- package/dist/tools/smart.tools.d.ts +9 -0
- package/dist/tools/smart.tools.d.ts.map +1 -0
- package/dist/tools/smart.tools.js +364 -0
- package/dist/tools/smart.tools.js.map +1 -0
- package/dist/tools/static-table.tools.js +1 -1
- package/dist/tools/static-table.tools.js.map +1 -1
- package/dist/tools/trade.tools.js +1 -1
- package/dist/tools/trade.tools.js.map +1 -1
- package/package.json +13 -11
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import { z } from "zod/v4";
|
|
2
|
+
import { formatDynamicData } from "../services/data-formatter.js";
|
|
3
|
+
import { appendAttribution } from "../services/attribution.js";
|
|
4
|
+
import { logger } from "../utils/logger.js";
|
|
5
|
+
/**
|
|
6
|
+
* AI-friendly shortcut tools that reduce multi-step workflows to single calls.
|
|
7
|
+
*/
|
|
8
|
+
export function registerSmartTools(server, client, resolver, config) {
|
|
9
|
+
// ---------- find_variable ----------
|
|
10
|
+
server.tool("find_variable", `Cari variabel data BPS berdasarkan kata kunci. Mencari di semua subjek yang relevan.
|
|
11
|
+
|
|
12
|
+
Contoh penggunaan:
|
|
13
|
+
- find_variable(keyword="penduduk") → variabel terkait jumlah penduduk
|
|
14
|
+
- find_variable(keyword="kemiskinan", domain="3500") → variabel kemiskinan di Jawa Timur
|
|
15
|
+
- find_variable(keyword="inflasi") → variabel inflasi nasional
|
|
16
|
+
|
|
17
|
+
Setelah mendapat var_id dari tool ini, gunakan get_dynamic_data untuk mengambil datanya.`, {
|
|
18
|
+
keyword: z.string().describe("Kata kunci pencarian variabel (misal: penduduk, kemiskinan, inflasi, pengangguran, PDRB)"),
|
|
19
|
+
domain: z.string().default("0000").describe("Kode domain BPS. '0000'=nasional. Gunakan resolve_domain jika perlu."),
|
|
20
|
+
subject: z.number().optional().describe("Filter berdasarkan ID subjek (opsional, gunakan list_subjects untuk melihat daftar)"),
|
|
21
|
+
}, async ({ keyword, domain, subject }) => {
|
|
22
|
+
try {
|
|
23
|
+
const allVars = [];
|
|
24
|
+
const kw = keyword.toLowerCase();
|
|
25
|
+
if (subject) {
|
|
26
|
+
// Search within specific subject
|
|
27
|
+
await searchVariablesInSubject(client, domain, subject, kw, allVars);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
// Use keyword → subject mapping + subject title matching
|
|
31
|
+
const mappedIds = getSubjectIdsForKeyword(kw);
|
|
32
|
+
const subjects = await client.listSubjects(domain);
|
|
33
|
+
const matchedIds = subjects.data
|
|
34
|
+
.filter(s => {
|
|
35
|
+
const t = s.title.toLowerCase();
|
|
36
|
+
return kw.split(/\s+/).some(w => w.length > 2 && t.includes(w)) || t.includes(kw);
|
|
37
|
+
})
|
|
38
|
+
.map(s => s.sub_id);
|
|
39
|
+
const subjectIds = [...new Set([...mappedIds, ...matchedIds])];
|
|
40
|
+
// Search in relevant subjects first
|
|
41
|
+
for (const subId of subjectIds.slice(0, 5)) {
|
|
42
|
+
await searchVariablesInSubject(client, domain, subId, kw, allVars);
|
|
43
|
+
if (allVars.length >= 15)
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
// If no results from relevant subjects, try without subject filter
|
|
47
|
+
if (allVars.length === 0) {
|
|
48
|
+
await searchVariablesInSubject(client, domain, undefined, kw, allVars);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (allVars.length === 0) {
|
|
52
|
+
return {
|
|
53
|
+
content: [{
|
|
54
|
+
type: "text",
|
|
55
|
+
text: appendAttribution(`Tidak ditemukan variabel yang cocok dengan "${keyword}" di domain ${domain}.\n\n` +
|
|
56
|
+
`**Tips:** Coba kata kunci yang lebih umum, atau gunakan list_subjects untuk melihat subjek yang tersedia, lalu filter dengan parameter subject.`),
|
|
57
|
+
}],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const lines = [
|
|
61
|
+
`## Variabel yang cocok dengan "${keyword}"`,
|
|
62
|
+
`**Domain:** ${domain} | **Ditemukan:** ${allVars.length} variabel`,
|
|
63
|
+
"",
|
|
64
|
+
];
|
|
65
|
+
for (const v of allVars.slice(0, 15)) {
|
|
66
|
+
lines.push(`- **${v.title}** (var_id: \`${v.var_id}\`) — Subjek: ${v.sub_name}${v.unit ? ` — Satuan: ${v.unit}` : ""}`);
|
|
67
|
+
if (v.def)
|
|
68
|
+
lines.push(` _${v.def.substring(0, 150)}_`);
|
|
69
|
+
}
|
|
70
|
+
lines.push("");
|
|
71
|
+
lines.push("**Langkah selanjutnya:** Gunakan `get_dynamic_data(domain=\"" + domain + "\", var=\"<var_id>\")` untuk mengambil data.");
|
|
72
|
+
return { content: [{ type: "text", text: appendAttribution(lines.join("\n")) }] };
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
const msg = error instanceof Error ? error.message : "Gagal mencari variabel";
|
|
76
|
+
return { content: [{ type: "text", text: msg }], isError: true };
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
// ---------- find_data ----------
|
|
80
|
+
server.tool("find_data", `Tool utama untuk AI: cari dan ambil data BPS dalam satu langkah.
|
|
81
|
+
Secara otomatis: resolve nama wilayah → cari variabel → ambil data.
|
|
82
|
+
|
|
83
|
+
Gunakan tool ini sebagai langkah PERTAMA ketika user bertanya tentang data statistik.
|
|
84
|
+
|
|
85
|
+
Contoh:
|
|
86
|
+
- find_data(query="jumlah penduduk", region="Jawa Timur", year="2023")
|
|
87
|
+
- find_data(query="angka kemiskinan", region="Indonesia", year="2020,2021,2022,2023")
|
|
88
|
+
- find_data(query="tingkat pengangguran", region="DKI Jakarta")
|
|
89
|
+
- find_data(query="PDRB", region="Bali", year="2023")
|
|
90
|
+
- find_data(query="inflasi", region="Indonesia", year="2024")
|
|
91
|
+
|
|
92
|
+
Jika hasilnya tidak sesuai, gunakan find_variable untuk mencari variabel yang lebih spesifik, lalu get_dynamic_data.`, {
|
|
93
|
+
query: z.string().describe("Deskripsi data yang dicari (misal: jumlah penduduk, angka kemiskinan, inflasi, PDRB, pengangguran)"),
|
|
94
|
+
region: z.string().default("Indonesia").describe("Nama wilayah (misal: Indonesia, Jawa Timur, Surabaya, DKI Jakarta). Mendukung nama resmi dan singkatan."),
|
|
95
|
+
year: z.string().optional().describe("Tahun data (misal: '2023' atau '2020,2021,2022,2023' untuk multi-tahun). Kosongkan untuk data terbaru."),
|
|
96
|
+
}, async ({ query, region, year }) => {
|
|
97
|
+
try {
|
|
98
|
+
// Step 1: Resolve domain
|
|
99
|
+
let domain = "0000";
|
|
100
|
+
let domainName = "Indonesia";
|
|
101
|
+
if (region.toLowerCase() !== "indonesia" && region !== "0000") {
|
|
102
|
+
const resolved = await resolver.resolve(region);
|
|
103
|
+
if (resolved) {
|
|
104
|
+
domain = resolved.domainId;
|
|
105
|
+
domainName = resolved.domainName;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
return {
|
|
109
|
+
content: [{
|
|
110
|
+
type: "text",
|
|
111
|
+
text: appendAttribution(`Wilayah "${region}" tidak ditemukan. Gunakan resolve_domain untuk mencari kode wilayah yang benar.`),
|
|
112
|
+
}],
|
|
113
|
+
isError: true,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Step 2: Find matching variable by searching relevant subjects
|
|
118
|
+
const kw = query.toLowerCase();
|
|
119
|
+
let bestVar = null;
|
|
120
|
+
const candidates = [];
|
|
121
|
+
// Find subject IDs from keyword mapping + subject title matching
|
|
122
|
+
const mappedSubjectIds = getSubjectIdsForKeyword(kw);
|
|
123
|
+
const subjects = await client.listSubjects(domain);
|
|
124
|
+
const relevantSubjects = subjects.data.filter(s => {
|
|
125
|
+
const titleLower = s.title.toLowerCase();
|
|
126
|
+
return kw.split(/\s+/).some(w => w.length > 2 && titleLower.includes(w)) || titleLower.includes(kw);
|
|
127
|
+
});
|
|
128
|
+
const subjectIdsToSearch = [
|
|
129
|
+
...new Set([...mappedSubjectIds, ...relevantSubjects.map(s => s.sub_id)])
|
|
130
|
+
];
|
|
131
|
+
// Search in relevant subjects
|
|
132
|
+
for (const subId of subjectIdsToSearch.slice(0, 5)) {
|
|
133
|
+
const result = await client.listVariables(domain, subId, undefined, 1, 100);
|
|
134
|
+
if (!result.data || result.data.length === 0)
|
|
135
|
+
continue;
|
|
136
|
+
for (const v of result.data) {
|
|
137
|
+
const titleLower = v.title.toLowerCase();
|
|
138
|
+
const score = computeRelevanceScore(kw, titleLower, v.sub_name?.toLowerCase() || "");
|
|
139
|
+
if (score > 0) {
|
|
140
|
+
candidates.push({ var_id: v.var_id, title: v.title, sub_name: v.sub_name, unit: v.unit, score });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (candidates.length >= 10)
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
// If no results from subject-based search, try without subject filter
|
|
147
|
+
if (candidates.length === 0) {
|
|
148
|
+
const domainsToSearch = domain === "0000" ? ["0000"] : [domain, "0000"];
|
|
149
|
+
for (const searchDomain of domainsToSearch) {
|
|
150
|
+
for (let page = 1; page <= 2; page++) {
|
|
151
|
+
const result = await client.listVariables(searchDomain, undefined, undefined, page, 100);
|
|
152
|
+
if (!result.data || result.data.length === 0)
|
|
153
|
+
break;
|
|
154
|
+
for (const v of result.data) {
|
|
155
|
+
const titleLower = v.title.toLowerCase();
|
|
156
|
+
const score = computeRelevanceScore(kw, titleLower, v.sub_name?.toLowerCase() || "");
|
|
157
|
+
if (score > 0) {
|
|
158
|
+
candidates.push({ var_id: v.var_id, title: v.title, sub_name: v.sub_name, unit: v.unit, score });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (candidates.length >= 5)
|
|
162
|
+
break;
|
|
163
|
+
if (result.data.length < 100)
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
if (candidates.length >= 5)
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Sort by relevance score
|
|
171
|
+
candidates.sort((a, b) => b.score - a.score);
|
|
172
|
+
bestVar = candidates[0] || null;
|
|
173
|
+
if (!bestVar) {
|
|
174
|
+
// Fallback: try strategic indicators
|
|
175
|
+
const indicators = await client.listStrategicIndicators(domain);
|
|
176
|
+
if (indicators.data && indicators.data.length > 0) {
|
|
177
|
+
for (const ind of indicators.data) {
|
|
178
|
+
const titleLower = ind.title.toLowerCase();
|
|
179
|
+
if (titleLower.includes(kw) || kw.split(/\s+/).some(w => titleLower.includes(w))) {
|
|
180
|
+
// Return strategic indicator data directly
|
|
181
|
+
const lines = [
|
|
182
|
+
`## ${ind.title}`,
|
|
183
|
+
`**Wilayah:** ${domainName} (${domain})`,
|
|
184
|
+
"",
|
|
185
|
+
];
|
|
186
|
+
if (ind.data) {
|
|
187
|
+
lines.push("| Periode | Nilai |");
|
|
188
|
+
lines.push("| --- | --- |");
|
|
189
|
+
const entries = Object.entries(ind.data);
|
|
190
|
+
// Filter by year if specified
|
|
191
|
+
const filtered = year
|
|
192
|
+
? entries.filter(([k]) => year.split(",").some(y => k.includes(y)))
|
|
193
|
+
: entries.slice(-10);
|
|
194
|
+
for (const [period, value] of filtered) {
|
|
195
|
+
lines.push(`| ${period} | ${typeof value === "number" ? value.toLocaleString("id-ID") : value} |`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return { content: [{ type: "text", text: appendAttribution(lines.join("\n")) }] };
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
content: [{
|
|
204
|
+
type: "text",
|
|
205
|
+
text: appendAttribution(`Tidak ditemukan data "${query}" untuk ${domainName}.\n\n` +
|
|
206
|
+
`**Saran:**\n` +
|
|
207
|
+
`1. Gunakan \`find_variable(keyword="${query}", domain="${domain}")\` untuk mencari variabel yang lebih spesifik\n` +
|
|
208
|
+
`2. Gunakan \`search(keyword="${query}")\` untuk pencarian lebih luas\n` +
|
|
209
|
+
`3. Gunakan \`list_strategic_indicators(domain="${domain}")\` untuk indikator utama`),
|
|
210
|
+
}],
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
// Step 3: Get data
|
|
214
|
+
logger.debug(`find_data: using var_id=${bestVar.var_id} (${bestVar.title}) for query="${query}"`);
|
|
215
|
+
// Resolve year to period IDs if needed
|
|
216
|
+
let periodParam = year;
|
|
217
|
+
if (year) {
|
|
218
|
+
try {
|
|
219
|
+
const periods = await client.listPeriods(domain, bestVar.var_id);
|
|
220
|
+
if (periods.length > 0) {
|
|
221
|
+
const yearNums = year.split(",").map(y => y.trim());
|
|
222
|
+
// BPS API returns periods with various field names: th_name, th, val
|
|
223
|
+
const matchingPeriods = periods.filter(p => {
|
|
224
|
+
const pAny = p;
|
|
225
|
+
const thName = String(pAny.th_name || pAny.th || "");
|
|
226
|
+
const thVal = String(pAny.val || "");
|
|
227
|
+
const thId = String(p.th_id);
|
|
228
|
+
return yearNums.some(y => thName.includes(y) || thVal.includes(y) || thId === y);
|
|
229
|
+
});
|
|
230
|
+
if (matchingPeriods.length > 0) {
|
|
231
|
+
periodParam = matchingPeriods.map(p => String(p.th_id)).join(",");
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
// If period lookup fails, try with raw year value
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
const result = await client.getDynamicData(domain, String(bestVar.var_id), periodParam);
|
|
240
|
+
const formatted = formatDynamicData(result, domain, config.defaultLang);
|
|
241
|
+
// Prepend context
|
|
242
|
+
const header = `**Pencarian:** "${query}" di ${domainName}${year ? ` (${year})` : ""}\n**Variabel:** ${bestVar.title} (ID: ${bestVar.var_id})\n\n`;
|
|
243
|
+
// If no datacontent, show alternatives
|
|
244
|
+
if (!result.datacontent || Object.keys(result.datacontent).length === 0) {
|
|
245
|
+
const altLines = [
|
|
246
|
+
`Data untuk variabel "${bestVar.title}" tidak tersedia${year ? ` untuk tahun ${year}` : ""} di ${domainName}.`,
|
|
247
|
+
"",
|
|
248
|
+
];
|
|
249
|
+
if (candidates.length > 1) {
|
|
250
|
+
altLines.push("**Variabel alternatif yang ditemukan:**");
|
|
251
|
+
for (const c of candidates.slice(0, 5)) {
|
|
252
|
+
altLines.push(`- ${c.title} (var_id: \`${c.var_id}\`)${c.unit ? ` — ${c.unit}` : ""}`);
|
|
253
|
+
}
|
|
254
|
+
altLines.push("");
|
|
255
|
+
altLines.push("Gunakan `get_dynamic_data` dengan var_id di atas untuk mencoba variabel lain.");
|
|
256
|
+
}
|
|
257
|
+
return { content: [{ type: "text", text: appendAttribution(altLines.join("\n")) }] };
|
|
258
|
+
}
|
|
259
|
+
return { content: [{ type: "text", text: header + formatted }] };
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
const msg = error instanceof Error ? error.message : "Gagal mengambil data";
|
|
263
|
+
return { content: [{ type: "text", text: msg }], isError: true };
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
// Common keyword → subject ID mapping (BPS subject IDs are stable across domains)
|
|
268
|
+
const KEYWORD_SUBJECTS = {
|
|
269
|
+
pengangguran: [6], tenaga: [6], kerja: [6], tpak: [6], angkatan: [6],
|
|
270
|
+
miskin: [23], kemiskinan: [23], gini: [23], ketimpangan: [23],
|
|
271
|
+
penduduk: [12], kependudukan: [12], fertilitas: [12], migrasi: [12],
|
|
272
|
+
inflasi: [3], harga: [3], ihk: [3],
|
|
273
|
+
pdrb: [52], ekonomi: [52, 35], pertumbuhan: [52],
|
|
274
|
+
ipm: [26], pembangunan: [26],
|
|
275
|
+
ekspor: [8], impor: [8], perdagangan: [8],
|
|
276
|
+
pertanian: [55], pangan: [55],
|
|
277
|
+
industri: [9], manufaktur: [9],
|
|
278
|
+
kesehatan: [30],
|
|
279
|
+
pendidikan: [28],
|
|
280
|
+
pariwisata: [16],
|
|
281
|
+
};
|
|
282
|
+
function getSubjectIdsForKeyword(kw) {
|
|
283
|
+
const ids = [];
|
|
284
|
+
for (const [keyword, subIds] of Object.entries(KEYWORD_SUBJECTS)) {
|
|
285
|
+
if (kw.includes(keyword))
|
|
286
|
+
ids.push(...subIds);
|
|
287
|
+
}
|
|
288
|
+
return [...new Set(ids)];
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Search variables within a subject (or all if undefined) and add matches to results array.
|
|
292
|
+
*/
|
|
293
|
+
async function searchVariablesInSubject(client, domain, subject, kw, results) {
|
|
294
|
+
const kwWords = kw.split(/\s+/).filter(w => w.length > 2);
|
|
295
|
+
for (let page = 1; page <= 3; page++) {
|
|
296
|
+
const result = await client.listVariables(domain, subject, undefined, page, 100);
|
|
297
|
+
if (!result.data || result.data.length === 0)
|
|
298
|
+
break;
|
|
299
|
+
for (const v of result.data) {
|
|
300
|
+
const titleLower = v.title.toLowerCase();
|
|
301
|
+
const defLower = (v.def || "").toLowerCase();
|
|
302
|
+
// Match if full keyword or any word matches
|
|
303
|
+
const matches = titleLower.includes(kw) || defLower.includes(kw) ||
|
|
304
|
+
kwWords.some(w => titleLower.includes(w));
|
|
305
|
+
if (matches) {
|
|
306
|
+
// Avoid duplicates
|
|
307
|
+
if (!results.some(r => r.var_id === v.var_id)) {
|
|
308
|
+
results.push({
|
|
309
|
+
var_id: v.var_id,
|
|
310
|
+
title: v.title,
|
|
311
|
+
sub_name: v.sub_name,
|
|
312
|
+
unit: v.unit,
|
|
313
|
+
def: v.def,
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
if (results.length >= 15)
|
|
319
|
+
break;
|
|
320
|
+
if (result.data.length < 100)
|
|
321
|
+
break;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Compute relevance score for a variable title against a search query.
|
|
326
|
+
* Higher score = more relevant.
|
|
327
|
+
*/
|
|
328
|
+
function computeRelevanceScore(query, title, subName) {
|
|
329
|
+
let score = 0;
|
|
330
|
+
const queryWords = query.split(/\s+/).filter(w => w.length > 2);
|
|
331
|
+
// Exact phrase match in title
|
|
332
|
+
if (title.includes(query))
|
|
333
|
+
score += 100;
|
|
334
|
+
// Word-level matches in title
|
|
335
|
+
let wordMatches = 0;
|
|
336
|
+
for (const word of queryWords) {
|
|
337
|
+
if (title.includes(word)) {
|
|
338
|
+
score += 30;
|
|
339
|
+
wordMatches++;
|
|
340
|
+
}
|
|
341
|
+
if (subName.includes(word))
|
|
342
|
+
score += 15;
|
|
343
|
+
}
|
|
344
|
+
// Bonus for matching all query words
|
|
345
|
+
if (queryWords.length > 1 && wordMatches === queryWords.length)
|
|
346
|
+
score += 40;
|
|
347
|
+
// Title starts with query
|
|
348
|
+
if (title.startsWith(query))
|
|
349
|
+
score += 50;
|
|
350
|
+
// Prefer "tingkat" or "persentase" variants (main indicators)
|
|
351
|
+
if (title.includes("tingkat") || title.includes("persentase") || title.includes("jumlah"))
|
|
352
|
+
score += 20;
|
|
353
|
+
// Prefer shorter titles (more general/main indicators)
|
|
354
|
+
if (title.length < 60)
|
|
355
|
+
score += 15;
|
|
356
|
+
if (title.length > 100)
|
|
357
|
+
score -= 20;
|
|
358
|
+
// Penalize titles with "menurut" (breakdowns are less useful as primary)
|
|
359
|
+
const menurutCount = (title.match(/menurut/g) || []).length;
|
|
360
|
+
if (menurutCount > 1)
|
|
361
|
+
score -= 15;
|
|
362
|
+
return score;
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=smart.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart.tools.js","sourceRoot":"","sources":["../../src/tools/smart.tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static-table.tools.js","sourceRoot":"","sources":["../../src/tools/static-table.tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"static-table.tools.js","sourceRoot":"","sources":["../../src/tools/static-table.tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trade.tools.js","sourceRoot":"","sources":["../../src/tools/trade.tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"trade.tools.js","sourceRoot":"","sources":["../../src/tools/trade.tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAG3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,MAAiB;IACrE,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,8HAA8H,EAC9H;QACE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,gDAAgD,CAAC;QACrF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;QACtF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kEAAkE,CAAC;QAChG,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACvD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;KAClF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;QACnD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CACtC,MAAM,CAAC,MAAM,CAAU,EACvB,OAAO,EACP,OAAO,EACP,IAAI,EACJ,MAAM,CACP,CAAC;YACF,MAAM,WAAW,GAAG,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;YACxD,MAAM,IAAI,GAAG,iBAAiB,CAC5B,WAAW,WAAW,SAAS,OAAO,MAAM;gBAC5C,cAAc,IAAI,mBAAmB,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM;gBACzF,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,OAAO,CACxD,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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bps-mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "MCP server for BPS (Badan Pusat Statistik) Indonesia statistics data",
|
|
5
5
|
"author": "Murphi",
|
|
6
6
|
"license": "MIT",
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"build": "tsc",
|
|
26
26
|
"dev": "tsc --watch",
|
|
27
27
|
"start": "node --env-file=.env dist/index.js",
|
|
28
|
+
"prepublishOnly": "npm run build",
|
|
28
29
|
"lint": "eslint src/",
|
|
29
30
|
"typecheck": "tsc --noEmit",
|
|
30
31
|
"typecheck:worker": "tsc --noEmit --project tsconfig.worker.json",
|
|
@@ -37,22 +38,23 @@
|
|
|
37
38
|
"deploy:dry": "wrangler deploy --dry-run"
|
|
38
39
|
},
|
|
39
40
|
"dependencies": {
|
|
40
|
-
"@
|
|
41
|
+
"@cloudflare/workers-oauth-provider": "^0.6.0",
|
|
42
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
41
43
|
"cheerio": "^1.2.0",
|
|
42
|
-
"zod": "^
|
|
44
|
+
"zod": "^4.4.3"
|
|
43
45
|
},
|
|
44
46
|
"devDependencies": {
|
|
45
|
-
"@cloudflare/workers-types": "^4.
|
|
47
|
+
"@cloudflare/workers-types": "^4.20260519.0",
|
|
46
48
|
"@eslint/js": "^10.0.1",
|
|
47
|
-
"@types/node": "^22.
|
|
48
|
-
"eslint": "^10.
|
|
49
|
-
"typescript": "^
|
|
50
|
-
"typescript-eslint": "^8.
|
|
51
|
-
"vitest": "^
|
|
52
|
-
"wrangler": "^4.
|
|
49
|
+
"@types/node": "^22.19.19",
|
|
50
|
+
"eslint": "^10.4.0",
|
|
51
|
+
"typescript": "^6.0.3",
|
|
52
|
+
"typescript-eslint": "^8.59.4",
|
|
53
|
+
"vitest": "^4.1.6",
|
|
54
|
+
"wrangler": "^4.93.0"
|
|
53
55
|
},
|
|
54
56
|
"engines": {
|
|
55
|
-
"node": ">=
|
|
57
|
+
"node": ">=22.0.0"
|
|
56
58
|
},
|
|
57
59
|
"keywords": [
|
|
58
60
|
"mcp",
|