mcp-google-api 0.21.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/README.md ADDED
@@ -0,0 +1,316 @@
1
+ > [!CAUTION]
2
+ > ### 🚨 STRICTLY EXPERIMENTAL — PROOF OF CONCEPT (PRE-ALPHA)
3
+ >
4
+ > ![Status: Proof of Concept](https://img.shields.io/badge/Status-Proof_of_Concept-red?style=flat-square) ![Stage: Pre-Alpha](https://img.shields.io/badge/Stage-Pre--Alpha-critical?style=flat-square) ![Maintenance: Personal Use Only](https://img.shields.io/badge/Scope-Personal_Use_Only-important?style=flat-square) ![Issues: Closed](https://img.shields.io/badge/Issues_%26_PRs-Not_Accepted-inactive?style=flat-square)
5
+ >
6
+ > **PLEASE READ CAREFULLY BEFORE USING THIS SOFTWARE:**
7
+ >
8
+ > * **Very Early Stage:** This project is currently a raw **Proof of Concept (PoC)** in a **pre-alpha** state. It is nowhere near production-ready and may contain severe bugs, breaking changes, or incomplete logic.
9
+ > * **Personal Use Only:** This repository is developed, maintained, and shared strictly for **personal use**.
10
+ > * **No Support or Feature Requests:** Please **do not** open issues, bug reports, or feature requests. They will not be addressed or accepted at this stage of development.
11
+ > * **No Warranty:** This software is provided **"AS IS"**, without warranty of any kind, express or implied. You may use it strictly for **testing and evaluation purposes** at your own sole risk.
12
+
13
+ # mcp-google-api (0.21.0)
14
+
15
+ <p align="center">
16
+ <img src="https://img.shields.io/badge/node-%3E%3D24-339933?style=flat-square&logo=nodedotjs&logoColor=white" alt="Node.js >= 24">
17
+ <img src="https://img.shields.io/badge/typescript-5.7-3178C6?style=flat-square&logo=typescript&logoColor=white" alt="TypeScript 5.7">
18
+ <img src="https://img.shields.io/badge/license-GPL--3.0--only-491?style=flat-square" alt="License: GPL-3.0-only">
19
+ <img src="https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-6A7EC2?style=flat-square&logo=terminal&logoColor=white" alt="Platforms">
20
+ </p>
21
+
22
+ <p align="center">
23
+ <strong>MCP Google API — Google APIs for AI agents (stdio + Streamable HTTP)</strong><br>
24
+ A [Model Context Protocol](https://modelcontextprotocol.io) server that exposes **Google APIs** to AI agents, designed to host multiple Google API families over time. The first supported family is **Google Maps Platform**, providing 18 tools: Places API (New) search with **server-side filters** (`priceLevels`, `minRating`, `strictTypeFiltering`), raw API payload access, geocoding, directions, distance matrix, and more.
25
+
26
+ Supported transports: **stdio** (local MCP clients) and **Streamable HTTP**.
27
+
28
+ > Ships the **eatspot-discovery** agent skill (`src/resources/skills/`) for budget-, quality-, category-, and schedule-validated venue search.
29
+
30
+ </p>
31
+
32
+ <p align="center">
33
+ <a href="#feature-highlights">Feature Highlights</a> |
34
+ <a href="#requirements">Requirements</a> |
35
+ <a href="#install">Install / Uninstall</a> |
36
+ <a href="#quick-start">Quick Start</a> |
37
+ <a href="#command-line-interface">CLI</a> |
38
+ <a href="#registering-in-an-mcp-client">MCP Clients</a> |
39
+ <a href="#documentation">Docs</a>
40
+ </p>
41
+ <p align="center">
42
+ <br>
43
+ 🚧 <strong>DRAFT:</strong> Proof-of-Concept (PoC) Version 📝 - Work in Progress 🏗️ 🚧<br>
44
+ ⚠️ <strong>IMPORTANT NOTICE</strong>: Created with <a href="https://www.npmjs.com/package/pi-usereq"><strong>PI-useReq/pi-usereq</strong></a> 🤖✨ ⚠️<br>
45
+ <br>
46
+ </p>
47
+
48
+
49
+ ## Feature Highlights
50
+
51
+ - **Google API tool surface** — 18 **Google Maps** tools today (the first supported API family), ready to grow with further Google API families: geocoding, reverse geocoding, Places API (New) text/nearby search, place details, directions, distance matrix, elevation, timezone, weather, air quality, static maps, batch geocode, plus composite tools (explore-area, plan-route, compare-places, search-along-route, local-rank-tracker). Full catalog: [docs/TOOLS.md](docs/TOOLS.md).
52
+ - **Server-side Places filters** — `priceLevels`, `minRating`, `openNow`, `includedType`, `strictTypeFiltering`, and location bias are forwarded to Places API (New) as request fields by `maps_search_places`; in `maps_search_nearby`, `openNow` and `minRating` are applied after the query, so filters can return fewer than 20 results.
53
+ - **Raw API payloads** — searches and details can return the untouched Google response (`includeRaw: true`) with explicit Field Masks.
54
+ - **Two transports** — stdio for local MCP clients (pi, Claude Desktop, Cursor, ...) and Streamable HTTP at `/mcp` with per-session API keys.
55
+ - **Per-request credentials** — key resolution from `X-Google-Maps-API-Key` or `Authorization: Bearer` headers, per-session keys, or the persisted `api-key` setting; one-shot CLI commands (`exec`, `doctor --live`, `batch-geocode`) read `--apikey` (default: `GOOGLE_MAPS_API_KEY` environment).
56
+ - **Standalone CLI** — `doctor` self-checks, `exec <tool>` one-shot calls, `batch-geocode` with bounded concurrency.
57
+ - **Automatic update check** — at server startup the server compares its version against the latest npm release and prints an upgrade notice on stderr; it never blocks startup and can be disabled with `mcp-google-api auto-update disable` (persisted `autoUpdate` setting; see [Configuration prerequisites](#configuration-prerequisites)).
58
+ - **EatSpot Discovery skill** — server-side `priceLevels`/`minRating`/`strictTypeFiltering` filters and raw payloads back the bundled `eatspot-discovery` skill (`src/resources/skills/`).
59
+
60
+ ## Requirements
61
+
62
+ - Node.js **>= 24**
63
+ - A **Google Maps API key** (<https://console.cloud.google.com/apis/credentials>) with the services enabled — see below
64
+
65
+ ## Required Google Cloud APIs
66
+
67
+ Mapping verified against the sources: every endpoint the server calls and the tools that call it. The table below covers the **Google Maps family** — the first supported API family; further Google API families will extend this table with the same enable → key → tools pattern.
68
+
69
+ | # | API to enable | Endpoint used by the server | Tools that require it | Needed for | Skill priority |
70
+ |---|---|---|---|---|---|
71
+ | 1 | **Places API (New)** | `places.googleapis.com` (`places:searchText`, `places:searchNearby`, `GET places/{id}`, photo media) via `@googlemaps/places` | `maps_search_places`, `maps_search_nearby`, `maps_place_details`, `maps_explore_area`, `maps_compare_places`, `maps_search_along_route`, `maps_local_rank_tracker` | Place search/details, `priceLevels`/`minRating` filters, `priceRange`, opening hours | **Required** |
72
+ | 2 | **Geocoding API** | `maps.googleapis.com/maps/api/geocode/json` via `@googlemaps/google-maps-services-js` | `maps_geocode`, `maps_reverse_geocode`, `maps_batch_geocode` (+ internal address-resolution fallback) | Address ↔ coordinate conversion | High |
73
+ | 3 | **Routes API** | `routes.googleapis.com` (`computeRoutes`, `computeRouteMatrix`) | `maps_directions`, `maps_distance_matrix`, `maps_plan_route` | Routes and distance matrix | Medium |
74
+ | 4 | **Time Zone API** | `maps.googleapis.com/maps/api/timezone/json` | `maps_timezone` | Time zone / local time | Low |
75
+ | 5 | **Maps Elevation API** *(in the console: "Maps Elevation API", service `elevation-backend`)* | `maps.googleapis.com/maps/api/elevation/json` | `maps_elevation` | Ground elevation | Low |
76
+ | 6 | **Maps Static API** | `maps.googleapis.com/maps/api/staticmap` | `maps_static_map` | PNG map image | Low |
77
+ | 7 | **Weather API** | `weather.googleapis.com/v1` (current, forecast/days, forecast/hours) | `maps_weather` | Current weather / forecasts | Low (regional availability) |
78
+ | 8 | **Air Quality API** | `airquality.googleapis.com/v1/currentConditions:lookup` | `maps_air_quality` | Air quality | Low (regional availability) |
79
+
80
+ Quick enablement (current GCP project):
81
+
82
+ ```bash
83
+ PROJECT=your-project
84
+ gcloud services enable places-backend-new.googleapis.com \
85
+ geocoding-backend.googleapis.com \
86
+ routes.googleapis.com \
87
+ timezone-backend.googleapis.com \
88
+ elevation-backend.googleapis.com \
89
+ static-maps-backend.googleapis.com \
90
+ weather-backend.googleapis.com \
91
+ airquality.googleapis.com --project=$PROJECT
92
+ ```
93
+
94
+ ### Notes
95
+
96
+ - For minimal eatspot-discovery use, **Places API (New)** + **Geocoding API** suffice; enable the others only for the corresponding tools (or limit exposure with `GOOGLE_MAPS_ENABLED_TOOLS`).
97
+ - **Maps Grounding Lite** and **Geolocation API** are **not required** by this server: the former belongs to Google's hosted MCP (`mapstools.googleapis.com`), the latter is used by no tool (there is no `ip_geolocate` in this fork).
98
+ - The legacy **Places API** is not needed: the server uses Places API (New) exclusively.
99
+ - Weather API and Air Quality API have limited regional coverage: outside coverage, the tool returns an unsupported-location error message.
100
+
101
+
102
+ ## Install
103
+
104
+ **Prerequisites**: Node.js **>= 24** and a Google Maps API key (see [Requirements](#requirements)).
105
+
106
+ ### Prebuilt package (recommended)
107
+
108
+ ```bash
109
+ npm install -g mcp-google-api
110
+ mcp-google-api api-key "AIza..." # persist the Google API key at ~/.config/mcp-google-api/config.json (masked in output)
111
+ mcp-google-api doctor # local self-check: Node, package, key, config (no network)
112
+ mcp-google-api start --stdio # MCP server over stdio
113
+ mcp-google-api start # MCP server over Streamable HTTP at http://127.0.0.1:3000/mcp
114
+ ```
115
+
116
+ One-shot alternative without a global install: `npx -y mcp-google-api start --stdio`.
117
+
118
+ > The server resolves its key exclusively from the persisted `api-key` setting (see [Configuration prerequisites](#configuration-prerequisites)). One-shot CLI commands (`exec`, `doctor --live`, `batch-geocode`) can instead read `GOOGLE_MAPS_API_KEY` from the environment or a `.env` scaffolded with `mcp-google-api setup --write-env`.
119
+
120
+ ### From source (this repository) — cross-platform, no bash required
121
+
122
+ ```bash
123
+ git clone https://github.com/Ogekuri/mcp-google-api.git
124
+ cd mcp-google-api
125
+ npm ci # install dependencies from the lockfile
126
+ npm run build # tsup -> dist/ (ESM)
127
+ node dist/cli.js start --stdio # MCP server over stdio
128
+ node dist/cli.js start --host 127.0.0.1 --port 3000 # Streamable HTTP at /mcp
129
+ ```
130
+
131
+ On Linux/macOS the bash helpers in `scripts/` wrap the same commands (`scripts/setup.sh`, `scripts/build.sh`, `scripts/start-mcp.sh`, `scripts/start-http.sh`, `scripts/test.sh`); each helper fails with remediation guidance instead of chaining implicit installs or builds. `scripts/mcp-google-api.sh` runs the local copy exactly like the installed bin — every argument is forwarded to the local `dist/cli.js` (e.g. `scripts/mcp-google-api.sh doctor`). On Windows use the `npm`/`node` commands above.
132
+
133
+ MCP client registration over stdio works cross-platform with plain `node` (no key is embedded: the server loads its key from the persisted `api-key` setting at startup):
134
+
135
+ ```json
136
+ {
137
+ "mcpServers": {
138
+ "mcp-google-api": {
139
+ "command": "node",
140
+ "args": ["/absolute/path/to/mcp-google-api/dist/cli.js", "start", "--stdio"]
141
+ }
142
+ }
143
+ }
144
+ ```
145
+
146
+ ## Uninstall
147
+
148
+ ```bash
149
+ mcp-google-api uninstall # remove MCP registrations + skills from every enabled CLI
150
+ npm uninstall -g mcp-google-api # npm-based install
151
+ rm -rf mcp-google-api # from-source clone; also remove any MCP client registration
152
+ ```
153
+
154
+ ## Quick Start
155
+
156
+ The [prebuilt-package path](#install) is the recommended Quick Start: install, `api-key "AIza..."`, `doctor`, run. Registration snippets for any client are one command away (JSON on stdout, no files written):
157
+
158
+ ```bash
159
+ mcp-google-api snippet --client claude # stdio snippet (npx launcher)
160
+ mcp-google-api snippet --client pi --env-key GOOGLE_MAPS_API_KEY # ${VAR} reference (client-specific expansion)
161
+ mcp-google-api snippet --transport http --port 3100 # HTTP URL snippet
162
+ ```
163
+
164
+ > **Loopback default (migration)**: the HTTP server now binds to `127.0.0.1` by default; it previously bound `0.0.0.0`. To listen on all interfaces pass `--host 0.0.0.0` or set `MCP_SERVER_HOST=0.0.0.0`. In HTTP mode, `SIGINT`/`SIGTERM` close all sessions and the listening socket before exit.
165
+
166
+ ## Command-line interface
167
+
168
+ All commands work through the `mcp-google-api` binary (npm install) or `node dist/cli.js` (from source).
169
+
170
+ ```bash
171
+ mcp-google-api start --stdio # MCP server over stdio
172
+ mcp-google-api start --host 127.0.0.1 --port 3000 # MCP server over Streamable HTTP at /mcp (loopback default)
173
+ mcp-google-api setup --write-env # onboarding: readiness checks + .env scaffold (no network, no prompts)
174
+ mcp-google-api doctor # local self-check: Node, package, key, config, tool profiles (no network)
175
+ mcp-google-api doctor --live --apikey "AIza..." # also probes Geocoding, Places (New), Routes (billable calls)
176
+ mcp-google-api doctor --live --probes geocoding,routes # probe only the selected APIs
177
+ mcp-google-api exec geocode '{"address":"Tokyo Tower"}' # one tool call from the terminal
178
+ mcp-google-api batch-geocode -i addresses.txt -o results.json
179
+ mcp-google-api enable pi claude # enable MCP registration + skills for specific CLIs
180
+ mcp-google-api api-key "AIza..." # save the API key in the user settings and refresh every enabled CLI registration
181
+ mcp-google-api install # register the stdio server and install skills in every enabled CLI
182
+ mcp-google-api install --debug-skills # also append each skill's packaged debug overlay to the installed SKILL.md
183
+ mcp-google-api uninstall # reciprocal removal of install in every enabled CLI
184
+ mcp-google-api show # CLI Configuration and Installation Status tables
185
+ mcp-google-api auto-update disable # disable the startup update check (enable|disable|1|0)
186
+ mcp-google-api --env-file /path/to/.env doctor # load an explicit environment file
187
+ mcp-google-api snippet --client cursor # print an MCP client registration snippet (no files written)
188
+ mcp-google-api --ver # print installed, npmjs-latest, and GitHub-latest versions
189
+ mcp-google-api --upgrade # npm install -g mcp-google-api@latest, then refresh skills
190
+ mcp-google-api --uninstall # npm uninstall -g mcp-google-api
191
+ ```
192
+
193
+ - `exec <tool> [params]` runs one tool and prints JSON; `params` is a JSON string. Tool names accept short (`geocode`), snake_case (`search_places`), and `maps_`-prefixed (`maps_geocode`) forms.
194
+ - `exec` writes results to stdout and errors to stderr; it exits 1 when no API key is configured, the tool reports a failure, the JSON is invalid, or the tool name is unknown.
195
+ - `batch-geocode` reads one address per line from `--input` (use `-` for stdin), geocodes with bounded concurrency (`--concurrency`, default 20, clamped to 1–50), writes a JSON summary `{ total, succeeded, failed, results }` to `--output` or stdout, and exits 1 if any address failed.
196
+ - `setup` is non-interactive: no prompts, no Google API calls, and no writes unless `--write-env` is passed; `--write-env` creates `.env` in `--env-dir` (default: current directory) only when it does not exist and never overwrites it.
197
+ - `snippet` prints a valid `mcpServers` JSON registration to stdout (guidance notes on stderr) and never writes or edits configuration files; by default it embeds a literal placeholder, and `--env-key NAME` emits a `${NAME}` reference whose expansion is client-specific.
198
+ - `--env-file <path>` loads exactly the given environment file for any command and exits 1 with a JSON error when the file is missing (no implicit `.env` fallback).
199
+ - `enable <cli>` / `disable <cli>` manage the persisted enabled-CLI set at `~/.config/mcp-google-api/config.json`; accepted names (case-insensitive): `pi`, `openclaw`, `codex`, `antigravity`, `claude`; unsupported names exit 2 listing the supported ones.
200
+ - `api-key <key>` validates the key (20-50 characters of letters, digits, hyphens, underscores), saves it as `apiKey` in the persisted settings at `~/.config/mcp-google-api/config.json` (masked in the JSON output), and immediately re-runs `install` for every enabled CLI; invalid keys fail with a JSON error and persist nothing.
201
+ - `install` registers for every enabled CLI the stdio server entry `mcp-google-api` (`npx -y mcp-google-api start --stdio`) with **no embedded key or environment setup** — the registered server loads its key at startup from the persisted `api-key` setting — and installs every bundled skill; `uninstall` is the reciprocal removal. Per-CLI targets: pi `~/.pi/agent/mcp.json` + `~/.pi/agent/skills`, openclaw `~/.openclaw/openclaw.json` + `~/.openclaw/workspace/skills`, codex `~/.codex/config.toml` (`mcp_servers` table) + `~/.codex/skills`, antigravity `~/.gemini/settings.json` + `~/.gemini/config/skills`, claude `~/.claude.json` + `~/.claude/skills`. Existing unrelated configuration entries are always preserved.
202
+ - `install --debug-skills` appends each skill's packaged debug overlay (declared by the manifest `debug` field, e.g. `eatspot-discovery/DEBUG.md`) to the installed `SKILL.md`; without the flag the debug file is neither copied nor appended, so installed skills carry no debug instructions. `--upgrade` and `api-key` always reinstall without the overlay, and `show` reports `OK` for skills installed in either mode.
203
+ - `show` prints two human-readable tables: CLI Configuration (CLI, Enabled, MCP Config Path, Skills Config Path for all five CLIs) and Installation Status (Type, Name, CLI, Enabled, Installed with OK/MISSING/STALE per enabled CLI).
204
+ - `auto-update <state>` accepts `enable`, `disable`, `1`, `0` (case-insensitive), persists the boolean into the settings `autoUpdate` field before printing a human-readable confirmation, and rejects any other value with a stderr error, persisting nothing.
205
+ - HTTP mode starts even without an API key and logs a warning (per-request header keys remain supported); `start`/`run` resolve the server key exclusively from the persisted `api-key` setting — stdio mode exits 1 with a JSON error on stderr inviting `mcp-google-api api-key <key>` when no key is configured. One-shot CLI commands (`exec`, `doctor --live`, `batch-geocode`) take the key from `--apikey` (default: `GOOGLE_MAPS_API_KEY` environment/`.env`). When no HTTP instance can start (invalid or taken port), the process exits non-zero.
206
+
207
+ ## Registering in an MCP client
208
+
209
+ Generate the registration JSON with `mcp-google-api snippet --client <generic|claude|cursor|pi>` (see [Quick Start](#quick-start)), then paste it into the target file. Manual examples:
210
+
211
+ **stdio:"
212
+
213
+ ```json
214
+ {
215
+ "mcpServers": {
216
+ "mcp-google-api": {
217
+ "command": "/absolute/path/to/mcp-google-api/scripts/start-mcp.sh"
218
+ }
219
+ }
220
+ }
221
+ ```
222
+
223
+ No key is embedded in the registration: the server loads its key at startup from the persisted `mcp-google-api api-key` setting.
224
+
225
+ **HTTP** (after `scripts/start-http.sh`):
226
+
227
+ ```json
228
+ {
229
+ "mcpServers": {
230
+ "mcp-google-api": {
231
+ "url": "http://127.0.0.1:3000/mcp"
232
+ }
233
+ }
234
+ }
235
+ ```
236
+
237
+ ### pi CLI
238
+
239
+ pi reads MCP servers from `~/.pi/agent/mcp.json` (user) or `.pi/mcp.json` (project, requires trust). stdio entry for this server:
240
+
241
+ ```json
242
+ {
243
+ "mcpServers": {
244
+ "maps": {
245
+ "command": "node",
246
+ "args": ["/absolute/path/to/mcp-google-api/dist/cli.js", "start", "--stdio"]
247
+ }
248
+ }
249
+ }
250
+ ```
251
+
252
+ - From a terminal: `pi mcp add maps -- node /absolute/path/to/mcp-google-api/dist/cli.js start --stdio`.
253
+ - The registration carries no key: configure the server once with `mcp-google-api api-key <key>` (persisted setting); an optional `"env": { "GOOGLE_MAPS_API_KEY": "${GOOGLE_MAPS_API_KEY}" }` block expands the environment variable client-side if you prefer per-client key injection for one-shot CLI use.
254
+ - After editing `mcp.json` outside the session, run `/reload` in pi; `/mcp` inspects status, tools, and connection errors.
255
+ - Tools appear with the `mcp__<server>__` prefix: `mcp__maps__maps_geocode`, `mcp__maps__maps_search_places`, ...
256
+
257
+ ### OpenClaw
258
+
259
+ OpenClaw manages MCP servers in `~/.openclaw/openclaw.json` through its CLI (verified on OpenClaw 2026.4.21):
260
+
261
+ ```bash
262
+ openclaw mcp set maps '{"command":"node","args":["/absolute/path/to/mcp-google-api/dist/cli.js","start","--stdio"],"description":"Google APIs (Maps family): Places API (New), geocoding, routes, weather"}'
263
+ ```
264
+
265
+ - Without a local install: use `"command":"npx","args":["-y","mcp-google-api","start","--stdio"]` (runs the published npm package).
266
+ - After the change, reload the gateway or restart the agent session so the new server gets connected.
267
+ - Inspect and remove: `openclaw mcp list`, `openclaw mcp show maps`, `openclaw mcp unset maps`.
268
+ - The OpenClaw agent can install and configure the server on its own (shell + `openclaw mcp set`); creating the API key in Google Cloud Console remains a human task.
269
+
270
+ ### Configuration prerequisites
271
+
272
+ 1. **A single API key**: create it at <https://console.cloud.google.com/apis/credentials>, enable the services listed in the [Required Google Cloud APIs](#required-google-cloud-apis) table, and persist it with `mcp-google-api api-key "AIza..."` — the only configuration path the server reads at startup.
273
+ 2. **Minimal operational subset**: Places API (New) + Geocoding API; enable the other services only for the tools you use.
274
+ 3. **Restrict exposure**: `GOOGLE_MAPS_ENABLED_TOOLS=maps_geocode,maps_search_places,maps_place_details` reduces the registered tools (and the LLM context).
275
+ 4. **Post-install verification**: `mcp-google-api doctor` (no network calls), then `mcp-google-api doctor --live --apikey "AIza..."` (real probes against Geocoding, Places, and Routes).
276
+ 5. **Automatic update check**: enabled by default at server startup; disable or re-enable with `mcp-google-api auto-update <disable|enable>` (also `1`/`0`), persisted as the `autoUpdate` field of `~/.config/mcp-google-api/config.json`.
277
+
278
+ ## Project structure
279
+
280
+ ```
281
+ mcp-google-api/
282
+ ├── src/ # MCP server sources
283
+ │ ├── cli.ts # entry point (stdio/HTTP, exec and doctor commands)
284
+ │ ├── config.ts # registration of the exposed tools
285
+ │ ├── core/ # BaseMcpServer: MCP SDK, stdio + Streamable HTTP
286
+ │ ├── services/ # Places API (New), Geocoding, Routes, environment
287
+ │ ├── tools/ # definition of the 18 MCP tools
288
+ │ └── utils/ # API key resolution, request context, update check
289
+ ├── scripts/ # helper bash scripts (setup/build/start/test) + mcp-google-api.sh local launcher
290
+ ├── docs/ # project documentation
291
+ └── tests/ # unit tests (mocked) + smoke/e2e (real API key)
292
+ ```
293
+
294
+ ## Documentation
295
+
296
+ - [docs/TOOLS.md](docs/TOOLS.md) — tool catalog and parameters
297
+ - [docs/CONFIGURATION.md](docs/CONFIGURATION.md) — environment variables, transports, API key
298
+ - [src/resources/skills/](src/resources/skills/) — bundled `eatspot-discovery` agent skill (budget filters, FieldMask, raw payload)
299
+
300
+ ## Development
301
+
302
+ ```bash
303
+ npm ci # install dependencies from the lockfile
304
+ npm run verify # single pipeline: typecheck + unit tests + build
305
+ npm run dev # incremental watch build
306
+ npm run typecheck # tsc --noEmit
307
+ npm test # unit tests
308
+ ```
309
+
310
+ ## License
311
+
312
+ GPL-3.0-only — see [LICENSE](LICENSE).
313
+
314
+ ## Acknowledgments
315
+
316
+ Special thanks to **CabLate** for the upstream contribution that seeded this project.