|
| 1 | +# l3dg3rr MCP Server — Interface Test Summary |
| 2 | + |
| 3 | +**Date**: 2026-04-16 |
| 4 | +**Binary**: `target/debug/ledgerr-mcp-server` |
| 5 | +**Protocol**: MCP 2025-11-25 |
| 6 | +**Commit**: `faba56d` |
| 7 | +**Tools advertised**: 28 | **Tools probed**: 27 |
| 8 | + |
| 9 | +## Bug Registry |
| 10 | + |
| 11 | +| ID | Severity | Tool | Issue | Status | |
| 12 | +|----|----------|------|-------|--------| |
| 13 | +| BUG-001 | P1 | `proxy_docling_ingest_pdf` | Schema required `source_ref`; impl required `pdf_path`+`journal_path`+`workbook_path` | ✅ Fixed — schema updated to match impl; `extracted_rows` made truly optional | |
| 14 | +| BUG-002 | P1 | `l3dg3rr_ontology_export_snapshot` | Schema advertised no params; impl required `ontology_path` | ✅ Fixed — schema updated; handler routed through `TurboLedgerService` | |
| 15 | + |
| 16 | +## Pass Results by Tool Group |
| 17 | + |
| 18 | +| Group | Tools | Result | |
| 19 | +|-------|-------|--------| |
| 20 | +| Core | `list_accounts`, `get_pipeline_status`, `hsm_status`, `query_audit_log`, `proxy_rustledger_ingest_statement_rows` | ✅ All pass | |
| 21 | +| Reconciliation | `validate_reconciliation`, `reconcile_postings`, `commit_guarded` | ✅ All pass (balanced/unbalanced/edge cases) | |
| 22 | +| HSM | `hsm_transition`, `hsm_resume`, `hsm_status` | ✅ Respond correctly (blocked transitions expected by lifecycle guard) | |
| 23 | +| Events | `event_history`, `event_replay` | ✅ All pass | |
| 24 | +| Classification | `classify_ingested`, `classify_transaction`, `reconcile_excel_classification`, `query_flags` | ✅ All pass | |
| 25 | +| Tax | `tax_assist`, `tax_evidence_chain`, `tax_ambiguity_review`, `get_schedule_summary`, `export_cpa_workbook` | ✅ All pass | |
| 26 | +| Ontology (read) | `ontology_query_path`, `ontology_upsert_entities`, `ontology_upsert_edges` | ✅ Pass | |
| 27 | +| Ontology (export) | `ontology_export_snapshot` | ✅ Pass (BUG-002 fixed) | |
| 28 | +| Docling proxy | `proxy_docling_ingest_pdf` | ✅ Pass (BUG-001 fixed) | |
| 29 | + |
| 30 | +## Protocol Compliance |
| 31 | + |
| 32 | +- Initialize/initialized handshake: ✅ |
| 33 | +- `tools/list` returns complete schema: ✅ |
| 34 | +- JSON-RPC error codes: ✅ (`-32601` for unknown method) |
| 35 | +- Response envelope (`result.content[].type`, `isError`): ✅ |
| 36 | + |
| 37 | +## Input Validation Coverage |
| 38 | + |
| 39 | +| Input class | Behavior | |
| 40 | +|-------------|----------| |
| 41 | +| Valid decimal string `"-42.11"` | ✅ Accepted | |
| 42 | +| Non-numeric decimal | ✅ Rejected with `InvalidInput` | |
| 43 | +| ISO 8601 date `"2024-01-15"` | ✅ Accepted | |
| 44 | +| Slash-delimited date `"2024/01/15"` | ✅ Rejected | |
| 45 | +| Valid schedule enum | ✅ Accepted | |
| 46 | +| Invalid enum value | ✅ Rejected with descriptive message | |
| 47 | +| Missing required field | ✅ Rejected with `"missing or invalid \`fieldname\`"` | |
| 48 | +| Unknown tool name | ✅ Returns `unknown tool: <name>` with `isError:true` | |
| 49 | + |
| 50 | +## Recommendations |
| 51 | + |
| 52 | +1. **Systematic schema audit**: BUG-001 and BUG-002 reveal a pattern — schemas may have been written against an earlier or future API shape. Audit all 28 tool schemas against their `parse_*` functions. |
| 53 | +2. **Schema generation**: Derive `inputSchema` from the same struct that drives parsing (e.g., `schemars`) to prevent drift. |
| 54 | +3. **CI gate**: Add a test that calls every tool with schema-compliant minimal args and asserts `isError:false` (or an expected domain error, not a parse error). |
0 commit comments