@ikeytz/maps-mcp 1.0.2 → 1.0.4

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,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.4
4
+
5
+ - Legal tools: get_legal, Urheberrecht/Copyright/Impressum (maps text), AGB/Nutzung/Datenschutz/Widerruf (www URLs).
6
+ - CLI flags like www: `list` prints global flags, `list --global`, per-tool `-h` with args + `--show-mcp-command`.
7
+
8
+ ## 1.0.3
9
+
10
+ - More maps-only commands: slugs, PLZ index, hub, embed, geo_api, Lage, Geschichte, Distanz, URL-resolve, Google-Maps-Paste.
11
+
3
12
  ## 1.0.2
4
13
 
5
14
  - Drop private Git remote from npm metadata.
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.4
42
42
  ikeytz-maps-mcp update # später: npm i -g @ikeytz/maps-mcp@latest
43
43
  ```
44
44
 
@@ -97,7 +97,8 @@ 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
+ ikeytz-maps-mcp list --global # nur globale Flags (wie ikeytz-mcp)
101
102
  ikeytz-maps-mcp describe NAME # = ikeytz-maps-mcp NAME -h
102
103
  ikeytz-maps-mcp call NAME … # oder: ikeytz-maps-mcp NAME …
103
104
  ```
@@ -112,6 +113,7 @@ ikeytz-maps-mcp call NAME … # oder: ikeytz-maps-mcp NAME …
112
113
  | `--show-mcp-command` | curl 1a/1b/2 only |
113
114
  | `--raw` | JSON structuredContent |
114
115
  | `--json '{…}'` | Roh-Arguments |
116
+ | `list --global` | nur globale Flags (offline) |
115
117
 
116
118
  ## Geo-Tools — Payload (vom Server, CLI spiegelt 1:1)
117
119
 
@@ -127,19 +129,45 @@ ikeytz-maps-mcp call NAME … # oder: ikeytz-maps-mcp NAME …
127
129
 
128
130
  Volltext Geo: `ikeytz-maps-mcp get_discovery --which llms-orte-geo`
129
131
 
130
- ## Alle 7 Tool-Befehle
132
+ ## Alle Tool-Befehle (HTTP + WebMCP + CLI, dieselbe Liste)
131
133
 
132
134
  | Befehl | Argumente |
133
135
  |--------|-----------|
134
136
  | `list_service_areas` | — |
135
- | `get_service_area` | `--slug` · `--plz` · `--name` |
137
+ | `get_service_area` | `--slug` · `--plz` · `--name` (ein Treffer; PLZ = erster) |
136
138
  | `get_geo_office` | — |
137
139
  | `get_contact` | — |
138
140
  | `get_discovery` | `--which*` · `--offset` · `--limit` |
139
141
  | `get_llms_mcp_server` | — |
140
142
  | `get_llms_mcp_web` | — |
141
-
142
- Präfix immer `ikeytz-maps-mcp` (z. B. `ikeytz-maps-mcp get_service_area -h`).
143
+ | `find_by_keyword` | `--q*` · `--limit` |
144
+ | `find_by_serp` | `--q` · `--path` · `--url` · `--slug` · `--limit` |
145
+ | `get_serp_snippet` | `--path` · `--url` · `--slug` |
146
+ | `find_by_plz` | `--plz*` (alle Gebiete dieser PLZ) |
147
+ | `find_by_geo` | `--lat` · `--lng` · `--icbm` · `--radius_km` · `--limit` |
148
+ | `find_by_icbm` | `--icbm` · `--lat` · `--lng` · `--radius_km` · `--limit` |
149
+ | `find_by_gebiet` | `--q` · `--name` · `--slug` |
150
+ | `find_by_area` | Alias von `find_by_gebiet` |
151
+ | `list_slugs` | — |
152
+ | `list_plz` | — |
153
+ | `get_hub` | — |
154
+ | `get_embed_map` | `--slug` · `--plz` · `--name` |
155
+ | `get_geo_api` | `--slug` · `--plz` · `--name` |
156
+ | `get_lage` | `--slug` · `--plz` · `--name` |
157
+ | `get_geschichte` | `--slug` · `--plz` · `--name` |
158
+ | `distance_to_office` | `--slug` · `--lat` · `--lng` · `--icbm` |
159
+ | `resolve_maps_url` | `--url` |
160
+ | `find_by_google_maps` | `--q` (Koordinaten-Paste) |
161
+ | `get_legal` | `--doc*` urheberrecht\|copyright\|impressum\|agb\|nutzungsbedingungen\|datenschutz\|widerruf |
162
+ | `get_urheberrecht` | — (maps `/llms-urheberrecht.txt`) |
163
+ | `get_copyright` | — |
164
+ | `get_impressum` | — |
165
+ | `get_agb` | — (www-URL) |
166
+ | `get_nutzungsbedingungen` | — (www-URL) |
167
+ | `get_datenschutz` | — (www-URL) |
168
+ | `get_widerruf` | — (www-URL) |
169
+
170
+ Präfix immer `ikeytz-maps-mcp` (z. B. `ikeytz-maps-mcp find_by_plz --plz=71638`).
143
171
 
