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
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Murphi
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# BPS MCP Server
|
|
2
|
+
|
|
3
|
+
[](https://github.com/murphi/bps-mcp-server/actions/workflows/ci.yml)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
[](https://nodejs.org)
|
|
6
|
+
|
|
7
|
+
MCP (Model Context Protocol) server untuk data statistik BPS (Badan Pusat Statistik) Indonesia. Memungkinkan AI clients seperti Claude Desktop, Claude Code, Cursor, dan lainnya untuk mengakses data statistik resmi Indonesia melalui natural language.
|
|
8
|
+
|
|
9
|
+
## Fitur
|
|
10
|
+
|
|
11
|
+
- **32 tools** mencakup seluruh endpoint BPS API v1
|
|
12
|
+
- **3 MCP Resources** — domain list, kabupaten per provinsi, subjek per domain
|
|
13
|
+
- **5 MCP Prompts** — template analisis data siap pakai
|
|
14
|
+
- **Domain resolver** dengan fuzzy matching (ketik "Jatim" → Jawa Timur)
|
|
15
|
+
- **Data formatter** yang mengubah raw BPS data menjadi format mudah dibaca
|
|
16
|
+
- **In-memory cache** dengan TTL per tipe data
|
|
17
|
+
- **Bilingual** — mendukung bahasa Indonesia dan Inggris
|
|
18
|
+
- **Atribusi BPS** otomatis di setiap response (sesuai ToU)
|
|
19
|
+
- **BYOK** (Bring Your Own Key) — setiap user menggunakan API key BPS sendiri
|
|
20
|
+
|
|
21
|
+
## Prasyarat
|
|
22
|
+
|
|
23
|
+
- Node.js ≥ 18
|
|
24
|
+
- API key BPS (gratis, daftar di [webapi.bps.go.id](https://webapi.bps.go.id))
|
|
25
|
+
|
|
26
|
+
## Instalasi & Penggunaan
|
|
27
|
+
|
|
28
|
+
### Via npx (recommended)
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
BPS_API_KEY=your_key npx bps-mcp-server
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Clone & Run
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
git clone https://github.com/murphi/bps-mcp-server
|
|
38
|
+
cd bps-mcp-server
|
|
39
|
+
npm install
|
|
40
|
+
npm run build
|
|
41
|
+
BPS_API_KEY=your_key npm start
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Konfigurasi MCP Client
|
|
45
|
+
|
|
46
|
+
### Claude Desktop
|
|
47
|
+
|
|
48
|
+
File: `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS)
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"mcpServers": {
|
|
53
|
+
"bps-statistics": {
|
|
54
|
+
"command": "npx",
|
|
55
|
+
"args": ["-y", "bps-mcp-server"],
|
|
56
|
+
"env": {
|
|
57
|
+
"BPS_API_KEY": "your_api_key_here"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Claude Code
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
claude mcp add bps -- npx -y bps-mcp-server
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Atau file `.mcp.json` di project root:
|
|
71
|
+
|
|
72
|
+
```json
|
|
73
|
+
{
|
|
74
|
+
"mcpServers": {
|
|
75
|
+
"bps": {
|
|
76
|
+
"command": "npx",
|
|
77
|
+
"args": ["-y", "bps-mcp-server"],
|
|
78
|
+
"env": {
|
|
79
|
+
"BPS_API_KEY": "${BPS_API_KEY}"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Cursor / VS Code
|
|
87
|
+
|
|
88
|
+
File `~/.cursor/mcp.json` atau `.vscode/mcp.json`:
|
|
89
|
+
|
|
90
|
+
```json
|
|
91
|
+
{
|
|
92
|
+
"mcpServers": {
|
|
93
|
+
"bps-statistics": {
|
|
94
|
+
"command": "npx",
|
|
95
|
+
"args": ["-y", "bps-mcp-server"],
|
|
96
|
+
"env": {
|
|
97
|
+
"BPS_API_KEY": "your_api_key_here"
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Tools (32)
|
|
105
|
+
|
|
106
|
+
| Tool | Deskripsi |
|
|
107
|
+
|------|-----------|
|
|
108
|
+
| `list_domains` | Daftar wilayah (provinsi, kab/kota) |
|
|
109
|
+
| `resolve_domain` | Konversi nama wilayah → kode domain (fuzzy matching) |
|
|
110
|
+
| `list_subjects` | Daftar subjek data statistik |
|
|
111
|
+
| `list_subject_categories` | Kategori subjek |
|
|
112
|
+
| `list_variables` | Daftar variabel tabel dinamis |
|
|
113
|
+
| `list_vertical_variables` | Variabel vertikal (disagregasi) |
|
|
114
|
+
| `list_derived_variables` | Turunan variabel |
|
|
115
|
+
| `list_periods` | Periode data tersedia |
|
|
116
|
+
| `list_derived_periods` | Turunan periode |
|
|
117
|
+
| `list_units` | Satuan data |
|
|
118
|
+
| `get_dynamic_data` | **Core** — Ambil data tabel dinamis |
|
|
119
|
+
| `list_static_tables` | Daftar tabel statis |
|
|
120
|
+
| `get_static_table` | Detail tabel statis (HTML) |
|
|
121
|
+
| `list_press_releases` | Daftar Berita Resmi Statistik (BRS) |
|
|
122
|
+
| `get_press_release` | Detail BRS |
|
|
123
|
+
| `list_publications` | Daftar publikasi |
|
|
124
|
+
| `get_publication` | Detail publikasi |
|
|
125
|
+
| `list_strategic_indicators` | Indikator strategis |
|
|
126
|
+
| `get_trade_data` | Data ekspor/impor berdasarkan kode HS |
|
|
127
|
+
| `list_infographics` | Daftar infografis BPS |
|
|
128
|
+
| `get_infographic` | Detail infografis |
|
|
129
|
+
| `list_news` | Daftar berita BPS |
|
|
130
|
+
| `get_news` | Detail berita |
|
|
131
|
+
| `list_census_events` | Daftar kegiatan sensus |
|
|
132
|
+
| `list_census_topics` | Topik data per kegiatan sensus |
|
|
133
|
+
| `list_csa_categories` | Kategori CSA |
|
|
134
|
+
| `list_csa_subjects` | Subjek CSA per domain |
|
|
135
|
+
| `list_csa_tables` | Tabel CSA per subjek |
|
|
136
|
+
| `get_csa_table` | Detail tabel CSA (HTML) |
|
|
137
|
+
| `list_glossary` | Glosarium istilah statistik |
|
|
138
|
+
| `search` | Pencarian lintas tipe |
|
|
139
|
+
| `cache_clear` | Bersihkan cache |
|
|
140
|
+
|
|
141
|
+
## Resources (3)
|
|
142
|
+
|
|
143
|
+
| URI | Deskripsi |
|
|
144
|
+
|-----|-----------|
|
|
145
|
+
| `bps://domains/provinces` | Daftar seluruh provinsi Indonesia (cached) |
|
|
146
|
+
| `bps://domains/regencies/{prov_id}` | Kabupaten/kota per provinsi |
|
|
147
|
+
| `bps://subjects/{domain}` | Subjek statistik per domain |
|
|
148
|
+
|
|
149
|
+
## Prompts (5)
|
|
150
|
+
|
|
151
|
+
| Prompt | Deskripsi |
|
|
152
|
+
|--------|-----------|
|
|
153
|
+
| `compare_regions` | Bandingkan data antara dua wilayah |
|
|
154
|
+
| `trend_analysis` | Analisis tren data multi-tahun |
|
|
155
|
+
| `poverty_profile` | Profil kemiskinan suatu wilayah |
|
|
156
|
+
| `economic_overview` | Ringkasan ekonomi wilayah |
|
|
157
|
+
| `population_stats` | Statistik kependudukan |
|
|
158
|
+
|
|
159
|
+
## Contoh Query
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
"Berapa jumlah penduduk Indonesia tahun 2023?"
|
|
163
|
+
"Bandingkan angka kemiskinan Jawa Timur vs Jawa Barat 2020-2023"
|
|
164
|
+
"Cari BRS terbaru tentang inflasi"
|
|
165
|
+
"Data ekspor kopi Indonesia tahun 2024"
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Environment Variables
|
|
169
|
+
|
|
170
|
+
| Variable | Default | Deskripsi |
|
|
171
|
+
|----------|---------|-----------|
|
|
172
|
+
| `BPS_API_KEY` | (required) | API key dari webapi.bps.go.id |
|
|
173
|
+
| `BPS_API_BASE_URL` | `https://webapi.bps.go.id/v1` | Base URL API |
|
|
174
|
+
| `BPS_DEFAULT_LANG` | `ind` | Bahasa default: `ind` / `eng` |
|
|
175
|
+
| `BPS_DEFAULT_DOMAIN` | `0000` | Domain default (0000 = Nasional) |
|
|
176
|
+
| `BPS_CACHE_ENABLED` | `true` | Aktifkan cache |
|
|
177
|
+
| `BPS_CACHE_MAX_ENTRIES` | `500` | Maks entri cache |
|
|
178
|
+
| `BPS_LOG_LEVEL` | `info` | Level log: debug/info/warn/error |
|
|
179
|
+
|
|
180
|
+
## Development
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
git clone https://github.com/murphi/bps-mcp-server
|
|
184
|
+
cd bps-mcp-server
|
|
185
|
+
npm install
|
|
186
|
+
npm run build
|
|
187
|
+
npm run test:unit
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Atribusi
|
|
191
|
+
|
|
192
|
+
Sumber: Badan Pusat Statistik (BPS) — https://www.bps.go.id
|
|
193
|
+
Layanan ini menggunakan API Badan Pusat Statistik (BPS).
|
|
194
|
+
|
|
195
|
+
## Lisensi
|
|
196
|
+
|
|
197
|
+
MIT
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AuthResult, IAuthProvider } from "./types.js";
|
|
2
|
+
export declare class ApiKeyProvider implements IAuthProvider {
|
|
3
|
+
private readonly apiKey;
|
|
4
|
+
constructor(apiKey: string);
|
|
5
|
+
authenticate(): Promise<AuthResult>;
|
|
6
|
+
getHeaders(): Promise<Record<string, string>>;
|
|
7
|
+
getQueryParams(): Promise<Record<string, string>>;
|
|
8
|
+
isExpired(): boolean;
|
|
9
|
+
refresh(): Promise<void>;
|
|
10
|
+
getType(): "api-key";
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=api-key.provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-key.provider.d.ts","sourceRoot":"","sources":["../../src/auth/api-key.provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5D,qBAAa,cAAe,YAAW,aAAa;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,MAAM;IAOpB,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC;IAInC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI7C,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIvD,SAAS,IAAI,OAAO;IAId,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,OAAO,IAAI,SAAS;CAGrB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export class ApiKeyProvider {
|
|
2
|
+
apiKey;
|
|
3
|
+
constructor(apiKey) {
|
|
4
|
+
if (!apiKey) {
|
|
5
|
+
throw new Error("BPS_API_KEY is required for api-key auth type");
|
|
6
|
+
}
|
|
7
|
+
this.apiKey = apiKey;
|
|
8
|
+
}
|
|
9
|
+
async authenticate() {
|
|
10
|
+
return { authenticated: true, type: "api-key" };
|
|
11
|
+
}
|
|
12
|
+
async getHeaders() {
|
|
13
|
+
return {};
|
|
14
|
+
}
|
|
15
|
+
async getQueryParams() {
|
|
16
|
+
return { key: this.apiKey };
|
|
17
|
+
}
|
|
18
|
+
isExpired() {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
async refresh() {
|
|
22
|
+
// API keys don't expire
|
|
23
|
+
}
|
|
24
|
+
getType() {
|
|
25
|
+
return "api-key";
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=api-key.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-key.provider.js","sourceRoot":"","sources":["../../src/auth/api-key.provider.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,cAAc;IACR,MAAM,CAAS;IAEhC,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IAED,SAAS;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,OAAO;QACX,wBAAwB;IAC1B,CAAC;IAED,OAAO;QACL,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/auth/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAchE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ApiKeyProvider } from "./api-key.provider.js";
|
|
2
|
+
import { OAuth2Provider } from "./oauth2.provider.js";
|
|
3
|
+
export function createAuthProvider(config) {
|
|
4
|
+
switch (config.authType) {
|
|
5
|
+
case "api-key":
|
|
6
|
+
return new ApiKeyProvider(config.apiKey);
|
|
7
|
+
case "oauth2":
|
|
8
|
+
return new OAuth2Provider(config.oauthClientId, config.oauthClientSecret, config.oauthTokenEndpoint, config.oauthScopes);
|
|
9
|
+
default:
|
|
10
|
+
throw new Error(`Unknown auth type: ${config.authType}`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/auth/factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,SAAS;YACZ,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,MAAO,CAAC,CAAC;QAC5C,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CACvB,MAAM,CAAC,aAAc,EACrB,MAAM,CAAC,iBAAkB,EACzB,MAAM,CAAC,kBAAmB,EAC1B,MAAM,CAAC,WAAW,CACnB,CAAC;QACJ;YACE,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AuthResult, IAuthProvider } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* OAuth2 provider for future WSO2 BPS API v2.
|
|
4
|
+
* Placeholder implementation — will be completed when BPS releases v2.
|
|
5
|
+
*/
|
|
6
|
+
export declare class OAuth2Provider implements IAuthProvider {
|
|
7
|
+
private readonly clientId;
|
|
8
|
+
private readonly clientSecret;
|
|
9
|
+
private readonly tokenEndpoint;
|
|
10
|
+
private readonly scopes?;
|
|
11
|
+
private accessToken;
|
|
12
|
+
private expiresAt;
|
|
13
|
+
constructor(clientId: string, clientSecret: string, tokenEndpoint: string, scopes?: string | undefined);
|
|
14
|
+
authenticate(): Promise<AuthResult>;
|
|
15
|
+
getHeaders(): Promise<Record<string, string>>;
|
|
16
|
+
getQueryParams(): Promise<Record<string, string>>;
|
|
17
|
+
isExpired(): boolean;
|
|
18
|
+
refresh(): Promise<void>;
|
|
19
|
+
getType(): "oauth2";
|
|
20
|
+
private fetchToken;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=oauth2.provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth2.provider.d.ts","sourceRoot":"","sources":["../../src/auth/oauth2.provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5D;;;GAGG;AACH,qBAAa,cAAe,YAAW,aAAa;IAKhD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAP1B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,SAAS,CAAa;gBAGX,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,YAAA;IAG5B,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC;IAKnC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAS7C,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIvD,SAAS,IAAI,OAAO;IAId,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,OAAO,IAAI,QAAQ;YAIL,UAAU;CAwBzB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth2 provider for future WSO2 BPS API v2.
|
|
3
|
+
* Placeholder implementation — will be completed when BPS releases v2.
|
|
4
|
+
*/
|
|
5
|
+
export class OAuth2Provider {
|
|
6
|
+
clientId;
|
|
7
|
+
clientSecret;
|
|
8
|
+
tokenEndpoint;
|
|
9
|
+
scopes;
|
|
10
|
+
accessToken = null;
|
|
11
|
+
expiresAt = 0;
|
|
12
|
+
constructor(clientId, clientSecret, tokenEndpoint, scopes) {
|
|
13
|
+
this.clientId = clientId;
|
|
14
|
+
this.clientSecret = clientSecret;
|
|
15
|
+
this.tokenEndpoint = tokenEndpoint;
|
|
16
|
+
this.scopes = scopes;
|
|
17
|
+
}
|
|
18
|
+
async authenticate() {
|
|
19
|
+
await this.fetchToken();
|
|
20
|
+
return { authenticated: true, type: "oauth2" };
|
|
21
|
+
}
|
|
22
|
+
async getHeaders() {
|
|
23
|
+
if (this.isExpired()) {
|
|
24
|
+
await this.refresh();
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
Authorization: `Bearer ${this.accessToken}`,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
async getQueryParams() {
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
isExpired() {
|
|
34
|
+
return Date.now() >= this.expiresAt - 60_000;
|
|
35
|
+
}
|
|
36
|
+
async refresh() {
|
|
37
|
+
await this.fetchToken();
|
|
38
|
+
}
|
|
39
|
+
getType() {
|
|
40
|
+
return "oauth2";
|
|
41
|
+
}
|
|
42
|
+
async fetchToken() {
|
|
43
|
+
const body = new URLSearchParams({
|
|
44
|
+
grant_type: "client_credentials",
|
|
45
|
+
client_id: this.clientId,
|
|
46
|
+
client_secret: this.clientSecret,
|
|
47
|
+
});
|
|
48
|
+
if (this.scopes) {
|
|
49
|
+
body.set("scope", this.scopes);
|
|
50
|
+
}
|
|
51
|
+
const res = await fetch(this.tokenEndpoint, {
|
|
52
|
+
method: "POST",
|
|
53
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
54
|
+
body,
|
|
55
|
+
});
|
|
56
|
+
if (!res.ok) {
|
|
57
|
+
throw new Error(`OAuth2 token request failed: ${res.status} ${res.statusText}`);
|
|
58
|
+
}
|
|
59
|
+
const data = (await res.json());
|
|
60
|
+
this.accessToken = data.access_token;
|
|
61
|
+
this.expiresAt = Date.now() + data.expires_in * 1000;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=oauth2.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth2.provider.js","sourceRoot":"","sources":["../../src/auth/oauth2.provider.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,cAAc;IAKN;IACA;IACA;IACA;IAPX,WAAW,GAAkB,IAAI,CAAC;IAClC,SAAS,GAAW,CAAC,CAAC;IAE9B,YACmB,QAAgB,EAChB,YAAoB,EACpB,aAAqB,EACrB,MAAe;QAHf,aAAQ,GAAR,QAAQ,CAAQ;QAChB,iBAAY,GAAZ,YAAY,CAAQ;QACpB,kBAAa,GAAb,aAAa,CAAQ;QACrB,WAAM,GAAN,MAAM,CAAS;IAC/B,CAAC;IAEJ,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QACD,OAAO;YACL,aAAa,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE;SAC5C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO;QACL,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;YAC/B,UAAU,EAAE,oBAAoB;YAChC,SAAS,EAAE,IAAI,CAAC,QAAQ;YACxB,aAAa,EAAE,IAAI,CAAC,YAAY;SACjC,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI;SACL,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAClF,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAiD,CAAC;QAChF,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACvD,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface AuthResult {
|
|
2
|
+
authenticated: boolean;
|
|
3
|
+
type: "api-key" | "oauth2";
|
|
4
|
+
}
|
|
5
|
+
export interface IAuthProvider {
|
|
6
|
+
authenticate(): Promise<AuthResult>;
|
|
7
|
+
getHeaders(): Promise<Record<string, string>>;
|
|
8
|
+
getQueryParams(): Promise<Record<string, string>>;
|
|
9
|
+
isExpired(): boolean;
|
|
10
|
+
refresh(): Promise<void>;
|
|
11
|
+
getType(): "api-key" | "oauth2";
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,SAAS,GAAG,QAAQ,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IACpC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,SAAS,IAAI,OAAO,CAAC;IACrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,OAAO,IAAI,SAAS,GAAG,QAAQ,CAAC;CACjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { IAuthProvider } from "../auth/types.js";
|
|
2
|
+
import type { ICacheProvider } from "../services/cache.js";
|
|
3
|
+
import type { Config } from "../config/index.js";
|
|
4
|
+
import type { BpsDomain, BpsSubject, BpsSubjectCategory, BpsVariable, BpsVerticalVariable, BpsDerivedVariable, BpsPeriod, BpsDerivedPeriod, BpsUnit, BpsDynamicDataResponse, BpsStaticTable, BpsStaticTableDetail, BpsPressRelease, BpsPublication, BpsStrategicIndicator, BpsInfographic, BpsInfographicDetail, BpsNews, BpsNewsDetail, BpsGlossaryTerm, BpsCsaSubjectCategory, BpsCsaSubject, BpsCsaTable, BpsCsaTableDetail, BpsCensusEvent, BpsCensusTopic, PageInfo } from "./types.js";
|
|
5
|
+
export declare class BpsClient {
|
|
6
|
+
private readonly auth;
|
|
7
|
+
private readonly cache;
|
|
8
|
+
private readonly baseUrl;
|
|
9
|
+
private readonly defaultLang;
|
|
10
|
+
private readonly defaultDomain;
|
|
11
|
+
constructor(auth: IAuthProvider, cache: ICacheProvider | null, config: Config);
|
|
12
|
+
private fetchJson;
|
|
13
|
+
private authParams;
|
|
14
|
+
/**
|
|
15
|
+
* Perform a list request: /api/list/model/{model}/...
|
|
16
|
+
*/
|
|
17
|
+
private listRequest;
|
|
18
|
+
/**
|
|
19
|
+
* Perform a view request: /api/view/model/{model}/...
|
|
20
|
+
*/
|
|
21
|
+
private viewRequest;
|
|
22
|
+
private extractPaginated;
|
|
23
|
+
listDomains(type?: "all" | "prov" | "kab" | "kabbyprov", provId?: string): Promise<{
|
|
24
|
+
data: BpsDomain[];
|
|
25
|
+
page?: PageInfo;
|
|
26
|
+
}>;
|
|
27
|
+
listSubjects(domain?: string, subcat?: number): Promise<{
|
|
28
|
+
data: BpsSubject[];
|
|
29
|
+
page?: PageInfo;
|
|
30
|
+
}>;
|
|
31
|
+
listSubjectCategories(domain?: string): Promise<BpsSubjectCategory[]>;
|
|
32
|
+
listVariables(domain?: string, subject?: number, year?: number, page?: number, perPage?: number): Promise<{
|
|
33
|
+
data: BpsVariable[];
|
|
34
|
+
page?: PageInfo;
|
|
35
|
+
}>;
|
|
36
|
+
listVerticalVariables(domain?: string, varId?: number): Promise<BpsVerticalVariable[]>;
|
|
37
|
+
listDerivedVariables(domain?: string, varId?: number): Promise<BpsDerivedVariable[]>;
|
|
38
|
+
listPeriods(domain?: string, varId?: number): Promise<BpsPeriod[]>;
|
|
39
|
+
listDerivedPeriods(domain?: string, varId?: number): Promise<BpsDerivedPeriod[]>;
|
|
40
|
+
listUnits(domain?: string): Promise<BpsUnit[]>;
|
|
41
|
+
getDynamicData(domain: string, varId: string, th?: string, turvar?: string, vervar?: string, turth?: string): Promise<BpsDynamicDataResponse>;
|
|
42
|
+
listStaticTables(domain?: string, keyword?: string, year?: number, month?: number, page?: number): Promise<{
|
|
43
|
+
data: BpsStaticTable[];
|
|
44
|
+
page?: PageInfo;
|
|
45
|
+
}>;
|
|
46
|
+
getStaticTable(domain: string, id: number): Promise<BpsStaticTableDetail>;
|
|
47
|
+
listPressReleases(domain?: string, keyword?: string, year?: number, month?: number, page?: number): Promise<{
|
|
48
|
+
data: BpsPressRelease[];
|
|
49
|
+
page?: PageInfo;
|
|
50
|
+
}>;
|
|
51
|
+
getPressRelease(domain: string, id: number): Promise<BpsPressRelease>;
|
|
52
|
+
listPublications(domain?: string, keyword?: string, year?: number, month?: number, page?: number): Promise<{
|
|
53
|
+
data: BpsPublication[];
|
|
54
|
+
page?: PageInfo;
|
|
55
|
+
}>;
|
|
56
|
+
getPublication(domain: string, id: string): Promise<BpsPublication>;
|
|
57
|
+
listStrategicIndicators(domain?: string, varId?: number, page?: number): Promise<{
|
|
58
|
+
data: BpsStrategicIndicator[];
|
|
59
|
+
page?: PageInfo;
|
|
60
|
+
}>;
|
|
61
|
+
getTradeData(source: 1 | 2, hsCode: string, hsType: string, year: string, period: string): Promise<unknown>;
|
|
62
|
+
listInfographics(domain?: string, keyword?: string, page?: number): Promise<{
|
|
63
|
+
data: BpsInfographic[];
|
|
64
|
+
page?: PageInfo;
|
|
65
|
+
}>;
|
|
66
|
+
getInfographic(domain: string, id: number): Promise<BpsInfographicDetail>;
|
|
67
|
+
listNews(domain?: string, keyword?: string, page?: number): Promise<{
|
|
68
|
+
data: BpsNews[];
|
|
69
|
+
page?: PageInfo;
|
|
70
|
+
}>;
|
|
71
|
+
getNews(domain: string, id: number): Promise<BpsNewsDetail>;
|
|
72
|
+
listGlossary(domain?: string, keyword?: string, page?: number): Promise<{
|
|
73
|
+
data: BpsGlossaryTerm[];
|
|
74
|
+
page?: PageInfo;
|
|
75
|
+
}>;
|
|
76
|
+
listCsaSubjectCategories(domain?: string): Promise<BpsCsaSubjectCategory[]>;
|
|
77
|
+
listCsaSubjects(domain?: string, subcat?: number): Promise<{
|
|
78
|
+
data: BpsCsaSubject[];
|
|
79
|
+
page?: PageInfo;
|
|
80
|
+
}>;
|
|
81
|
+
listCsaTables(domain?: string, subject?: number, page?: number): Promise<{
|
|
82
|
+
data: BpsCsaTable[];
|
|
83
|
+
page?: PageInfo;
|
|
84
|
+
}>;
|
|
85
|
+
getCsaTable(domain: string, id: string): Promise<BpsCsaTableDetail>;
|
|
86
|
+
listCensusEvents(): Promise<BpsCensusEvent[]>;
|
|
87
|
+
listCensusTopics(kegiatan: string): Promise<BpsCensusTopic[]>;
|
|
88
|
+
search(domain: string, keyword: string, model?: string, page?: number): Promise<{
|
|
89
|
+
data: unknown[];
|
|
90
|
+
page?: PageInfo;
|
|
91
|
+
}>;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=bps-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bps-client.d.ts","sourceRoot":"","sources":["../../src/client/bps-client.ts"],"names":[],"mappings":"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"}
|