@honua/mcp-server 0.0.20-alpha.0 → 0.1.1-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.
- package/README.md +141 -15
- package/certification/geospatial-mcp-schemas/PROVENANCE.md +15 -7
- package/certification/geospatial-mcp-schemas/conformance/manifest.schema.json +6 -0
- package/certification/geospatial-mcp-schemas/index.json +88 -9
- package/certification/geospatial-mcp-schemas/tools/apply_style_preset.schema.json +13 -9
- package/certification/geospatial-mcp-schemas/tools/buffer_features.schema.json +60 -0
- package/certification/geospatial-mcp-schemas/tools/edit_features.schema.json +74 -0
- package/certification/geospatial-mcp-schemas/tools/export_dataset.schema.json +60 -0
- package/certification/geospatial-mcp-schemas/tools/geocode_addresses.schema.json +34 -0
- package/certification/geospatial-mcp-schemas/tools/get_style.schema.json +13 -3
- package/certification/geospatial-mcp-schemas/tools/ingest_dataset.schema.json +45 -0
- package/certification/geospatial-mcp-schemas/tools/join_features.schema.json +73 -0
- package/certification/geospatial-mcp-schemas/tools/overlay_features.schema.json +53 -0
- package/certification/geospatial-mcp-schemas/tools/query_features.schema.json +20 -0
- package/certification/geospatial-mcp-schemas/tools/render_map.schema.json +5 -0
- package/certification/geospatial-mcp-schemas/tools/reproject_features.schema.json +49 -0
- package/certification/geospatial-mcp-schemas/tools/summarize_statistics.schema.json +71 -0
- package/dist/src/agent-execution.d.ts +16 -0
- package/dist/src/agent-execution.d.ts.map +1 -0
- package/dist/src/agent-execution.js +46 -0
- package/dist/src/capability.d.ts +48 -0
- package/dist/src/capability.d.ts.map +1 -0
- package/dist/src/capability.js +44 -0
- package/dist/src/certification/census-data.d.ts +33 -0
- package/dist/src/certification/census-data.d.ts.map +1 -0
- package/dist/src/certification/census-data.js +506 -0
- package/dist/src/certification/census-fixture-client.d.ts +7 -0
- package/dist/src/certification/census-fixture-client.d.ts.map +1 -0
- package/dist/src/certification/census-fixture-client.js +226 -0
- package/dist/src/certification/certifier.d.ts +7 -1
- package/dist/src/certification/certifier.d.ts.map +1 -1
- package/dist/src/certification/certifier.js +52 -7
- package/dist/src/certification/cli.js +19 -4
- package/dist/src/certification/contracts.d.ts +41 -0
- package/dist/src/certification/contracts.d.ts.map +1 -1
- package/dist/src/certification/contracts.js +71 -0
- package/dist/src/certification/fixture-client.d.ts.map +1 -1
- package/dist/src/certification/fixtures.d.ts +13 -0
- package/dist/src/certification/fixtures.d.ts.map +1 -1
- package/dist/src/certification/fixtures.js +28 -0
- package/dist/src/certification/json-schema.d.ts +23 -1
- package/dist/src/certification/json-schema.d.ts.map +1 -1
- package/dist/src/certification/json-schema.js +10 -2
- package/dist/src/certification/lifecycle.d.ts +14 -0
- package/dist/src/certification/lifecycle.d.ts.map +1 -0
- package/dist/src/certification/lifecycle.js +326 -0
- package/dist/src/certification/operator-catalog.d.ts +8 -0
- package/dist/src/certification/operator-catalog.d.ts.map +1 -1
- package/dist/src/certification/operator-catalog.js +189 -5
- package/dist/src/certification/report.d.ts.map +1 -1
- package/dist/src/certification/report.js +13 -0
- package/dist/src/certification/run.d.ts.map +1 -1
- package/dist/src/certification/run.js +1 -0
- package/dist/src/certification/schema-index.d.ts +25 -0
- package/dist/src/certification/schema-index.d.ts.map +1 -1
- package/dist/src/certification/schema-index.js +27 -0
- package/dist/src/certification/target.d.ts +9 -1
- package/dist/src/certification/target.d.ts.map +1 -1
- package/dist/src/certification/target.js +54 -2
- package/dist/src/eval/cli.js +4 -2
- package/dist/src/eval/corpus.d.ts +7 -0
- package/dist/src/eval/corpus.d.ts.map +1 -1
- package/dist/src/eval/corpus.js +16 -0
- package/dist/src/eval/drivers/deterministic.d.ts.map +1 -1
- package/dist/src/eval/drivers/deterministic.js +13 -0
- package/dist/src/eval/grade.d.ts.map +1 -1
- package/dist/src/eval/grade.js +20 -1
- package/dist/src/eval/report.d.ts +5 -0
- package/dist/src/eval/report.d.ts.map +1 -1
- package/dist/src/eval/report.js +3 -0
- package/dist/src/eval/runner.d.ts +6 -0
- package/dist/src/eval/runner.d.ts.map +1 -1
- package/dist/src/eval/runner.js +21 -7
- package/dist/src/eval/standalone-corpus.d.ts +3 -0
- package/dist/src/eval/standalone-corpus.d.ts.map +1 -0
- package/dist/src/eval/standalone-corpus.js +699 -0
- package/dist/src/eval/types.d.ts +25 -0
- package/dist/src/eval/types.d.ts.map +1 -1
- package/dist/src/helpers.d.ts +1 -1
- package/dist/src/helpers.d.ts.map +1 -1
- package/dist/src/index.d.ts +37 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +47 -22
- package/dist/src/nl-map-control.d.ts +70 -0
- package/dist/src/nl-map-control.d.ts.map +1 -0
- package/dist/src/nl-map-control.js +470 -0
- package/dist/src/provenance.d.ts +44 -0
- package/dist/src/provenance.d.ts.map +1 -0
- package/dist/src/provenance.js +37 -0
- package/dist/src/resources/styles.d.ts.map +1 -1
- package/dist/src/resources/styles.js +36 -3
- package/dist/src/stable-json.d.ts +14 -0
- package/dist/src/stable-json.d.ts.map +1 -0
- package/dist/src/stable-json.js +126 -0
- package/dist/src/styles.d.ts +2 -0
- package/dist/src/styles.d.ts.map +1 -1
- package/dist/src/styles.js +29 -3
- package/dist/src/tools/apply-style-preset.d.ts.map +1 -1
- package/dist/src/tools/apply-style-preset.js +14 -2
- package/dist/src/tools/explain-capability-gap.d.ts +3 -3
- package/dist/src/tools/explain-capability-gap.d.ts.map +1 -1
- package/dist/src/tools/explain-capability-gap.js +1 -1
- package/dist/src/tools/get-style.d.ts.map +1 -1
- package/dist/src/tools/get-style.js +24 -13
- package/dist/src/tools/list-services.d.ts.map +1 -1
- package/dist/src/tools/list-services.js +16 -1
- package/package.json +27 -2
package/README.md
CHANGED
|
@@ -1,45 +1,127 @@
|
|
|
1
1
|
# `@honua/mcp-server`
|
|
2
2
|
|
|
3
|
-
Model Context Protocol (MCP) server for
|
|
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
|
-
|
|
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
|
-
|
|
12
|
+
Two modes:
|
|
8
13
|
|
|
9
|
-
-
|
|
10
|
-
-
|
|
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
|
-
##
|
|
22
|
+
## Requirements
|
|
13
23
|
|
|
14
|
-
-
|
|
15
|
-
-
|
|
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
|
-
|
|
27
|
+
## Platform-free mode (any ArcGIS / OGC endpoint)
|
|
21
28
|
|
|
22
|
-
|
|
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://
|
|
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
|
-
-
|
|
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
|
|
77
|
+
|
|
78
|
+
Hosts that use signed safe-agent plans can import
|
|
79
|
+
`@honua/mcp-server/agent-execution`. Its `createReadOnlyMcpAgentExecutor` binds
|
|
80
|
+
one named read tool to `@honua/sdk-js/agent-safety`'s exact approved-operation,
|
|
81
|
+
durable-audit, and signed-receipt path. It never enables wildcard dispatch or
|
|
82
|
+
mutation on the standalone server. The descriptor requires a bounded exact name
|
|
83
|
+
and a deterministic `countRows(result)` callback; missing or invalid row counts
|
|
84
|
+
fail instead of being reported as zero.
|
|
85
|
+
|
|
86
|
+
### Optional natural-language map-plan tools
|
|
87
|
+
|
|
88
|
+
Embedded hosts with a map runtime, BYO-LLM callback, approval verifier, and
|
|
89
|
+
atomic approval-use store can opt into two additional tools:
|
|
90
|
+
|
|
91
|
+
- `proposeMapPlan` — compiles an instruction into an inspectable, content-addressed plan and never executes it.
|
|
92
|
+
- `executeMapPlan` — accepts that plan plus a signed approval envelope and executes only after scope, signature,
|
|
93
|
+
expiry, single-use, cancellation, and plan-identity checks. The envelope is required for effects and for every
|
|
94
|
+
read step that names a `sourceId`; only non-source inspection may use read-only auto-execution.
|
|
95
|
+
|
|
96
|
+
```ts
|
|
97
|
+
import { createNlMapControlMcpHost, createServer } from "@honua/mcp-server";
|
|
98
|
+
|
|
99
|
+
const nlMapControl = createNlMapControlMcpHost({
|
|
100
|
+
control: {
|
|
101
|
+
tools: { runtime },
|
|
102
|
+
llm: callYourModel,
|
|
103
|
+
approvalVerifier,
|
|
104
|
+
receiptSigner,
|
|
105
|
+
},
|
|
106
|
+
approvalUseConsumer, // host-owned atomic consume + verify callbacks
|
|
107
|
+
resolveAuthorizationScopes: (transportScopes) => transportScopes,
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
const server = createServer(honuaClient, { nlMapControl });
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
The callbacks are deliberately not inferred from environment variables: model
|
|
114
|
+
transport, map authority, signing keys, and replay storage remain host-owned.
|
|
115
|
+
The MCP response omits raw tool results and the original instruction from its
|
|
116
|
+
execution receipt. Plans containing credential, cursor, or endpoint material
|
|
117
|
+
are refused instead of returning a redacted plan that could no longer match its
|
|
118
|
+
approval fingerprint.
|
|
38
119
|
|
|
39
120
|
## MCP Resources
|
|
40
121
|
|
|
41
122
|
- `honua://services`
|
|
42
123
|
- `honua://services/{encodedServiceId}/layers/{layerId}`
|
|
124
|
+
- `honua://styles`, `honua://styles/{styleId}` — structured-unavailable on a plain FeatureServer
|
|
43
125
|
|
|
44
126
|
## Certification
|
|
45
127
|
|
|
@@ -72,9 +154,36 @@ npm run certify
|
|
|
72
154
|
|
|
73
155
|
# CI entry points (also runnable locally):
|
|
74
156
|
npm run test:certification # gate: runs harness tests + certifier, exits non-zero on failure
|
|
157
|
+
npm run test:certification:nl-map-control # gate: approval/scope/replay/cancellation/receipt security matrix
|
|
75
158
|
npm run test:certification:artifact # evidence: writes artifacts, always exits 0
|
|
76
159
|
```
|
|
77
160
|
|
|
161
|
+
The certification test lane also hosts the optional NL tools over an in-memory
|
|
162
|
+
MCP transport with a deterministic fixture completion and mock map runtime. It proves
|
|
163
|
+
propose→approve→execute plus missing, expired, replayed, wrong-scope, tampered,
|
|
164
|
+
cancelled, deterministic-receipt, and redaction cases without a model, API key,
|
|
165
|
+
network service, or wall-clock dependency.
|
|
166
|
+
|
|
167
|
+
### Platform-free certification lane
|
|
168
|
+
|
|
169
|
+
A dedicated **standalone** target (`HONUA_MCP_CERT_TARGET=standalone`, or
|
|
170
|
+
`--target standalone`) certifies the platform-free surface against an in-process
|
|
171
|
+
fixture of a **plain public FeatureServer** — the recorded US Census 2020
|
|
172
|
+
apportionment layer from `services.arcgis.com`, with **no** Honua surfaces. It
|
|
173
|
+
proves the tools certify **green with honest skips** against a non-Honua endpoint:
|
|
174
|
+
the data tools round-trip against real recorded data, the Honua-only style tools
|
|
175
|
+
degrade to structured "not available" results, and the auth/mutation/job contracts
|
|
176
|
+
skip-with-reason. Fixture-backed and deterministic — no network.
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
npm run certify:standalone # platform-free cert (plain FeatureServer fixture)
|
|
180
|
+
npm run test:certification:standalone # CI gate variant
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
The fixture is recorded by `scripts/record-census-fixtures.mjs` into
|
|
184
|
+
`src/certification/census-data.ts`; the evaluator that replays it is verified for
|
|
185
|
+
parity against the live recordings in `test/certification/census-fixture-client.test.ts`.
|
|
186
|
+
|
|
78
187
|
Artifacts are written to the package root as
|
|
79
188
|
`mcp-certification-results.json` and `mcp-certification-results.md` (gitignored;
|
|
80
189
|
uploaded by CI). To certify against a **live** honua-server, set `HONUA_BASE_URL`
|
|
@@ -147,6 +256,23 @@ by CI) record the per-model scorecard. The CI gate asserts the deterministic
|
|
|
147
256
|
control passes every scenario; live cross-model runs are recorded but
|
|
148
257
|
informational.
|
|
149
258
|
|
|
259
|
+
### Platform-free semantic corpus (`src/eval/standalone-corpus.ts`)
|
|
260
|
+
|
|
261
|
+
The **standalone** corpus is 50+ scenarios run against the plain public
|
|
262
|
+
FeatureServer fixture (the census layer) with **semantic** grading — not just tool
|
|
263
|
+
trajectory. Each scenario asserts the *meaning* of the answer: correct feature
|
|
264
|
+
counts (52 rows, 4 states with ≥20 seats), correct geographic facts (California is
|
|
265
|
+
the most populous; Wyoming the least; the House totals 435 seats), correct tool
|
|
266
|
+
selection for ambiguous asks (count vs. query vs. statistics), refusal /
|
|
267
|
+
clarification behavior on ambiguous or unsupported requests, and anti-hallucination
|
|
268
|
+
guards. Because the fixture replays real recorded data, a wrong number or a
|
|
269
|
+
hallucinated place name fails. The grading taxonomy is documented in
|
|
270
|
+
[`evals/README.md`](evals/README.md).
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
npm run eval:standalone # deterministic control over the census fixture (offline)
|
|
274
|
+
```
|
|
275
|
+
|
|
150
276
|
### Live lane (paid, manual only)
|
|
151
277
|
|
|
152
278
|
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:** `
|
|
9
|
-
(`
|
|
10
|
-
- **Schema index date:** `2026-07-
|
|
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,
|
|
23
|
-
|
|
24
|
-
|
|
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-
|
|
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":
|
|
61
|
+
"referenceToolName": "honua_get_style",
|
|
62
62
|
"family": "Style inspection",
|
|
63
63
|
"schema": "tools/get_style.schema.json",
|
|
64
|
-
"implementationStatus": "
|
|
64
|
+
"implementationStatus": "implemented"
|
|
65
65
|
},
|
|
66
66
|
{
|
|
67
67
|
"standardName": "apply_style_preset",
|
|
68
|
-
"referenceToolName":
|
|
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": "
|
|
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":
|
|
104
|
+
"referenceToolName": "honua_publish_result",
|
|
105
105
|
"family": "Publishing",
|
|
106
106
|
"schema": "tools/publish_result.schema.json",
|
|
107
|
-
"implementationStatus": "
|
|
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
|
|
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": ["
|
|
9
|
+
"required": ["serviceId", "layerId", "styleId"],
|
|
9
10
|
"properties": {
|
|
10
|
-
"
|
|
11
|
+
"serviceId": {
|
|
11
12
|
"type": "string",
|
|
12
|
-
"
|
|
13
|
+
"minLength": 1,
|
|
14
|
+
"description": "Published service identifier or name whose layer is being styled."
|
|
13
15
|
},
|
|
14
|
-
"
|
|
15
|
-
"type": "
|
|
16
|
-
"
|
|
16
|
+
"layerId": {
|
|
17
|
+
"type": "integer",
|
|
18
|
+
"minimum": 0,
|
|
19
|
+
"description": "Service-local layer index to apply the preset to."
|
|
17
20
|
},
|
|
18
|
-
"
|
|
21
|
+
"styleId": {
|
|
19
22
|
"type": "string",
|
|
20
|
-
"
|
|
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
|
+
}
|