@honua/mcp-server 0.0.20-alpha.0 → 0.1.0-beta.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.
Files changed (92) hide show
  1. package/README.md +92 -15
  2. package/certification/geospatial-mcp-schemas/PROVENANCE.md +15 -7
  3. package/certification/geospatial-mcp-schemas/conformance/manifest.schema.json +6 -0
  4. package/certification/geospatial-mcp-schemas/index.json +88 -9
  5. package/certification/geospatial-mcp-schemas/tools/apply_style_preset.schema.json +13 -9
  6. package/certification/geospatial-mcp-schemas/tools/buffer_features.schema.json +60 -0
  7. package/certification/geospatial-mcp-schemas/tools/edit_features.schema.json +74 -0
  8. package/certification/geospatial-mcp-schemas/tools/export_dataset.schema.json +60 -0
  9. package/certification/geospatial-mcp-schemas/tools/geocode_addresses.schema.json +34 -0
  10. package/certification/geospatial-mcp-schemas/tools/get_style.schema.json +13 -3
  11. package/certification/geospatial-mcp-schemas/tools/ingest_dataset.schema.json +45 -0
  12. package/certification/geospatial-mcp-schemas/tools/join_features.schema.json +73 -0
  13. package/certification/geospatial-mcp-schemas/tools/overlay_features.schema.json +53 -0
  14. package/certification/geospatial-mcp-schemas/tools/query_features.schema.json +20 -0
  15. package/certification/geospatial-mcp-schemas/tools/render_map.schema.json +5 -0
  16. package/certification/geospatial-mcp-schemas/tools/reproject_features.schema.json +49 -0
  17. package/certification/geospatial-mcp-schemas/tools/summarize_statistics.schema.json +71 -0
  18. package/dist/src/capability.d.ts +48 -0
  19. package/dist/src/capability.d.ts.map +1 -0
  20. package/dist/src/capability.js +44 -0
  21. package/dist/src/certification/census-data.d.ts +33 -0
  22. package/dist/src/certification/census-data.d.ts.map +1 -0
  23. package/dist/src/certification/census-data.js +506 -0
  24. package/dist/src/certification/census-fixture-client.d.ts +7 -0
  25. package/dist/src/certification/census-fixture-client.d.ts.map +1 -0
  26. package/dist/src/certification/census-fixture-client.js +226 -0
  27. package/dist/src/certification/certifier.d.ts +7 -1
  28. package/dist/src/certification/certifier.d.ts.map +1 -1
  29. package/dist/src/certification/certifier.js +52 -7
  30. package/dist/src/certification/cli.js +19 -4
  31. package/dist/src/certification/contracts.d.ts +41 -0
  32. package/dist/src/certification/contracts.d.ts.map +1 -1
  33. package/dist/src/certification/contracts.js +71 -0
  34. package/dist/src/certification/fixtures.d.ts +13 -0
  35. package/dist/src/certification/fixtures.d.ts.map +1 -1
  36. package/dist/src/certification/fixtures.js +28 -0
  37. package/dist/src/certification/json-schema.d.ts +23 -1
  38. package/dist/src/certification/json-schema.d.ts.map +1 -1
  39. package/dist/src/certification/json-schema.js +10 -2
  40. package/dist/src/certification/lifecycle.d.ts +14 -0
  41. package/dist/src/certification/lifecycle.d.ts.map +1 -0
  42. package/dist/src/certification/lifecycle.js +326 -0
  43. package/dist/src/certification/operator-catalog.d.ts +8 -0
  44. package/dist/src/certification/operator-catalog.d.ts.map +1 -1
  45. package/dist/src/certification/operator-catalog.js +189 -5
  46. package/dist/src/certification/report.d.ts.map +1 -1
  47. package/dist/src/certification/report.js +13 -0
  48. package/dist/src/certification/run.d.ts.map +1 -1
  49. package/dist/src/certification/run.js +1 -0
  50. package/dist/src/certification/schema-index.d.ts +25 -0
  51. package/dist/src/certification/schema-index.d.ts.map +1 -1
  52. package/dist/src/certification/schema-index.js +27 -0
  53. package/dist/src/certification/target.d.ts +9 -1
  54. package/dist/src/certification/target.d.ts.map +1 -1
  55. package/dist/src/certification/target.js +54 -2
  56. package/dist/src/eval/cli.js +4 -2
  57. package/dist/src/eval/corpus.d.ts +7 -0
  58. package/dist/src/eval/corpus.d.ts.map +1 -1
  59. package/dist/src/eval/corpus.js +16 -0
  60. package/dist/src/eval/drivers/deterministic.d.ts.map +1 -1
  61. package/dist/src/eval/drivers/deterministic.js +13 -0
  62. package/dist/src/eval/grade.d.ts.map +1 -1
  63. package/dist/src/eval/grade.js +20 -1
  64. package/dist/src/eval/report.d.ts +5 -0
  65. package/dist/src/eval/report.d.ts.map +1 -1
  66. package/dist/src/eval/report.js +3 -0
  67. package/dist/src/eval/runner.d.ts +6 -0
  68. package/dist/src/eval/runner.d.ts.map +1 -1
  69. package/dist/src/eval/runner.js +21 -7
  70. package/dist/src/eval/standalone-corpus.d.ts +3 -0
  71. package/dist/src/eval/standalone-corpus.d.ts.map +1 -0
  72. package/dist/src/eval/standalone-corpus.js +699 -0
  73. package/dist/src/eval/types.d.ts +25 -0
  74. package/dist/src/eval/types.d.ts.map +1 -1
  75. package/dist/src/index.d.ts +29 -5
  76. package/dist/src/index.d.ts.map +1 -1
  77. package/dist/src/index.js +41 -21
  78. package/dist/src/provenance.d.ts +44 -0
  79. package/dist/src/provenance.d.ts.map +1 -0
  80. package/dist/src/provenance.js +37 -0
  81. package/dist/src/resources/styles.d.ts.map +1 -1
  82. package/dist/src/resources/styles.js +36 -3
  83. package/dist/src/styles.d.ts +2 -0
  84. package/dist/src/styles.d.ts.map +1 -1
  85. package/dist/src/styles.js +29 -3
  86. package/dist/src/tools/apply-style-preset.d.ts.map +1 -1
  87. package/dist/src/tools/apply-style-preset.js +14 -2
  88. package/dist/src/tools/get-style.d.ts.map +1 -1
  89. package/dist/src/tools/get-style.js +24 -13
  90. package/dist/src/tools/list-services.d.ts.map +1 -1
  91. package/dist/src/tools/list-services.js +16 -1
  92. package/package.json +11 -2
