@ikeytz/maps-mcp 1.0.1 → 1.0.3

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/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.3
4
+
5
+ - More maps-only commands: slugs, PLZ index, hub, embed, geo_api, Lage, Geschichte, Distanz, URL-resolve, Google-Maps-Paste.
6
+
7
+ ## 1.0.2
8
+
9
+ - Drop private Git remote from npm metadata.
10
+
3
11
  ## 1.0.1
4
12
 
5
13
  - Public npm README (install, 7 tools, hosts, legal). Not the internal geo plan.
package/README.md CHANGED
@@ -10,7 +10,7 @@ License: proprietary — LicenseRef-ikeytz-terms (see LICENSE; install & use OK;
10
10
 
11
11
  npm name `@ikeytz` = npm organization (namespace). Not the MCP server scope field.
12
12
 
13
- This is **not** `@ikeytz/mcp` (www, 42 tools, `https://www.ikeytz.com/mcp`).
13
+ This is **not** `@ikeytz/mcp` (www, prices/FAQ). This server is **only** ikeytz maps: 52 Einsatzgebiete, Punkte, Embed, Discovery.
14
14
 
15
15
  ## For AI assistants (npm / discovery)
16
16
 
@@ -38,7 +38,7 @@ Install (Mac/Linux/Windows):
38
38
 
39
39
  ```bash
40
40
  npm i -g @ikeytz/maps-mcp
41
- ikeytz-maps-mcp --version # z. B. 1.0.1
41
+ ikeytz-maps-mcp --version # z. B. 1.0.3
42
42
  ikeytz-maps-mcp update # später: npm i -g @ikeytz/maps-mcp@latest
43
43
  ```
44
44
 
@@ -97,7 +97,7 @@ Discovery (`get_discovery`): Datei 1:1. `which` z. B. `llms`, `llms-keywords`, `
97
97
  ikeytz-maps-mcp # MCP stdio proxy (any MCP host) — keine Args
98
98
  ikeytz-maps-mcp help # Usage + Flags (offline)
99
99
  ikeytz-maps-mcp update [ver] # npm i -g @ikeytz/maps-mcp@latest
100
- ikeytz-maps-mcp list # 7 Tools (offline) + global CLI flags
100
+ ikeytz-maps-mcp list # Tools (offline) + global CLI flags
101
101
  ikeytz-maps-mcp describe NAME # = ikeytz-maps-mcp NAME -h
102
102
  ikeytz-maps-mcp call NAME … # oder: ikeytz-maps-mcp NAME …
103
103
  ```
@@ -127,19 +127,37 @@ ikeytz-maps-mcp call NAME … # oder: ikeytz-maps-mcp NAME …
127
127
 
128
128
  Volltext Geo: `ikeytz-maps-mcp get_discovery --which llms-orte-geo`
129
129
 
130
- ## Alle 7 Tool-Befehle
130
+ ## Alle Tool-Befehle (HTTP + WebMCP + CLI, dieselbe Liste)
131
131
 
132
132
  | Befehl | Argumente |
133
133
  |--------|-----------|
134
134
  | `list_service_areas` | — |
135
- | `get_service_area` | `--slug` · `--plz` · `--name` |
135
+ | `get_service_area` | `--slug` · `--plz` · `--name` (ein Treffer; PLZ = erster) |
136
136
  | `get_geo_office` | — |
137
137
  | `get_contact` | — |
138
138
  | `get_discovery` | `--which*` · `--offset` · `--limit` |
139
139
  | `get_llms_mcp_server` | — |
140
140
  | `get_llms_mcp_web` | — |
141
-
142
- Präfix immer `ikeytz-maps-mcp` (z. B. `ikeytz-maps-mcp get_service_area -h`).
141
+ | `find_by_keyword` | `--q*` · `--limit` |
142
+ | `find_by_serp` | `--q` · `--path` · `--url` · `--slug` · `--limit` |
143
+ | `get_serp_snippet` | `--path` · `--url` · `--slug` |
144
+ | `find_by_plz` | `--plz*` (alle Gebiete dieser PLZ) |
145
+ | `find_by_geo` | `--lat` · `--lng` · `--icbm` · `--radius_km` · `--limit` |
146
+ | `find_by_icbm` | `--icbm` · `--lat` · `--lng` · `--radius_km` · `--limit` |
147
+ | `find_by_gebiet` | `--q` · `--name` · `--slug` |
148
+ | `find_by_area` | Alias von `find_by_gebiet` |
149
+ | `list_slugs` | — |
150
+ | `list_plz` | — |
151
+ | `get_hub` | — |
152
+ | `get_embed_map` | `--slug` · `--plz` · `--name` |
153
+ | `get_geo_api` | `--slug` · `--plz` · `--name` |
154
+ | `get_lage` | `--slug` · `--plz` · `--name` |
155
+ | `get_geschichte` | `--slug` · `--plz` · `--name` |
156
+ | `distance_to_office` | `--slug` · `--lat` · `--lng` · `--icbm` |
157
+ | `resolve_maps_url` | `--url` |
158
+ | `find_by_google_maps` | `--q` (Koordinaten-Paste) |
159
+
160
+ Präfix immer `ikeytz-maps-mcp` (z. B. `ikeytz-maps-mcp find_by_plz --plz=71638`).
143
161
 
144
162
  ## MCP hosts (any client — not only Cursor / Claude)
145
163
 
@@ -185,7 +203,7 @@ www bleibt **zweiter** Eintrag:
185
203
 
186
204
  `ikeytz-maps-mcp get_service_area --slug=pattonville`, `ikeytz-maps-mcp list_service_areas`, … — ohne MCP-Host.
187
205
 
188
- Alle Optionen nutzen dieselbe SSOT: `https://maps.ikeytz.com/mcp` (7 Tools, read/link only).
206
+ Alle Optionen nutzen dieselbe SSOT: `https://maps.ikeytz.com/mcp` (read/link only, HTTP = WebMCP = CLI).
189
207
 
190
208
  ## Env
191
209
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ikeytz/maps-mcp",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "mcpName": "com.ikeytz/maps",
5
5
  "description": "Official terminal CLI and MCP stdio proxy for maps.ikeytz.com. Not @ikeytz/mcp.",
6
6
  "type": "module",
@@ -37,10 +37,5 @@
37
37
  "LICENSE",
38
38
  "README.md",
39
39
  "CHANGELOG.md"
40
- ],
41
- "repository": {
42
- "type": "git",
43
- "url": "https://vmd199268.contaboserver.net/ikeytz-geo/ikeytz-geo-stack.git",
44
- "directory": "packages/maps-mcp"
45
- }
40
+ ]
46
41
  }
