@quantaroute/mcp-server 1.0.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 +22 -0
- package/README.md +481 -0
- package/dist/api/[...path].d.ts +3 -0
- package/dist/api/[...path].d.ts.map +1 -0
- package/dist/api/[...path].js +368 -0
- package/dist/api/[...path].js.map +1 -0
- package/dist/client.d.ts +45 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +127 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +508 -0
- package/dist/index.js.map +1 -0
- package/dist/src/client.d.ts +45 -0
- package/dist/src/client.d.ts.map +1 -0
- package/dist/src/client.js +127 -0
- package/dist/src/client.js.map +1 -0
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +498 -0
- package/dist/src/index.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
import { QuantaRouteClient } from '../src/client.js';
|
|
2
|
+
// CORS headers
|
|
3
|
+
const corsHeaders = {
|
|
4
|
+
'Access-Control-Allow-Origin': '*',
|
|
5
|
+
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
|
6
|
+
'Access-Control-Allow-Headers': 'Content-Type, Authorization, x-api-key',
|
|
7
|
+
'Content-Type': 'application/json',
|
|
8
|
+
};
|
|
9
|
+
// Helper to send JSON response
|
|
10
|
+
function sendJson(res, status, data) {
|
|
11
|
+
Object.entries(corsHeaders).forEach(([key, value]) => {
|
|
12
|
+
res.setHeader(key, value);
|
|
13
|
+
});
|
|
14
|
+
res.status(status).json(data);
|
|
15
|
+
}
|
|
16
|
+
// Helper to handle errors
|
|
17
|
+
function handleError(res, error, status = 500) {
|
|
18
|
+
console.error('API Error:', error);
|
|
19
|
+
// Determine status code from error message
|
|
20
|
+
if (error.message?.includes('Authentication failed')) {
|
|
21
|
+
status = 401;
|
|
22
|
+
}
|
|
23
|
+
else if (error.message?.includes('Rate limit exceeded')) {
|
|
24
|
+
status = 429;
|
|
25
|
+
}
|
|
26
|
+
else if (error.message?.includes('required') || error.message?.includes('must be')) {
|
|
27
|
+
status = 400;
|
|
28
|
+
}
|
|
29
|
+
sendJson(res, status, {
|
|
30
|
+
error: error.message || 'Internal server error',
|
|
31
|
+
success: false,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
// Get API key from request headers or environment
|
|
35
|
+
function getApiKey(req) {
|
|
36
|
+
// Priority: Request header > Environment variable
|
|
37
|
+
const headerKey = req.headers['x-api-key'];
|
|
38
|
+
const envKey = process.env.QUANTAROUTE_API_KEY;
|
|
39
|
+
if (headerKey) {
|
|
40
|
+
return headerKey;
|
|
41
|
+
}
|
|
42
|
+
if (envKey) {
|
|
43
|
+
return envKey;
|
|
44
|
+
}
|
|
45
|
+
throw new Error('API key is required. Set QUANTAROUTE_API_KEY environment variable or provide x-api-key header');
|
|
46
|
+
}
|
|
47
|
+
// Create client instance with API key
|
|
48
|
+
function createClient(req) {
|
|
49
|
+
const apiKey = getApiKey(req);
|
|
50
|
+
return new QuantaRouteClient(apiKey);
|
|
51
|
+
}
|
|
52
|
+
// Handle CORS preflight
|
|
53
|
+
function handleCors(req, res) {
|
|
54
|
+
if (req.method === 'OPTIONS') {
|
|
55
|
+
Object.entries(corsHeaders).forEach(([key, value]) => {
|
|
56
|
+
res.setHeader(key, value);
|
|
57
|
+
});
|
|
58
|
+
res.status(200).end();
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
export default async function handler(req, res) {
|
|
64
|
+
// Handle CORS preflight
|
|
65
|
+
if (handleCors(req, res)) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const { method, query, body } = req;
|
|
69
|
+
const path = query.path || [];
|
|
70
|
+
const endpoint = path[0] || '';
|
|
71
|
+
try {
|
|
72
|
+
// Create client instance with API key from request or environment
|
|
73
|
+
const client = createClient(req);
|
|
74
|
+
// Health check
|
|
75
|
+
if (endpoint === 'health' && method === 'GET') {
|
|
76
|
+
const result = await client.getHealth();
|
|
77
|
+
return sendJson(res, 200, { success: true, data: result });
|
|
78
|
+
}
|
|
79
|
+
// Get usage statistics
|
|
80
|
+
if (endpoint === 'usage' && method === 'GET') {
|
|
81
|
+
const result = await client.getUsage();
|
|
82
|
+
return sendJson(res, 200, { success: true, data: result });
|
|
83
|
+
}
|
|
84
|
+
// Get location statistics
|
|
85
|
+
if (endpoint === 'location-statistics' && method === 'GET') {
|
|
86
|
+
const result = await client.getLocationStatistics();
|
|
87
|
+
return sendJson(res, 200, { success: true, data: result });
|
|
88
|
+
}
|
|
89
|
+
// Geocode
|
|
90
|
+
if (endpoint === 'geocode' && method === 'POST') {
|
|
91
|
+
if (!body || !body.address) {
|
|
92
|
+
return sendJson(res, 400, {
|
|
93
|
+
success: false,
|
|
94
|
+
error: 'Address is required',
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
const result = await client.geocode(body);
|
|
98
|
+
return sendJson(res, 200, { success: true, data: result });
|
|
99
|
+
}
|
|
100
|
+
// Reverse geocode
|
|
101
|
+
if (endpoint === 'reverse-geocode' && method === 'POST') {
|
|
102
|
+
if (!body || !body.digipin) {
|
|
103
|
+
return sendJson(res, 400, {
|
|
104
|
+
success: false,
|
|
105
|
+
error: 'DigiPin is required',
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
const result = await client.reverseGeocode(body.digipin);
|
|
109
|
+
return sendJson(res, 200, { success: true, data: result });
|
|
110
|
+
}
|
|
111
|
+
// Coordinates to DigiPin
|
|
112
|
+
if (endpoint === 'coordinates-to-digipin' && method === 'POST') {
|
|
113
|
+
if (typeof body?.latitude !== 'number' || typeof body?.longitude !== 'number') {
|
|
114
|
+
return sendJson(res, 400, {
|
|
115
|
+
success: false,
|
|
116
|
+
error: 'Latitude and longitude are required and must be numbers',
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
if (body.latitude < -90 || body.latitude > 90) {
|
|
120
|
+
return sendJson(res, 400, {
|
|
121
|
+
success: false,
|
|
122
|
+
error: 'Latitude must be between -90 and 90',
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
if (body.longitude < -180 || body.longitude > 180) {
|
|
126
|
+
return sendJson(res, 400, {
|
|
127
|
+
success: false,
|
|
128
|
+
error: 'Longitude must be between -180 and 180',
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
const result = await client.coordinatesToDigiPin(body.latitude, body.longitude);
|
|
132
|
+
return sendJson(res, 200, { success: true, data: result });
|
|
133
|
+
}
|
|
134
|
+
// Validate DigiPin (GET method with query parameter)
|
|
135
|
+
if (endpoint === 'validate-digipin') {
|
|
136
|
+
if (method === 'GET') {
|
|
137
|
+
const digipin = query.digipin;
|
|
138
|
+
if (!digipin) {
|
|
139
|
+
return sendJson(res, 400, {
|
|
140
|
+
success: false,
|
|
141
|
+
error: 'DigiPin query parameter is required',
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
const result = await client.validateDigiPin(digipin);
|
|
145
|
+
return sendJson(res, 200, { success: true, data: result });
|
|
146
|
+
}
|
|
147
|
+
// Also support POST for consistency
|
|
148
|
+
if (method === 'POST') {
|
|
149
|
+
if (!body || !body.digipin) {
|
|
150
|
+
return sendJson(res, 400, {
|
|
151
|
+
success: false,
|
|
152
|
+
error: 'DigiPin is required',
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
const result = await client.validateDigiPin(body.digipin);
|
|
156
|
+
return sendJson(res, 200, { success: true, data: result });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Batch geocode
|
|
160
|
+
if (endpoint === 'batch-geocode' && method === 'POST') {
|
|
161
|
+
if (!body || !Array.isArray(body.addresses) || body.addresses.length === 0) {
|
|
162
|
+
return sendJson(res, 400, {
|
|
163
|
+
success: false,
|
|
164
|
+
error: 'Addresses must be a non-empty array',
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
if (body.addresses.length > 100) {
|
|
168
|
+
return sendJson(res, 400, {
|
|
169
|
+
success: false,
|
|
170
|
+
error: 'Maximum 100 addresses allowed per batch',
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
const result = await client.batchGeocode(body.addresses);
|
|
174
|
+
return sendJson(res, 200, { success: true, data: result });
|
|
175
|
+
}
|
|
176
|
+
// Autocomplete
|
|
177
|
+
if (endpoint === 'autocomplete' && method === 'GET') {
|
|
178
|
+
const queryParam = req.query.q;
|
|
179
|
+
const limit = req.query.limit ? parseInt(req.query.limit, 10) : 5;
|
|
180
|
+
if (!queryParam || queryParam.length < 3) {
|
|
181
|
+
return sendJson(res, 400, {
|
|
182
|
+
success: false,
|
|
183
|
+
error: 'Query parameter "q" must be at least 3 characters long',
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
if (limit > 10) {
|
|
187
|
+
return sendJson(res, 400, {
|
|
188
|
+
success: false,
|
|
189
|
+
error: 'Limit cannot exceed 10',
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
const result = await client.autocomplete(queryParam, limit);
|
|
193
|
+
return sendJson(res, 200, { success: true, data: result });
|
|
194
|
+
}
|
|
195
|
+
// Lookup location from coordinates
|
|
196
|
+
if (endpoint === 'lookup-location-from-coordinates' && method === 'POST') {
|
|
197
|
+
if (typeof body?.latitude !== 'number' || typeof body?.longitude !== 'number') {
|
|
198
|
+
return sendJson(res, 400, {
|
|
199
|
+
success: false,
|
|
200
|
+
error: 'Latitude and longitude are required and must be numbers',
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
if (body.latitude < -90 || body.latitude > 90) {
|
|
204
|
+
return sendJson(res, 400, {
|
|
205
|
+
success: false,
|
|
206
|
+
error: 'Latitude must be between -90 and 90',
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
if (body.longitude < -180 || body.longitude > 180) {
|
|
210
|
+
return sendJson(res, 400, {
|
|
211
|
+
success: false,
|
|
212
|
+
error: 'Longitude must be between -180 and 180',
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
const result = await client.lookupLocationFromCoordinates(body.latitude, body.longitude);
|
|
216
|
+
return sendJson(res, 200, { success: true, data: result });
|
|
217
|
+
}
|
|
218
|
+
// Lookup location from DigiPin
|
|
219
|
+
if (endpoint === 'lookup-location-from-digipin' && method === 'POST') {
|
|
220
|
+
if (!body || !body.digipin) {
|
|
221
|
+
return sendJson(res, 400, {
|
|
222
|
+
success: false,
|
|
223
|
+
error: 'DigiPin is required',
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
const result = await client.lookupLocationFromDigiPin(body.digipin);
|
|
227
|
+
return sendJson(res, 200, { success: true, data: result });
|
|
228
|
+
}
|
|
229
|
+
// Batch location lookup
|
|
230
|
+
if (endpoint === 'batch-location-lookup' && method === 'POST') {
|
|
231
|
+
if (!body || !Array.isArray(body.locations) || body.locations.length === 0) {
|
|
232
|
+
return sendJson(res, 400, {
|
|
233
|
+
success: false,
|
|
234
|
+
error: 'Locations must be a non-empty array',
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
if (body.locations.length > 100) {
|
|
238
|
+
return sendJson(res, 400, {
|
|
239
|
+
success: false,
|
|
240
|
+
error: 'Maximum 100 locations allowed per batch',
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
const result = await client.batchLocationLookup(body.locations);
|
|
244
|
+
return sendJson(res, 200, { success: true, data: result });
|
|
245
|
+
}
|
|
246
|
+
// Find nearby boundaries
|
|
247
|
+
if (endpoint === 'find-nearby-boundaries' && method === 'POST') {
|
|
248
|
+
if (typeof body?.latitude !== 'number' || typeof body?.longitude !== 'number') {
|
|
249
|
+
return sendJson(res, 400, {
|
|
250
|
+
success: false,
|
|
251
|
+
error: 'Latitude and longitude are required and must be numbers',
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
if (body.latitude < -90 || body.latitude > 90) {
|
|
255
|
+
return sendJson(res, 400, {
|
|
256
|
+
success: false,
|
|
257
|
+
error: 'Latitude must be between -90 and 90',
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
if (body.longitude < -180 || body.longitude > 180) {
|
|
261
|
+
return sendJson(res, 400, {
|
|
262
|
+
success: false,
|
|
263
|
+
error: 'Longitude must be between -180 and 180',
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
const radius_km = typeof body.radius_km === 'number' ? body.radius_km : 5.0;
|
|
267
|
+
const limit = typeof body.limit === 'number' ? body.limit : 10;
|
|
268
|
+
if (radius_km > 100) {
|
|
269
|
+
return sendJson(res, 400, {
|
|
270
|
+
success: false,
|
|
271
|
+
error: 'Radius cannot exceed 100 km',
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
if (limit > 50) {
|
|
275
|
+
return sendJson(res, 400, {
|
|
276
|
+
success: false,
|
|
277
|
+
error: 'Limit cannot exceed 50',
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
const result = await client.findNearbyBoundaries(body.latitude, body.longitude, radius_km, limit);
|
|
281
|
+
return sendJson(res, 200, { success: true, data: result });
|
|
282
|
+
}
|
|
283
|
+
// Root endpoint - show API documentation
|
|
284
|
+
if (endpoint === '' && method === 'GET') {
|
|
285
|
+
return sendJson(res, 200, {
|
|
286
|
+
success: true,
|
|
287
|
+
message: 'QuantaRoute Geocoder REST API',
|
|
288
|
+
version: '1.0.0',
|
|
289
|
+
documentation: 'https://github.com/mapdevsaikat/quantaroute-geocoder',
|
|
290
|
+
authentication: {
|
|
291
|
+
method: 'API Key',
|
|
292
|
+
header: 'x-api-key',
|
|
293
|
+
env: 'QUANTAROUTE_API_KEY',
|
|
294
|
+
note: 'API key can be provided via x-api-key header or QUANTAROUTE_API_KEY environment variable',
|
|
295
|
+
},
|
|
296
|
+
endpoints: {
|
|
297
|
+
'GET /api': 'Get API information (this endpoint)',
|
|
298
|
+
'GET /api/health': 'Check API health status',
|
|
299
|
+
'GET /api/usage': 'Get API usage statistics',
|
|
300
|
+
'GET /api/location-statistics': 'Get location service statistics',
|
|
301
|
+
'GET /api/autocomplete?q=query&limit=5': 'Get address autocomplete suggestions (min 3 chars)',
|
|
302
|
+
'GET /api/validate-digipin?digipin=XXX-XXX-XXXX': 'Validate a DigiPin code',
|
|
303
|
+
'POST /api/geocode': 'Geocode an address to get DigiPin and coordinates',
|
|
304
|
+
'POST /api/reverse-geocode': 'Reverse geocode a DigiPin to get address',
|
|
305
|
+
'POST /api/coordinates-to-digipin': 'Convert coordinates to DigiPin',
|
|
306
|
+
'POST /api/validate-digipin': 'Validate a DigiPin code (alternative to GET)',
|
|
307
|
+
'POST /api/batch-geocode': 'Geocode multiple addresses (up to 100)',
|
|
308
|
+
'POST /api/lookup-location-from-coordinates': 'Get administrative boundaries from coordinates',
|
|
309
|
+
'POST /api/lookup-location-from-digipin': 'Get administrative boundaries from DigiPin',
|
|
310
|
+
'POST /api/batch-location-lookup': 'Batch lookup for multiple locations (up to 100)',
|
|
311
|
+
'POST /api/find-nearby-boundaries': 'Find nearby postal boundaries within a radius',
|
|
312
|
+
},
|
|
313
|
+
examples: {
|
|
314
|
+
geocode: {
|
|
315
|
+
method: 'POST',
|
|
316
|
+
url: '/api/geocode',
|
|
317
|
+
headers: { 'Content-Type': 'application/json', 'x-api-key': 'your-api-key' },
|
|
318
|
+
body: {
|
|
319
|
+
address: '123 Main Street, New Delhi',
|
|
320
|
+
city: 'New Delhi',
|
|
321
|
+
state: 'Delhi',
|
|
322
|
+
pincode: '110001',
|
|
323
|
+
},
|
|
324
|
+
},
|
|
325
|
+
reverseGeocode: {
|
|
326
|
+
method: 'POST',
|
|
327
|
+
url: '/api/reverse-geocode',
|
|
328
|
+
headers: { 'Content-Type': 'application/json', 'x-api-key': 'your-api-key' },
|
|
329
|
+
body: { digipin: 'ABC-DEF-1234' },
|
|
330
|
+
},
|
|
331
|
+
autocomplete: {
|
|
332
|
+
method: 'GET',
|
|
333
|
+
url: '/api/autocomplete?q=New Delhi&limit=5',
|
|
334
|
+
headers: { 'x-api-key': 'your-api-key' },
|
|
335
|
+
},
|
|
336
|
+
},
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
// 404 for unknown endpoints
|
|
340
|
+
return sendJson(res, 404, {
|
|
341
|
+
success: false,
|
|
342
|
+
error: 'Endpoint not found',
|
|
343
|
+
endpoint: endpoint || '(root)',
|
|
344
|
+
method: method,
|
|
345
|
+
availableEndpoints: [
|
|
346
|
+
'GET /api',
|
|
347
|
+
'GET /api/health',
|
|
348
|
+
'GET /api/usage',
|
|
349
|
+
'GET /api/location-statistics',
|
|
350
|
+
'GET /api/autocomplete?q=query&limit=5',
|
|
351
|
+
'GET /api/validate-digipin?digipin=XXX-XXX-XXXX',
|
|
352
|
+
'POST /api/geocode',
|
|
353
|
+
'POST /api/reverse-geocode',
|
|
354
|
+
'POST /api/coordinates-to-digipin',
|
|
355
|
+
'POST /api/validate-digipin',
|
|
356
|
+
'POST /api/batch-geocode',
|
|
357
|
+
'POST /api/lookup-location-from-coordinates',
|
|
358
|
+
'POST /api/lookup-location-from-digipin',
|
|
359
|
+
'POST /api/batch-location-lookup',
|
|
360
|
+
'POST /api/find-nearby-boundaries',
|
|
361
|
+
],
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
catch (error) {
|
|
365
|
+
handleError(res, error);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=%5B...path%5D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"[...path].js","sourceRoot":"","sources":["../../api/[...path].ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
interface GeocodeParams {
|
|
2
|
+
address: string;
|
|
3
|
+
city?: string;
|
|
4
|
+
state?: string;
|
|
5
|
+
pincode?: string;
|
|
6
|
+
country?: string;
|
|
7
|
+
}
|
|
8
|
+
interface BatchGeocodeParams {
|
|
9
|
+
addresses: Array<{
|
|
10
|
+
address: string;
|
|
11
|
+
city?: string;
|
|
12
|
+
state?: string;
|
|
13
|
+
pincode?: string;
|
|
14
|
+
country?: string;
|
|
15
|
+
}>;
|
|
16
|
+
}
|
|
17
|
+
interface BatchLocationParams {
|
|
18
|
+
locations: Array<{
|
|
19
|
+
latitude?: number;
|
|
20
|
+
longitude?: number;
|
|
21
|
+
digipin?: string;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
export declare class QuantaRouteClient {
|
|
25
|
+
private client;
|
|
26
|
+
private apiKey;
|
|
27
|
+
private baseUrl;
|
|
28
|
+
constructor(apiKey?: string, baseUrl?: string);
|
|
29
|
+
private makeRequest;
|
|
30
|
+
geocode(params: GeocodeParams): Promise<any>;
|
|
31
|
+
reverseGeocode(digipin: string): Promise<any>;
|
|
32
|
+
coordinatesToDigiPin(latitude: number, longitude: number): Promise<any>;
|
|
33
|
+
validateDigiPin(digipin: string): Promise<any>;
|
|
34
|
+
batchGeocode(addresses: BatchGeocodeParams['addresses']): Promise<any>;
|
|
35
|
+
autocomplete(query: string, limit?: number): Promise<any>;
|
|
36
|
+
lookupLocationFromCoordinates(latitude: number, longitude: number): Promise<any>;
|
|
37
|
+
lookupLocationFromDigiPin(digipin: string): Promise<any>;
|
|
38
|
+
batchLocationLookup(locations: BatchLocationParams['locations']): Promise<any>;
|
|
39
|
+
findNearbyBoundaries(latitude: number, longitude: number, radius_km?: number, limit?: number): Promise<any>;
|
|
40
|
+
getUsage(): Promise<any>;
|
|
41
|
+
getLocationStatistics(): Promise<any>;
|
|
42
|
+
getHealth(): Promise<any>;
|
|
43
|
+
}
|
|
44
|
+
export {};
|
|
45
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,kBAAkB;IAC1B,SAAS,EAAE,KAAK,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ;AAED,UAAU,mBAAmB;IAC3B,SAAS,EAAE,KAAK,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,MAAsC;YAsB9D,WAAW;IA0BnB,OAAO,CAAC,MAAM,EAAE,aAAa;IAa7B,cAAc,CAAC,OAAO,EAAE,MAAM;IAK9B,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAQxD,eAAe,CAAC,OAAO,EAAE,MAAM;IAK/B,YAAY,CAAC,SAAS,EAAE,kBAAkB,CAAC,WAAW,CAAC;IAKvD,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU;IAQ7C,6BAA6B,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAQjE,yBAAyB,CAAC,OAAO,EAAE,MAAM;IAKzC,mBAAmB,CAAC,SAAS,EAAE,mBAAmB,CAAC,WAAW,CAAC;IAK/D,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,EAAE,KAAK,GAAE,MAAW;IAUrG,QAAQ;IAKR,qBAAqB;IAKrB,SAAS;CAIhB"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
export class QuantaRouteClient {
|
|
3
|
+
client;
|
|
4
|
+
apiKey;
|
|
5
|
+
baseUrl;
|
|
6
|
+
constructor(apiKey, baseUrl = 'https://api.quantaroute.com') {
|
|
7
|
+
this.apiKey = apiKey || process.env.QUANTAROUTE_API_KEY || '';
|
|
8
|
+
this.baseUrl = baseUrl;
|
|
9
|
+
this.client = axios.create({
|
|
10
|
+
baseURL: this.baseUrl,
|
|
11
|
+
timeout: 30000,
|
|
12
|
+
headers: {
|
|
13
|
+
'Content-Type': 'application/json',
|
|
14
|
+
'User-Agent': '@quantaroute/mcp-server/1.0.0',
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
// Set API key interceptor if provided
|
|
18
|
+
if (this.apiKey) {
|
|
19
|
+
this.client.interceptors.request.use((config) => {
|
|
20
|
+
config.headers['x-api-key'] = this.apiKey;
|
|
21
|
+
return config;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async makeRequest(method, endpoint, data, params) {
|
|
26
|
+
try {
|
|
27
|
+
const response = await this.client.request({
|
|
28
|
+
method,
|
|
29
|
+
url: endpoint,
|
|
30
|
+
data,
|
|
31
|
+
params,
|
|
32
|
+
});
|
|
33
|
+
return response.data;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (error.response) {
|
|
37
|
+
const status = error.response.status;
|
|
38
|
+
const message = error.response.data?.message || error.message;
|
|
39
|
+
if (status === 401) {
|
|
40
|
+
throw new Error(`Authentication failed: ${message}`);
|
|
41
|
+
}
|
|
42
|
+
if (status === 429) {
|
|
43
|
+
throw new Error(`Rate limit exceeded: ${message}`);
|
|
44
|
+
}
|
|
45
|
+
throw new Error(`API error (${status}): ${message}`);
|
|
46
|
+
}
|
|
47
|
+
throw new Error(`Request failed: ${error.message}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async geocode(params) {
|
|
51
|
+
const data = {
|
|
52
|
+
address: params.address,
|
|
53
|
+
country: params.country || 'India',
|
|
54
|
+
};
|
|
55
|
+
if (params.city)
|
|
56
|
+
data.city = params.city;
|
|
57
|
+
if (params.state)
|
|
58
|
+
data.state = params.state;
|
|
59
|
+
if (params.pincode)
|
|
60
|
+
data.pincode = params.pincode;
|
|
61
|
+
const response = await this.makeRequest('POST', '/v1/digipin/geocode', data);
|
|
62
|
+
return response.data || response;
|
|
63
|
+
}
|
|
64
|
+
async reverseGeocode(digipin) {
|
|
65
|
+
const response = await this.makeRequest('POST', '/v1/digipin/reverse', { digipin });
|
|
66
|
+
return response.data || response;
|
|
67
|
+
}
|
|
68
|
+
async coordinatesToDigiPin(latitude, longitude) {
|
|
69
|
+
const response = await this.makeRequest('POST', '/v1/digipin/coordinates-to-digipin', {
|
|
70
|
+
latitude,
|
|
71
|
+
longitude,
|
|
72
|
+
});
|
|
73
|
+
return response.data || response;
|
|
74
|
+
}
|
|
75
|
+
async validateDigiPin(digipin) {
|
|
76
|
+
const response = await this.makeRequest('GET', `/v1/digipin/validate/${digipin}`);
|
|
77
|
+
return response.data || response;
|
|
78
|
+
}
|
|
79
|
+
async batchGeocode(addresses) {
|
|
80
|
+
const response = await this.makeRequest('POST', '/v1/digipin/batch', { addresses });
|
|
81
|
+
return response.data || response;
|
|
82
|
+
}
|
|
83
|
+
async autocomplete(query, limit = 5) {
|
|
84
|
+
const response = await this.makeRequest('GET', '/v1/digipin/autocomplete', undefined, {
|
|
85
|
+
q: query,
|
|
86
|
+
limit: Math.min(limit, 10),
|
|
87
|
+
});
|
|
88
|
+
return response.data || response;
|
|
89
|
+
}
|
|
90
|
+
async lookupLocationFromCoordinates(latitude, longitude) {
|
|
91
|
+
const response = await this.makeRequest('POST', '/v1/location/lookup', {
|
|
92
|
+
latitude,
|
|
93
|
+
longitude,
|
|
94
|
+
});
|
|
95
|
+
return response.data || response;
|
|
96
|
+
}
|
|
97
|
+
async lookupLocationFromDigiPin(digipin) {
|
|
98
|
+
const response = await this.makeRequest('POST', '/v1/location/lookup', { digipin });
|
|
99
|
+
return response.data || response;
|
|
100
|
+
}
|
|
101
|
+
async batchLocationLookup(locations) {
|
|
102
|
+
const response = await this.makeRequest('POST', '/v1/location/batch-lookup', { locations });
|
|
103
|
+
return response.data || response;
|
|
104
|
+
}
|
|
105
|
+
async findNearbyBoundaries(latitude, longitude, radius_km = 5.0, limit = 10) {
|
|
106
|
+
const response = await this.makeRequest('GET', '/v1/location/nearby', undefined, {
|
|
107
|
+
lat: latitude,
|
|
108
|
+
lng: longitude,
|
|
109
|
+
radius: radius_km,
|
|
110
|
+
limit: Math.min(limit, 50),
|
|
111
|
+
});
|
|
112
|
+
return response.data || response;
|
|
113
|
+
}
|
|
114
|
+
async getUsage() {
|
|
115
|
+
const response = await this.makeRequest('GET', '/v1/digipin/usage');
|
|
116
|
+
return response.data || response;
|
|
117
|
+
}
|
|
118
|
+
async getLocationStatistics() {
|
|
119
|
+
const response = await this.makeRequest('GET', '/v1/location/stats');
|
|
120
|
+
return response.data || response;
|
|
121
|
+
}
|
|
122
|
+
async getHealth() {
|
|
123
|
+
const response = await this.makeRequest('GET', '/health');
|
|
124
|
+
return response.data || response;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
|