144
172
  ## MCP hosts (any client — not only Cursor / Claude)
145
173
 
@@ -185,7 +213,7 @@ www bleibt **zweiter** Eintrag:
185
213
 
186
214
  `ikeytz-maps-mcp get_service_area --slug=pattonville`, `ikeytz-maps-mcp list_service_areas`, … — ohne MCP-Host.
187
215
 
188
- Alle Optionen nutzen dieselbe SSOT: `https://maps.ikeytz.com/mcp` (7 Tools, read/link only).
216
+ Alle Optionen nutzen dieselbe SSOT: `https://maps.ikeytz.com/mcp` (read/link only, HTTP = WebMCP = CLI).
189
217
 
190
218
  ## Env
191
219
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ikeytz/maps-mcp",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
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",
package/src/cli.js CHANGED
@@ -1,7 +1,83 @@
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
+ "doc",
19
+ ];
20
+ const NUMBER_FLAGS = new Set(["offset", "limit", "lat", "lng", "radius_km"]);
21
+
22
+ function globalCliFlagsLines() {
23
+ return [
24
+ "Global CLI flags (every tool — not sent to MCP)",
25
+ " -h, --help, -help per-tool help (offline)",
26
+ " --raw JSON structuredContent",
27
+ " --show-mcp-command curl 1a/1b/2 only — no MCP call (alias: --show-mcp-befehl)",
28
+ " --json '{…}' raw MCP arguments",
29
+ "",
30
+ "Default tool output payload only (no ok/tool/meta envelope)",
31
+ " --name=value --name value",
32
+ ];
33
+ }
34
+
35
+ function exampleForTool(name) {
36
+ const examples = {
37
+ get_service_area: "ikeytz-maps-mcp get_service_area --slug=pattonville",
38
+ get_discovery: "ikeytz-maps-mcp get_discovery --which=llms-urheberrecht",
39
+ find_by_plz: "ikeytz-maps-mcp find_by_plz --plz=71638",
40
+ get_legal: "ikeytz-maps-mcp get_legal --doc=urheberrecht",
41
+ get_urheberrecht: "ikeytz-maps-mcp get_urheberrecht",
42
+ get_agb: "ikeytz-maps-mcp get_agb",
43
+ get_nutzungsbedingungen: "ikeytz-maps-mcp get_nutzungsbedingungen",
44
+ get_lage: "ikeytz-maps-mcp get_lage --slug=pattonville",
45
+ };
46
+ return examples[name] || `ikeytz-maps-mcp ${name}`;
47
+ }
48
+
49
+ function formatToolHelp(tool) {
50
+ const schema = tool.inputSchema || { type: "object", properties: {} };
51
+ const props = schema.properties || {};
52
+ const req = new Set(schema.required || []);
53
+ const lines = [tool.name, tool.description || "", "", "Arguments"];
54
+ const keys = Object.keys(props);
55
+ if (!keys.length) {
56
+ lines.push(" (none)");
57
+ } else {
58
+ for (const key of keys) {
59
+ const p = props[key] || {};
60
+ const type = p.enum ? p.enum.join("|") : p.type || "any";
61
+ const star = req.has(key) ? "*" : " ";
62
+ lines.push(` ${star} --${key.padEnd(16)} ${type}`);
63
+ }
64
+ if (req.size) {
65
+ lines.push("");
66
+ lines.push(" * required");
67
+ }
68
+ }
69
+ lines.push("");
70
+ lines.push("CLI flags (not sent to MCP)");
71
+ lines.push(" -h, --help, -help this help (offline, no MCP call)");
72
+ lines.push(" --raw JSON structuredContent");
73
+ lines.push(" --show-mcp-command curl 1a/1b/2 only — no MCP call (alias: --show-mcp-befehl)");
74
+ lines.push("");
75
+ lines.push("Examples");
76
+ lines.push(` ${exampleForTool(tool.name)}`);
77
+ lines.push(` ikeytz-maps-mcp ${tool.name} -h`);
78
+ lines.push(` ikeytz-maps-mcp ${tool.name} --show-mcp-command`);
79
+ return `${lines.join("\n")}\n`;
80
+ }
5
81
 
