@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 +9 -0
- package/README.md +36 -8
- package/package.json +1 -1
- package/src/cli.js +100 -19
- package/src/tools-catalog.json +442 -1
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,
|
|
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.
|
|
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 #
|
|
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
|
|
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
|
-
|
|
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` (
|
|
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
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 = [
|
|
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
|
|
14
|
-
list
|
|
15
|
-
|
|
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
|
|
97
|
+
<tool> --raw JSON structuredContent
|
|
21
98
|
<tool> --json '{…}'
|
|
22
99
|
|
|
100
|
+
${globalCliFlagsLines().join("\n")}
|
|
101
|
+
|
|
23
102
|
Tools:
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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 === "
|
|
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
|
|
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",
|
|
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
|
-
|
|
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(
|
|
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(
|
|
296
|
+
process.stdout.write(formatToolHelp(tool));
|
|
216
297
|
return;
|
|
217
298
|
}
|
|
218
299
|
const args = argsFromFlags(flags);
|
package/src/tools-catalog.json
CHANGED
|
@@ -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
|
}
|