@honua/mcp-server 0.0.9-alpha.0 → 0.0.20-alpha.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 (147) hide show
  1. package/README.md +167 -0
  2. package/certification/geospatial-mcp-schemas/PROVENANCE.md +33 -0
  3. package/certification/geospatial-mcp-schemas/README.md +90 -0
  4. package/certification/geospatial-mcp-schemas/common/geoprocessing-error.schema.json +45 -0
  5. package/certification/geospatial-mcp-schemas/conformance/manifest.schema.json +73 -0
  6. package/certification/geospatial-mcp-schemas/index.json +311 -0
  7. package/certification/geospatial-mcp-schemas/resources/app-package.schema.json +20 -0
  8. package/certification/geospatial-mcp-schemas/resources/app-template.schema.json +15 -0
  9. package/certification/geospatial-mcp-schemas/resources/artifact.schema.json +69 -0
  10. package/certification/geospatial-mcp-schemas/resources/deployment.schema.json +27 -0
  11. package/certification/geospatial-mcp-schemas/resources/map-package.schema.json +21 -0
  12. package/certification/geospatial-mcp-schemas/resources/map-template.schema.json +15 -0
  13. package/certification/geospatial-mcp-schemas/resources/provenance.schema.json +50 -0
  14. package/certification/geospatial-mcp-schemas/resources/published-service.schema.json +21 -0
  15. package/certification/geospatial-mcp-schemas/resources/result-package.schema.json +64 -0
  16. package/certification/geospatial-mcp-schemas/resources/style.schema.json +12 -0
  17. package/certification/geospatial-mcp-schemas/resources/theme.schema.json +12 -0
  18. package/certification/geospatial-mcp-schemas/resources/workspace.schema.json +63 -0
  19. package/certification/geospatial-mcp-schemas/tools/apply_style_preset.schema.json +23 -0
  20. package/certification/geospatial-mcp-schemas/tools/cancel_job.schema.json +15 -0
  21. package/certification/geospatial-mcp-schemas/tools/clarify_intent.schema.json +69 -0
  22. package/certification/geospatial-mcp-schemas/tools/compose_mixed_protocol_map.schema.json +21 -0
  23. package/certification/geospatial-mcp-schemas/tools/create_app_package.schema.json +33 -0
  24. package/certification/geospatial-mcp-schemas/tools/create_map_package.schema.json +41 -0
  25. package/certification/geospatial-mcp-schemas/tools/execute_plan.schema.json +64 -0
  26. package/certification/geospatial-mcp-schemas/tools/geocode_address.schema.json +36 -0
  27. package/certification/geospatial-mcp-schemas/tools/get_style.schema.json +30 -0
  28. package/certification/geospatial-mcp-schemas/tools/ground_candidates.schema.json +66 -0
  29. package/certification/geospatial-mcp-schemas/tools/list_capabilities.schema.json +21 -0
  30. package/certification/geospatial-mcp-schemas/tools/list_layers.schema.json +14 -0
  31. package/certification/geospatial-mcp-schemas/tools/plan_analysis.schema.json +19 -0
  32. package/certification/geospatial-mcp-schemas/tools/preview_app_package.schema.json +15 -0
  33. package/certification/geospatial-mcp-schemas/tools/preview_map_package.schema.json +17 -0
  34. package/certification/geospatial-mcp-schemas/tools/preview_package.schema.json +40 -0
  35. package/certification/geospatial-mcp-schemas/tools/propose_operation.schema.json +28 -0
  36. package/certification/geospatial-mcp-schemas/tools/publish_result.schema.json +29 -0
  37. package/certification/geospatial-mcp-schemas/tools/publish_service.schema.json +59 -0
  38. package/certification/geospatial-mcp-schemas/tools/query_features.schema.json +54 -0
  39. package/certification/geospatial-mcp-schemas/tools/refine_map_package.schema.json +22 -0
  40. package/certification/geospatial-mcp-schemas/tools/render_map.schema.json +55 -0
  41. package/certification/geospatial-mcp-schemas/tools/resolve_entity.schema.json +30 -0
  42. package/certification/geospatial-mcp-schemas/tools/solve_route.schema.json +39 -0
  43. package/certification/geospatial-mcp-schemas/tools/validate_package.schema.json +35 -0
  44. package/certification/geospatial-mcp-schemas/tools/validate_plan.schema.json +61 -0
  45. package/dist/src/certification/certifier.d.ts +119 -0
  46. package/dist/src/certification/certifier.d.ts.map +1 -0
  47. package/dist/src/certification/certifier.js +410 -0
  48. package/dist/src/certification/cli.d.ts +3 -0
  49. package/dist/src/certification/cli.d.ts.map +1 -0
  50. package/dist/src/certification/cli.js +48 -0
  51. package/dist/src/certification/contracts.d.ts +62 -0
  52. package/dist/src/certification/contracts.d.ts.map +1 -0
  53. package/dist/src/certification/contracts.js +174 -0
  54. package/dist/src/certification/fixture-client.d.ts +4 -0
  55. package/dist/src/certification/fixture-client.d.ts.map +1 -0
  56. package/dist/src/certification/fixture-client.js +113 -0
  57. package/dist/src/certification/fixtures.d.ts +32 -0
  58. package/dist/src/certification/fixtures.d.ts.map +1 -0
  59. package/dist/src/certification/fixtures.js +64 -0
  60. package/dist/src/certification/json-schema.d.ts +49 -0
  61. package/dist/src/certification/json-schema.d.ts.map +1 -0
  62. package/dist/src/certification/json-schema.js +164 -0
  63. package/dist/src/certification/mock-upstream.d.ts +29 -0
  64. package/dist/src/certification/mock-upstream.d.ts.map +1 -0
  65. package/dist/src/certification/mock-upstream.js +96 -0
  66. package/dist/src/certification/operator-catalog.d.ts +82 -0
  67. package/dist/src/certification/operator-catalog.d.ts.map +1 -0
  68. package/dist/src/certification/operator-catalog.js +466 -0
  69. package/dist/src/certification/report.d.ts +4 -0
  70. package/dist/src/certification/report.d.ts.map +1 -0
  71. package/dist/src/certification/report.js +90 -0
  72. package/dist/src/certification/run.d.ts +28 -0
  73. package/dist/src/certification/run.d.ts.map +1 -0
  74. package/dist/src/certification/run.js +31 -0
  75. package/dist/src/certification/schema-index.d.ts +69 -0
  76. package/dist/src/certification/schema-index.d.ts.map +1 -0
  77. package/dist/src/certification/schema-index.js +82 -0
  78. package/dist/src/certification/target.d.ts +40 -0
  79. package/dist/src/certification/target.d.ts.map +1 -0
  80. package/dist/src/certification/target.js +167 -0
  81. package/dist/src/eval/cli.d.ts +3 -0
  82. package/dist/src/eval/cli.d.ts.map +1 -0
  83. package/dist/src/eval/cli.js +116 -0
  84. package/dist/src/eval/corpus.d.ts +27 -0
  85. package/dist/src/eval/corpus.d.ts.map +1 -0
  86. package/dist/src/eval/corpus.js +134 -0
  87. package/dist/src/eval/drivers/anthropic.d.ts +14 -0
  88. package/dist/src/eval/drivers/anthropic.d.ts.map +1 -0
  89. package/dist/src/eval/drivers/anthropic.js +120 -0
  90. package/dist/src/eval/drivers/bedrock.d.ts +54 -0
  91. package/dist/src/eval/drivers/bedrock.d.ts.map +1 -0
  92. package/dist/src/eval/drivers/bedrock.js +178 -0
  93. package/dist/src/eval/drivers/deterministic.d.ts +17 -0
  94. package/dist/src/eval/drivers/deterministic.d.ts.map +1 -0
  95. package/dist/src/eval/drivers/deterministic.js +51 -0
  96. package/dist/src/eval/drivers/index.d.ts +34 -0
  97. package/dist/src/eval/drivers/index.d.ts.map +1 -0
  98. package/dist/src/eval/drivers/index.js +74 -0
  99. package/dist/src/eval/drivers/openai.d.ts +14 -0
  100. package/dist/src/eval/drivers/openai.d.ts.map +1 -0
  101. package/dist/src/eval/drivers/openai.js +136 -0
  102. package/dist/src/eval/grade.d.ts +14 -0
  103. package/dist/src/eval/grade.d.ts.map +1 -0
  104. package/dist/src/eval/grade.js +56 -0
  105. package/dist/src/eval/northstar-corpus.d.ts +3 -0
  106. package/dist/src/eval/northstar-corpus.d.ts.map +1 -0
  107. package/dist/src/eval/northstar-corpus.js +194 -0
  108. package/dist/src/eval/operator-corpus.d.ts +3 -0
  109. package/dist/src/eval/operator-corpus.d.ts.map +1 -0
  110. package/dist/src/eval/operator-corpus.js +193 -0
  111. package/dist/src/eval/report.d.ts +104 -0
  112. package/dist/src/eval/report.d.ts.map +1 -0
  113. package/dist/src/eval/report.js +130 -0
  114. package/dist/src/eval/runner.d.ts +22 -0
  115. package/dist/src/eval/runner.d.ts.map +1 -0
  116. package/dist/src/eval/runner.js +116 -0
  117. package/dist/src/eval/types.d.ts +93 -0
  118. package/dist/src/eval/types.d.ts.map +1 -0
  119. package/dist/src/eval/types.js +10 -0
  120. package/dist/src/helpers.d.ts +11 -0
  121. package/dist/src/helpers.d.ts.map +1 -1
  122. package/dist/src/helpers.js +22 -0
  123. package/dist/src/index.d.ts +7 -0
  124. package/dist/src/index.d.ts.map +1 -1
  125. package/dist/src/index.js +30 -4
  126. package/dist/src/proxy.d.ts +46 -0
  127. package/dist/src/proxy.d.ts.map +1 -0
  128. package/dist/src/proxy.js +124 -0
  129. package/dist/src/resources/styles.d.ts +29 -0
  130. package/dist/src/resources/styles.d.ts.map +1 -0
  131. package/dist/src/resources/styles.js +43 -0
  132. package/dist/src/styles.d.ts +110 -0
  133. package/dist/src/styles.d.ts.map +1 -0
  134. package/dist/src/styles.js +118 -0
  135. package/dist/src/tools/apply-style-preset.d.ts +27 -0
  136. package/dist/src/tools/apply-style-preset.d.ts.map +1 -0
  137. package/dist/src/tools/apply-style-preset.js +29 -0
  138. package/dist/src/tools/count-features.d.ts.map +1 -1
  139. package/dist/src/tools/count-features.js +5 -4
  140. package/dist/src/tools/get-extent.d.ts.map +1 -1
  141. package/dist/src/tools/get-extent.js +6 -4
  142. package/dist/src/tools/get-style.d.ts +24 -0
  143. package/dist/src/tools/get-style.d.ts.map +1 -0
  144. package/dist/src/tools/get-style.js +28 -0
  145. package/dist/src/tools/query-features.d.ts.map +1 -1
  146. package/dist/src/tools/query-features.js +4 -1
  147. package/package.json +19 -4