package/README.md CHANGED
@@ -1,45 +1,85 @@
1
1
  # `@honua/mcp-server`
2
2
 
3
- Model Context Protocol (MCP) server for Honua geospatial feature services.
3
+ The **platform-free** Model Context Protocol (MCP) server for geospatial feature
4
+ services. Point it at **any** public Esri FeatureServer or OGC API endpoint and it
5
+ exposes discovery, query, and analysis workflows to any MCP client — with **zero**
6
+ platform lock-in and no metering. Mapbox, CARTO, and Esri each ship an MCP server
7
+ bound to their own platform; this one is bound to none.
4
8
 
5
- This package exposes a focused MCP surface for discovery and query workflows on top of Honua's FeatureServer APIs.
9
+ **Release status: beta.** Tool contracts are certified against live and fixture
10
+ targets on every release; remaining pre-1.0 work is hardening, not surface change.
6
11
 
7
- ## Requirements
12
+ Two modes:
8
13
 
9
- - Node.js `>=20`
10
- - A reachable Honua server URL
14
+ - **Standalone (platform-free) — the front door.** The `honua-mcp` bin runs the
15
+ direct-SDK surface against any public FeatureServer/OGC endpoint. No Honua
16
+ server, no admin API, no `/mcp` catalog required.
17
+ - **Honua-enhanced — the upgrade path.** The `honua-mcp-proxy` bin bridges a
18
+ Honua deployment's full `/mcp` operator catalog (planning, async jobs,
19
+ publishing) to stdio. Honua does **not** expose an AI/MCP feature-mutation tool
20
+ — AI operational data editing is not supported (honua-server ADR-0028).
11
21
 
12
- ## Environment Variables
22
+ ## Requirements
13
23
 
14
- - `HONUA_BASE_URL` (required): absolute Honua base URL, for example `https://honua.example.com`
15
- - `HONUA_TRANSPORT` (optional): `grpc-web` (default) or `rest`
16
- - `HONUA_API_KEY` (optional): admin/API key when your deployment requires it
17
- - `HONUA_TIMEOUT_MS` (optional): request timeout in milliseconds (default `30000`)
18
- - `HONUA_RETRY_MAX_RETRIES` (optional): retry attempts for transient failures (default `2`)
24
+ - Node.js `>=20`
25
+ - Any reachable FeatureServer/OGC endpoint (public or Honua)
19
26
 
20
- When `HONUA_API_KEY` is configured, use `https://` for non-localhost servers.
27
+ ## Platform-free mode (any ArcGIS / OGC endpoint)
21
28
 
22
- ## Run Locally
29
+ Point `HONUA_BASE_URL` at any origin/folder that serves the standard GeoServices
30
+ REST paths (`/rest/services`, `/FeatureServer/{id}/query`). Example — the public
31
+ US Census 2020 apportionment FeatureServer on `services.arcgis.com`:
23
32
 
24
33
  ```bash
25
34
  npm install
26
35
  npm run build
27
- HONUA_BASE_URL="https://honua.example.com" HONUA_TRANSPORT="grpc-web" node dist/src/index.js
36
+ HONUA_BASE_URL="https://services.arcgis.com/P3ePLMYs2RVChkJx/arcgis" \
37
+ HONUA_TRANSPORT="rest" node dist/src/index.js
28
38
  ```
29
39
 
40
+ Tools that require a Honua-only surface (server-side styling via OGC API – Styles,
41
+ a `/rest/services` catalog) **degrade gracefully** on a plain endpoint: they
42
+ return a structured result
43
+
44
+ ```json
45
+ { "available": false, "surface": "OGC API - Styles", "reason": "…", "guidance": "…" }
46
+ ```
47
+
48
+ instead of crashing, hanging, or returning misleading empty data. This is the
49
+ same skip-with-reason honesty the certification suite uses.
50
+
51
+ ## Environment Variables
52
+
53
+ - `HONUA_BASE_URL` (required): absolute base URL — a public ArcGIS folder
54
+ (`https://services.arcgis.com/<org>/arcgis`) or a Honua deployment
55
+ (`https://honua.example.com`).
56
+ - `HONUA_TRANSPORT` (optional): `grpc-web` (default, Honua deployments) or `rest`.
57
+ Use `rest` for plain public ArcGIS/OGC endpoints.
58
+ - `HONUA_API_KEY` (optional): API key when your deployment requires it. Public
59
+ endpoints need none.
60
+ - `HONUA_TIMEOUT_MS` (optional): request timeout in milliseconds (default `30000`)
61
+ - `HONUA_RETRY_MAX_RETRIES` (optional): retry attempts for transient failures (default `2`)
62
+
63
+ When `HONUA_API_KEY` is configured, use `https://` for non-localhost servers.
64
+
30
65
  ## MCP Tools
