mcp-mapmyindia 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 +126 -0
- package/dist/auth.d.ts +13 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +50 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +8 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +43 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +39 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/directions.d.ts +29 -0
- package/dist/tools/directions.d.ts.map +1 -0
- package/dist/tools/directions.js +55 -0
- package/dist/tools/directions.js.map +1 -0
- package/dist/tools/distance-matrix.d.ts +17 -0
- package/dist/tools/distance-matrix.d.ts.map +1 -0
- package/dist/tools/distance-matrix.js +47 -0
- package/dist/tools/distance-matrix.js.map +1 -0
- package/dist/tools/geocode.d.ts +21 -0
- package/dist/tools/geocode.d.ts.map +1 -0
- package/dist/tools/geocode.js +31 -0
- package/dist/tools/geocode.js.map +1 -0
- package/dist/tools/nearby.d.ts +17 -0
- package/dist/tools/nearby.d.ts.map +1 -0
- package/dist/tools/nearby.js +32 -0
- package/dist/tools/nearby.js.map +1 -0
- package/dist/tools/place-detail.d.ts +8 -0
- package/dist/tools/place-detail.d.ts.map +1 -0
- package/dist/tools/place-detail.js +12 -0
- package/dist/tools/place-detail.js.map +1 -0
- package/dist/tools/places-search.d.ts +24 -0
- package/dist/tools/places-search.d.ts.map +1 -0
- package/dist/tools/places-search.js +37 -0
- package/dist/tools/places-search.js.map +1 -0
- package/dist/tools/reverse-geocode.d.ts +10 -0
- package/dist/tools/reverse-geocode.d.ts.map +1 -0
- package/dist/tools/reverse-geocode.js +18 -0
- package/dist/tools/reverse-geocode.js.map +1 -0
- package/package.json +54 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 bhuvnsh
|
|
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,126 @@
|
|
|
1
|
+
# mcp-mapmyindia
|
|
2
|
+
|
|
3
|
+
**MCP Server for Mappls / MapMyIndia APIs**
|
|
4
|
+
|
|
5
|
+
[](https://github.com/bhuvnsh/mcp-mappls/actions/workflows/ci.yml)
|
|
6
|
+
[](https://www.npmjs.com/package/mcp-mapmyindia)
|
|
7
|
+
[](LICENSE)
|
|
8
|
+
|
|
9
|
+
An [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server that exposes [Mappls / MapMyIndia](https://mappls.com) APIs as tools for AI assistants like Claude. Enables geocoding, reverse geocoding, place search, nearby discovery, routing, and distance calculations — all focused on India's mapping data.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Tools
|
|
14
|
+
|
|
15
|
+
| Tool | Description |
|
|
16
|
+
|---|---|
|
|
17
|
+
| `geocode` | Convert an address or place name to coordinates |
|
|
18
|
+
| `reverse_geocode` | Convert coordinates (lat/lng) to a human-readable address |
|
|
19
|
+
| `places_search` | Autocomplete and search for places by query string |
|
|
20
|
+
| `nearby` | Discover nearby places by keyword around a reference location |
|
|
21
|
+
| `directions` | Get turn-by-turn directions between two points (supports waypoints) |
|
|
22
|
+
| `distance_matrix` | Compute travel distance and time between multiple origins and destinations |
|
|
23
|
+
| `place_detail` | Fetch detailed information for a place using its eLoc (Mappls place ID) |
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Setup
|
|
28
|
+
|
|
29
|
+
### Get API credentials
|
|
30
|
+
|
|
31
|
+
Register at [https://apis.mappls.com](https://apis.mappls.com) to get either:
|
|
32
|
+
- An **API key** (simpler, for personal/testing use)
|
|
33
|
+
- **OAuth client credentials** (recommended for production)
|
|
34
|
+
|
|
35
|
+
### Authentication
|
|
36
|
+
|
|
37
|
+
Set one of the following in your environment:
|
|
38
|
+
|
|
39
|
+
**Option A — API Key:**
|
|
40
|
+
```bash
|
|
41
|
+
export MAPPLS_API_KEY=your_api_key_here
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**Option B — OAuth (Client Credentials):**
|
|
45
|
+
```bash
|
|
46
|
+
export MAPPLS_CLIENT_ID=your_client_id
|
|
47
|
+
export MAPPLS_CLIENT_SECRET=your_client_secret
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Usage with Claude Desktop
|
|
53
|
+
|
|
54
|
+
Add to your `claude_desktop_config.json`:
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"mcpServers": {
|
|
59
|
+
"mapmyindia": {
|
|
60
|
+
"command": "npx",
|
|
61
|
+
"args": ["-y", "mcp-mapmyindia"],
|
|
62
|
+
"env": {
|
|
63
|
+
"MAPPLS_API_KEY": "your_api_key_here"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Or with OAuth:
|
|
71
|
+
|
|
72
|
+
```json
|
|
73
|
+
{
|
|
74
|
+
"mcpServers": {
|
|
75
|
+
"mapmyindia": {
|
|
76
|
+
"command": "npx",
|
|
77
|
+
"args": ["-y", "mcp-mapmyindia"],
|
|
78
|
+
"env": {
|
|
79
|
+
"MAPPLS_CLIENT_ID": "your_client_id",
|
|
80
|
+
"MAPPLS_CLIENT_SECRET": "your_client_secret"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Config file location:
|
|
88
|
+
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
89
|
+
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Development
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# Clone and install
|
|
97
|
+
git clone https://github.com/bhuvnsh/mcp-mappls.git
|
|
98
|
+
cd mcp-mappls
|
|
99
|
+
npm install
|
|
100
|
+
|
|
101
|
+
# Build
|
|
102
|
+
npm run build
|
|
103
|
+
|
|
104
|
+
# Run tests
|
|
105
|
+
npm test
|
|
106
|
+
|
|
107
|
+
# Watch mode (dev)
|
|
108
|
+
npm run dev
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Requirements
|
|
112
|
+
|
|
113
|
+
- Node.js >= 18
|
|
114
|
+
- A Mappls API key or OAuth client credentials
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Contributing
|
|
119
|
+
|
|
120
|
+
Contributions are welcome. Please open an issue first to discuss what you'd like to change. Pull requests should include tests.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## License
|
|
125
|
+
|
|
126
|
+
[MIT](LICENSE)
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type AuthMode = "api_key" | "oauth";
|
|
2
|
+
export interface AuthConfig {
|
|
3
|
+
mode: AuthMode;
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
clientId?: string;
|
|
6
|
+
clientSecret?: string;
|
|
7
|
+
accessToken?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function _resetTokenCache(): void;
|
|
10
|
+
export declare function resolveAuth(): AuthConfig;
|
|
11
|
+
export declare function getAccessToken(auth: AuthConfig): Promise<string>;
|
|
12
|
+
export declare function authQueryParam(auth: AuthConfig, token: string): string;
|
|
13
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAKD,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC;AAED,wBAAgB,WAAW,IAAI,UAAU,CAiBxC;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BtE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAItE"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
let cachedToken = null;
|
|
2
|
+
let tokenExpiresAt = 0;
|
|
3
|
+
export function _resetTokenCache() {
|
|
4
|
+
cachedToken = null;
|
|
5
|
+
tokenExpiresAt = 0;
|
|
6
|
+
}
|
|
7
|
+
export function resolveAuth() {
|
|
8
|
+
const apiKey = process.env.MAPPLS_API_KEY;
|
|
9
|
+
const clientId = process.env.MAPPLS_CLIENT_ID;
|
|
10
|
+
const clientSecret = process.env.MAPPLS_CLIENT_SECRET;
|
|
11
|
+
if (apiKey) {
|
|
12
|
+
return { mode: "api_key", apiKey };
|
|
13
|
+
}
|
|
14
|
+
if (clientId && clientSecret) {
|
|
15
|
+
return { mode: "oauth", clientId, clientSecret };
|
|
16
|
+
}
|
|
17
|
+
throw new Error("Auth not configured. Set MAPPLS_API_KEY for API key auth, " +
|
|
18
|
+
"or MAPPLS_CLIENT_ID + MAPPLS_CLIENT_SECRET for OAuth.");
|
|
19
|
+
}
|
|
20
|
+
export async function getAccessToken(auth) {
|
|
21
|
+
if (auth.mode === "api_key") {
|
|
22
|
+
return auth.apiKey;
|
|
23
|
+
}
|
|
24
|
+
if (cachedToken && Date.now() < tokenExpiresAt - 60_000) {
|
|
25
|
+
return cachedToken;
|
|
26
|
+
}
|
|
27
|
+
const params = new URLSearchParams({
|
|
28
|
+
grant_type: "client_credentials",
|
|
29
|
+
client_id: auth.clientId,
|
|
30
|
+
client_secret: auth.clientSecret,
|
|
31
|
+
});
|
|
32
|
+
const res = await fetch("https://outpost.mappls.com/api/security/oauth/token", {
|
|
33
|
+
method: "POST",
|
|
34
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
35
|
+
body: params.toString(),
|
|
36
|
+
});
|
|
37
|
+
if (!res.ok) {
|
|
38
|
+
throw new Error(`OAuth token fetch failed: ${res.status} ${await res.text()}`);
|
|
39
|
+
}
|
|
40
|
+
const data = (await res.json());
|
|
41
|
+
cachedToken = data.access_token;
|
|
42
|
+
tokenExpiresAt = Date.now() + data.expires_in * 1000;
|
|
43
|
+
return cachedToken;
|
|
44
|
+
}
|
|
45
|
+
export function authQueryParam(auth, token) {
|
|
46
|
+
return auth.mode === "api_key"
|
|
47
|
+
? `rest_key=${encodeURIComponent(token)}`
|
|
48
|
+
: `access_token=${encodeURIComponent(token)}`;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAUA,IAAI,WAAW,GAAkB,IAAI,CAAC;AACtC,IAAI,cAAc,GAAG,CAAC,CAAC;AAEvB,MAAM,UAAU,gBAAgB;IAC9B,WAAW,GAAG,IAAI,CAAC;IACnB,cAAc,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAEtD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IACrC,CAAC;IAED,IAAI,QAAQ,IAAI,YAAY,EAAE,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IACnD,CAAC;IAED,MAAM,IAAI,KAAK,CACb,4DAA4D;QAC1D,uDAAuD,CAC1D,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAgB;IACnD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,MAAO,CAAC;IACtB,CAAC;IAED,IAAI,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,GAAG,MAAM,EAAE,CAAC;QACxD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,UAAU,EAAE,oBAAoB;QAChC,SAAS,EAAE,IAAI,CAAC,QAAS;QACzB,aAAa,EAAE,IAAI,CAAC,YAAa;KAClC,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,qDAAqD,EAAE;QAC7E,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;QAChE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE;KACxB,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAiD,CAAC;IAChF,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;IAChC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACrD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAgB,EAAE,KAAa;IAC5D,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS;QAC5B,CAAC,CAAC,YAAY,kBAAkB,CAAC,KAAK,CAAC,EAAE;QACzC,CAAC,CAAC,gBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;AAClD,CAAC"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { AuthConfig } from "./auth.js";
|
|
2
|
+
/** atlas.mappls.com — Bearer token in Authorization header */
|
|
3
|
+
export declare function mapplsAtlas(auth: AuthConfig, path: string, params: Record<string, string | number | boolean>): Promise<unknown>;
|
|
4
|
+
/** apis.mappls.com/advancedmaps — token embedded in URL path */
|
|
5
|
+
export declare function mapplsAdvanced(auth: AuthConfig, path: string, params?: Record<string, string | number | boolean>): Promise<unknown>;
|
|
6
|
+
/** explore.mappls.com — Bearer token in Authorization header */
|
|
7
|
+
export declare function mapplsExplore(auth: AuthConfig, path: string): Promise<unknown>;
|
|
8
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAkB,MAAM,WAAW,CAAC;AAcvD,8DAA8D;AAC9D,wBAAsB,WAAW,CAC/B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAChD,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED,gEAAgE;AAChE,wBAAsB,cAAc,CAClC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GACjD,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED,gEAAgE;AAChE,wBAAsB,aAAa,CACjC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,CAOlB"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { getAccessToken } from "./auth.js";
|
|
2
|
+
const ATLAS_BASE = "https://atlas.mappls.com/api/places";
|
|
3
|
+
const ADVANCED_BASE = "https://apis.mappls.com/advancedmaps/v1";
|
|
4
|
+
const EXPLORE_BASE = "https://explore.mappls.com";
|
|
5
|
+
async function handleResponse(res) {
|
|
6
|
+
if (!res.ok) {
|
|
7
|
+
const body = await res.text();
|
|
8
|
+
throw new Error(`Mappls API error ${res.status}: ${body}`);
|
|
9
|
+
}
|
|
10
|
+
return res.json();
|
|
11
|
+
}
|
|
12
|
+
/** atlas.mappls.com — Bearer token in Authorization header */
|
|
13
|
+
export async function mapplsAtlas(auth, path, params) {
|
|
14
|
+
const token = await getAccessToken(auth);
|
|
15
|
+
const query = new URLSearchParams(Object.entries(params).map(([k, v]) => [k, String(v)]));
|
|
16
|
+
const url = `${ATLAS_BASE}${path}?${query.toString()}`;
|
|
17
|
+
const res = await fetch(url, {
|
|
18
|
+
headers: { Authorization: `bearer ${token}` },
|
|
19
|
+
});
|
|
20
|
+
return handleResponse(res);
|
|
21
|
+
}
|
|
22
|
+
/** apis.mappls.com/advancedmaps — token embedded in URL path */
|
|
23
|
+
export async function mapplsAdvanced(auth, path, params) {
|
|
24
|
+
const token = await getAccessToken(auth);
|
|
25
|
+
const query = params
|
|
26
|
+
? new URLSearchParams(Object.entries(params).map(([k, v]) => [k, String(v)]))
|
|
27
|
+
: null;
|
|
28
|
+
const url = query
|
|
29
|
+
? `${ADVANCED_BASE}/${token}${path}?${query.toString()}`
|
|
30
|
+
: `${ADVANCED_BASE}/${token}${path}`;
|
|
31
|
+
const res = await fetch(url);
|
|
32
|
+
return handleResponse(res);
|
|
33
|
+
}
|
|
34
|
+
/** explore.mappls.com — Bearer token in Authorization header */
|
|
35
|
+
export async function mapplsExplore(auth, path) {
|
|
36
|
+
const token = await getAccessToken(auth);
|
|
37
|
+
const url = `${EXPLORE_BASE}${path}`;
|
|
38
|
+
const res = await fetch(url, {
|
|
39
|
+
headers: { Authorization: `bearer ${token}` },
|
|
40
|
+
});
|
|
41
|
+
return handleResponse(res);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,cAAc,EAAE,MAAM,WAAW,CAAC;AAEvD,MAAM,UAAU,GAAG,qCAAqC,CAAC;AACzD,MAAM,aAAa,GAAG,yCAAyC,CAAC;AAChE,MAAM,YAAY,GAAG,4BAA4B,CAAC;AAElD,KAAK,UAAU,cAAc,CAAC,GAAa;IACzC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAgB,EAChB,IAAY,EACZ,MAAiD;IAEjD,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,eAAe,CAC/B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CACvD,CAAC;IACF,MAAM,GAAG,GAAG,GAAG,UAAU,GAAG,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;IACvD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;KAC9C,CAAC,CAAC;IACH,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAgB,EAChB,IAAY,EACZ,MAAkD;IAElD,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM;QAClB,CAAC,CAAC,IAAI,eAAe,CACjB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CACvD;QACH,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,GAAG,GAAG,KAAK;QACf,CAAC,CAAC,GAAG,aAAa,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE;QACxD,CAAC,CAAC,GAAG,aAAa,IAAI,KAAK,GAAG,IAAI,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAgB,EAChB,IAAY;IAEZ,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,GAAG,YAAY,GAAG,IAAI,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;KAC9C,CAAC,CAAC;IACH,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { createServer } from "./server.js";
|
|
4
|
+
async function main() {
|
|
5
|
+
const server = createServer();
|
|
6
|
+
const transport = new StdioServerTransport();
|
|
7
|
+
await server.connect(transport);
|
|
8
|
+
// MCP servers communicate over stdio — stderr is safe for logging
|
|
9
|
+
process.stderr.write("mcp-mapmyindia server running\n");
|
|
10
|
+
}
|
|
11
|
+
main().catch((err) => {
|
|
12
|
+
process.stderr.write(`Fatal: ${err}\n`);
|
|
13
|
+
process.exit(1);
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,kEAAkE;IAClE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;AAC1D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -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;AAUpE,wBAAgB,YAAY,IAAI,SAAS,CAuExC"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { resolveAuth } from "./auth.js";
|
|
3
|
+
import { geocode, geocodeSchema } from "./tools/geocode.js";
|
|
4
|
+
import { reverseGeocode, reverseGeocodeSchema } from "./tools/reverse-geocode.js";
|
|
5
|
+
import { placesSearch, placesSearchSchema } from "./tools/places-search.js";
|
|
6
|
+
import { nearby, nearbySchema } from "./tools/nearby.js";
|
|
7
|
+
import { directions, directionsSchema } from "./tools/directions.js";
|
|
8
|
+
import { distanceMatrix, distanceMatrixSchema } from "./tools/distance-matrix.js";
|
|
9
|
+
import { placeDetail, placeDetailSchema } from "./tools/place-detail.js";
|
|
10
|
+
export function createServer() {
|
|
11
|
+
const auth = resolveAuth();
|
|
12
|
+
const server = new McpServer({
|
|
13
|
+
name: "mcp-mapmyindia",
|
|
14
|
+
version: "0.1.0",
|
|
15
|
+
});
|
|
16
|
+
server.tool("geocode", "Convert an address or place name to latitude/longitude coordinates using Mappls geocoding API", geocodeSchema.shape, async (input) => ({
|
|
17
|
+
content: [{ type: "text", text: await geocode(auth, input) }],
|
|
18
|
+
}));
|
|
19
|
+
server.tool("reverse_geocode", "Convert latitude/longitude coordinates to a human-readable address using Mappls reverse geocoding", reverseGeocodeSchema.shape, async (input) => ({
|
|
20
|
+
content: [{ type: "text", text: await reverseGeocode(auth, input) }],
|
|
21
|
+
}));
|
|
22
|
+
server.tool("places_search", "Search for places by keyword or category using Mappls Places API", placesSearchSchema.shape, async (input) => ({
|
|
23
|
+
content: [{ type: "text", text: await placesSearch(auth, input) }],
|
|
24
|
+
}));
|
|
25
|
+
server.tool("nearby", "Find nearby places of a specific category around a given location using Mappls Nearby API", nearbySchema.shape, async (input) => ({
|
|
26
|
+
content: [{ type: "text", text: await nearby(auth, input) }],
|
|
27
|
+
}));
|
|
28
|
+
server.tool("directions", "Get turn-by-turn driving/biking/walking directions between two or more points using Mappls Directions API", directionsSchema.shape, async (input) => ({
|
|
29
|
+
content: [{ type: "text", text: await directions(auth, input) }],
|
|
30
|
+
}));
|
|
31
|
+
server.tool("distance_matrix", "Calculate travel distances and durations between multiple origins and destinations using Mappls Distance Matrix API", distanceMatrixSchema.shape, async (input) => ({
|
|
32
|
+
content: [{ type: "text", text: await distanceMatrix(auth, input) }],
|
|
33
|
+
}));
|
|
34
|
+
server.tool("place_detail", "Get detailed information about a place using its Mappls eLoc (6-character place ID)", placeDetailSchema.shape, async (input) => ({
|
|
35
|
+
content: [{ type: "text", text: await placeDetail(auth, input) }],
|
|
36
|
+
}));
|
|
37
|
+
return server;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AuthConfig } from "../auth.js";
|
|
3
|
+
export declare const directionsSchema: z.ZodObject<{
|
|
4
|
+
origin: z.ZodString;
|
|
5
|
+
destination: z.ZodString;
|
|
6
|
+
waypoints: z.ZodOptional<z.ZodString>;
|
|
7
|
+
profile: z.ZodOptional<z.ZodEnum<{
|
|
8
|
+
driving: "driving";
|
|
9
|
+
biking: "biking";
|
|
10
|
+
walking: "walking";
|
|
11
|
+
trucking: "trucking";
|
|
12
|
+
}>>;
|
|
13
|
+
alternatives: z.ZodOptional<z.ZodBoolean>;
|
|
14
|
+
steps: z.ZodOptional<z.ZodBoolean>;
|
|
15
|
+
geometries: z.ZodOptional<z.ZodEnum<{
|
|
16
|
+
polyline: "polyline";
|
|
17
|
+
polyline6: "polyline6";
|
|
18
|
+
geojson: "geojson";
|
|
19
|
+
}>>;
|
|
20
|
+
overview: z.ZodOptional<z.ZodEnum<{
|
|
21
|
+
full: "full";
|
|
22
|
+
simplified: "simplified";
|
|
23
|
+
false: "false";
|
|
24
|
+
}>>;
|
|
25
|
+
region: z.ZodOptional<z.ZodString>;
|
|
26
|
+
}, z.core.$strip>;
|
|
27
|
+
export type DirectionsInput = z.infer<typeof directionsSchema>;
|
|
28
|
+
export declare function directions(auth: AuthConfig, input: DirectionsInput): Promise<string>;
|
|
29
|
+
//# sourceMappingURL=directions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directions.d.ts","sourceRoot":"","sources":["../../src/tools/directions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxC,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;iBAoB3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAY/D,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAmB1F"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { mapplsAdvanced } from "../client.js";
|
|
3
|
+
export const directionsSchema = z.object({
|
|
4
|
+
origin: z
|
|
5
|
+
.string()
|
|
6
|
+
.describe("Start point as 'lat,lng' or eLoc (e.g. '28.6139,77.2090' or 'MMI000')"),
|
|
7
|
+
destination: z
|
|
8
|
+
.string()
|
|
9
|
+
.describe("End point as 'lat,lng' or eLoc"),
|
|
10
|
+
waypoints: z
|
|
11
|
+
.string()
|
|
12
|
+
.optional()
|
|
13
|
+
.describe("Pipe-separated intermediate waypoints as 'lat,lng' or eLoc"),
|
|
14
|
+
profile: z
|
|
15
|
+
.enum(["driving", "biking", "walking", "trucking"])
|
|
16
|
+
.optional()
|
|
17
|
+
.describe("Routing profile (default: driving)"),
|
|
18
|
+
alternatives: z.boolean().optional().describe("Request alternative routes"),
|
|
19
|
+
steps: z.boolean().optional().describe("Include turn-by-turn steps"),
|
|
20
|
+
geometries: z.enum(["polyline", "polyline6", "geojson"]).optional(),
|
|
21
|
+
overview: z.enum(["full", "simplified", "false"]).optional(),
|
|
22
|
+
region: z.string().optional().describe("ISO 3166-1 alpha-2 country code"),
|
|
23
|
+
});
|
|
24
|
+
function isELoc(point) {
|
|
25
|
+
return !point.includes(",");
|
|
26
|
+
}
|
|
27
|
+
function toRoutePoint(point) {
|
|
28
|
+
if (isELoc(point))
|
|
29
|
+
return point;
|
|
30
|
+
const [lat, lng] = point.split(",");
|
|
31
|
+
return `${lng},${lat}`;
|
|
32
|
+
}
|
|
33
|
+
export async function directions(auth, input) {
|
|
34
|
+
const profile = input.profile ?? "driving";
|
|
35
|
+
const points = [input.origin];
|
|
36
|
+
if (input.waypoints) {
|
|
37
|
+
points.push(...input.waypoints.split("|"));
|
|
38
|
+
}
|
|
39
|
+
points.push(input.destination);
|
|
40
|
+
const coords = points.map(toRoutePoint).join(";");
|
|
41
|
+
const params = {};
|
|
42
|
+
if (input.alternatives !== undefined)
|
|
43
|
+
params.alternatives = input.alternatives;
|
|
44
|
+
if (input.steps !== undefined)
|
|
45
|
+
params.steps = input.steps;
|
|
46
|
+
if (input.geometries)
|
|
47
|
+
params.geometries = input.geometries;
|
|
48
|
+
if (input.overview)
|
|
49
|
+
params.overview = input.overview;
|
|
50
|
+
if (input.region)
|
|
51
|
+
params.region = input.region;
|
|
52
|
+
const data = await mapplsAdvanced(auth, `/route_adv/${profile}/${coords}`, params);
|
|
53
|
+
return JSON.stringify(data, null, 2);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=directions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directions.js","sourceRoot":"","sources":["../../src/tools/directions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AuthConfig } from "../auth.js";
|
|
3
|
+
export declare const distanceMatrixSchema: z.ZodObject<{
|
|
4
|
+
origins: z.ZodString;
|
|
5
|
+
destinations: z.ZodString;
|
|
6
|
+
profile: z.ZodOptional<z.ZodEnum<{
|
|
7
|
+
driving: "driving";
|
|
8
|
+
biking: "biking";
|
|
9
|
+
walking: "walking";
|
|
10
|
+
trucking: "trucking";
|
|
11
|
+
}>>;
|
|
12
|
+
region: z.ZodOptional<z.ZodString>;
|
|
13
|
+
rtype: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
}, z.core.$strip>;
|
|
15
|
+
export type DistanceMatrixInput = z.infer<typeof distanceMatrixSchema>;
|
|
16
|
+
export declare function distanceMatrix(auth: AuthConfig, input: DistanceMatrixInput): Promise<string>;
|
|
17
|
+
//# sourceMappingURL=distance-matrix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distance-matrix.d.ts","sourceRoot":"","sources":["../../src/tools/distance-matrix.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxC,eAAO,MAAM,oBAAoB;;;;;;;;;;;iBAkB/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAavE,wBAAsB,cAAc,CAClC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,MAAM,CAAC,CAmBjB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { mapplsAdvanced } from "../client.js";
|
|
3
|
+
export const distanceMatrixSchema = z.object({
|
|
4
|
+
origins: z
|
|
5
|
+
.string()
|
|
6
|
+
.describe("Pipe-separated list of origin points as 'lat,lng' or eLoc (e.g. '28.6,77.2|28.7,77.3')"),
|
|
7
|
+
destinations: z
|
|
8
|
+
.string()
|
|
9
|
+
.describe("Pipe-separated list of destination points as 'lat,lng' or eLoc"),
|
|
10
|
+
profile: z
|
|
11
|
+
.enum(["driving", "biking", "walking", "trucking"])
|
|
12
|
+
.optional()
|
|
13
|
+
.describe("Routing profile (default: driving)"),
|
|
14
|
+
region: z.string().optional().describe("ISO 3166-1 alpha-2 country code"),
|
|
15
|
+
rtype: z
|
|
16
|
+
.number()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("Route type: 0 = optimal (default), 1 = shortest"),
|
|
19
|
+
});
|
|
20
|
+
function isELoc(point) {
|
|
21
|
+
return !point.includes(",");
|
|
22
|
+
}
|
|
23
|
+
function toRoutePoint(point) {
|
|
24
|
+
if (isELoc(point))
|
|
25
|
+
return point;
|
|
26
|
+
const [lat, lng] = point.split(",");
|
|
27
|
+
return `${lng},${lat}`;
|
|
28
|
+
}
|
|
29
|
+
export async function distanceMatrix(auth, input) {
|
|
30
|
+
const profile = input.profile ?? "driving";
|
|
31
|
+
const originPts = input.origins.split("|").map(toRoutePoint);
|
|
32
|
+
const destPts = input.destinations.split("|").map(toRoutePoint);
|
|
33
|
+
const allCoords = [...originPts, ...destPts].join(";");
|
|
34
|
+
const sourceIndices = originPts.map((_, i) => i).join(";");
|
|
35
|
+
const destIndices = destPts.map((_, i) => i + originPts.length).join(";");
|
|
36
|
+
const params = {
|
|
37
|
+
sources: sourceIndices,
|
|
38
|
+
destinations: destIndices,
|
|
39
|
+
};
|
|
40
|
+
if (input.region)
|
|
41
|
+
params.region = input.region;
|
|
42
|
+
if (input.rtype !== undefined)
|
|
43
|
+
params.rtype = input.rtype;
|
|
44
|
+
const data = await mapplsAdvanced(auth, `/distance_matrix/${profile}/${allCoords}`, params);
|
|
45
|
+
return JSON.stringify(data, null, 2);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=distance-matrix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distance-matrix.js","sourceRoot":"","sources":["../../src/tools/distance-matrix.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,CACP,wFAAwF,CACzF;IACH,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,QAAQ,CAAC,gEAAgE,CAAC;IAC7E,OAAO,EAAE,CAAC;SACP,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;SAClD,QAAQ,EAAE;SACV,QAAQ,CAAC,oCAAoC,CAAC;IACjD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACzE,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,iDAAiD,CAAC;CAC/D,CAAC,CAAC;AAIH,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,MAAM,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAChC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;AACzB,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAgB,EAChB,KAA0B;IAE1B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,SAAS,CAAC;IAE3C,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEvD,MAAM,aAAa,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE1E,MAAM,MAAM,GAA8C;QACxD,OAAO,EAAE,aAAa;QACtB,YAAY,EAAE,WAAW;KAC1B,CAAC;IACF,IAAI,KAAK,CAAC,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC/C,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAE1D,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,oBAAoB,OAAO,IAAI,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;IAC5F,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AuthConfig } from "../auth.js";
|
|
3
|
+
export declare const geocodeSchema: z.ZodObject<{
|
|
4
|
+
address: z.ZodString;
|
|
5
|
+
region: z.ZodOptional<z.ZodString>;
|
|
6
|
+
pod: z.ZodOptional<z.ZodEnum<{
|
|
7
|
+
SLC: "SLC";
|
|
8
|
+
LC: "LC";
|
|
9
|
+
CITY: "CITY";
|
|
10
|
+
VLG: "VLG";
|
|
11
|
+
SDIST: "SDIST";
|
|
12
|
+
DIST: "DIST";
|
|
13
|
+
STATE: "STATE";
|
|
14
|
+
SSLC: "SSLC";
|
|
15
|
+
}>>;
|
|
16
|
+
bias: z.ZodOptional<z.ZodNumber>;
|
|
17
|
+
filter: z.ZodOptional<z.ZodString>;
|
|
18
|
+
}, z.core.$strip>;
|
|
19
|
+
export type GeocodeInput = z.infer<typeof geocodeSchema>;
|
|
20
|
+
export declare function geocode(auth: AuthConfig, input: GeocodeInput): Promise<string>;
|
|
21
|
+
//# sourceMappingURL=geocode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geocode.d.ts","sourceRoot":"","sources":["../../src/tools/geocode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxC,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;iBAYxB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEzD,wBAAsB,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAWpF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { mapplsAtlas } from "../client.js";
|
|
3
|
+
export const geocodeSchema = z.object({
|
|
4
|
+
address: z.string().describe("Address or place name to geocode"),
|
|
5
|
+
region: z.string().optional().describe("ISO 3166-1 alpha-2 country code (default: IND)"),
|
|
6
|
+
pod: z
|
|
7
|
+
.enum(["SLC", "LC", "CITY", "VLG", "SDIST", "DIST", "STATE", "SSLC"])
|
|
8
|
+
.optional()
|
|
9
|
+
.describe("Place type filter"),
|
|
10
|
+
bias: z.number().optional().describe("1 to bias results to user location"),
|
|
11
|
+
filter: z
|
|
12
|
+
.string()
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("Filter by state/district/city, e.g. 'pin:110001' or 'state:Haryana'"),
|
|
15
|
+
});
|
|
16
|
+
export async function geocode(auth, input) {
|
|
17
|
+
const params = {
|
|
18
|
+
address: input.address,
|
|
19
|
+
};
|
|
20
|
+
if (input.region)
|
|
21
|
+
params.region = input.region;
|
|
22
|
+
if (input.pod)
|
|
23
|
+
params.pod = input.pod;
|
|
24
|
+
if (input.bias)
|
|
25
|
+
params.bias = input.bias;
|
|
26
|
+
if (input.filter)
|
|
27
|
+
params.filter = input.filter;
|
|
28
|
+
const data = await mapplsAtlas(auth, "/geocode", params);
|
|
29
|
+
return JSON.stringify(data, null, 2);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=geocode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geocode.js","sourceRoot":"","sources":["../../src/tools/geocode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IAChE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;IACxF,GAAG,EAAE,CAAC;SACH,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;SACpE,QAAQ,EAAE;SACV,QAAQ,CAAC,mBAAmB,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IAC1E,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,qEAAqE,CAAC;CACnF,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAgB,EAAE,KAAmB;IACjE,MAAM,MAAM,GAA8C;QACxD,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;IACF,IAAI,KAAK,CAAC,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC/C,IAAI,KAAK,CAAC,GAAG;QAAE,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACtC,IAAI,KAAK,CAAC,IAAI;QAAE,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAE/C,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AuthConfig } from "../auth.js";
|
|
3
|
+
export declare const nearbySchema: z.ZodObject<{
|
|
4
|
+
keywords: z.ZodString;
|
|
5
|
+
refLocation: z.ZodString;
|
|
6
|
+
radius: z.ZodOptional<z.ZodNumber>;
|
|
7
|
+
sortBy: z.ZodOptional<z.ZodEnum<{
|
|
8
|
+
"dist:asc": "dist:asc";
|
|
9
|
+
"dist:desc": "dist:desc";
|
|
10
|
+
imp: "imp";
|
|
11
|
+
}>>;
|
|
12
|
+
page: z.ZodOptional<z.ZodNumber>;
|
|
13
|
+
region: z.ZodOptional<z.ZodString>;
|
|
14
|
+
}, z.core.$strip>;
|
|
15
|
+
export type NearbyInput = z.infer<typeof nearbySchema>;
|
|
16
|
+
export declare function nearby(auth: AuthConfig, input: NearbyInput): Promise<string>;
|
|
17
|
+
//# sourceMappingURL=nearby.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nearby.d.ts","sourceRoot":"","sources":["../../src/tools/nearby.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxC,eAAO,MAAM,YAAY;;;;;;;;;;;iBAYvB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAEvD,wBAAsB,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAYlF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { mapplsAtlas } from "../client.js";
|
|
3
|
+
export const nearbySchema = z.object({
|
|
4
|
+
keywords: z.string().describe("Category or keyword to search nearby (e.g. 'atm', 'hospital')"),
|
|
5
|
+
refLocation: z
|
|
6
|
+
.string()
|
|
7
|
+
.describe("Reference lat,lng (e.g. '28.6139,77.2090') or a eLoc/place-id"),
|
|
8
|
+
radius: z.number().optional().describe("Search radius in meters (max 10000, default 1000)"),
|
|
9
|
+
sortBy: z
|
|
10
|
+
.enum(["dist:asc", "dist:desc", "imp"])
|
|
11
|
+
.optional()
|
|
12
|
+
.describe("Sort order"),
|
|
13
|
+
page: z.number().optional().describe("Page number"),
|
|
14
|
+
region: z.string().optional().describe("ISO 3166-1 alpha-2 country code"),
|
|
15
|
+
});
|
|
16
|
+
export async function nearby(auth, input) {
|
|
17
|
+
const params = {
|
|
18
|
+
keywords: input.keywords,
|
|
19
|
+
refLocation: input.refLocation,
|
|
20
|
+
};
|
|
21
|
+
if (input.radius)
|
|
22
|
+
params.radius = input.radius;
|
|
23
|
+
if (input.sortBy)
|
|
24
|
+
params.sortBy = input.sortBy;
|
|
25
|
+
if (input.page)
|
|
26
|
+
params.page = input.page;
|
|
27
|
+
if (input.region)
|
|
28
|
+
params.region = input.region;
|
|
29
|
+
const data = await mapplsAtlas(auth, "/nearby/json", params);
|
|
30
|
+
return JSON.stringify(data, null, 2);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=nearby.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nearby.js","sourceRoot":"","sources":["../../src/tools/nearby.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;IAC9F,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,QAAQ,CAAC,+DAA+D,CAAC;IAC5E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;IAC3F,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;SACtC,QAAQ,EAAE;SACV,QAAQ,CAAC,YAAY,CAAC;IACzB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;IACnD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;CAC1E,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAgB,EAAE,KAAkB;IAC/D,MAAM,MAAM,GAA8C;QACxD,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,WAAW,EAAE,KAAK,CAAC,WAAW;KAC/B,CAAC;IACF,IAAI,KAAK,CAAC,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC/C,IAAI,KAAK,CAAC,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC/C,IAAI,KAAK,CAAC,IAAI;QAAE,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAE/C,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AuthConfig } from "../auth.js";
|
|
3
|
+
export declare const placeDetailSchema: z.ZodObject<{
|
|
4
|
+
eLoc: z.ZodString;
|
|
5
|
+
}, z.core.$strip>;
|
|
6
|
+
export type PlaceDetailInput = z.infer<typeof placeDetailSchema>;
|
|
7
|
+
export declare function placeDetail(auth: AuthConfig, input: PlaceDetailInput): Promise<string>;
|
|
8
|
+
//# sourceMappingURL=place-detail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"place-detail.d.ts","sourceRoot":"","sources":["../../src/tools/place-detail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxC,eAAO,MAAM,iBAAiB;;iBAI5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE,wBAAsB,WAAW,CAC/B,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,MAAM,CAAC,CAGjB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { mapplsExplore } from "../client.js";
|
|
3
|
+
export const placeDetailSchema = z.object({
|
|
4
|
+
eLoc: z
|
|
5
|
+
.string()
|
|
6
|
+
.describe("6-character Mappls eLoc (place ID) to look up, e.g. 'MMI000'"),
|
|
7
|
+
});
|
|
8
|
+
export async function placeDetail(auth, input) {
|
|
9
|
+
const data = await mapplsExplore(auth, `/apis/O2O/entity/${input.eLoc}`);
|
|
10
|
+
return JSON.stringify(data, null, 2);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=place-detail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"place-detail.js","sourceRoot":"","sources":["../../src/tools/place-detail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,CAAC,8DAA8D,CAAC;CAC5E,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAgB,EAChB,KAAuB;IAEvB,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,oBAAoB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACzE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AuthConfig } from "../auth.js";
|
|
3
|
+
export declare const placesSearchSchema: z.ZodObject<{
|
|
4
|
+
query: z.ZodString;
|
|
5
|
+
location: z.ZodOptional<z.ZodString>;
|
|
6
|
+
radius: z.ZodOptional<z.ZodNumber>;
|
|
7
|
+
pod: z.ZodOptional<z.ZodEnum<{
|
|
8
|
+
SLC: "SLC";
|
|
9
|
+
LC: "LC";
|
|
10
|
+
CITY: "CITY";
|
|
11
|
+
VLG: "VLG";
|
|
12
|
+
SDIST: "SDIST";
|
|
13
|
+
DIST: "DIST";
|
|
14
|
+
STATE: "STATE";
|
|
15
|
+
SSLC: "SSLC";
|
|
16
|
+
Res_com: "Res_com";
|
|
17
|
+
}>>;
|
|
18
|
+
filter: z.ZodOptional<z.ZodString>;
|
|
19
|
+
page: z.ZodOptional<z.ZodNumber>;
|
|
20
|
+
region: z.ZodOptional<z.ZodString>;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
export type PlacesSearchInput = z.infer<typeof placesSearchSchema>;
|
|
23
|
+
export declare function placesSearch(auth: AuthConfig, input: PlacesSearchInput): Promise<string>;
|
|
24
|
+
//# sourceMappingURL=places-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"places-search.d.ts","sourceRoot":"","sources":["../../src/tools/places-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxC,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;iBAc7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEnE,wBAAsB,YAAY,CAChC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,MAAM,CAAC,CAajB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { mapplsAtlas } from "../client.js";
|
|
3
|
+
export const placesSearchSchema = z.object({
|
|
4
|
+
query: z.string().describe("Search keyword or place name"),
|
|
5
|
+
location: z
|
|
6
|
+
.string()
|
|
7
|
+
.optional()
|
|
8
|
+
.describe("Bias results near this lat,lng (e.g. '28.6139,77.2090')"),
|
|
9
|
+
radius: z.number().optional().describe("Search radius in meters (max 10000)"),
|
|
10
|
+
pod: z
|
|
11
|
+
.enum(["SLC", "LC", "CITY", "VLG", "SDIST", "DIST", "STATE", "SSLC", "Res_com"])
|
|
12
|
+
.optional()
|
|
13
|
+
.describe("Place type filter"),
|
|
14
|
+
filter: z.string().optional().describe("Restrict results, e.g. 'pin:110001'"),
|
|
15
|
+
page: z.number().optional().describe("Page number for pagination"),
|
|
16
|
+
region: z.string().optional().describe("ISO 3166-1 alpha-2 country code"),
|
|
17
|
+
});
|
|
18
|
+
export async function placesSearch(auth, input) {
|
|
19
|
+
const params = {
|
|
20
|
+
query: input.query,
|
|
21
|
+
};
|
|
22
|
+
if (input.location)
|
|
23
|
+
params.location = input.location;
|
|
24
|
+
if (input.radius)
|
|
25
|
+
params.radius = input.radius;
|
|
26
|
+
if (input.pod)
|
|
27
|
+
params.pod = input.pod;
|
|
28
|
+
if (input.filter)
|
|
29
|
+
params.filter = input.filter;
|
|
30
|
+
if (input.page)
|
|
31
|
+
params.page = input.page;
|
|
32
|
+
if (input.region)
|
|
33
|
+
params.region = input.region;
|
|
34
|
+
const data = await mapplsAtlas(auth, "/search/json", params);
|
|
35
|
+
return JSON.stringify(data, null, 2);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=places-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"places-search.js","sourceRoot":"","sources":["../../src/tools/places-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;IAC1D,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,yDAAyD,CAAC;IACtE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IAC7E,GAAG,EAAE,CAAC;SACH,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;SAC/E,QAAQ,EAAE;SACV,QAAQ,CAAC,mBAAmB,CAAC;IAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IAC7E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IAClE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;CAC1E,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAgB,EAChB,KAAwB;IAExB,MAAM,MAAM,GAA8C;QACxD,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAC;IACF,IAAI,KAAK,CAAC,QAAQ;QAAE,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IACrD,IAAI,KAAK,CAAC,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC/C,IAAI,KAAK,CAAC,GAAG;QAAE,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACtC,IAAI,KAAK,CAAC,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC/C,IAAI,KAAK,CAAC,IAAI;QAAE,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAE/C,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AuthConfig } from "../auth.js";
|
|
3
|
+
export declare const reverseGeocodeSchema: z.ZodObject<{
|
|
4
|
+
lat: z.ZodNumber;
|
|
5
|
+
lng: z.ZodNumber;
|
|
6
|
+
lang: z.ZodOptional<z.ZodString>;
|
|
7
|
+
}, z.core.$strip>;
|
|
8
|
+
export type ReverseGeocodeInput = z.infer<typeof reverseGeocodeSchema>;
|
|
9
|
+
export declare function reverseGeocode(auth: AuthConfig, input: ReverseGeocodeInput): Promise<string>;
|
|
10
|
+
//# sourceMappingURL=reverse-geocode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reverse-geocode.d.ts","sourceRoot":"","sources":["../../src/tools/reverse-geocode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxC,eAAO,MAAM,oBAAoB;;;;iBAI/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEvE,wBAAsB,cAAc,CAClC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,MAAM,CAAC,CASjB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { mapplsAdvanced } from "../client.js";
|
|
3
|
+
export const reverseGeocodeSchema = z.object({
|
|
4
|
+
lat: z.number().describe("Latitude"),
|
|
5
|
+
lng: z.number().describe("Longitude"),
|
|
6
|
+
lang: z.string().optional().describe("Response language (e.g. 'hi' for Hindi)"),
|
|
7
|
+
});
|
|
8
|
+
export async function reverseGeocode(auth, input) {
|
|
9
|
+
const params = {
|
|
10
|
+
lat: input.lat,
|
|
11
|
+
lng: input.lng,
|
|
12
|
+
};
|
|
13
|
+
if (input.lang)
|
|
14
|
+
params.lang = input.lang;
|
|
15
|
+
const data = await mapplsAdvanced(auth, "/rev_geocode", params);
|
|
16
|
+
return JSON.stringify(data, null, 2);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=reverse-geocode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reverse-geocode.js","sourceRoot":"","sources":["../../src/tools/reverse-geocode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;IACpC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;CAChF,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAgB,EAChB,KAA0B;IAE1B,MAAM,MAAM,GAA8C;QACxD,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,GAAG,EAAE,KAAK,CAAC,GAAG;KACf,CAAC;IACF,IAAI,KAAK,CAAC,IAAI;QAAE,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IAEzC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mcp-mapmyindia",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for MapMyIndia (Mappls) APIs — geocoding, routing, places, and more",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"mcp",
|
|
7
|
+
"mcp-server",
|
|
8
|
+
"mapmyindia",
|
|
9
|
+
"mappls",
|
|
10
|
+
"maps",
|
|
11
|
+
"india",
|
|
12
|
+
"geocoding",
|
|
13
|
+
"routing",
|
|
14
|
+
"directions",
|
|
15
|
+
"places",
|
|
16
|
+
"nearby"
|
|
17
|
+
],
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/bhuvnsh/mcp-mapmyindia.git"
|
|
22
|
+
},
|
|
23
|
+
"homepage": "https://github.com/bhuvnsh/mcp-mapmyindia#readme",
|
|
24
|
+
"type": "module",
|
|
25
|
+
"bin": {
|
|
26
|
+
"mcp-mapmyindia": "dist/index.js"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist"
|
|
30
|
+
],
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsc && chmod +x dist/index.js",
|
|
33
|
+
"dev": "tsx watch src/index.ts",
|
|
34
|
+
"start": "node dist/index.js",
|
|
35
|
+
"test": "vitest run",
|
|
36
|
+
"test:watch": "vitest",
|
|
37
|
+
"test:coverage": "vitest run --coverage",
|
|
38
|
+
"prepublishOnly": "npm run build && npm test"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@modelcontextprotocol/sdk": "^1.10.2",
|
|
42
|
+
"zod": "^4.3.6"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/node": "^22.0.0",
|
|
46
|
+
"@vitest/coverage-v8": "^4.1.0",
|
|
47
|
+
"tsx": "^4.19.0",
|
|
48
|
+
"typescript": "^5.7.0",
|
|
49
|
+
"vitest": "^4.1.0"
|
|
50
|
+
},
|
|
51
|
+
"engines": {
|
|
52
|
+
"node": ">=18"
|
|
53
|
+
}
|
|
54
|
+
}
|