package/README.md CHANGED
@@ -40,3 +40,170 @@ HONUA_BASE_URL="https://honua.example.com" HONUA_TRANSPORT="grpc-web" node dist/
40
40
 
41
41
  - `honua://services`
42
42
  - `honua://services/{encodedServiceId}/layers/{layerId}`
43
+
44
+ ## Certification
45
+
46
+ The package ships a **deterministic MCP certification harness** that proves the
47
+ advertised MCP surface is well-formed and conformant to the open
48
+ [`geospatial-mcp`](https://github.com/honua-io/geospatial-mcp) standard. It is
49
+ fully offline — no model/API calls, no network in the default path — and is the
50
+ evidence document for the WS-H "Provability" workstream.
51
+
52
+ For each tool the server advertises (over an in-memory MCP transport) it:
53
+
54
+ 1. Enumerates `tools/list`, `resources/list`, and `prompts/list`.
55
+ 2. Validates each `inputSchema` (and any `structuredContent` output schema) is
56
+ well-formed JSON Schema, accepting both the draft-07 dialect emitted by
57
+ zod-to-json-schema and the draft 2020-12 dialect of the standard.
58
+ 3. Where a vendored standard schema matches the advertised tool (by the
59
+ standard's `referenceToolName`), checks **conformance** — every standard
60
+ `required` property must be accepted with a compatible type. Standard tools
61
+ that are not advertised, and advertised tools outside the standard, are
62
+ recorded as **known gaps**, not failures.
63
+ 4. **Round-trips** every read-only tool (`tools/call` with a fixture input),
64
+ validating the response. Write/destructive tools are never called.
65
+
66
+ It emits a stable machine-readable JSON report plus a human-readable Markdown
67
+ summary, and exits non-zero on any conformance/round-trip failure.
68
+
69
+ ```bash
70
+ # Run the certifier against the offline fixture backend and write artifacts:
71
+ npm run certify
72
+
73
+ # CI entry points (also runnable locally):
74
+ npm run test:certification # gate: runs harness tests + certifier, exits non-zero on failure
75
+ npm run test:certification:artifact # evidence: writes artifacts, always exits 0
76
+ ```
77
+
78
+ Artifacts are written to the package root as
79
+ `mcp-certification-results.json` and `mcp-certification-results.md` (gitignored;
80
+ uploaded by CI). To certify against a **live** honua-server, set `HONUA_BASE_URL`
81
+ (and `HONUA_TRANSPORT`, `HONUA_MCP_SERVICE_ID`, `HONUA_MCP_LAYER_ID`); the
82
+ harness then drives a real `HonuaClient` instead of the fixture.
83
+
84
+ The standard schemas are vendored under
85
+ `certification/geospatial-mcp-schemas/` (see that directory's `PROVENANCE.md`
86
+ for the pinned source revision).
87
+
88
+ ## Transport-symmetric stdio proxy
89
+
90
+ The honua server exposes one MCP catalog over streamable-HTTP/SSE at `/mcp`.
91
+ Claude-Desktop-style clients speak **stdio**. Rather than reimplement that
92
+ catalog (which is how the HTTP and stdio surfaces historically drifted apart),
93
+ this package ships a **stdio proxy** (`honua-mcp-proxy`) that bridges a local
94
+ stdio MCP client to the remote HTTP-SSE MCP server. It connects upstream as an
95
+ MCP client and re-exposes the *same* catalog downstream over stdio — identical
96
+ tools, identical input/output schemas, identical resources and prompts, and live
97
+ `tools/list_changed` notifications. There is one source-of-truth catalog (the
98
+ server's `/mcp`); the SDK proxies it, so the two transports are symmetric by
99
+ construction. (Cross-repo: honua-io/honua-server#1950.)
100
+
101
+ ```bash
102
+ # Bridge a stdio MCP client to a remote honua /mcp surface:
103
+ HONUA_MCP_REMOTE_URL="https://demo.honua.io/mcp" honua-mcp-proxy
104
+ ```
105
+
106
+ Environment variables:
107
+
108
+ - `HONUA_MCP_REMOTE_URL` (required; alias `HONUA_MCP_URL`): the remote honua
109
+ `/mcp` endpoint to proxy.
110
+ - `HONUA_MCP_AUTH_TOKEN` (optional): sent as `Authorization: Bearer <token>`.
111
+ - `HONUA_API_KEY` (optional): sent as `x-api-key`.
112
+
113
+ A parity test (`test/proxy.test.ts`) asserts the tool/resource/template catalog
114
+ the downstream client sees is byte-identical to the upstream surface, that
115
+ `tools/call` and resource reads round-trip identically, and that `list_changed`
116
+ notifications are forwarded.
117
+
118
+ ## Cross-model workflow eval (provability)
119
+
120
+ The package ships a **cross-model workflow eval** that proves the "any client →
121
+ any workflow" claim: a held-out corpus of GIS workflows (`src/eval/corpus.ts`)
122
+ is driven through the MCP surface by different client LLMs and graded for
123
+ end-to-end success / clarification / edit rates per model. (Cross-repo:
124
+ honua-io/honua-server#1956.)
125
+
126
+ - **Deterministic control (offline, CI):** a scripted "ideal client" runs every
127
+ workflow's real `tools/call` round-trips against the offline fixture surface —
128
+ no model/API calls — and is graded identically to the live models. This is the
129
+ reproducible CI gate.
130
+ - **Live cross-model (Claude + GPT):** when `ANTHROPIC_API_KEY` /
131
+ `OPENAI_API_KEY` are set, the Claude driver (latest Opus, `claude-opus-4-8`)
132
+ and the GPT driver (GA flagship, `gpt-5.5`, override with `OPENAI_MODEL`) run
133
+ the corpus through a real agentic tool-use loop over the identical catalog. The
134
+ `@anthropic-ai/sdk` / `openai` packages are imported dynamically (not
135
+ dependencies); keys come from the environment and are never hardcoded. Set
136
+ `HONUA_MCP_REMOTE_URL` to drive a live remote `/mcp` instead of the fixture.
137
+
138
+ ```bash
139
+ npm run eval # run the eval (live models join if their keys are set)
140
+ npm run eval:offline # force the deterministic control + fixture surface
141
+ npm run test:eval # gate: harness tests + offline eval, exits non-zero on failure
142
+ npm run test:eval:artifact # evidence: writes artifacts, always exits 0
143
+ ```
144
+
145
+ Artifacts (`mcp-eval-results.json` / `mcp-eval-results.md`, gitignored, uploaded
146
+ by CI) record the per-model scorecard. The CI gate asserts the deterministic
147
+ control passes every scenario; live cross-model runs are recorded but
148
+ informational.
149
+
150
+ ### Live lane (paid, manual only)
151
+
152
+ The **operator corpus** (`src/eval/operator-corpus.ts`, 8 harder scenarios) is
153
+ meant to run against a live honua-server **operator** `/mcp` surface with real
154
+ models. This is a **billable** lane: it makes real Anthropic / OpenAI (or AWS
155
+ Bedrock) calls. It never runs on push/PR — locally via `npm run eval:live`, or in
156
+ CI via the manual **`MCP Live Cross-Model Eval`** workflow
157
+ (`.github/workflows/mcp-eval-live.yml`, `workflow_dispatch`-only). The live model
158
+ SDKs are not package dependencies; install them first for a live run:
159
+
160
+ ```bash
161
+ npm install --no-save @anthropic-ai/sdk openai # only needed for live runs
162
+ ```
163
+
164
+ `eval:live` runs the operator corpus (`--corpus operator`) against the remote
165
+ `/mcp` and always writes artifacts (`--artifact-only`). Authentication uses the
166
+ same headers as the stdio proxy — **no dev-auth bypass**; the resolved auth mode
167
+ (`bearer` / `api-key` / `anonymous`) is recorded in the artifact so the run
168
+ proves it was authenticated. Set `HONUA_EVAL_REQUIRE_AUTH=1` to refuse an
169
+ anonymous run outright.
170
+
171
+ Shared env for every live run:
172
+
173
+ - `HONUA_MCP_REMOTE_URL` (required): the operator `/mcp` endpoint, e.g. `https://demo.honua.io/mcp`.
174
+ - `HONUA_MCP_AUTH_TOKEN`: sent as `Authorization: Bearer <token>` (preferred; ⇒ auth mode `bearer`).
175
+ - `HONUA_API_KEY`: sent as `x-api-key` (⇒ auth mode `api-key`) when the deployment uses key auth instead.
176
+ - `HONUA_EVAL_REQUIRE_AUTH=1` (recommended): fail fast if neither credential is present.
177
+
178
+ ```bash
179
+ # Anthropic Claude (default claude-opus-4-8; override with HONUA_EVAL_ANTHROPIC_MODEL):
180
+ HONUA_MCP_REMOTE_URL="https://demo.honua.io/mcp" \
181
+ HONUA_MCP_AUTH_TOKEN="$HONUA_TOKEN" \
182
+ HONUA_EVAL_REQUIRE_AUTH=1 \
183
+ ANTHROPIC_API_KEY="$ANTHROPIC_API_KEY" \
184
+ npm run eval:live -- --driver anthropic
185
+
186
+ # OpenAI GPT (default gpt-5.5; override with OPENAI_MODEL, e.g. gpt-5.6-sol once you have access):
187
+ HONUA_MCP_REMOTE_URL="https://demo.honua.io/mcp" \
188
+ HONUA_MCP_AUTH_TOKEN="$HONUA_TOKEN" \
189
+ HONUA_EVAL_REQUIRE_AUTH=1 \
190
+ OPENAI_API_KEY="$OPENAI_API_KEY" \
191
+ npm run eval:live -- --driver openai
192
+
193
+ # Claude via Amazon Bedrock (AWS credential chain; default Sonnet 4.5,
194
+ # override with HONUA_EVAL_BEDROCK_MODEL — most ids need a us.* inference profile):
195
+ HONUA_MCP_REMOTE_URL="https://demo.honua.io/mcp" \
196
+ HONUA_MCP_AUTH_TOKEN="$HONUA_TOKEN" \
197
+ HONUA_EVAL_REQUIRE_AUTH=1 \
198
+ HONUA_EVAL_BEDROCK=1 AWS_REGION=us-west-2 \
199
+ HONUA_EVAL_BEDROCK_MODEL="us.anthropic.claude-sonnet-4-5-20250929-v1:0" \
200
+ npm run eval:live -- --driver bedrock
201
+ ```
202
+
203
+ Pass multiple drivers to compare them in one artifact:
204
+ `npm run eval:live -- --driver anthropic,openai`. Every driver is graded against
205
+ the **identical** operator corpus and catalog, and the artifact's
206
+ `catalog.unresolvedRequiredTools` names any required tool the live surface did
207
+ not advertise — so a scenario that fails does so for a real capability gap, not a
208
+ silent tool name-resolution bug (the runner resolves required tools against the
209
+ live `tools/list`, never against the vendored certification index).
@@ -0,0 +1,33 @@
1
+ # Vendored geospatial-mcp JSON Schemas
2
+
3
+ These JSON Schema files are a verbatim, vendored copy of the published
4
+ machine-readable schemas from the open **geospatial-mcp** standard.
5
+
6
+ - **Source repo:** https://github.com/honua-io/geospatial-mcp
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`
11
+ - **Dialect:** JSON Schema draft 2020-12
12
+
13
+ ## Why vendored
14
+
15
+ The MCP certification harness (`src/certification/`) must run deterministically
16
+ in CI with **zero network access and zero model/API token spend**. Vendoring the
17
+ published schemas pins the standard the Honua MCP surface is certified against to
18
+ a known, reproducible revision and removes any cross-repo fetch at certify time.
19
+
20
+ ## Refreshing
21
+
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.
26
+
27
+ ## Index
28
+
29
+ `index.json` maps each standard tool's bare `standardName` (taxonomy.md name) to
30
+ the `referenceToolName` the reference implementation (Honua `/mcp`) advertises,
31
+ plus an `implementationStatus` (`implemented` | `known-gap`). The certifier reads
32
+ this index to decide which advertised tools to conformance-check and which
33
+ standard tools to record as known gaps.
@@ -0,0 +1,90 @@
1
+ # Machine-Readable JSON Schemas
2
+
3
+ **Status:** Draft
4
+ **Date:** 2026-06-21
5
+ **Scope:** Implementable JSON Schema (draft 2020-12) bindings for the geospatial MCP standard
6
+
7
+ This directory makes the prose specification **implementable**. It publishes
8
+ [JSON Schema](https://json-schema.org/) (draft 2020-12) documents describing:
9
+
10
+ - each core MCP **tool** `inputSchema` (the argument shape an agent sends on a
11
+ `tools/call`), under [`tools/`](tools/);
12
+ - each core MCP **resource** payload shape (the read-only projection a
13
+ `resources/read` returns), under [`resources/`](resources/).
14
+
15
+ A machine-readable [`index.json`](index.json) maps every standard tool name and
16
+ resource family URI to its schema file, so a harness can resolve a schema from
17
+ a vocabulary key without hard-coding paths.
18
+
19
+ A self-check **conformance fixture tree** lives under
20
+ [`../../conformance/fixtures/`](../../conformance/fixtures/): example tool-call
21
+ inputs and resource payloads that validate against these schemas. An
22
+ implementer can run their JSON Schema validator over the fixtures to confirm the
23
+ schemas load and that the examples conform, before testing their own server.
24
+
25
+ ## Relationship to the prose
26
+
27
+ These schemas are **derived from**, and faithful to, the normative prose:
28
+
29
+ - Tool families and names come from
30
+ [`spec/taxonomy.md` §MCP Tools to Workflow Family Mapping](../taxonomy.md#mcp-tools-to-workflow-family-mapping).
31
+ - Resource families, URI grammar, and inspection fields come from
32
+ [`spec/resources.md`](../resources.md).
33
+ - The canonical concept model (`AnalysisPlan`, `ArtifactRef`, `WorkspaceRef`,
34
+ `GeoprocessingError`, …) comes from
35
+ [`spec/taxonomy.md` §Canonical Concept Model](../taxonomy.md#canonical-concept-model).
36
+
37
+ ### Where the prose is intentionally upstream-owned
38
+
39
+ The prose **defers concrete field spellings** for several canonical objects to
40
+ `honua-server` (`MapPackage`, `AppPackage`, `PublishedService`, `Deployment`
41
+ — see [`resources.md` §2.4 Deferred-Shape Fixtures](../conformance.md#24-deferred-shape-fixtures)
42
+ and the responsibility-level projections in `resources.md`). For those, the
43
+ prose deliberately gives **responsibilities**, not a frozen field table.
44
+
45
+ Per the task of making the standard implementable, where the prose is ambiguous
46
+ or upstream-owned, **these schemas adopt the shape the reference implementation
47
+ (Honua's `/mcp`) already emits**, and mark it as such with a
48
+ `x-honua-reference-shape: true` annotation and a `description` note. This keeps
49
+ the standard constructible today while remaining honest that the concrete field
50
+ names track the reference implementation until the upstream ticket lands.
51
+
52
+ Resources whose concrete shape is still fully deferred upstream (e.g.
53
+ `MapPackage`, `AppPackage`, `PublishedService`, `Deployment`,
54
+ `PublishingResultPackage`) carry **responsibility-level** schemas: the stable
55
+ identifier and `honua://` URI are pinned and required, additional properties are
56
+ permitted (`additionalProperties: true`), and the responsibility fields are
57
+ described but not over-constrained. This matches the conformance rubric, which
58
+ scores those resources on stable identifiers, URI grammar, and
59
+ responsibility-level projection while marking concrete-field assertions
60
+ `not_applicable`.
61
+
62
+ ## Draft and dialect
63
+
64
+ All schemas declare:
65
+
66
+ ```json
67
+ "$schema": "https://json-schema.org/draft/2020-12/schema"
68
+ ```
69
+
70
+ and a stable `$id` of the form
71
+ `https://geospatial-mcp.honua.io/spec/schemas/{tools|resources}/{name}.schema.json`.
72
+
73
+ ## Tool-name prefixing
74
+
75
+ The standard names tools without a vendor prefix (`plan_analysis`,
76
+ `ground_candidates`, …; see `taxonomy.md`). A conformant server MAY advertise
77
+ the tools under a vendor-namespaced name — the reference implementation
78
+ advertises e.g. `honua_plan_analysis`. The `index.json` lists both the bare
79
+ standard name and the reference implementation's advertised name so a harness
80
+ can resolve either. The schemas validate the **argument object**, which is
81
+ prefix-independent.
82
+
83
+ ## Files
84
+
85
+ | File | Describes |
86
+ |---|---|
87
+ | [`index.json`](index.json) | Machine-readable tool/resource → schema map |
88
+ | [`common/geoprocessing-error.schema.json`](common/geoprocessing-error.schema.json) | The canonical `GeoprocessingError` envelope (shared) |
89
+ | [`tools/*.schema.json`](tools/) | One `inputSchema` per core tool family |
90
+ | [`resources/*.schema.json`](resources/) | One payload schema per core resource family |
@@ -0,0 +1,45 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://geospatial-mcp.honua.io/spec/schemas/common/geoprocessing-error.schema.json",
4
+ "title": "GeoprocessingError",
5
+ "description": "Canonical error envelope reused verbatim by every MCP tool and resource failure path. See spec/resources.md §Error Model. No parallel MCP-local error taxonomy is permitted.",
6
+ "type": "object",
7
+ "required": ["kind", "message"],
8
+ "properties": {
9
+ "kind": {
10
+ "type": "string",
11
+ "description": "GeoprocessingErrorKind value.",
12
+ "enum": [
13
+ "ValidationFailed",
14
+ "AuthorizationDenied",
15
+ "UnknownDataset",
16
+ "UnknownProcess",
17
+ "ExecutionFailed",
18
+ "Timeout",
19
+ "Cancelled",
20
+ "OutputBindingFailed"
21
+ ]
22
+ },
23
+ "message": {
24
+ "type": "string",
25
+ "description": "Human-readable summary."
26
+ },
27
+ "stepId": {
28
+ "type": "string",
29
+ "description": "Plan step identifier when applicable."
30
+ },
31
+ "violations": {
32
+ "type": "array",
33
+ "description": "Structured validation failures.",
34
+ "items": {
35
+ "type": "object",
36
+ "required": ["code", "message"],
37
+ "properties": {
38
+ "code": { "type": "string" },
39
+ "message": { "type": "string" },
40
+ "fieldPath": { "type": "string" }
41
+ }
42
+ }
43
+ }
44
+ }
45
+ }
@@ -0,0 +1,73 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://geospatial-mcp.honua.io/spec/schemas/conformance/manifest.schema.json",
4
+ "title": "geospatial-mcp conformance manifest",
5
+ "description": "Static, server-emitted declaration of the MCP tool and resource surface an implementation advertises, used to check coverage of the geospatial-mcp standard vocabulary without running a live scenario harness. A conformant server produces this manifest from its own tools/list and resources/templates/list capability advertisement. See /CONFORMANCE.md and spec/conformance.md.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["specDate", "implementation", "tools", "resources"],
9
+ "properties": {
10
+ "specDate": {
11
+ "type": "string",
12
+ "description": "The Date header of the spec/conformance.md document this manifest was produced against (e.g. 2026-04-19), per spec/conformance.md §8 'Conformance spec identifier per run'.",
13
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
14
+ },
15
+ "implementation": {
16
+ "type": "object",
17
+ "description": "Identity of the implementation under test.",
18
+ "additionalProperties": true,
19
+ "required": ["name"],
20
+ "properties": {
21
+ "name": { "type": "string", "description": "Implementation name (e.g. 'Honua /mcp')." },
22
+ "version": { "type": "string", "description": "Optional implementation version or build identifier." },
23
+ "isReferenceImplementation": {
24
+ "type": "boolean",
25
+ "description": "True only for the reference implementation named in /CONFORMANCE.md (Honua). Other implementations omit this or set it false."
26
+ }
27
+ }
28
+ },
29
+ "tools": {
30
+ "type": "array",
31
+ "description": "The tools the implementation advertises that map onto standard vocabulary.",
32
+ "items": {
33
+ "type": "object",
34
+ "additionalProperties": false,
35
+ "required": ["standardName", "advertisedName"],
36
+ "properties": {
37
+ "standardName": {
38
+ "type": "string",
39
+ "description": "The bare taxonomy.md tool name this advertised tool implements (e.g. 'plan_analysis'). MUST match a tools[].standardName in spec/schemas/index.json."
40
+ },
41
+ "advertisedName": {
42
+ "type": "string",
43
+ "description": "The name the server advertises on tools/list (e.g. 'honua_plan_analysis'). MAY be vendor-prefixed."
44
+ },
45
+ "workflowFamily": {
46
+ "type": "string",
47
+ "description": "Optional workflow-family tag the server attaches to the tool, for coverage reporting."
48
+ }
49
+ }
50
+ }
51
+ },
52
+ "resources": {
53
+ "type": "array",
54
+ "description": "The resource families the implementation advertises that map onto standard vocabulary.",
55
+ "items": {
56
+ "type": "object",
57
+ "additionalProperties": false,
58
+ "required": ["family", "uriForm"],
59
+ "properties": {
60
+ "family": {
61
+ "type": "string",
62
+ "description": "Resource family name. MUST match a resources[].family in spec/schemas/index.json."
63
+ },
64
+ "uriForm": {
65
+ "type": "string",
66
+ "description": "The honua:// URI template the server advertises for the family (e.g. honua://results/{result_package_id}).",
67
+ "pattern": "^honua://"
68
+ }
69
+ }
70
+ }
71
+ }
72
+ }
73
+ }