@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.
- package/README.md +167 -0
- package/certification/geospatial-mcp-schemas/PROVENANCE.md +33 -0
- package/certification/geospatial-mcp-schemas/README.md +90 -0
- package/certification/geospatial-mcp-schemas/common/geoprocessing-error.schema.json +45 -0
- package/certification/geospatial-mcp-schemas/conformance/manifest.schema.json +73 -0
- package/certification/geospatial-mcp-schemas/index.json +311 -0
- package/certification/geospatial-mcp-schemas/resources/app-package.schema.json +20 -0
- package/certification/geospatial-mcp-schemas/resources/app-template.schema.json +15 -0
- package/certification/geospatial-mcp-schemas/resources/artifact.schema.json +69 -0
- package/certification/geospatial-mcp-schemas/resources/deployment.schema.json +27 -0
- package/certification/geospatial-mcp-schemas/resources/map-package.schema.json +21 -0
- package/certification/geospatial-mcp-schemas/resources/map-template.schema.json +15 -0
- package/certification/geospatial-mcp-schemas/resources/provenance.schema.json +50 -0
- package/certification/geospatial-mcp-schemas/resources/published-service.schema.json +21 -0
- package/certification/geospatial-mcp-schemas/resources/result-package.schema.json +64 -0
- package/certification/geospatial-mcp-schemas/resources/style.schema.json +12 -0
- package/certification/geospatial-mcp-schemas/resources/theme.schema.json +12 -0
- package/certification/geospatial-mcp-schemas/resources/workspace.schema.json +63 -0
- package/certification/geospatial-mcp-schemas/tools/apply_style_preset.schema.json +23 -0
- package/certification/geospatial-mcp-schemas/tools/cancel_job.schema.json +15 -0
- package/certification/geospatial-mcp-schemas/tools/clarify_intent.schema.json +69 -0
- package/certification/geospatial-mcp-schemas/tools/compose_mixed_protocol_map.schema.json +21 -0
- package/certification/geospatial-mcp-schemas/tools/create_app_package.schema.json +33 -0
- package/certification/geospatial-mcp-schemas/tools/create_map_package.schema.json +41 -0
- package/certification/geospatial-mcp-schemas/tools/execute_plan.schema.json +64 -0
- package/certification/geospatial-mcp-schemas/tools/geocode_address.schema.json +36 -0
- package/certification/geospatial-mcp-schemas/tools/get_style.schema.json +30 -0
- package/certification/geospatial-mcp-schemas/tools/ground_candidates.schema.json +66 -0
- package/certification/geospatial-mcp-schemas/tools/list_capabilities.schema.json +21 -0
- package/certification/geospatial-mcp-schemas/tools/list_layers.schema.json +14 -0
- package/certification/geospatial-mcp-schemas/tools/plan_analysis.schema.json +19 -0
- package/certification/geospatial-mcp-schemas/tools/preview_app_package.schema.json +15 -0
- package/certification/geospatial-mcp-schemas/tools/preview_map_package.schema.json +17 -0
- package/certification/geospatial-mcp-schemas/tools/preview_package.schema.json +40 -0
- package/certification/geospatial-mcp-schemas/tools/propose_operation.schema.json +28 -0
- package/certification/geospatial-mcp-schemas/tools/publish_result.schema.json +29 -0
- package/certification/geospatial-mcp-schemas/tools/publish_service.schema.json +59 -0
- package/certification/geospatial-mcp-schemas/tools/query_features.schema.json +54 -0
- package/certification/geospatial-mcp-schemas/tools/refine_map_package.schema.json +22 -0
- package/certification/geospatial-mcp-schemas/tools/render_map.schema.json +55 -0
- package/certification/geospatial-mcp-schemas/tools/resolve_entity.schema.json +30 -0
- package/certification/geospatial-mcp-schemas/tools/solve_route.schema.json +39 -0
- package/certification/geospatial-mcp-schemas/tools/validate_package.schema.json +35 -0
- package/certification/geospatial-mcp-schemas/tools/validate_plan.schema.json +61 -0
- package/dist/src/certification/certifier.d.ts +119 -0
- package/dist/src/certification/certifier.d.ts.map +1 -0
- package/dist/src/certification/certifier.js +410 -0
- package/dist/src/certification/cli.d.ts +3 -0
- package/dist/src/certification/cli.d.ts.map +1 -0
- package/dist/src/certification/cli.js +48 -0
- package/dist/src/certification/contracts.d.ts +62 -0
- package/dist/src/certification/contracts.d.ts.map +1 -0
- package/dist/src/certification/contracts.js +174 -0
- package/dist/src/certification/fixture-client.d.ts +4 -0
- package/dist/src/certification/fixture-client.d.ts.map +1 -0
- package/dist/src/certification/fixture-client.js +113 -0
- package/dist/src/certification/fixtures.d.ts +32 -0
- package/dist/src/certification/fixtures.d.ts.map +1 -0
- package/dist/src/certification/fixtures.js +64 -0
- package/dist/src/certification/json-schema.d.ts +49 -0
- package/dist/src/certification/json-schema.d.ts.map +1 -0
- package/dist/src/certification/json-schema.js +164 -0
- package/dist/src/certification/mock-upstream.d.ts +29 -0
- package/dist/src/certification/mock-upstream.d.ts.map +1 -0
- package/dist/src/certification/mock-upstream.js +96 -0
- package/dist/src/certification/operator-catalog.d.ts +82 -0
- package/dist/src/certification/operator-catalog.d.ts.map +1 -0
- package/dist/src/certification/operator-catalog.js +466 -0
- package/dist/src/certification/report.d.ts +4 -0
- package/dist/src/certification/report.d.ts.map +1 -0
- package/dist/src/certification/report.js +90 -0
- package/dist/src/certification/run.d.ts +28 -0
- package/dist/src/certification/run.d.ts.map +1 -0
- package/dist/src/certification/run.js +31 -0
- package/dist/src/certification/schema-index.d.ts +69 -0
- package/dist/src/certification/schema-index.d.ts.map +1 -0
- package/dist/src/certification/schema-index.js +82 -0
- package/dist/src/certification/target.d.ts +40 -0
- package/dist/src/certification/target.d.ts.map +1 -0
- package/dist/src/certification/target.js +167 -0
- package/dist/src/eval/cli.d.ts +3 -0
- package/dist/src/eval/cli.d.ts.map +1 -0
- package/dist/src/eval/cli.js +116 -0
- package/dist/src/eval/corpus.d.ts +27 -0
- package/dist/src/eval/corpus.d.ts.map +1 -0
- package/dist/src/eval/corpus.js +134 -0
- package/dist/src/eval/drivers/anthropic.d.ts +14 -0
- package/dist/src/eval/drivers/anthropic.d.ts.map +1 -0
- package/dist/src/eval/drivers/anthropic.js +120 -0
- package/dist/src/eval/drivers/bedrock.d.ts +54 -0
- package/dist/src/eval/drivers/bedrock.d.ts.map +1 -0
- package/dist/src/eval/drivers/bedrock.js +178 -0
- package/dist/src/eval/drivers/deterministic.d.ts +17 -0
- package/dist/src/eval/drivers/deterministic.d.ts.map +1 -0
- package/dist/src/eval/drivers/deterministic.js +51 -0
- package/dist/src/eval/drivers/index.d.ts +34 -0
- package/dist/src/eval/drivers/index.d.ts.map +1 -0
- package/dist/src/eval/drivers/index.js +74 -0
- package/dist/src/eval/drivers/openai.d.ts +14 -0
- package/dist/src/eval/drivers/openai.d.ts.map +1 -0
- package/dist/src/eval/drivers/openai.js +136 -0
- package/dist/src/eval/grade.d.ts +14 -0
- package/dist/src/eval/grade.d.ts.map +1 -0
- package/dist/src/eval/grade.js +56 -0
- package/dist/src/eval/northstar-corpus.d.ts +3 -0
- package/dist/src/eval/northstar-corpus.d.ts.map +1 -0
- package/dist/src/eval/northstar-corpus.js +194 -0
- package/dist/src/eval/operator-corpus.d.ts +3 -0
- package/dist/src/eval/operator-corpus.d.ts.map +1 -0
- package/dist/src/eval/operator-corpus.js +193 -0
- package/dist/src/eval/report.d.ts +104 -0
- package/dist/src/eval/report.d.ts.map +1 -0
- package/dist/src/eval/report.js +130 -0
- package/dist/src/eval/runner.d.ts +22 -0
- package/dist/src/eval/runner.d.ts.map +1 -0
- package/dist/src/eval/runner.js +116 -0
- package/dist/src/eval/types.d.ts +93 -0
- package/dist/src/eval/types.d.ts.map +1 -0
- package/dist/src/eval/types.js +10 -0
- package/dist/src/helpers.d.ts +11 -0
- package/dist/src/helpers.d.ts.map +1 -1
- package/dist/src/helpers.js +22 -0
- package/dist/src/index.d.ts +7 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +30 -4
- package/dist/src/proxy.d.ts +46 -0
- package/dist/src/proxy.d.ts.map +1 -0
- package/dist/src/proxy.js +124 -0
- package/dist/src/resources/styles.d.ts +29 -0
- package/dist/src/resources/styles.d.ts.map +1 -0
- package/dist/src/resources/styles.js +43 -0
- package/dist/src/styles.d.ts +110 -0
- package/dist/src/styles.d.ts.map +1 -0
- package/dist/src/styles.js +118 -0
- package/dist/src/tools/apply-style-preset.d.ts +27 -0
- package/dist/src/tools/apply-style-preset.d.ts.map +1 -0
- package/dist/src/tools/apply-style-preset.js +29 -0
- package/dist/src/tools/count-features.d.ts.map +1 -1
- package/dist/src/tools/count-features.js +5 -4
- package/dist/src/tools/get-extent.d.ts.map +1 -1
- package/dist/src/tools/get-extent.js +6 -4
- package/dist/src/tools/get-style.d.ts +24 -0
- package/dist/src/tools/get-style.d.ts.map +1 -0
- package/dist/src/tools/get-style.js +28 -0
- package/dist/src/tools/query-features.d.ts.map +1 -1
- package/dist/src/tools/query-features.js +4 -1
- 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
|
+
}
|