Files
alkhttp/tasks/adapters/review-001-mcp-tool-fidelity.md
T
glm-5.3-flash 12b35e2c5f docs(tasks): decompose review 001 remediation Units 1-5 into taskgraph tasks
21 review-001 tasks across server/adapters/client/gateway/websocket/infra,
chunked from the 7-unit remediation plan in
docs/reviews/001-initial-implementation-review.md.

- Scope split by mechanism, not one-per-finding: 15 tasks in generation 1
  (parallelizable), 6 sequenced after their file-sharing precursors
- Deliberately deferred until dependent fixes land: projection/doc
  fidelity partial (Unit 6 beyond dependency hygiene), coverage backfills
  (COV-01..07 via in-task acceptance for forward.rs), and per-finding
  minors (OAI-06/07, HY-02/04/06/10/11, CON-08)
- Cross-crate WS-12 (alkcall demux 4 GiB discard alloc) noted for filing
  in alkcall, not here

taskgraph: validate clean, no cycles, 6 generations
2026-08-29 07:10:15 +00:00

61 lines
2.5 KiB
Markdown

---
id: review-001-mcp-tool-fidelity
name: MCP tool-gateway runtime fidelity (PRJ-07, PRJ-08, PRJ-09, PRJ-10, PRJ-13)
status: pending
depends_on: [review-001-schema-internal-visibility]
scope: narrow
risk: low
impact: component
level: implementation
tags: [adapters, review-001, mcp]
---
## Description
Review 001 MCP projection findings in `src/adapters/to_mcp.rs` (the
schema-ACL half of the MCP story is review-001-schema-internal-visibility;
this task covers the rest of the tool surface):
- **PRJ-07**: the `search` tool advertises an optional substring `query`
filter but `call_tool` drops `arguments` entirely (`:382`) — an LLM
passing `{"query": "fs"}` gets the full unfiltered listing (context
waste/overflow in big registries). Honor the filter.
- **PRJ-08**: `search` excludes only `Sub`, not `Pub` (`:268-274`),
contradicting ADR-068 ("excludes both"). A discovered Pub op can never
be invoked via the `call` tool — the advertised discovery surface is a
lie for the whole Pub class. (The `"subscription"`/`"Sub"` match arms
are dead — `op_type_str` only emits lowercase.)
- **PRJ-09**: batch item shape `{"isError", "output"|"error"}` contradicts
the tool description ("each shaped like a `call` result") — fix the
description or the shape.
- **PRJ-10**: `structuredContent` passes output through verbatim, so
string/array/null outputs produce non-object `structuredContent`
(strict MCP clients may reject; batch returns a top-level array). Wrap
or document.
- **PRJ-13**: hand-rolled argument errors omit `retryable` (required by
the OpenAPI error schemas, always present on `CallError`), and a
non-string `operation` reports the misleading "missing required field".
Build argument errors in the `CallError` wire shape.
## Acceptance Criteria
- [ ] `search` respects a `query` argument (test); `Pub` ops excluded from results (test)
- [ ] Batch item doc matches the emitted shape (or shape changed to match — one way or the other, tested)
- [ ] Non-object outputs wrapped into objects or documented as an exception; batch shape consistent
- [ ] MCP argument errors carry `retryable` and truthful messages
- [ ] `cargo test --all-features` passes
## References
- docs/reviews/001-initial-implementation-review.md (Part F, PRJ-07..PRJ-10, PRJ-13)
- docs/architecture/decisions/041-mcp-tool-gateway-pattern.md
- docs/architecture/decisions/068-gateway-publish-endpoint.md
## Notes
> Agent fills during implementation. Depends on the visibility task
> because both rework the `schema` tool in `to_mcp.rs`.
## Summary
> Filled on completion.