6
82
  const HELP = `ikeytz-maps-mcp ${packageVersion()}
7
83
  Remote: ${mapsMcpUrl()}
@@ -10,24 +86,23 @@ Nur maps. Nicht @ikeytz/mcp / www.
10
86
  Ohne Args stdio-Proxy (Cursor/Claude)
11
87
  help | --help diese Hilfe
12
88
  --version Version
13
- update npm i -g @ikeytz/maps-mcp@latest
14
- list 7 Tools (offline)
15
- describe <tool> Schema (offline)
89
+ update [ver] npm i -g @ikeytz/maps-mcp@latest
90
+ list ${toolNames().length} Tools (offline) + global CLI flags
91
+ list --global nur globale CLI-Flags (offline)
92
+ describe <tool> Args + Flags + Beispiele (offline)
16
93
  call <tool> … wie <tool> …
17
94
  <tool> Payload von maps /mcp
18
- <tool> -h Args (offline)
95
+ <tool> -h Args + CLI-Flags (offline)
19
96
  <tool> --show-mcp-command | --show-mcp-befehl
20
- <tool> --raw volles JSON-RPC
97
+ <tool> --raw JSON structuredContent
21
98
  <tool> --json '{…}'
22
99
 
100
+ ${globalCliFlagsLines().join("\n")}
101
+
23
102
  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
103
+ ${toolNames()
104
+ .map((n) => ` ${n}`)
105
+ .join("\n")}
31
106
  `;
32
107
 