package/src/cli.js CHANGED
@@ -1,7 +1,22 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { callTool, mapsMcpUrl, mapsRpc, packageVersion, showMcpCommand, toolByName, toolNames } from "./proxy.js";
3
3
 
4
- const TOOL_FLAGS = ["slug", "plz", "name", "which", "offset", "limit"];
4
+ const TOOL_FLAGS = [
5
+ "slug",
6
+ "plz",
7
+ "name",
8
+ "which",
9
+ "offset",
10
+ "limit",
11
+ "q",
12
+ "path",
13
+ "url",
14
+ "icbm",
15
+ "lat",
16
+ "lng",
17
+ "radius_km",
18
+ ];
19
+ const NUMBER_FLAGS = new Set(["offset", "limit", "lat", "lng", "radius_km"]);
5
20
 
6
21
  const HELP = `ikeytz-maps-mcp ${packageVersion()}
7
22
  Remote: ${mapsMcpUrl()}
@@ -11,7 +26,7 @@ Ohne Args stdio-Proxy (Cursor/Claude)
11
26
  help | --help diese Hilfe
12
27
  --version Version
13
28
  update npm i -g @ikeytz/maps-mcp@latest
14
- list 7 Tools (offline)
29
+ list ${toolNames().length} Tools (offline)
15
30
  describe <tool> Schema (offline)
16
31
  call <tool> … wie <tool> …
17
32
  <tool> Payload von maps /mcp
@@ -21,13 +36,9 @@ call <tool> … wie <tool> …
21
36
  <tool> --json '{…}'
22
37
 
23
38
  Tools:
24
- list_service_areas
25
- get_service_area --slug=… | --plz=… | --name=…
26
- get_geo_office
27
- get_contact
28
- get_discovery --which=llms|llms-orte-geo|ai-plugin|…
29
- get_llms_mcp_server
30
- get_llms_mcp_web
39
+ ${toolNames()
40
+ .map((n) => ` ${n}`)
41
+ .join("\n")}
31
42
  `;
32
43
 
33
44
  function parseArgv(argv) {
@@ -62,7 +73,7 @@ function argsFromFlags(flags) {
62
73
  if (flags.json) Object.assign(args, JSON.parse(flags.json));
63
74
  for (const key of TOOL_FLAGS) {
64
75
  if (flags[key] != null && flags[key] !== true) {
65
- args[key] = key === "offset" || key === "limit" ? Number(flags[key]) : String(flags[key]);
76
+ args[key] = NUMBER_FLAGS.has(key) ? Number(flags[key]) : String(flags[key]);
66
77
  }
67
78
  }
68
79
  return args;
@@ -68,7 +68,8 @@
68
68
  "ai-txt",
69
69
  "ai-plugin",
70
70
  "answer-engine",
71
- "ai-catalog"
71
+ "ai-catalog",
72
+ "agent-skills"
72
73
  ]
73
74
  },
