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.
Files changed (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +197 -0
  3. package/dist/auth/api-key.provider.d.ts +12 -0
  4. package/dist/auth/api-key.provider.d.ts.map +1 -0
  5. package/dist/auth/api-key.provider.js +28 -0
  6. package/dist/auth/api-key.provider.js.map +1 -0
  7. package/dist/auth/factory.d.ts +4 -0
  8. package/dist/auth/factory.d.ts.map +1 -0
  9. package/dist/auth/factory.js +13 -0
  10. package/dist/auth/factory.js.map +1 -0
  11. package/dist/auth/oauth2.provider.d.ts +22 -0
  12. package/dist/auth/oauth2.provider.d.ts.map +1 -0
  13. package/dist/auth/oauth2.provider.js +64 -0
  14. package/dist/auth/oauth2.provider.js.map +1 -0
  15. package/dist/auth/types.d.ts +13 -0
  16. package/dist/auth/types.d.ts.map +1 -0
  17. package/dist/auth/types.js +2 -0
  18. package/dist/auth/types.js.map +1 -0
  19. package/dist/client/bps-client.d.ts +93 -0
  20. package/dist/client/bps-client.d.ts.map +1 -0
  21. package/dist/client/bps-client.js +255 -0
  22. package/dist/client/bps-client.js.map +1 -0
  23. package/dist/client/endpoints.d.ts +57 -0
  24. package/dist/client/endpoints.d.ts.map +1 -0
  25. package/dist/client/endpoints.js +166 -0
  26. package/dist/client/endpoints.js.map +1 -0
  27. package/dist/client/types.d.ts +273 -0
  28. package/dist/client/types.d.ts.map +1 -0
  29. package/dist/client/types.js +2 -0
  30. package/dist/client/types.js.map +1 -0
  31. package/dist/config/defaults.d.ts +24 -0
  32. package/dist/config/defaults.d.ts.map +1 -0
  33. package/dist/config/defaults.js +26 -0
  34. package/dist/config/defaults.js.map +1 -0
  35. package/dist/config/domain-aliases.d.ts +6 -0
  36. package/dist/config/domain-aliases.d.ts.map +1 -0
  37. package/dist/config/domain-aliases.js +105 -0
  38. package/dist/config/domain-aliases.js.map +1 -0
  39. package/dist/config/index.d.ts +71 -0
  40. package/dist/config/index.d.ts.map +1 -0
  41. package/dist/config/index.js +52 -0
  42. package/dist/config/index.js.map +1 -0
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +31 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/prompts/analysis.prompts.d.ts +3 -0
  48. package/dist/prompts/analysis.prompts.d.ts.map +1 -0
  49. package/dist/prompts/analysis.prompts.js +171 -0
  50. package/dist/prompts/analysis.prompts.js.map +1 -0
  51. package/dist/resources/domain.resources.d.ts +5 -0
  52. package/dist/resources/domain.resources.d.ts.map +1 -0
  53. package/dist/resources/domain.resources.js +62 -0
  54. package/dist/resources/domain.resources.js.map +1 -0
  55. package/dist/server.d.ts +12 -0
  56. package/dist/server.d.ts.map +1 -0
  57. package/dist/server.js +43 -0
  58. package/dist/server.js.map +1 -0
  59. package/dist/services/attribution.d.ts +3 -0
  60. package/dist/services/attribution.d.ts.map +1 -0
  61. package/dist/services/attribution.js +8 -0
  62. package/dist/services/attribution.js.map +1 -0
  63. package/dist/services/cache.d.ts +21 -0
  64. package/dist/services/cache.d.ts.map +1 -0
  65. package/dist/services/cache.js +47 -0
  66. package/dist/services/cache.js.map +1 -0
  67. package/dist/services/data-formatter.d.ts +13 -0
  68. package/dist/services/data-formatter.d.ts.map +1 -0
  69. package/dist/services/data-formatter.js +166 -0
  70. package/dist/services/data-formatter.js.map +1 -0
  71. package/dist/services/domain-resolver.d.ts +22 -0
  72. package/dist/services/domain-resolver.d.ts.map +1 -0
  73. package/dist/services/domain-resolver.js +101 -0
  74. package/dist/services/domain-resolver.js.map +1 -0
  75. package/dist/tools/census.tools.d.ts +4 -0
  76. package/dist/tools/census.tools.d.ts.map +1 -0
  77. package/dist/tools/census.tools.js +28 -0
  78. package/dist/tools/census.tools.js.map +1 -0
  79. package/dist/tools/csa.tools.d.ts +4 -0
  80. package/dist/tools/csa.tools.d.ts.map +1 -0
  81. package/dist/tools/csa.tools.js +77 -0
  82. package/dist/tools/csa.tools.js.map +1 -0
  83. package/dist/tools/domain.tools.d.ts +5 -0
  84. package/dist/tools/domain.tools.d.ts.map +1 -0
  85. package/dist/tools/domain.tools.js +44 -0
  86. package/dist/tools/domain.tools.js.map +1 -0
  87. package/dist/tools/dynamic-data.tools.d.ts +5 -0
  88. package/dist/tools/dynamic-data.tools.d.ts.map +1 -0
  89. package/dist/tools/dynamic-data.tools.js +136 -0
  90. package/dist/tools/dynamic-data.tools.js.map +1 -0
  91. package/dist/tools/glossary.tools.d.ts +4 -0
  92. package/dist/tools/glossary.tools.d.ts.map +1 -0
  93. package/dist/tools/glossary.tools.js +32 -0
  94. package/dist/tools/glossary.tools.js.map +1 -0
  95. package/dist/tools/infographic.tools.d.ts +4 -0
  96. package/dist/tools/infographic.tools.d.ts.map +1 -0
  97. package/dist/tools/infographic.tools.js +60 -0
  98. package/dist/tools/infographic.tools.js.map +1 -0
  99. package/dist/tools/news.tools.d.ts +4 -0
  100. package/dist/tools/news.tools.d.ts.map +1 -0
  101. package/dist/tools/news.tools.js +55 -0
  102. package/dist/tools/news.tools.js.map +1 -0
  103. package/dist/tools/publication.tools.d.ts +4 -0
  104. package/dist/tools/publication.tools.d.ts.map +1 -0
  105. package/dist/tools/publication.tools.js +101 -0
  106. package/dist/tools/publication.tools.js.map +1 -0
  107. package/dist/tools/reference.tools.d.ts +4 -0
  108. package/dist/tools/reference.tools.d.ts.map +1 -0
  109. package/dist/tools/reference.tools.js +20 -0
  110. package/dist/tools/reference.tools.js.map +1 -0
  111. package/dist/tools/search.tools.d.ts +4 -0
  112. package/dist/tools/search.tools.d.ts.map +1 -0
  113. package/dist/tools/search.tools.js +22 -0
  114. package/dist/tools/search.tools.js.map +1 -0
  115. package/dist/tools/static-table.tools.d.ts +4 -0
  116. package/dist/tools/static-table.tools.d.ts.map +1 -0
  117. package/dist/tools/static-table.tools.js +47 -0
  118. package/dist/tools/static-table.tools.js.map +1 -0
  119. package/dist/tools/trade.tools.d.ts +4 -0
  120. package/dist/tools/trade.tools.d.ts.map +1 -0
  121. package/dist/tools/trade.tools.js +25 -0
  122. package/dist/tools/trade.tools.js.map +1 -0
  123. package/dist/tools/utility.tools.d.ts +4 -0
  124. package/dist/tools/utility.tools.d.ts.map +1 -0
  125. package/dist/tools/utility.tools.js +10 -0
  126. package/dist/tools/utility.tools.js.map +1 -0
  127. package/dist/transport/stdio.d.ts +3 -0
  128. package/dist/transport/stdio.d.ts.map +1 -0
  129. package/dist/transport/stdio.js +9 -0
  130. package/dist/transport/stdio.js.map +1 -0
  131. package/dist/utils/error.d.ts +13 -0
  132. package/dist/utils/error.d.ts.map +1 -0
  133. package/dist/utils/error.js +38 -0
  134. package/dist/utils/error.js.map +1 -0
  135. package/dist/utils/logger.d.ts +12 -0
  136. package/dist/utils/logger.d.ts.map +1 -0
  137. package/dist/utils/logger.js +47 -0
  138. package/dist/utils/logger.js.map +1 -0
  139. package/dist/utils/pagination.d.ts +11 -0
  140. package/dist/utils/pagination.d.ts.map +1 -0
  141. package/dist/utils/pagination.js +19 -0
  142. package/dist/utils/pagination.js.map +1 -0
  143. package/package.json +60 -0
@@ -0,0 +1,171 @@
1
+ import { z } from "zod";
2
+ export function registerPrompts(server) {
3
+ server.prompt("compare_regions", "Template untuk membandingkan data statistik antar wilayah", {
4
+ region_a: z.string().describe("Nama wilayah pertama (misal: Jawa Timur)"),
5
+ region_b: z.string().describe("Nama wilayah kedua (misal: Jawa Barat)"),
6
+ indicator: z.string().optional().describe("Indikator yang dibandingkan (misal: kemiskinan, pengangguran). Kosongkan untuk ringkasan umum"),
7
+ year: z.string().optional().describe("Tahun data (misal: 2023). Kosongkan untuk data terbaru"),
8
+ }, async ({ region_a, region_b, indicator, year }) => {
9
+ const indicatorText = indicator ?? "indikator utama (kemiskinan, pengangguran, pertumbuhan ekonomi, IPM)";
10
+ const yearText = year ?? "terbaru yang tersedia";
11
+ return {
12
+ messages: [
13
+ {
14
+ role: "user",
15
+ content: {
16
+ type: "text",
17
+ text: `Bandingkan data statistik ${indicatorText} antara ${region_a} dan ${region_b} untuk tahun ${yearText}.
18
+
19
+ Langkah:
20
+ 1. Gunakan tool resolve_domain untuk mendapatkan kode domain kedua wilayah
21
+ 2. Gunakan tool list_variables atau list_strategic_indicators untuk menemukan variabel yang relevan
22
+ 3. Gunakan tool get_dynamic_data untuk mengambil data kedua wilayah
23
+ 4. Sajikan perbandingan dalam format tabel yang mudah dipahami
24
+ 5. Berikan analisis singkat tentang perbedaan yang ditemukan
25
+
26
+ Format output yang diharapkan:
27
+ - Tabel perbandingan dengan kolom: Indikator | ${region_a} | ${region_b} | Selisih
28
+ - Ringkasan analisis 2-3 kalimat`,
29
+ },
30
+ },
31
+ ],
32
+ };
33
+ });
34
+ server.prompt("trend_analysis", "Template untuk analisis tren data statistik multi-tahun", {
35
+ region: z.string().describe("Nama wilayah (misal: Indonesia, Jawa Timur)"),
36
+ indicator: z.string().describe("Indikator yang dianalisis (misal: inflasi, kemiskinan, pengangguran)"),
37
+ start_year: z.string().optional().describe("Tahun awal (misal: 2019)"),
38
+ end_year: z.string().optional().describe("Tahun akhir (misal: 2023)"),
39
+ }, async ({ region, indicator, start_year, end_year }) => {
40
+ const startText = start_year ?? "2019";
41
+ const endText = end_year ?? "2023";
42
+ return {
43
+ messages: [
44
+ {
45
+ role: "user",
46
+ content: {
47
+ type: "text",
48
+ text: `Analisis tren ${indicator} di ${region} dari tahun ${startText} sampai ${endText}.
49
+
50
+ Langkah:
51
+ 1. Gunakan tool resolve_domain untuk mendapatkan kode domain wilayah
52
+ 2. Gunakan tool list_variables atau search untuk menemukan variabel ${indicator}
53
+ 3. Gunakan tool get_dynamic_data dengan parameter th="${startText},${Number(startText) + 1},${Number(startText) + 2},...,${endText}" untuk mengambil data multi-tahun
54
+ 4. Sajikan data dalam tabel time-series
55
+ 5. Identifikasi tren (naik/turun/fluktuatif) dan titik-titik penting
56
+
57
+ Format output yang diharapkan:
58
+ - Tabel: Tahun | Nilai | Perubahan (%)
59
+ - Grafik ASCII sederhana jika memungkinkan
60
+ - Analisis tren 3-5 kalimat, termasuk faktor-faktor yang mungkin mempengaruhi`,
61
+ },
62
+ },
63
+ ],
64
+ };
65
+ });
66
+ server.prompt("poverty_profile", "Template profil kemiskinan suatu daerah", {
67
+ region: z.string().describe("Nama wilayah (misal: Jawa Timur, Surabaya)"),
68
+ year: z.string().optional().describe("Tahun data (misal: 2023)"),
69
+ }, async ({ region, year }) => {
70
+ const yearText = year ?? "terbaru";
71
+ return {
72
+ messages: [
73
+ {
74
+ role: "user",
75
+ content: {
76
+ type: "text",
77
+ text: `Buatkan profil kemiskinan ${region} tahun ${yearText}.
78
+
79
+ Langkah:
80
+ 1. Gunakan resolve_domain untuk mendapatkan kode domain
81
+ 2. Cari data berikut menggunakan list_variables dan get_dynamic_data:
82
+ - Persentase penduduk miskin
83
+ - Jumlah penduduk miskin (ribu jiwa)
84
+ - Garis kemiskinan (Rp/kapita/bulan)
85
+ - Indeks Kedalaman Kemiskinan (P1)
86
+ - Indeks Keparahan Kemiskinan (P2)
87
+ 3. Jika tersedia, bandingkan dengan angka nasional
88
+ 4. Cari BRS terkait kemiskinan menggunakan list_press_releases
89
+
90
+ Format output:
91
+ - Ringkasan data kemiskinan dalam tabel
92
+ - Perbandingan dengan rata-rata nasional
93
+ - Tren 3 tahun terakhir jika data tersedia
94
+ - Sumber BRS terkait`,
95
+ },
96
+ },
97
+ ],
98
+ };
99
+ });
100
+ server.prompt("economic_overview", "Template ringkasan ekonomi daerah", {
101
+ region: z.string().describe("Nama wilayah (misal: DKI Jakarta, Bali)"),
102
+ year: z.string().optional().describe("Tahun data (misal: 2023)"),
103
+ }, async ({ region, year }) => {
104
+ const yearText = year ?? "terbaru";
105
+ return {
106
+ messages: [
107
+ {
108
+ role: "user",
109
+ content: {
110
+ type: "text",
111
+ text: `Buatkan ringkasan ekonomi ${region} tahun ${yearText}.
112
+
113
+ Langkah:
114
+ 1. Gunakan resolve_domain untuk mendapatkan kode domain
115
+ 2. Kumpulkan data indikator ekonomi utama menggunakan list_strategic_indicators dan get_dynamic_data:
116
+ - PDRB (nominal dan riil)
117
+ - Pertumbuhan ekonomi (%)
118
+ - Inflasi (%)
119
+ - Tingkat Pengangguran Terbuka (TPT)
120
+ - Indeks Pembangunan Manusia (IPM)
121
+ - Gini Ratio
122
+ 3. Jika tersedia, cari data ekspor/impor menggunakan get_trade_data
123
+ 4. Cari publikasi terkait menggunakan list_publications
124
+
125
+ Format output:
126
+ - Dashboard indikator ekonomi utama (tabel)
127
+ - Perbandingan dengan tahun sebelumnya dan nasional
128
+ - Highlight 3-5 poin penting
129
+ - Sumber data dan publikasi terkait`,
130
+ },
131
+ },
132
+ ],
133
+ };
134
+ });
135
+ server.prompt("population_stats", "Template statistik kependudukan", {
136
+ region: z.string().describe("Nama wilayah (misal: Indonesia, Jawa Barat)"),
137
+ year: z.string().optional().describe("Tahun data (misal: 2023)"),
138
+ }, async ({ region, year }) => {
139
+ const yearText = year ?? "terbaru";
140
+ return {
141
+ messages: [
142
+ {
143
+ role: "user",
144
+ content: {
145
+ type: "text",
146
+ text: `Tampilkan statistik kependudukan ${region} tahun ${yearText}.
147
+
148
+ Langkah:
149
+ 1. Gunakan resolve_domain untuk mendapatkan kode domain
150
+ 2. Kumpulkan data kependudukan menggunakan get_dynamic_data dan list_strategic_indicators:
151
+ - Jumlah penduduk
152
+ - Laju pertumbuhan penduduk
153
+ - Kepadatan penduduk (jiwa/km²)
154
+ - Rasio jenis kelamin
155
+ - Dependency ratio
156
+ - Angka harapan hidup
157
+ 3. Jika tersedia, cari data sensus menggunakan list_census_events dan list_census_topics
158
+ 4. Cari tabel statis terkait menggunakan list_static_tables dengan keyword "penduduk"
159
+
160
+ Format output:
161
+ - Tabel ringkasan demografi
162
+ - Perbandingan dengan sensus sebelumnya jika tersedia
163
+ - Distribusi umur dan jenis kelamin jika data tersedia
164
+ - Sumber data dan catatan metodologi`,
165
+ },
166
+ },
167
+ ],
168
+ };
169
+ });
170
+ }
171
+ //# sourceMappingURL=analysis.prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.prompts.js","sourceRoot":"","sources":["../../src/prompts/analysis.prompts.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 registerResources(server: McpServer, client: BpsClient, _resolver: DomainResolver): void;
5
+ //# sourceMappingURL=domain.resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain.resources.d.ts","sourceRoot":"","sources":["../../src/resources/domain.resources.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;AAMrE,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,cAAc,GACxB,IAAI,CA+EN"}
@@ -0,0 +1,62 @@
1
+ import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ function firstValue(v) {
3
+ return Array.isArray(v) ? v[0] : v;
4
+ }
5
+ export function registerResources(server, client, _resolver) {
6
+ server.resource("provinces", "bps://domains/provinces", { description: "Daftar seluruh provinsi di Indonesia beserta kode domain BPS" }, async () => {
7
+ const result = await client.listDomains("prov");
8
+ const lines = result.data.map((d) => `${d.domain_id}\t${d.domain_name}`);
9
+ return {
10
+ contents: [
11
+ {
12
+ uri: "bps://domains/provinces",
13
+ mimeType: "text/plain",
14
+ text: `kode_domain\tnama\n${lines.join("\n")}`,
15
+ },
16
+ ],
17
+ };
18
+ });
19
+ server.resource("regencies-by-province", new ResourceTemplate("bps://domains/regencies/{prov_id}", {
20
+ list: async () => {
21
+ const provinces = await client.listDomains("prov");
22
+ return {
23
+ resources: provinces.data.map((p) => ({
24
+ uri: `bps://domains/regencies/${p.domain_id}`,
25
+ name: `Kab/Kota di ${p.domain_name}`,
26
+ description: `Daftar kabupaten/kota di provinsi ${p.domain_name}`,
27
+ mimeType: "text/plain",
28
+ })),
29
+ };
30
+ },
31
+ }), { description: "Daftar kabupaten/kota untuk provinsi tertentu" }, async (uri, variables) => {
32
+ const provId = firstValue(variables.prov_id);
33
+ const result = await client.listDomains("kabbyprov", provId);
34
+ const lines = result.data.map((d) => `${d.domain_id}\t${d.domain_name}`);
35
+ return {
36
+ contents: [
37
+ {
38
+ uri: uri.href,
39
+ mimeType: "text/plain",
40
+ text: `kode_domain\tnama\n${lines.join("\n")}`,
41
+ },
42
+ ],
43
+ };
44
+ });
45
+ server.resource("subjects-by-domain", new ResourceTemplate("bps://subjects/{domain}", {
46
+ list: undefined,
47
+ }), { description: "Daftar subjek statistik untuk domain/wilayah tertentu" }, async (uri, variables) => {
48
+ const domain = firstValue(variables.domain);
49
+ const result = await client.listSubjects(domain);
50
+ const lines = result.data.map((s) => `${s.sub_id}\t${s.title}${s.ntabel ? ` (${s.ntabel} tabel)` : ""}`);
51
+ return {
52
+ contents: [
53
+ {
54
+ uri: uri.href,
55
+ mimeType: "text/plain",
56
+ text: `sub_id\tjudul\n${lines.join("\n")}`,
57
+ },
58
+ ],
59
+ };
60
+ });
61
+ }
62
+ //# sourceMappingURL=domain.resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain.resources.js","sourceRoot":"","sources":["../../src/resources/domain.resources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { Config } from "./config/index.js";
3
+ import type { IAuthProvider } from "./auth/types.js";
4
+ import type { ICacheProvider } from "./services/cache.js";
5
+ import { BpsClient } from "./client/bps-client.js";
6
+ import { DomainResolver } from "./services/domain-resolver.js";
7
+ export declare function createServer(config: Config, auth: IAuthProvider, cache: ICacheProvider | null): {
8
+ server: McpServer;
9
+ client: BpsClient;
10
+ resolver: DomainResolver;
11
+ };
12
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAiB/D,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,cAAc,GAAG,IAAI,GAC3B;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,CA2BpE"}
package/dist/server.js ADDED
@@ -0,0 +1,43 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { BpsClient } from "./client/bps-client.js";
3
+ import { DomainResolver } from "./services/domain-resolver.js";
4
+ import { registerDomainTools } from "./tools/domain.tools.js";
5
+ import { registerDynamicDataTools } from "./tools/dynamic-data.tools.js";
6
+ import { registerStaticTableTools } from "./tools/static-table.tools.js";
7
+ import { registerPublicationTools } from "./tools/publication.tools.js";
8
+ import { registerReferenceTools } from "./tools/reference.tools.js";
9
+ import { registerTradeTools } from "./tools/trade.tools.js";
10
+ import { registerSearchTools } from "./tools/search.tools.js";
11
+ import { registerUtilityTools } from "./tools/utility.tools.js";
12
+ import { registerInfographicTools } from "./tools/infographic.tools.js";
13
+ import { registerCensusTools } from "./tools/census.tools.js";
14
+ import { registerCsaTools } from "./tools/csa.tools.js";
15
+ import { registerNewsTools } from "./tools/news.tools.js";
16
+ import { registerGlossaryTools } from "./tools/glossary.tools.js";
17
+ import { registerResources } from "./resources/domain.resources.js";
18
+ import { registerPrompts } from "./prompts/analysis.prompts.js";
19
+ export function createServer(config, auth, cache) {
20
+ const server = new McpServer({
21
+ name: "bps-statistics",
22
+ version: "0.1.0",
23
+ });
24
+ const client = new BpsClient(auth, cache, config);
25
+ const resolver = new DomainResolver(client);
26
+ registerDomainTools(server, client, resolver);
27
+ registerDynamicDataTools(server, client, config);
28
+ registerStaticTableTools(server, client);
29
+ registerPublicationTools(server, client);
30
+ registerReferenceTools(server, client);
31
+ registerTradeTools(server, client);
32
+ registerSearchTools(server, client);
33
+ registerInfographicTools(server, client);
34
+ registerCensusTools(server, client);
35
+ registerCsaTools(server, client);
36
+ registerNewsTools(server, client);
37
+ registerGlossaryTools(server, client);
38
+ registerUtilityTools(server, cache);
39
+ registerResources(server, client, resolver);
40
+ registerPrompts(server);
41
+ return { server, client, resolver };
42
+ }
43
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,MAAM,UAAU,YAAY,CAC1B,MAAc,EACd,IAAmB,EACnB,KAA4B;IAE5B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;IAE5C,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9C,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAEpC,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC5C,eAAe,CAAC,MAAM,CAAC,CAAC;IAExB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACtC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function getAttribution(lang?: "ind" | "eng"): string;
2
+ export declare function appendAttribution(text: string, lang?: "ind" | "eng"): string;
3
+ //# sourceMappingURL=attribution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attribution.d.ts","sourceRoot":"","sources":["../../src/services/attribution.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,CAAC,IAAI,GAAE,KAAK,GAAG,KAAa,GAAG,MAAM,CAElE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,KAAK,GAAG,KAAa,GAAG,MAAM,CAEnF"}
@@ -0,0 +1,8 @@
1
+ import { ATTRIBUTION, ATTRIBUTION_EN } from "../config/defaults.js";
2
+ export function getAttribution(lang = "ind") {
3
+ return lang === "eng" ? ATTRIBUTION_EN : ATTRIBUTION;
4
+ }
5
+ export function appendAttribution(text, lang = "ind") {
6
+ return `${text}\n\n---\n${getAttribution(lang)}`;
7
+ }
8
+ //# sourceMappingURL=attribution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attribution.js","sourceRoot":"","sources":["../../src/services/attribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEpE,MAAM,UAAU,cAAc,CAAC,OAAsB,KAAK;IACxD,OAAO,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,OAAsB,KAAK;IACzE,OAAO,GAAG,IAAI,YAAY,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;AACnD,CAAC"}
@@ -0,0 +1,21 @@
1
+ export interface ICacheProvider {
2
+ get(key: string): Promise<string | null>;
3
+ set(key: string, value: string, ttlSeconds: number): Promise<void>;
4
+ delete(key: string): Promise<void>;
5
+ clear(): Promise<void>;
6
+ }
7
+ /**
8
+ * In-memory LRU cache with TTL support.
9
+ * Used for stdio transport. For Cloudflare Workers, use KVCache instead.
10
+ */
11
+ export declare class InMemoryCache implements ICacheProvider {
12
+ private cache;
13
+ private readonly maxEntries;
14
+ constructor(maxEntries?: number);
15
+ get(key: string): Promise<string | null>;
16
+ set(key: string, value: string, ttlSeconds: number): Promise<void>;
17
+ delete(key: string): Promise<void>;
18
+ clear(): Promise<void>;
19
+ get size(): number;
20
+ }
21
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/services/cache.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAOD;;;GAGG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,UAAU,GAAE,MAAY;IAI9B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAexC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAelE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * In-memory LRU cache with TTL support.
3
+ * Used for stdio transport. For Cloudflare Workers, use KVCache instead.
4
+ */
5
+ export class InMemoryCache {
6
+ cache = new Map();
7
+ maxEntries;
8
+ constructor(maxEntries = 500) {
9
+ this.maxEntries = maxEntries;
10
+ }
11
+ async get(key) {
12
+ const entry = this.cache.get(key);
13
+ if (!entry)
14
+ return null;
15
+ if (Date.now() > entry.expiresAt) {
16
+ this.cache.delete(key);
17
+ return null;
18
+ }
19
+ // Move to end for LRU
20
+ this.cache.delete(key);
21
+ this.cache.set(key, entry);
22
+ return entry.value;
23
+ }
24
+ async set(key, value, ttlSeconds) {
25
+ // Evict oldest if at capacity
26
+ if (this.cache.size >= this.maxEntries && !this.cache.has(key)) {
27
+ const firstKey = this.cache.keys().next().value;
28
+ if (firstKey !== undefined) {
29
+ this.cache.delete(firstKey);
30
+ }
31
+ }
32
+ this.cache.set(key, {
33
+ value,
34
+ expiresAt: Date.now() + ttlSeconds * 1000,
35
+ });
36
+ }
37
+ async delete(key) {
38
+ this.cache.delete(key);
39
+ }
40
+ async clear() {
41
+ this.cache.clear();
42
+ }
43
+ get size() {
44
+ return this.cache.size;
45
+ }
46
+ }
47
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/services/cache.ts"],"names":[],"mappings":"AAYA;;;GAGG;AACH,MAAM,OAAO,aAAa;IAChB,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC7B,UAAU,CAAS;IAEpC,YAAY,aAAqB,GAAG;QAClC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,sBAAsB;QACtB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,UAAkB;QACtD,8BAA8B;QAC9B,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAClB,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,IAAI;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ import type { BpsDynamicDataResponse } from "../client/types.js";
2
+ /**
3
+ * Format BPS dynamic data response into human/LLM-readable text.
4
+ *
5
+ * BPS datacontent keys are concatenated IDs: {vervar}{var}{turvar}{th}
6
+ * We resolve them using the metadata arrays in the response.
7
+ */
8
+ export declare function formatDynamicData(response: BpsDynamicDataResponse, domain: string, lang?: "ind" | "eng"): string;
9
+ /**
10
+ * Format a simple list of items into readable text.
11
+ */
12
+ export declare function formatList<T>(items: T[], formatter: (item: T) => string, title: string, lang?: "ind" | "eng"): string;
13
+ //# sourceMappingURL=data-formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-formatter.d.ts","sourceRoot":"","sources":["../../src/services/data-formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAqF,MAAM,oBAAoB,CAAC;AAapJ;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,sBAAsB,EAChC,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,KAAK,GAAG,KAAa,GAC1B,MAAM,CAyFR;AA4FD;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,KAAK,EAAE,CAAC,EAAE,EACV,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,EAC9B,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,KAAK,GAAG,KAAa,GAC1B,MAAM,CAYR"}
@@ -0,0 +1,166 @@
1
+ import { appendAttribution } from "./attribution.js";
2
+ /**
3
+ * Format BPS dynamic data response into human/LLM-readable text.
4
+ *
5
+ * BPS datacontent keys are concatenated IDs: {vervar}{var}{turvar}{th}
6
+ * We resolve them using the metadata arrays in the response.
7
+ */
8
+ export function formatDynamicData(response, domain, lang = "ind") {
9
+ const datacontent = response.datacontent;
10
+ if (!datacontent || Object.keys(datacontent).length === 0) {
11
+ return appendAttribution(lang === "ind"
12
+ ? "Tidak ada data yang ditemukan untuk parameter yang diberikan."
13
+ : "No data found for the given parameters.", lang);
14
+ }
15
+ // Build lookup maps
16
+ const varMap = buildMap(response.var, (v) => [String(v.var_id), v]);
17
+ const vervarMap = buildMap(response.vervar, (v) => [String(v.kode_vervar), v]);
18
+ const turvarMap = buildMap(response.turvar, (v) => [String(v.kode_turvar), v]);
19
+ const periodMap = buildMap(response.tahun, (v) => [String(v.th_id), v]);
20
+ const turthMap = buildMap(response.turtahun, (v) => [String(v.turth_id), v]);
21
+ const rows = [];
22
+ for (const [key, value] of Object.entries(datacontent)) {
23
+ const row = resolveDatacontentKey(key, value, varMap, vervarMap, turvarMap, periodMap, turthMap);
24
+ if (row)
25
+ rows.push(row);
26
+ }
27
+ if (rows.length === 0) {
28
+ return appendAttribution("Data tersedia tetapi tidak dapat di-parse.", lang);
29
+ }
30
+ // Format as text table
31
+ const lines = [];
32
+ // Title from variables
33
+ const varNames = [...new Set(rows.map((r) => r.variable))];
34
+ if (varNames.length > 0) {
35
+ lines.push(`## ${varNames.join(", ")}`);
36
+ lines.push(`**Domain:** ${domain}`);
37
+ lines.push("");
38
+ }
39
+ // Group by variable
40
+ const grouped = new Map();
41
+ for (const row of rows) {
42
+ const key = row.variable;
43
+ if (!grouped.has(key))
44
+ grouped.set(key, []);
45
+ grouped.get(key).push(row);
46
+ }
47
+ for (const [varName, varRows] of grouped) {
48
+ if (grouped.size > 1) {
49
+ lines.push(`### ${varName}`);
50
+ }
51
+ // Build a readable table
52
+ const hasVervar = varRows.some((r) => r.verticalVariable);
53
+ const hasTurvar = varRows.some((r) => r.derivedVariable);
54
+ // Header
55
+ const headers = [];
56
+ if (hasVervar)
57
+ headers.push("Kategori");
58
+ headers.push("Periode");
59
+ if (hasTurvar)
60
+ headers.push("Turunan");
61
+ headers.push("Nilai");
62
+ lines.push("| " + headers.join(" | ") + " |");
63
+ lines.push("| " + headers.map(() => "---").join(" | ") + " |");
64
+ // Sort rows by period
65
+ varRows.sort((a, b) => a.period.localeCompare(b.period));
66
+ for (const row of varRows) {
67
+ const cols = [];
68
+ if (hasVervar)
69
+ cols.push(row.verticalVariable ?? "-");
70
+ cols.push(row.period);
71
+ if (hasTurvar)
72
+ cols.push(row.derivedVariable ?? "-");
73
+ cols.push(formatValue(row.value));
74
+ lines.push("| " + cols.join(" | ") + " |");
75
+ }
76
+ lines.push("");
77
+ }
78
+ // Unit info
79
+ const units = [...new Set(rows.map((r) => r.unit).filter(Boolean))];
80
+ if (units.length > 0) {
81
+ lines.push(`**Satuan:** ${units.join(", ")}`);
82
+ }
83
+ return appendAttribution(lines.join("\n"), lang);
84
+ }
85
+ /**
86
+ * Try to resolve a datacontent key into labeled row.
87
+ * BPS key format is typically concatenated numeric IDs.
88
+ */
89
+ function resolveDatacontentKey(key, value, varMap, vervarMap, turvarMap, periodMap, turthMap) {
90
+ // Strategy: try to match known IDs from the metadata maps
91
+ // The key is a concatenation, so we iterate possible splits
92
+ let matchedVar;
93
+ let matchedVervar;
94
+ let matchedTurvar;
95
+ let matchedPeriod;
96
+ let matchedTurth;
97
+ // Try matching against known IDs
98
+ for (const [id, v] of varMap) {
99
+ if (key.includes(id)) {
100
+ matchedVar = v;
101
+ break;
102
+ }
103
+ }
104
+ for (const [id, v] of vervarMap) {
105
+ if (key.includes(id)) {
106
+ matchedVervar = v;
107
+ break;
108
+ }
109
+ }
110
+ for (const [id, v] of turvarMap) {
111
+ if (key.includes(id)) {
112
+ matchedTurvar = v;
113
+ break;
114
+ }
115
+ }
116
+ for (const [id, v] of periodMap) {
117
+ if (key.includes(id)) {
118
+ matchedPeriod = v;
119
+ break;
120
+ }
121
+ }
122
+ for (const [id, v] of turthMap) {
123
+ if (key.includes(id)) {
124
+ matchedTurth = v;
125
+ break;
126
+ }
127
+ }
128
+ return {
129
+ variable: matchedVar?.title ?? "Data",
130
+ verticalVariable: matchedVervar?.label_vervar,
131
+ derivedVariable: matchedTurvar?.label_turvar,
132
+ period: matchedPeriod?.th_name ?? "N/A",
133
+ derivedPeriod: matchedTurth?.turth_name,
134
+ value,
135
+ unit: matchedVar?.unit,
136
+ };
137
+ }
138
+ function buildMap(items, keyFn) {
139
+ const map = new Map();
140
+ if (items) {
141
+ for (const item of items) {
142
+ const [key, val] = keyFn(item);
143
+ map.set(key, val);
144
+ }
145
+ }
146
+ return map;
147
+ }
148
+ function formatValue(value) {
149
+ if (typeof value === "number") {
150
+ return value.toLocaleString("id-ID");
151
+ }
152
+ return String(value);
153
+ }
154
+ /**
155
+ * Format a simple list of items into readable text.
156
+ */
157
+ export function formatList(items, formatter, title, lang = "ind") {
158
+ if (items.length === 0) {
159
+ return appendAttribution(lang === "ind"
160
+ ? `Tidak ada ${title.toLowerCase()} yang ditemukan.`
161
+ : `No ${title.toLowerCase()} found.`, lang);
162
+ }
163
+ const lines = [`## ${title}`, "", ...items.map((item, i) => `${i + 1}. ${formatter(item)}`), ""];
164
+ return appendAttribution(lines.join("\n"), lang);
165
+ }
166
+ //# sourceMappingURL=data-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-formatter.js","sourceRoot":"","sources":["../../src/services/data-formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { BpsClient } from "../client/bps-client.js";
2
+ import type { BpsDomain } from "../client/types.js";
3
+ export declare class DomainResolver {
4
+ private readonly client;
5
+ private domains;
6
+ private nameIndex;
7
+ private loaded;
8
+ constructor(client: BpsClient);
9
+ ensureLoaded(): Promise<void>;
10
+ private loadDomains;
11
+ /**
12
+ * Resolve a query (name, alias, or code) to a BPS domain code.
13
+ * Returns null if no match found.
14
+ */
15
+ resolve(query: string): Promise<{
16
+ domainId: string;
17
+ domainName: string;
18
+ } | null>;
19
+ /** Get all loaded domains */
20
+ getDomains(): BpsDomain[];
21
+ }
22
+ //# sourceMappingURL=domain-resolver.d.ts.map