31
66
 
32
- - `honua_list_services`
67
+ All read-only:
68
+
69
+ - `honua_list_services` — discover services (degrades if the target has no catalog)
33
70
  - `honua_describe_layer`
34
71
  - `honua_query_features`
35
72
  - `honua_count_features`
36
73
  - `honua_get_extent`
37
74
  - `honua_statistics`
75
+ - `honua_explain_capability_gap`
76
+ - `honua_get_style`, `honua_apply_style_preset` — structured-unavailable on a plain FeatureServer
38
77
 
39
78
  ## MCP Resources
40
79
 
41
80
  - `honua://services`
42
81
  - `honua://services/{encodedServiceId}/layers/{layerId}`
82
+ - `honua://styles`, `honua://styles/{styleId}` — structured-unavailable on a plain FeatureServer
43
83
 
44
84
  ## Certification
45
85
 
@@ -75,6 +115,26 @@ npm run test:certification # gate: runs harness tests + certifier, ex
75
115
  npm run test:certification:artifact # evidence: writes artifacts, always exits 0
76
116
  ```
77
117
 
118
+ ### Platform-free certification lane
119
+
120
+ A dedicated **standalone** target (`HONUA_MCP_CERT_TARGET=standalone`, or
121
+ `--target standalone`) certifies the platform-free surface against an in-process
122
+ fixture of a **plain public FeatureServer** — the recorded US Census 2020
123
+ apportionment layer from `services.arcgis.com`, with **no** Honua surfaces. It
124
+ proves the tools certify **green with honest skips** against a non-Honua endpoint:
125
+ the data tools round-trip against real recorded data, the Honua-only style tools
126
+ degrade to structured "not available" results, and the auth/mutation/job contracts
127
+ skip-with-reason. Fixture-backed and deterministic — no network.
128
+
129
+ ```bash
130
+ npm run certify:standalone # platform-free cert (plain FeatureServer fixture)
131
+ npm run test:certification:standalone # CI gate variant
132
+ ```
133
+
134
+ The fixture is recorded by `scripts/record-census-fixtures.mjs` into
135
+ `src/certification/census-data.ts`; the evaluator that replays it is verified for
136
+ parity against the live recordings in `test/certification/census-fixture-client.test.ts`.
137
+
78
138
  Artifacts are written to the package root as
79
139
  `mcp-certification-results.json` and `mcp-certification-results.md` (gitignored;
80
140
  uploaded by CI). To certify against a **live** honua-server, set `HONUA_BASE_URL`
@@ -147,6 +207,23 @@ by CI) record the per-model scorecard. The CI gate asserts the deterministic
147
207
  control passes every scenario; live cross-model runs are recorded but
148
208
  informational.
149
209
 
210
+ ### Platform-free semantic corpus (`src/eval/standalone-corpus.ts`)
211
+
212
+ The **standalone** corpus is 50+ scenarios run against the plain public
213
+ FeatureServer fixture (the census layer) with **semantic** grading — not just tool
214
+ trajectory. Each scenario asserts the *meaning* of the answer: correct feature
215
+ counts (52 rows, 4 states with ≥20 seats), correct geographic facts (California is
216
+ the most populous; Wyoming the least; the House totals 435 seats), correct tool
217
+ selection for ambiguous asks (count vs. query vs. statistics), refusal /
218
+ clarification behavior on ambiguous or unsupported requests, and anti-hallucination
219
+ guards. Because the fixture replays real recorded data, a wrong number or a
220
+ hallucinated place name fails. The grading taxonomy is documented in
221
+ [`evals/README.md`](evals/README.md).
222
+
223
+ ```bash
224
+ npm run eval:standalone # deterministic control over the census fixture (offline)
225
+ ```
226
+
150
227
  ### Live lane (paid, manual only)
151
228
 
152
229
  The **operator corpus** (`src/eval/operator-corpus.ts`, 8 harder scenarios) is
@@ -5,11 +5,17 @@ machine-readable schemas from the open **geospatial-mcp** standard.
5
5
 
6
6
  - **Source repo:** https://github.com/honua-io/geospatial-mcp
7
7
  - **Source path:** `spec/schemas/`
8
- - **Source commit:** `54cbd49a6b8bf408024fe4d0316f79b8fa0534ab`
9
- (`spec: align prose + served-family schemas to the honua-server /mcp grammar; harden strict manifest gate (#44)`)
10
- - **Schema index date:** `2026-07-01`
8
+ - **Source commit:** `eb53989cc61c856261cf017b4b5a8e721317dc41`
9
+ (`feat: direct geoprocessing verbs (analysis profile) + geometryPrecision/maxInlineBytes (#55)`)
10
+ - **Schema index date:** `2026-07-06`
11
11
  - **Dialect:** JSON Schema draft 2020-12
12
12
 
13
+ > The pin is deliberately held at `eb53989` (pre geospatial-mcp#58): the #58
14
+ > platform-ops schemas are marked implemented in the manifest but honua-server
15
+ > does not serve those tools yet, so re-vendoring past #58 would introduce
16
+ > conformance failures. The post-#58 bump is owned by honua-server#2555/#2566,
17
+ > which implement the new tools and vendor their schemas together.
18
+
13
19
  ## Why vendored
14
20
 
15
21
  The MCP certification harness (`src/certification/`) must run deterministically
@@ -19,10 +25,12 @@ a known, reproducible revision and removes any cross-repo fetch at certify time.
19
25
 
20
26
  ## Refreshing
21
27
 
22
- To re-pin to a newer published revision, re-copy `spec/schemas/` from the
23
- `geospatial-mcp` repo at the desired tag/commit and update the source commit and
24
- index date above. Do not hand-edit individual schema files; the standard is owned
25
- upstream.
28
+ To re-pin to a newer published revision, edit the **Source commit** SHA (and the
29
+ index date) above, then run `scripts/sync-schemas.sh --write` from the repo root
30
+ to re-copy `spec/schemas/` verbatim from that commit. Do not hand-edit individual
31
+ schema files; the standard is owned upstream. The `schema-sync` CI workflow
32
+ (`.github/workflows/schema-sync.yml`) runs `scripts/sync-schemas.sh` on every PR
33
+ and fails on any byte difference from the pinned commit.
26
34
 
27
35
  ## Index
28
36
 
@@ -23,6 +23,12 @@
23
23
  "isReferenceImplementation": {
24
24
  "type": "boolean",
25
25
  "description": "True only for the reference implementation named in /CONFORMANCE.md (Honua). Other implementations omit this or set it false."
26
+ },
27
+ "profiles": {
28
+ "type": "array",
29
+ "description": "Conformance profiles this implementation claims (default ['base'] when omitted). 'base' is the read-only floor; additive profiles such as 'mutation' require the implementation to advertise every tool the index assigns to that profile to reach FULL. See /CONFORMANCE.md §Conformance Profiles.",
30
+ "items": { "type": "string" },
31
+ "uniqueItems": true
26
32
  }
27
33
  }
28
34
  },
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "title": "geospatial-mcp JSON Schema index",
4
- "description": "Machine-readable map from standard MCP tool names and resource family URIs to their JSON Schema (draft 2020-12) files. 'standardName' is the bare taxonomy.md tool name; 'referenceToolName' is the name the reference implementation (Honua /mcp) advertises. 'implementationStatus' records whether the reference implementation ships the tool/resource family today (implemented) or whether it is a standard family not yet served by the reference (known-gap). For resources, 'implementationStatus' gates the FULL conformance level the same way it does for tools: a manifest must advertise every 'implemented' resource family to reach FULL; 'known-gap' families are reported as informational notes only.",
5
- "date": "2026-07-01",
4
+ "description": "Machine-readable map from standard MCP tool names and resource family URIs to their JSON Schema (draft 2020-12) files. 'standardName' is the bare taxonomy.md tool name; 'referenceToolName' is the name the reference implementation (Honua /mcp) advertises. 'implementationStatus' records whether the reference implementation ships the tool/resource family today (implemented) or whether it is a standard family not yet served by the reference (known-gap). For resources, 'implementationStatus' gates the FULL conformance level the same way it does for tools: a manifest must advertise every 'implemented' resource family to reach FULL; 'known-gap' families are reported as informational notes only. 'profile' (optional; default 'base') assigns a tool to a conformance profile: 'base' tools are required for the base FULL verdict; tools in an additive profile such as 'mutation' are required for FULL only when a manifest declares that profile, and are otherwise reported as informational notes (see /CONFORMANCE.md §Conformance Profiles).",
5
+ "date": "2026-07-06",
6
6
  "dialect": "https://json-schema.org/draft/2020-12/schema",