74
75
  "offset": {
@@ -98,6 +99,339 @@
98
99
  "type": "object",
99
100
  "properties": {}
100
101
  }
102
+ },
103
+ {
104
+ "name": "find_by_keyword",
105
+ "description": "Suche in maps llms-keywords.txt (Keyword → maps-URL). Nicht www.",
106
+ "inputSchema": {
107
+ "type": "object",
108
+ "properties": {
109
+ "q": {
110
+ "type": "string"
111
+ },
112
+ "limit": {
113
+ "type": "integer"
114
+ }
115
+ },
116
+ "required": [
117
+ "q"
118
+ ]
119
+ }
120
+ },
121
+ {
122
+ "name": "find_by_serp",
123
+ "description": "Suche in maps llms-serp.txt (Title/H1/Description/URL).",
124
+ "inputSchema": {
125
+ "type": "object",
126
+ "properties": {
127
+ "q": {
128
+ "type": "string"
129
+ },
130
+ "path": {
131
+ "type": "string"
132
+ },
133
+ "url": {
134
+ "type": "string"
135
+ },
136
+ "slug": {
137
+ "type": "string"
138
+ },
139
+ "limit": {
140
+ "type": "integer"
141
+ }
142
+ }
143
+ }
144
+ },
145
+ {
146
+ "name": "get_serp_snippet",
147
+ "description": "Ein SERP-Block für path, url oder slug (maps llms-serp.txt).",
148
+ "inputSchema": {
149
+ "type": "object",
150
+ "properties": {
151
+ "path": {
152
+ "type": "string"
153
+ },
154
+ "url": {
155
+ "type": "string"
156
+ },
157
+ "slug": {
158
+ "type": "string"
159
+ },
160
+ "q": {
161
+ "type": "string"
162
+ }
163
+ }
164
+ }
165
+ },
166
+ {
167
+ "name": "find_by_plz",
168
+ "description": "Alle Einsatzgebiete mit dieser PLZ (nicht nur der erste Treffer).",
169
+ "inputSchema": {
170
+ "type": "object",
171
+ "properties": {
172
+ "plz": {
173
+ "type": "string"
174
+ },
175
+ "q": {
176
+ "type": "string"
177
+ }
178
+ },
179
+ "required": [
180
+ "plz"
181
+ ]
182
+ }
183
+ },
184
+ {
185
+ "name": "find_by_geo",
186
+ "description": "Gebiete nach lat/lng, optional radius_km, sonst die nächsten.",
187
+ "inputSchema": {
188
+ "type": "object",
189
+ "properties": {
190
+ "lat": {
191
+ "type": "number"
192
+ },
193
+ "lng": {
194
+ "type": "number"
195
+ },
196
+ "icbm": {
197
+ "type": "string"
198
+ },
199
+ "radius_km": {
200
+ "type": "number"
201
+ },
202
+ "limit": {
203
+ "type": "integer"
204
+ }
205
+ }
206
+ }
207
+ },
208
+ {
209
+ "name": "find_by_icbm",
210
+ "description": "Gebiete nach ICBM (lat, lng) — nächste Punkte / optional radius_km.",
211
+ "inputSchema": {
212
+ "type": "object",
213
+ "properties": {
214
+ "icbm": {
215
+ "type": "string"
216
+ },
217
+ "lat": {
218
+ "type": "number"
219
+ },
220
+ "lng": {
221
+ "type": "number"
222
+ },
223
+ "radius_km": {
224
+ "type": "number"
225
+ },
226
+ "limit": {
227
+ "type": "integer"
228
+ }
229
+ }
230
+ }
231
+ },
232
+ {
233
+ "name": "find_by_gebiet",
234
+ "description": "Gebiete nach Name oder slug (mehrere Treffer, Umlaut ok).",
235
+ "inputSchema": {
236
+ "type": "object",
237
+ "properties": {
238
+ "q": {
239
+ "type": "string"
240
+ },
241
+ "name": {
242
+ "type": "string"
243
+ },
244
+ "slug": {
245
+ "type": "string"
246
+ }
247
+ }
248
+ }
249
+ },
250
+ {
251
+ "name": "find_by_area",
252
+ "description": "Alias von find_by_gebiet (Name/Slug, mehrere Treffer).",
253
+ "inputSchema": {
254
+ "type": "object",
255
+ "properties": {
256
+ "q": {
257
+ "type": "string"
258
+ },
259
+ "name": {
260
+ "type": "string"
261
+ },
262
+ "slug": {
263
+ "type": "string"
264
+ }
265
+ }
266
+ }
267
+ },
268
+ {
269
+ "name": "list_slugs",
270
+ "description": "Alle 52 maps-Slugs (ikeytz Einsatzgebiete).",
271
+ "inputSchema": {
272
+ "type": "object",
273
+ "properties": {}
274
+ }
275
+ },
276
+ {
277
+ "name": "list_plz",
278
+ "description": "PLZ → welche maps-Gebiete (Mehrfach-PLZ sichtbar).",
279
+ "inputSchema": {
280
+ "type": "object",
281
+ "properties": {}
282
+ }
283
+ },
284
+ {
285
+ "name": "get_hub",
286
+ "description": "Karten-Hub maps.ikeytz.com/ — 52 Gebiete, keine Visitenkarte.",
287
+ "inputSchema": {
288
+ "type": "object",
289
+ "properties": {}
290
+ }
291
+ },
292
+ {
293
+ "name": "get_embed_map",
294
+ "description": "Kanonische Karten-URL https://maps.ikeytz.com/{slug}.",
295
+ "inputSchema": {
296
+ "type": "object",
297
+ "properties": {
298
+ "slug": {
299
+ "type": "string"
300
+ },
301
+ "plz": {
302
+ "type": "string"
303
+ },
304
+ "name": {
305
+ "type": "string"
306
+ }
307
+ }
308
+ }
309
+ },
310
+ {
311
+ "name": "get_geo_api",
312
+ "description": "Public Embed-JSON URL für ein Gebiet (Punkt + Grenze, nicht geo-Cockpit).",
313
+ "inputSchema": {
314
+ "type": "object",
315
+ "properties": {
316
+ "slug": {
317
+ "type": "string"
318
+ },
319
+ "plz": {
320
+ "type": "string"
321
+ },
322
+ "name": {
323
+ "type": "string"
324
+ }
325
+ }
326
+ }
327
+ },
328
+ {
329
+ "name": "get_lage",
330
+ "description": "Lage-Text eines Einsatzgebiets (Karte / Visitenkarte).",
331
+ "inputSchema": {
332
+ "type": "object",
333
+ "properties": {
334
+ "slug": {
335
+ "type": "string"
336
+ },
337
+ "plz": {
338
+ "type": "string"
339
+ },
340
+ "name": {
341
+ "type": "string"
342
+ }
343
+ }
344
+ }
345
+ },
346
+ {
347
+ "name": "get_geschichte",
348
+ "description": "Geschichte-Text eines Einsatzgebiets (Karte / Visitenkarte).",
349
+ "inputSchema": {
350
+ "type": "object",
351
+ "properties": {
352
+ "slug": {
353
+ "type": "string"
354
+ },
355
+ "plz": {
356
+ "type": "string"
357
+ },
358
+ "name": {
359
+ "type": "string"
360
+ }
361
+ }
362
+ }
363
+ },
364
+ {
365
+ "name": "distance_to_office",
366
+ "description": "Luftlinie Gebiet oder Koordinate → Gewerbesitz (kein Walk-in).",
367
+ "inputSchema": {
368
+ "type": "object",
369
+ "properties": {
370
+ "slug": {
371
+ "type": "string"
372
+ },
373
+ "plz": {
374
+ "type": "string"
375
+ },
376
+ "name": {
377
+ "type": "string"
378
+ },
379
+ "lat": {
380
+ "type": "number"
381
+ },
382
+ "lng": {
383
+ "type": "number"
384
+ },
385
+ "icbm": {
386
+ "type": "string"
387
+ }
388
+ }
389
+ }
390
+ },
391
+ {
392
+ "name": "resolve_maps_url",
393
+ "description": "maps.ikeytz.com-URL → Hub oder Gebiet.",
394
+ "inputSchema": {
395
+ "type": "object",
396
+ "properties": {
397
+ "url": {
398
+ "type": "string"
399
+ },
400
+ "path": {
401
+ "type": "string"
402
+ },
403
+ "q": {
404
+ "type": "string"
405
+ }
406
+ }
407
+ }
408
+ },
409
+ {
410
+ "name": "find_by_google_maps",
411
+ "description": "Koordinaten-Paste (Google Maps / ICBM) → nächste ikeytz-Gebiete.",
412
+ "inputSchema": {
413
+ "type": "object",
414
+ "properties": {
415
+ "q": {
416
+ "type": "string"
417
+ },
418
+ "icbm": {
419
+ "type": "string"
420
+ },
421
+ "lat": {
422
+ "type": "number"
423
+ },
424
+ "lng": {
425
+ "type": "number"
426
+ },
427
+ "radius_km": {
428
+ "type": "number"
429
+ },
430
+ "limit": {
431
+ "type": "integer"
432
+ }
433
+ }
434
+ }
101
435
  }
102
436
  ]
103
437
  }