33
108
  function parseArgv(argv) {
@@ -36,7 +111,8 @@ function parseArgv(argv) {
36
111
  for (let i = 0; i < argv.length; i++) {
37
112
  const a = argv[i];
38
113
  if (a === "--raw") flags.raw = true;
39
- else if (a === "-h" || a === "--help") flags.help = true;
114
+ else if (a === "--global") flags.global = true;
115
+ else if (a === "-h" || a === "--help" || a === "-help") flags.help = true;
40
116
  else if (a === "--version") flags.version = true;
41
117
  else if (a === "--show-mcp-command" || a === "--show-mcp-befehl") flags.showMcp = true;
42
118
  else if (a === "--json") flags.json = argv[++i] || "";
@@ -62,7 +138,7 @@ function argsFromFlags(flags) {
62
138
  if (flags.json) Object.assign(args, JSON.parse(flags.json));
63
139
  for (const key of TOOL_FLAGS) {
64
140
  if (flags[key] != null && flags[key] !== true) {
65
- args[key] = key === "offset" || key === "limit" ? Number(flags[key]) : String(flags[key]);
141
+ args[key] = NUMBER_FLAGS.has(key) ? Number(flags[key]) : String(flags[key]);
66
142
  }
67
143
  }
68
144
  return args;
@@ -181,14 +257,19 @@ export async function main(argv) {
181
257
  return;
182
258
  }
183
259
  if (cmd === "update") {
260
+ const ver = positionals[1] ? String(positionals[1]).replace(/^@/, "") : "latest";
184
261
  await new Promise((resolve, reject) => {
185
- const child = spawn("npm", ["i", "-g", "@ikeytz/maps-mcp@latest"], { stdio: "inherit" });
262
+ const child = spawn("npm", ["i", "-g", `@ikeytz/maps-mcp@${ver}`], { stdio: "inherit" });
186
263
  child.on("exit", (code) => (code === 0 ? resolve() : reject(new Error(`npm exit ${code}`))));
187
264
  });
188
265
  return;
189
266
  }
190
267
  if (cmd === "list") {
191
- process.stdout.write(`${toolNames().join("\n")}\n`);
268
+ if (flags.global) {
269
+ process.stdout.write(`${globalCliFlagsLines().join("\n")}\n`);
270
+ return;
271
+ }
272
+ process.stdout.write(`${toolNames().join("\n")}\n\n${globalCliFlagsLines().join("\n")}\n`);
192
273
  return;
193
274
  }
194
275
  if (cmd === "describe") {
@@ -199,7 +280,7 @@ export async function main(argv) {
199
280
  process.exitCode = 1;
200
281
  return;
201
282
  }
202
- process.stdout.write(`${JSON.stringify(tool, null, 2)}\n`);
283
+ process.stdout.write(formatToolHelp(tool));
203
284
  return;
204
285
  }
205
286
 
@@ -212,7 +293,7 @@ export async function main(argv) {
212
293
  return;
213
294
  }
214
295
  if (flags.help) {
215
- process.stdout.write(`${tool.name}\n${tool.description}\n${JSON.stringify(tool.inputSchema, null, 2)}\n`);
296
+ process.stdout.write(formatToolHelp(tool));
216
297
  return;
217
298
  }
218
299
  const args = argsFromFlags(flags);
@@ -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,446 @@
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
+ }
435
+ },
436
+ {
437
+ "name": "get_legal",
438
+ "description": "Legal: urheberrecht|copyright|impressum (maps-Text) oder agb|nutzungsbedingungen|datenschutz|widerruf (www-URL).",
439
+ "inputSchema": {
440
+ "type": "object",
441
+ "properties": {
442
+ "doc": {
443
+ "type": "string",
444
+ "enum": [
445
+ "urheberrecht",
446
+ "copyright",
447
+ "impressum",
448
+ "agb",
449
+ "nutzungsbedingungen",
450
+ "datenschutz",
451
+ "widerruf"
452
+ ]
453
+ },
454
+ "offset": {
455
+ "type": "integer"
456
+ },
457
+ "limit": {
458
+ "type": "integer"
459
+ }
460
+ },
461
+ "required": [
462
+ "doc"
463
+ ]
464
+ }
465
+ },
466
+ {
467
+ "name": "get_urheberrecht",
468
+ "description": "Karten-Urheberrecht: maps /llms-urheberrecht.txt (HTML auf www).",
469
+ "inputSchema": {
470
+ "type": "object",
471
+ "properties": {
472
+ "offset": {
473
+ "type": "integer"
474
+ },
475
+ "limit": {
476
+ "type": "integer"
477
+ }
478
+ }
479
+ }
480
+ },
481
+ {
482
+ "name": "get_copyright",
483
+ "description": "Karten-Copyright EN: maps /llms-copyright.txt.",
484
+ "inputSchema": {
485
+ "type": "object",
486
+ "properties": {
487
+ "offset": {
488
+ "type": "integer"
489
+ },
490
+ "limit": {
491
+ "type": "integer"
492
+ }
493
+ }
494
+ }
495
+ },
496
+ {
497
+ "name": "get_impressum",
498
+ "description": "Impressum/Kontakt-Text: maps /llms-impressum-kontakt.txt.",
499
+ "inputSchema": {
500
+ "type": "object",
501
+ "properties": {
502
+ "offset": {
503
+ "type": "integer"
504
+ },
505
+ "limit": {
506
+ "type": "integer"
507
+ }
508
+ }
509
+ }
510
+ },
511
+ {
512
+ "name": "get_agb",
513
+ "description": "AGB: Link www.ikeytz.com/agb (HTML bleibt www, kein Preise-Corpus).",
514
+ "inputSchema": {
515
+ "type": "object",
516
+ "properties": {}
517
+ }
518
+ },
519
+ {
520
+ "name": "get_nutzungsbedingungen",
521
+ "description": "Nutzungsbedingungen: Link www (HTML bleibt www).",
522
+ "inputSchema": {
523
+ "type": "object",
524
+ "properties": {}
525
+ }
526
+ },
527
+ {
528
+ "name": "get_datenschutz",
529
+ "description": "Datenschutz: Link www (HTML bleibt www).",
530
+ "inputSchema": {
531
+ "type": "object",
532
+ "properties": {}
533
+ }
534
+ },
535
+ {
536
+ "name": "get_widerruf",
537
+ "description": "Widerruf: Link www (HTML bleibt www).",
538
+ "inputSchema": {
539
+ "type": "object",
540
+ "properties": {}
541
+ }
101
542
  }
102
543
  ]
103
544
  }