7
7
  "tools": [
8
8
  {
@@ -58,17 +58,17 @@
58
58
  },
59
59
  {
60
60
  "standardName": "get_style",
61
- "referenceToolName": null,
61
+ "referenceToolName": "honua_get_style",
62
62
  "family": "Style inspection",
63
63
  "schema": "tools/get_style.schema.json",
64
- "implementationStatus": "known-gap"
64
+ "implementationStatus": "implemented"
65
65
  },
66
66
  {
67
67
  "standardName": "apply_style_preset",
68
- "referenceToolName": null,
69
- "family": "Map composition",
68
+ "referenceToolName": "honua_apply_style_preset",
69
+ "family": "Map composition (reference shape)",
70
70
  "schema": "tools/apply_style_preset.schema.json",
71
- "implementationStatus": "known-gap"
71
+ "implementationStatus": "implemented"
72
72
  },
73
73
  {
74
74
  "standardName": "compose_mixed_protocol_map",
@@ -101,10 +101,11 @@
101
101
  },
102
102
  {
103
103
  "standardName": "publish_result",
104
- "referenceToolName": null,
104
+ "referenceToolName": "honua_publish_result",
105
105
  "family": "Publishing",
106
106
  "schema": "tools/publish_result.schema.json",
107
- "implementationStatus": "known-gap"
107
+ "implementationStatus": "implemented",
108
+ "notes": "honua_publish_result (honua-server#2482) promotes a completed analysis job's materialized FeatureLayer/Table artifact (sourceId = the job id) into a hosted published service + layer, routing through the same canonical service.publish promotion as honua_publish_service. The standard schema requires only sourceId; the reference tool adds honua extension selectors (artifactId / serviceName / layerName) under additionalProperties. Analyze / Publish Data (published_service) is implemented; Build App (deployment) promotion is deferred (honua-server#730/#732)."
108
109
  },
109
110
  {
110
111
  "standardName": "list_layers",
@@ -121,6 +122,15 @@
121
122
  "schema": "tools/query_features.schema.json",
122
123
  "implementationStatus": "implemented"
123
124
  },
125
+ {
126
+ "standardName": "edit_features",
127
+ "referenceToolName": null,
128
+ "family": "Feature editing",
129
+ "schema": "tools/edit_features.schema.json",
130
+ "implementationStatus": "known-gap",
131
+ "profile": "mutation",
132
+ "notes": "Sole member of the optional mutation conformance profile (docs/adr/0028-governed-feature-mutation.md). Governed transactional editing: an implementation must require an authenticated, authorized caller and authorize each edit type (insert/update/delete) independently. The reference implementation (Honua) does NOT serve this tool — Honua does not support AI operational data editing (honua-server ADR-0028, founder-reaffirmed 2026-07-06); its referenceToolName is null and its implementationStatus is known-gap. Base-profile (read-only) implementations conform without advertising this tool; it is required for FULL only when an adopter's manifest declares the mutation profile."
133
+ },
124
134
  {
125
135
  "standardName": "render_map",
126
136
  "referenceToolName": "honua_render_map",
@@ -135,6 +145,13 @@
135
145
  "schema": "tools/geocode_address.schema.json",
136
146
  "implementationStatus": "implemented"
137
147
  },
148
+ {
149
+ "standardName": "geocode_addresses",
150
+ "referenceToolName": "honua_geocode_addresses",
151
+ "family": "Analysis and geoprocessing (reference shape)",
152
+ "schema": "tools/geocode_addresses.schema.json",
153
+ "implementationStatus": "implemented"
154
+ },
138
155
  {
139
156
  "standardName": "solve_route",
140
157
  "referenceToolName": "honua_solve_route",
@@ -142,6 +159,60 @@
142
159
  "schema": "tools/solve_route.schema.json",
143
160
  "implementationStatus": "implemented"
144
161
  },
162
+ {
163
+ "standardName": "buffer_features",
164
+ "referenceToolName": null,
165
+ "family": "Analysis verbs",
166
+ "schema": "tools/buffer_features.schema.json",
167
+ "implementationStatus": "known-gap",
168
+ "profile": "analysis",
169
+ "notes": "Direct geoprocessing verb; member of the opt-in analysis conformance profile (docs/adr/0029-direct-geoprocessing-verbs.md, geospatial-mcp#53). Single-step buffer, an alternative to a plan_analysis/execute_plan Geoprocess step. The reference implementation does not ship a direct verb yet; required for FULL only when a manifest declares the analysis profile."
170
+ },
171
+ {
172
+ "standardName": "overlay_features",
173
+ "referenceToolName": null,
174
+ "family": "Analysis verbs",
175
+ "schema": "tools/overlay_features.schema.json",
176
+ "implementationStatus": "known-gap",
177
+ "profile": "analysis",
178
+ "notes": "Direct geoprocessing verb (analysis profile; docs/adr/0029-direct-geoprocessing-verbs.md, geospatial-mcp#53). Two-input overlay: intersect/union/difference/erase/clip. Not yet shipped by the reference; required for FULL only when a manifest declares the analysis profile."
179
+ },
180
+ {
181
+ "standardName": "summarize_statistics",
182
+ "referenceToolName": null,
183
+ "family": "Analysis verbs",
184
+ "schema": "tools/summarize_statistics.schema.json",
185
+ "implementationStatus": "known-gap",
186
+ "profile": "analysis",
187
+ "notes": "Direct geoprocessing verb (analysis profile; docs/adr/0029-direct-geoprocessing-verbs.md, geospatial-mcp#53). Group-by + statistics over a layer or a prior overlay/verb result. Not yet shipped by the reference; required for FULL only when a manifest declares the analysis profile."
188
+ },
189
+ {
190
+ "standardName": "reproject_features",
191
+ "referenceToolName": null,
192
+ "family": "Analysis verbs",
193
+ "schema": "tools/reproject_features.schema.json",
194
+ "implementationStatus": "known-gap",
195
+ "profile": "analysis",
196
+ "notes": "Direct geoprocessing verb (analysis profile; docs/adr/0029-direct-geoprocessing-verbs.md, geospatial-mcp#53). Reproject a dataset to a targetSrid; the sibling verbs also carry an optional outSrid output-CRS param. Not yet shipped by the reference; required for FULL only when a manifest declares the analysis profile."
197
+ },
198
+ {
199
+ "standardName": "join_features",
200
+ "referenceToolName": null,
201
+ "family": "Analysis verbs",
202
+ "schema": "tools/join_features.schema.json",
203
+ "implementationStatus": "known-gap",
204
+ "profile": "analysis",
205
+ "notes": "Direct geoprocessing verb (analysis profile; docs/adr/0029-direct-geoprocessing-verbs.md, geospatial-mcp#53). Attribute or spatial join of two datasets. Not yet shipped by the reference; required for FULL only when a manifest declares the analysis profile."
206
+ },
207
+ {
208
+ "standardName": "export_dataset",
209
+ "referenceToolName": null,
210
+ "family": "Analysis verbs",
211
+ "schema": "tools/export_dataset.schema.json",
212
+ "implementationStatus": "known-gap",
213
+ "profile": "analysis",
214
+ "notes": "Direct geoprocessing verb (analysis profile; docs/adr/0029-direct-geoprocessing-verbs.md, geospatial-mcp#53). Materialize a layer/result to a GeoJSON/GeoPackage/CSV/Parquet artifact. Advertised readOnlyHint:false (writes a new artifact) but non-destructive and not a mutation-profile tool. Not yet shipped by the reference; required for FULL only when a manifest declares the analysis profile."
215
+ },
145
216
  {
146
217
  "standardName": "cancel_job",
147
218
  "referenceToolName": "honua_cancel_job",
@@ -156,6 +227,14 @@
156
227
  "schema": "tools/propose_operation.schema.json",
157
228
  "implementationStatus": "implemented"
158
229
  },
230
+ {
231
+ "standardName": "ingest_dataset",
232
+ "referenceToolName": "honua_ingest_dataset",
233
+ "family": "Publishing",
234
+ "schema": "tools/ingest_dataset.schema.json",
235
+ "implementationStatus": "implemented",
236
+ "notes": "Publish Data ingest step of the reference implementation: inline CSV/GeoJSON to a catalog table whose {connectionId, schema, table} chains into publish_service. Closes the data-loading gap ahead of the standard's file/URL ingest contract."
237
+ },
159
238
  {
160
239
  "standardName": "publish_service",
161
240
  "referenceToolName": "honua_publish_service",
@@ -2,22 +2,26 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://geospatial-mcp.honua.io/spec/schemas/tools/apply_style_preset.schema.json",
4
4
  "title": "apply_style_preset inputSchema",
5
- "description": "Argument shape for apply_style_preset (Analyze, Build App; returns the updated MapPackage). Applies a reusable StyleRef preset to a map package, optionally scoped to a binding. Responsibility-level; concrete styling field set finalizes upstream. See taxonomy.md §Map composition and resources.md §honua://styles/{style_id}.",
5
+ "description": "Argument shape for apply_style_preset. x-honua-reference-shape: this shape tracks the reference implementation (advertised name honua_apply_style_preset), which applies a reusable StyleRef preset (a catalog styleId) as the primary/default style of a published layer, persisting through the server OGC API – Styles authoring surface (ADR-0048) so subsequent render_map calls reflect it. The bare taxonomy responsibility (map-package composition) is described in taxonomy.md §Map composition; the reference implementation binds presets to published layers rather than to an in-memory MapPackage. Applying a preset never edits feature records (ADR-0028); it authors presentation metadata on the hosted service. See taxonomy.md §Map composition and resources.md §honua://styles.",
6
+ "x-honua-reference-shape": true,
6
7
  "type": "object",
7
8
  "additionalProperties": true,
8
- "required": ["mapPackageId", "styleId"],
9
+ "required": ["serviceId", "layerId", "styleId"],
9
10
  "properties": {
10
- "mapPackageId": {
11
+ "serviceId": {
11
12
  "type": "string",
12
- "description": "Identifier (map_…) of the MapPackage to style."
13
+ "minLength": 1,
14
+ "description": "Published service identifier or name whose layer is being styled."
13
15
  },
14
- "styleId": {
15
- "type": "string",
16
- "description": "StyleRef preset identifier (style_…) to apply."
16
+ "layerId": {
17
+ "type": "integer",
18
+ "minimum": 0,
19
+ "description": "Service-local layer index to apply the preset to."
17
20
  },
18
- "targetBindingId": {
21
+ "styleId": {
19
22
  "type": "string",
20
- "description": "Optional SourceBinding the preset is scoped to; applies map-wide when omitted."
23
+ "minLength": 1,
24
+ "description": "StyleRef preset identifier (style_…) to apply as the layer's primary/default style. Discover the available presets with get_style (no styleId lists honua://styles)."
21
25
  }
22
26
  }
23
27
  }
@@ -0,0 +1,60 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://geospatial-mcp.honua.io/spec/schemas/tools/buffer_features.schema.json",
4
+ "title": "buffer_features inputSchema",
5
+ "description": "Direct geoprocessing verb (advertised name honua_buffer_features): buffer input features by a distance and return the buffer polygons. Use this for a single self-contained buffer step (\"buffer these roads by 500 m\"); for multi-step analysis with dependencies, clarification, and a packaged result, use plan_analysis + execute_plan instead. Member of the standard's opt-in **analysis** conformance profile (see /CONFORMANCE.md and docs/adr/0029-direct-geoprocessing-verbs.md). Long-running calls return an ExecutionJob handle (honua://jobs/{job_id}), pollable and cancelable via cancel_job; small/fast calls may return an inline result — the same handoff execute_plan uses. Advertised readOnlyHint: true (computes a derived result; mutates no server state). x-honua-reference-shape: the concrete source (serviceId/layerId, artifactId) spellings track the reference pipeline.",
6
+ "x-honua-reference-shape": true,
7
+ "type": "object",
8
+ "required": ["source", "distance"],
9
+ "properties": {
10
+ "source": {
11
+ "description": "Dataset to buffer: EITHER a published layer (serviceId + layerId) OR a prior-result artifact (artifactId) from an earlier analysis job or verb.",
12
+ "oneOf": [
13
+ { "$ref": "#/$defs/layerRef" },
14
+ { "$ref": "#/$defs/artifactRef" }
15
+ ]
16
+ },
17
+ "distance": {
18
+ "type": "number",
19
+ "description": "Buffer distance in the given unit. Negative distances buffer inward for polygon inputs."
20
+ },
21
+ "unit": {
22
+ "type": "string",
23
+ "default": "meters",
24
+ "enum": ["meters", "kilometers", "feet", "miles", "nautical_miles", "degrees"],
25
+ "description": "Linear unit of distance."
26
+ },
27
+ "dissolve": {
28
+ "type": "boolean",
29
+ "default": false,
30
+ "description": "When true, overlapping buffers are dissolved into a single geometry; when false, one buffer per input feature is returned."
31
+ },
32
+ "where": {
33
+ "type": "string",
34
+ "description": "Optional attribute filter (ArcGIS/SQL WHERE clause) selecting which input features to buffer."
35
+ },
36
+ "outSrid": {
37
+ "type": "integer",
38
+ "description": "Output spatial reference (SRID/WKID) for the returned buffers; defaults to the source CRS. Buffer distances are always measured in the given unit regardless of outSrid."
39
+ }
40
+ },
41
+ "$defs": {
42
+ "layerRef": {
43
+ "type": "object",
44
+ "required": ["serviceId", "layerId"],
45
+ "additionalProperties": false,
46
+ "properties": {
47
+ "serviceId": { "type": "string", "minLength": 1, "description": "Published service identifier or name (from list_layers.serviceId or resolve_entity)." },
48
+ "layerId": { "type": "integer", "minimum": 0, "description": "Service-local layer index (from list_layers.layerId)." }
49
+ }
50
+ },
51
+ "artifactRef": {
52
+ "type": "object",
53
+ "required": ["artifactId"],
54
+ "additionalProperties": false,
55
+ "properties": {
56
+ "artifactId": { "type": "string", "minLength": 1, "description": "Identifier (artifact_…) of a prior-result ArtifactRef produced by an earlier analysis job or verb. See resources/artifact.schema.json." }
57
+ }
58
+ }
59
+ }
60
+ }
@@ -0,0 +1,74 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://geospatial-mcp.honua.io/spec/schemas/tools/edit_features.schema.json",
4
+ "title": "edit_features inputSchema",
5
+ "description": "Argument shape for the transactional feature-editing tool (advertised name honua_edit_features). edit_features is the sole member of the standard's **mutation** conformance profile (see /CONFORMANCE.md and docs/adr/0028-governed-feature-mutation.md): it applies adds/updates/deletes to a single published editable layer as one all-or-nothing transaction when rollbackOnFailure=true (the default). It is governed mutation, not autonomous mutation: an implementation MUST require an authenticated, authorized caller and MUST authorize each edit type independently (insert for adds, update for updates, delete for deletes), rejecting the whole request before any edit is applied if any required permission is missing. An implementation MAY be read-only and still conform to the base profile by not advertising this tool. x-honua-reference-shape: the concrete objectId/globalId/attributes spellings track the reference implementation's shared edit/transaction pipeline; see taxonomy.md §Feature editing (mutation profile).",
6
+ "x-honua-reference-shape": true,
7
+ "type": "object",
8
+ "required": ["serviceId", "layerId"],
9
+ "properties": {
10
+ "serviceId": {
11
+ "type": "string",
12
+ "minLength": 1,
13
+ "description": "Published service identifier or name (from list_layers.serviceId or resolve_entity)."
14
+ },
15
+ "layerId": {
16
+ "type": "integer",
17
+ "minimum": 0,
18
+ "description": "Service-local layer index of the editable layer (from list_layers.layerId)."
19
+ },
20
+ "srid": {
21
+ "type": "integer",
22
+ "default": 4326,
23
+ "description": "Spatial reference (SRID/WKID) of the input feature geometries."
24
+ },
25
+ "adds": {
26
+ "type": "array",
27
+ "description": "Features to insert. Requires insert authorization on the target layer. Object IDs are assigned by the store.",
28
+ "items": { "$ref": "#/$defs/editFeature" }
29
+ },
30
+ "updates": {
31
+ "type": "array",
32
+ "description": "Features to update. Requires update authorization on the target layer. Each MUST carry an objectId identifying the existing feature.",
33
+ "items": { "$ref": "#/$defs/editFeature" }
34
+ },
35
+ "deletes": {
36
+ "type": "array",
37
+ "description": "Object IDs of features to delete. Requires delete authorization on the target layer.",
38
+ "items": { "type": "integer" }
39
+ },
40
+ "rollbackOnFailure": {
41
+ "type": "boolean",
42
+ "default": true,
43
+ "description": "When true (the default), any failed edit rolls back the whole transaction (all-or-nothing) and the layer is left unchanged; when false, successful edits commit independently and per-edit failures are reported."
44
+ },
45
+ "returnEditResults": {
46
+ "type": "boolean",
47
+ "default": true,
48
+ "description": "When true, per-edit results are returned; when false only the transaction summary is emitted."
49
+ }
50
+ },
51
+ "$defs": {
52
+ "editFeature": {
53
+ "type": "object",
54
+ "properties": {
55
+ "objectId": {
56
+ "type": "integer",
57
+ "description": "Object ID of the target feature. Required for updates; ignored for adds."
58
+ },
59
+ "globalId": {
60
+ "type": "string",
61
+ "description": "Optional global ID of the feature."
62
+ },
63
+ "geometry": {
64
+ "type": ["object", "null"],
65
+ "description": "RFC 7946 GeoJSON geometry object (e.g. {\"type\":\"Point\",\"coordinates\":[1,2]})."
66
+ },
67
+ "attributes": {
68
+ "type": "object",
69
+ "description": "Flat attribute name/value map applied to the feature."
70
+ }
71
+ }
72
+ }
73
+ }
74
+ }
@@ -0,0 +1,60 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://geospatial-mcp.honua.io/spec/schemas/tools/export_dataset.schema.json",
4
+ "title": "export_dataset inputSchema",
5
+ "description": "Direct geoprocessing verb (advertised name honua_export_dataset): materialize a dataset — a published layer or a prior verb/job result — into a downloadable artifact in the requested format and return an ArtifactRef with a content locator. Use this for a single self-contained export step (\"export the intersect result as GeoPackage\"); for multi-step analysis with dependencies and a packaged result, use plan_analysis + execute_plan instead. Member of the standard's opt-in **analysis** conformance profile (see /CONFORMANCE.md and docs/adr/0029-direct-geoprocessing-verbs.md). Long-running calls return an ExecutionJob handle (honua://jobs/{job_id}), pollable and cancelable via cancel_job; small/fast calls may return an inline result referencing the produced artifact. Advertised readOnlyHint: false — it writes a new downloadable artifact — but non-destructive (it creates a new artifact and mutates no source records) and idempotent. It is NOT feature mutation and is not part of the mutation profile. x-honua-reference-shape: the concrete source (serviceId/layerId, artifactId) spellings track the reference pipeline.",
6
+ "x-honua-reference-shape": true,
7
+ "type": "object",
8
+ "required": ["source", "format"],
9
+ "properties": {
10
+ "source": {
11
+ "description": "Dataset to export: EITHER a published layer (serviceId + layerId) OR a prior-result artifact (artifactId) from an earlier analysis job or verb.",
12
+ "oneOf": [
13
+ { "$ref": "#/$defs/layerRef" },
14
+ { "$ref": "#/$defs/artifactRef" }
15
+ ]
16
+ },
17
+ "format": {
18
+ "type": "string",
19
+ "enum": ["geojson", "geopackage", "csv", "parquet"],
20
+ "description": "Output format. geojson: RFC 7946 features. geopackage: OGC GeoPackage (.gpkg). csv: attribute rows (geometry as WKT when returnGeometry). parquet: (Geo)Parquet columnar."
21
+ },
22
+ "where": {
23
+ "type": "string",
24
+ "description": "Optional attribute filter (ArcGIS/SQL WHERE clause) selecting which features to export."
25
+ },
26
+ "outFields": {
27
+ "type": "array",
28
+ "items": { "type": "string" },
29
+ "description": "Optional attribute fields to include; omit for all fields."
30
+ },
31
+ "returnGeometry": {
32
+ "type": "boolean",
33
+ "default": true,
34
+ "description": "When false, export attributes only (no geometry). csv/parquet exports of attribute tables commonly set this false."
35
+ },
36
+ "outSrid": {
37
+ "type": "integer",
38
+ "description": "Output spatial reference (SRID/WKID) for exported geometries; defaults to the source CRS."
39
+ }
40
+ },
41
+ "$defs": {
42
+ "layerRef": {
43
+ "type": "object",
44
+ "required": ["serviceId", "layerId"],
45
+ "additionalProperties": false,
46
+ "properties": {
47
+ "serviceId": { "type": "string", "minLength": 1, "description": "Published service identifier or name (from list_layers.serviceId or resolve_entity)." },
48
+ "layerId": { "type": "integer", "minimum": 0, "description": "Service-local layer index (from list_layers.layerId)." }
49
+ }
50
+ },
51
+ "artifactRef": {
52
+ "type": "object",
53
+ "required": ["artifactId"],
54
+ "additionalProperties": false,
55
+ "properties": {
56
+ "artifactId": { "type": "string", "minLength": 1, "description": "Identifier (artifact_…) of a prior-result ArtifactRef produced by an earlier analysis job or verb. See resources/artifact.schema.json." }
57
+ }
58
+ }
59
+ }
60
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://geospatial-mcp.honua.io/spec/schemas/tools/geocode_addresses.schema.json",
4
+ "title": "geocode_addresses inputSchema",
5
+ "description": "Argument shape for the analysis/geoprocessing batch geocode tool (advertised name honua_geocode_addresses). Resolves up to 100 freeform addresses in one call, returning one result per input in input order ({input, ok, location?, score?, error?}); a failed address surfaces per item without failing the batch. First step of the CSV-of-addresses workflow: geocode here, then load the coordinates with ingest_dataset and publish the table with publish_service. x-honua-reference-shape: this shape tracks the reference implementation.",
6
+ "x-honua-reference-shape": true,
7
+ "type": "object",
8
+ "required": ["addresses"],
9
+ "properties": {
10
+ "addresses": {
11
+ "type": "array",
12
+ "minItems": 1,
13
+ "maxItems": 100,
14
+ "items": {
15
+ "type": "string",
16
+ "minLength": 1
17
+ },
18
+ "description": "Freeform single-line addresses to geocode, in the order results should be returned."
19
+ },
20
+ "countryCodes": {
21
+ "type": "string",
22
+ "description": "Optional comma-separated ISO 3166 country codes to restrict the search."
23
+ },
24
+ "outSrid": {
25
+ "type": "integer",
26
+ "default": 4326,
27
+ "description": "Spatial reference (SRID/WKID) for returned coordinates (x=longitude, y=latitude order). Defaults to 4326 (WGS84 lon/lat)."
28
+ },
29
+ "provider": {
30
+ "type": "string",
31
+ "description": "Optional preferred geocoding provider name."
32
+ }
33
+ }
34
+ }