Context
Surfaced 2026-06-15 while resolving an operator challenge: create a grid in a live Neo app using only the Neural Link MCP tools (no spec file). After call_method(viewport,'add',[gridConfig]) created a live Neo.grid.Container backed by a Neo.data.Store, the agent-facing inspect_store MCP tool failed:
MCP error -32602: Structured content does not match the tool's output schema: data/model must be string
This sits on the exact verification path #13362 AC4 cares about ("Neural Link verification proves … worker-side state/store data"). PR #13363's e2e spec did not catch it because it verifies the store via the in-process Playwright fixture inspectStore (NeuralLink_DataService), which bypasses MCP output-schema validation — only an agent driving the real inspect_store MCP tool hits it.
Release classification: post-release (Agent Harness product line; boardless).
The Problem
The inspect_store response includes the store's model. A live store's model is the serialized Neo.data.Model — an object ({className, fields:[…], keyProperty, …}). But the OpenAPI response schema declares model: type: string. Strict MCP output validation (activated by #10043; same family as #9837/#10072) rejects the object → -32602. Any store with an inline/object model is unreadable through the agent-facing tool.
The identical model: type: string defect exists in the sibling list_stores response schema. (#10072 already tracks a different list_stores divergence — the {stores:[…]} envelope + undeclared isLoaded — but does NOT call out model:string, so a list_stores fix per #10072 could miss it.)
The Architectural Reality
ai/mcp/server/neural-link/openapi.yaml:490-491 — inspect_store 200 response: model: type: string.
ai/mcp/server/neural-link/openapi.yaml:534-535 — list_stores items: model: type: string (sibling instance).
ai/services/neural-link/DataService.mjs:56 — inspectStore relays ConnectionService.call(sessionId,'inspect_store',…); the App-Worker snapshot carries model as an object.
test/playwright/unit/ai/mcp/validation/OpenApiValidatorCompliance.spec.mjs — the #10043 strict-output-validation harness where a round-trip belongs.
The Fix
Align the OpenAPI response schema to runtime reality (the #10072 recommendation-A pattern): declare model as type: object (or oneOf: [{type: string}, {type: object}] if some stores legitimately report only a model className string). Apply to both inspect_store (:490) and list_stores (:534). Add an OpenApiValidatorCompliance round-trip asserting an object-model store payload parses.
Decision Record impact
none — schema/contract correction, no ADR.
Acceptance Criteria
Out of Scope
- The
list_stores envelope / isLoaded divergence (#10072 owns that).
- The
create_instance / create_component agent-creation surface (separate friction ticket).
- A full re-audit of every NL tool output schema (this fixes the
model field; a broad audit could be its own sweep).
Related
- Surfaced by the live NL-tools grid-creation proof (the agent-surface counterpart to the fixture-only proof in PR #13363 / #13362 AC4).
- Same family: #10072 (list_stores envelope), #9837 (undeclared-field output drift), #10043 (strict output-validation activation).
- Agent Harness epic: #13012.
Origin Session ID
0f5d9f1d-0683-452d-aac1-f467297186ac
Handoff Retrieval Hints
query_raw_memories: "inspect_store MCP -32602 data/model must be string object model"; exact anchors: openapi.yaml:490 + :534 (model: type: string).
Live latest-open sweep: checked the latest 20 open issues 2026-06-15 (this session); #10072 is the same family (list_stores envelope) but a distinct divergence — no equivalent inspect_store / model-type ticket exists.
Context
Surfaced 2026-06-15 while resolving an operator challenge: create a grid in a live Neo app using only the Neural Link MCP tools (no spec file). After
call_method(viewport,'add',[gridConfig])created a liveNeo.grid.Containerbacked by aNeo.data.Store, the agent-facinginspect_storeMCP tool failed:This sits on the exact verification path #13362 AC4 cares about ("Neural Link verification proves … worker-side state/store data"). PR #13363's e2e spec did not catch it because it verifies the store via the in-process Playwright fixture
inspectStore(NeuralLink_DataService), which bypasses MCP output-schema validation — only an agent driving the realinspect_storeMCP tool hits it.Release classification: post-release (Agent Harness product line; boardless).
The Problem
The
inspect_storeresponse includes the store'smodel. A live store'smodelis the serializedNeo.data.Model— an object ({className, fields:[…], keyProperty, …}). But the OpenAPI response schema declaresmodel: type: string. Strict MCP output validation (activated by #10043; same family as #9837/#10072) rejects the object →-32602. Any store with an inline/object model is unreadable through the agent-facing tool.The identical
model: type: stringdefect exists in the siblinglist_storesresponse schema. (#10072 already tracks a differentlist_storesdivergence — the{stores:[…]}envelope + undeclaredisLoaded— but does NOT call outmodel:string, so alist_storesfix per #10072 could miss it.)The Architectural Reality
ai/mcp/server/neural-link/openapi.yaml:490-491—inspect_store200 response:model: type: string.ai/mcp/server/neural-link/openapi.yaml:534-535—list_storesitems:model: type: string(sibling instance).ai/services/neural-link/DataService.mjs:56—inspectStorerelaysConnectionService.call(sessionId,'inspect_store',…); the App-Worker snapshot carriesmodelas an object.test/playwright/unit/ai/mcp/validation/OpenApiValidatorCompliance.spec.mjs— the #10043 strict-output-validation harness where a round-trip belongs.The Fix
Align the OpenAPI response schema to runtime reality (the #10072 recommendation-A pattern): declare
modelastype: object(oroneOf: [{type: string}, {type: object}]if some stores legitimately report only a model className string). Apply to bothinspect_store(:490) andlist_stores(:534). Add anOpenApiValidatorComplianceround-trip asserting an object-modelstore payload parses.Decision Record impact
none— schema/contract correction, no ADR.Acceptance Criteria
inspect_storeagainst a live store with an inline/object model returns a valid payload (no-32602), verified by a direct MCP-tool call (not the in-process fixture).list_storesmodelfield accepts the same object shape.OpenApiValidatorCompliance.spec.mjsgains a parse round-trip for an object-modelstore payload (covers inspect_store + list_stores).inspect_storeMCP tool.Out of Scope
list_storesenvelope /isLoadeddivergence (#10072 owns that).create_instance/create_componentagent-creation surface (separate friction ticket).modelfield; a broad audit could be its own sweep).Related
Origin Session ID
0f5d9f1d-0683-452d-aac1-f467297186ac
Handoff Retrieval Hints
query_raw_memories: "inspect_store MCP -32602 data/model must be string object model"; exact anchors:openapi.yaml:490+:534(model: type: string).Live latest-open sweep: checked the latest 20 open issues 2026-06-15 (this session); #10072 is the same family (list_stores envelope) but a distinct divergence — no equivalent inspect_store / model-type ticket exists.