@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,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-geocoder-api/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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
|
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* QuantaRoute Geocoder MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Provides MCP tools for geocoding addresses, location lookups, and DigiPin processing
|
|
6
|
+
* using the QuantaRoute Geocoding API.
|
|
7
|
+
*/
|
|
8
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
9
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
10
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, ErrorCode, McpError, } from '@modelcontextprotocol/sdk/types.js';
|
|
11
|
+
import { QuantaRouteClient } from './client.js';
|
|
12
|
+
// Initialize MCP server
|
|
13
|
+
const server = new Server({
|
|
14
|
+
name: 'quantaroute-geocoder',
|
|
15
|
+
version: '1.0.0',
|
|
16
|
+
}, {
|
|
17
|
+
capabilities: {
|
|
18
|
+
tools: {},
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
// Initialize client
|
|
22
|
+
const client = new QuantaRouteClient();
|
|
23
|
+
// List available tools
|
|
24
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
25
|
+
return {
|
|
26
|
+
tools: [
|
|
27
|
+
{
|
|
28
|
+
name: 'geocode',
|
|
29
|
+
description: 'Geocode an address to get DigiPin code and coordinates. Returns location information including latitude, longitude, and DigiPin.',
|
|
30
|
+
inputSchema: {
|
|
31
|
+
type: 'object',
|
|
32
|
+
properties: {
|
|
33
|
+
address: {
|
|
34
|
+
type: 'string',
|
|
35
|
+
description: 'The address to geocode (required)',
|
|
36
|
+
},
|
|
37
|
+
city: {
|
|
38
|
+
type: 'string',
|
|
39
|
+
description: 'City name (optional)',
|
|
40
|
+
},
|
|
41
|
+
state: {
|
|
42
|
+
type: 'string',
|
|
43
|
+
description: 'State name (optional)',
|
|
44
|
+
},
|
|
45
|
+
pincode: {
|
|
46
|
+
type: 'string',
|
|
47
|
+
description: 'Postal code (optional)',
|
|
48
|
+
},
|
|
49
|
+
country: {
|
|
50
|
+
type: 'string',
|
|
51
|
+
description: 'Country name (optional, defaults to India)',
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
required: ['address'],
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: 'reverse_geocode',
|
|
59
|
+
description: 'Reverse geocode a DigiPin code to get coordinates and address information.',
|
|
60
|
+
inputSchema: {
|
|
61
|
+
type: 'object',
|
|
62
|
+
properties: {
|
|
63
|
+
digipin: {
|
|
64
|
+
type: 'string',
|
|
65
|
+
description: 'The DigiPin code to reverse geocode (format: XXX-XXX-XXXX)',
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
required: ['digipin'],
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'coordinates_to_digipin',
|
|
73
|
+
description: 'Convert latitude and longitude coordinates to a DigiPin code.',
|
|
74
|
+
inputSchema: {
|
|
75
|
+
type: 'object',
|
|
76
|
+
properties: {
|
|
77
|
+
latitude: {
|
|
78
|
+
type: 'number',
|
|
79
|
+
description: 'Latitude coordinate (-90 to 90)',
|
|
80
|
+
},
|
|
81
|
+
longitude: {
|
|
82
|
+
type: 'number',
|
|
83
|
+
description: 'Longitude coordinate (-180 to 180)',
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
required: ['latitude', 'longitude'],
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: 'validate_digipin',
|
|
91
|
+
description: 'Validate a DigiPin format and check if it corresponds to a real location.',
|
|
92
|
+
inputSchema: {
|
|
93
|
+
type: 'object',
|
|
94
|
+
properties: {
|
|
95
|
+
digipin: {
|
|
96
|
+
type: 'string',
|
|
97
|
+
description: 'The DigiPin code to validate',
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
required: ['digipin'],
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: 'batch_geocode',
|
|
105
|
+
description: 'Geocode multiple addresses in a single batch request (up to 100 addresses).',
|
|
106
|
+
inputSchema: {
|
|
107
|
+
type: 'object',
|
|
108
|
+
properties: {
|
|
109
|
+
addresses: {
|
|
110
|
+
type: 'array',
|
|
111
|
+
description: 'Array of address objects to geocode',
|
|
112
|
+
items: {
|
|
113
|
+
type: 'object',
|
|
114
|
+
properties: {
|
|
115
|
+
address: { type: 'string' },
|
|
116
|
+
city: { type: 'string' },
|
|
117
|
+
state: { type: 'string' },
|
|
118
|
+
pincode: { type: 'string' },
|
|
119
|
+
country: { type: 'string' },
|
|
120
|
+
},
|
|
121
|
+
required: ['address'],
|
|
122
|
+
},
|
|
123
|
+
maxItems: 100,
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
required: ['addresses'],
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
name: 'autocomplete',
|
|
131
|
+
description: 'Get autocomplete suggestions for addresses (minimum 3 characters).',
|
|
132
|
+
inputSchema: {
|
|
133
|
+
type: 'object',
|
|
134
|
+
properties: {
|
|
135
|
+
query: {
|
|
136
|
+
type: 'string',
|
|
137
|
+
description: 'Search query (minimum 3 characters)',
|
|
138
|
+
},
|
|
139
|
+
limit: {
|
|
140
|
+
type: 'number',
|
|
141
|
+
description: 'Maximum number of suggestions (default: 5, max: 10)',
|
|
142
|
+
default: 5,
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
required: ['query'],
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
name: 'lookup_location_from_coordinates',
|
|
150
|
+
description: '🚀 REVOLUTIONARY: Get administrative boundaries (pincode, state, division, locality) from coordinates. Provides precision that even government services don\'t offer.',
|
|
151
|
+
inputSchema: {
|
|
152
|
+
type: 'object',
|
|
153
|
+
properties: {
|
|
154
|
+
latitude: {
|
|
155
|
+
type: 'number',
|
|
156
|
+
description: 'Latitude coordinate (-90 to 90)',
|
|
157
|
+
},
|
|
158
|
+
longitude: {
|
|
159
|
+
type: 'number',
|
|
160
|
+
description: 'Longitude coordinate (-180 to 180)',
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
required: ['latitude', 'longitude'],
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
name: 'lookup_location_from_digipin',
|
|
168
|
+
description: '🚀 REVOLUTIONARY: Get administrative boundaries from a DigiPin code.',
|
|
169
|
+
inputSchema: {
|
|
170
|
+
type: 'object',
|
|
171
|
+
properties: {
|
|
172
|
+
digipin: {
|
|
173
|
+
type: 'string',
|
|
174
|
+
description: 'DigiPin code (format: XXX-XXX-XXXX)',
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
required: ['digipin'],
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
name: 'batch_location_lookup',
|
|
182
|
+
description: '🚀 REVOLUTIONARY: Batch lookup for multiple locations. Each location can be specified by coordinates or DigiPin (up to 100 locations).',
|
|
183
|
+
inputSchema: {
|
|
184
|
+
type: 'object',
|
|
185
|
+
properties: {
|
|
186
|
+
locations: {
|
|
187
|
+
type: 'array',
|
|
188
|
+
description: 'Array of location objects (each with latitude+longitude OR digipin)',
|
|
189
|
+
items: {
|
|
190
|
+
type: 'object',
|
|
191
|
+
oneOf: [
|
|
192
|
+
{
|
|
193
|
+
properties: {
|
|
194
|
+
latitude: { type: 'number' },
|
|
195
|
+
longitude: { type: 'number' },
|
|
196
|
+
},
|
|
197
|
+
required: ['latitude', 'longitude'],
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
properties: {
|
|
201
|
+
digipin: { type: 'string' },
|
|
202
|
+
},
|
|
203
|
+
required: ['digipin'],
|
|
204
|
+
},
|
|
205
|
+
],
|
|
206
|
+
},
|
|
207
|
+
maxItems: 100,
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
required: ['locations'],
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
name: 'find_nearby_boundaries',
|
|
215
|
+
description: 'Find nearby postal boundaries within a specified radius (experimental feature).',
|
|
216
|
+
inputSchema: {
|
|
217
|
+
type: 'object',
|
|
218
|
+
properties: {
|
|
219
|
+
latitude: {
|
|
220
|
+
type: 'number',
|
|
221
|
+
description: 'Center latitude',
|
|
222
|
+
},
|
|
223
|
+
longitude: {
|
|
224
|
+
type: 'number',
|
|
225
|
+
description: 'Center longitude',
|
|
226
|
+
},
|
|
227
|
+
radius_km: {
|
|
228
|
+
type: 'number',
|
|
229
|
+
description: 'Search radius in kilometers (default: 5.0, max: 100)',
|
|
230
|
+
default: 5.0,
|
|
231
|
+
},
|
|
232
|
+
limit: {
|
|
233
|
+
type: 'number',
|
|
234
|
+
description: 'Maximum number of results (default: 10, max: 50)',
|
|
235
|
+
default: 10,
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
required: ['latitude', 'longitude'],
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
name: 'get_usage',
|
|
243
|
+
description: 'Get API usage statistics and quota information.',
|
|
244
|
+
inputSchema: {
|
|
245
|
+
type: 'object',
|
|
246
|
+
properties: {},
|
|
247
|
+
},
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
name: 'get_location_statistics',
|
|
251
|
+
description: 'Get live statistics about the Location Lookup service (total boundaries, states, divisions, etc.).',
|
|
252
|
+
inputSchema: {
|
|
253
|
+
type: 'object',
|
|
254
|
+
properties: {},
|
|
255
|
+
},
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
name: 'get_health',
|
|
259
|
+
description: 'Check API health status and availability.',
|
|
260
|
+
inputSchema: {
|
|
261
|
+
type: 'object',
|
|
262
|
+
properties: {},
|
|
263
|
+
},
|
|
264
|
+
},
|
|
265
|
+
],
|
|
266
|
+
};
|
|
267
|
+
});
|
|
268
|
+
// Handle tool calls
|
|
269
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
270
|
+
const { name, arguments: args } = request.params;
|
|
271
|
+
if (!args || typeof args !== 'object') {
|
|
272
|
+
throw new McpError(ErrorCode.InvalidParams, 'Invalid arguments');
|
|
273
|
+
}
|
|
274
|
+
try {
|
|
275
|
+
switch (name) {
|
|
276
|
+
case 'geocode': {
|
|
277
|
+
const params = args;
|
|
278
|
+
if (!params.address || typeof params.address !== 'string') {
|
|
279
|
+
throw new McpError(ErrorCode.InvalidParams, 'Address is required');
|
|
280
|
+
}
|
|
281
|
+
const result = await client.geocode(params);
|
|
282
|
+
return {
|
|
283
|
+
content: [
|
|
284
|
+
{
|
|
285
|
+
type: 'text',
|
|
286
|
+
text: JSON.stringify(result, null, 2),
|
|
287
|
+
},
|
|
288
|
+
],
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
case 'reverse_geocode': {
|
|
292
|
+
const params = args;
|
|
293
|
+
if (!params.digipin || typeof params.digipin !== 'string') {
|
|
294
|
+
throw new McpError(ErrorCode.InvalidParams, 'DigiPin is required');
|
|
295
|
+
}
|
|
296
|
+
const result = await client.reverseGeocode(params.digipin);
|
|
297
|
+
return {
|
|
298
|
+
content: [
|
|
299
|
+
{
|
|
300
|
+
type: 'text',
|
|
301
|
+
text: JSON.stringify(result, null, 2),
|
|
302
|
+
},
|
|
303
|
+
],
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
case 'coordinates_to_digipin': {
|
|
307
|
+
const params = args;
|
|
308
|
+
if (typeof params.latitude !== 'number' || typeof params.longitude !== 'number') {
|
|
309
|
+
throw new McpError(ErrorCode.InvalidParams, 'Latitude and longitude must be numbers');
|
|
310
|
+
}
|
|
311
|
+
if (params.latitude < -90 || params.latitude > 90) {
|
|
312
|
+
throw new McpError(ErrorCode.InvalidParams, 'Latitude must be between -90 and 90');
|
|
313
|
+
}
|
|
314
|
+
if (params.longitude < -180 || params.longitude > 180) {
|
|
315
|
+
throw new McpError(ErrorCode.InvalidParams, 'Longitude must be between -180 and 180');
|
|
316
|
+
}
|
|
317
|
+
const result = await client.coordinatesToDigiPin(params.latitude, params.longitude);
|
|
318
|
+
return {
|
|
319
|
+
content: [
|
|
320
|
+
{
|
|
321
|
+
type: 'text',
|
|
322
|
+
text: JSON.stringify(result, null, 2),
|
|
323
|
+
},
|
|
324
|
+
],
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
case 'validate_digipin': {
|
|
328
|
+
const params = args;
|
|
329
|
+
if (!params.digipin || typeof params.digipin !== 'string') {
|
|
330
|
+
throw new McpError(ErrorCode.InvalidParams, 'DigiPin is required');
|
|
331
|
+
}
|
|
332
|
+
const result = await client.validateDigiPin(params.digipin);
|
|
333
|
+
return {
|
|
334
|
+
content: [
|
|
335
|
+
{
|
|
336
|
+
type: 'text',
|
|
337
|
+
text: JSON.stringify(result, null, 2),
|
|
338
|
+
},
|
|
339
|
+
],
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
case 'batch_geocode': {
|
|
343
|
+
const params = args;
|
|
344
|
+
if (!params.addresses || !Array.isArray(params.addresses) || params.addresses.length === 0) {
|
|
345
|
+
throw new McpError(ErrorCode.InvalidParams, 'Addresses must be a non-empty array');
|
|
346
|
+
}
|
|
347
|
+
if (params.addresses.length > 100) {
|
|
348
|
+
throw new McpError(ErrorCode.InvalidParams, 'Maximum 100 addresses allowed per batch');
|
|
349
|
+
}
|
|
350
|
+
const result = await client.batchGeocode(params.addresses);
|
|
351
|
+
return {
|
|
352
|
+
content: [
|
|
353
|
+
{
|
|
354
|
+
type: 'text',
|
|
355
|
+
text: JSON.stringify(result, null, 2),
|
|
356
|
+
},
|
|
357
|
+
],
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
case 'autocomplete': {
|
|
361
|
+
const params = args;
|
|
362
|
+
if (!params.query || typeof params.query !== 'string' || params.query.length < 3) {
|
|
363
|
+
throw new McpError(ErrorCode.InvalidParams, 'Query must be at least 3 characters long');
|
|
364
|
+
}
|
|
365
|
+
const result = await client.autocomplete(params.query, params.limit);
|
|
366
|
+
return {
|
|
367
|
+
content: [
|
|
368
|
+
{
|
|
369
|
+
type: 'text',
|
|
370
|
+
text: JSON.stringify(result, null, 2),
|
|
371
|
+
},
|
|
372
|
+
],
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
case 'lookup_location_from_coordinates': {
|
|
376
|
+
const params = args;
|
|
377
|
+
if (typeof params.latitude !== 'number' || typeof params.longitude !== 'number') {
|
|
378
|
+
throw new McpError(ErrorCode.InvalidParams, 'Latitude and longitude must be numbers');
|
|
379
|
+
}
|
|
380
|
+
if (params.latitude < -90 || params.latitude > 90) {
|
|
381
|
+
throw new McpError(ErrorCode.InvalidParams, 'Latitude must be between -90 and 90');
|
|
382
|
+
}
|
|
383
|
+
if (params.longitude < -180 || params.longitude > 180) {
|
|
384
|
+
throw new McpError(ErrorCode.InvalidParams, 'Longitude must be between -180 and 180');
|
|
385
|
+
}
|
|
386
|
+
const result = await client.lookupLocationFromCoordinates(params.latitude, params.longitude);
|
|
387
|
+
return {
|
|
388
|
+
content: [
|
|
389
|
+
{
|
|
390
|
+
type: 'text',
|
|
391
|
+
text: JSON.stringify(result, null, 2),
|
|
392
|
+
},
|
|
393
|
+
],
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
case 'lookup_location_from_digipin': {
|
|
397
|
+
const params = args;
|
|
398
|
+
if (!params.digipin || typeof params.digipin !== 'string') {
|
|
399
|
+
throw new McpError(ErrorCode.InvalidParams, 'DigiPin is required');
|
|
400
|
+
}
|
|
401
|
+
const result = await client.lookupLocationFromDigiPin(params.digipin);
|
|
402
|
+
return {
|
|
403
|
+
content: [
|
|
404
|
+
{
|
|
405
|
+
type: 'text',
|
|
406
|
+
text: JSON.stringify(result, null, 2),
|
|
407
|
+
},
|
|
408
|
+
],
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
case 'batch_location_lookup': {
|
|
412
|
+
const params = args;
|
|
413
|
+
if (!params.locations || !Array.isArray(params.locations) || params.locations.length === 0) {
|
|
414
|
+
throw new McpError(ErrorCode.InvalidParams, 'Locations must be a non-empty array');
|
|
415
|
+
}
|
|
416
|
+
if (params.locations.length > 100) {
|
|
417
|
+
throw new McpError(ErrorCode.InvalidParams, 'Maximum 100 locations allowed per batch');
|
|
418
|
+
}
|
|
419
|
+
const result = await client.batchLocationLookup(params.locations);
|
|
420
|
+
return {
|
|
421
|
+
content: [
|
|
422
|
+
{
|
|
423
|
+
type: 'text',
|
|
424
|
+
text: JSON.stringify(result, null, 2),
|
|
425
|
+
},
|
|
426
|
+
],
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
case 'find_nearby_boundaries': {
|
|
430
|
+
const params = args;
|
|
431
|
+
if (typeof params.latitude !== 'number' || typeof params.longitude !== 'number') {
|
|
432
|
+
throw new McpError(ErrorCode.InvalidParams, 'Latitude and longitude must be numbers');
|
|
433
|
+
}
|
|
434
|
+
const result = await client.findNearbyBoundaries(params.latitude, params.longitude, params.radius_km, params.limit);
|
|
435
|
+
return {
|
|
436
|
+
content: [
|
|
437
|
+
{
|
|
438
|
+
type: 'text',
|
|
439
|
+
text: JSON.stringify(result, null, 2),
|
|
440
|
+
},
|
|
441
|
+
],
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
case 'get_usage': {
|
|
445
|
+
const result = await client.getUsage();
|
|
446
|
+
return {
|
|
447
|
+
content: [
|
|
448
|
+
{
|
|
449
|
+
type: 'text',
|
|
450
|
+
text: JSON.stringify(result, null, 2),
|
|
451
|
+
},
|
|
452
|
+
],
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
case 'get_location_statistics': {
|
|
456
|
+
const result = await client.getLocationStatistics();
|
|
457
|
+
return {
|
|
458
|
+
content: [
|
|
459
|
+
{
|
|
460
|
+
type: 'text',
|
|
461
|
+
text: JSON.stringify(result, null, 2),
|
|
462
|
+
},
|
|
463
|
+
],
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
case 'get_health': {
|
|
467
|
+
const result = await client.getHealth();
|
|
468
|
+
return {
|
|
469
|
+
content: [
|
|
470
|
+
{
|
|
471
|
+
type: 'text',
|
|
472
|
+
text: JSON.stringify(result, null, 2),
|
|
473
|
+
},
|
|
474
|
+
],
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
default:
|
|
478
|
+
throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
catch (error) {
|
|
482
|
+
if (error instanceof McpError) {
|
|
483
|
+
throw error;
|
|
484
|
+
}
|
|
485
|
+
throw new McpError(ErrorCode.InternalError, `Tool execution failed: ${error.message}`);
|
|
486
|
+
}
|
|
487
|
+
});
|
|
488
|
+
// Start the server
|
|
489
|
+
async function main() {
|
|
490
|
+
const transport = new StdioServerTransport();
|
|
491
|
+
await server.connect(transport);
|
|
492
|
+
console.error('QuantaRoute Geocoder MCP server running on stdio');
|
|
493
|
+
}
|
|
494
|
+
main().catch((error) => {
|
|
495
|
+
console.error('Fatal error in main():', error);
|
|
496
|
+
process.exit(1);
|
|
497
|
+
});
|
|
498
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|