Skip to content

Commit 8f9d571

Browse files
Merge pull request #15 from PromptExecution/refactor/mcp-adapter-clarity
refactor(mcp-adapter): clarify naming, extract helpers, fix abstraction boundary
2 parents 8b45d9e + fdeb5e2 commit 8f9d571

7 files changed

Lines changed: 281 additions & 465 deletions

File tree

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,18 @@
11
# Changelog
22
All notable changes to this project will be documented in this file. See [conventional commits](https://www.conventionalcommits.org/) for commit guidelines.
33

4+
- - -
5+
## refactor/mcp-adapter-clarity - 2026-04-16
6+
#### Refactor
7+
- (**ledgerr-mcp**) extracted `error_envelope` private helper — ~29 duplicated parse-error/service-error JSON construction blocks collapsed to a single call site
8+
- (**ledgerr-mcp**) renamed 23 handler functions: single-tool handlers `*_tool_result``handle_*`; multi-tool dispatchers `reconciliation_tool_result`/`hsm_tool_result``dispatch_reconciliation`/`dispatch_hsm`
9+
- (**ledgerr-mcp**) renamed `map_tool_error``error_payload`; name now reflects JSON rendering, not error transformation
10+
- (**ledgerr-mcp**) renamed `normalize_rows_with_provenance``rows_to_json_with_provenance`; rows are already normalised — the function converts them to JSON with provenance annotation
11+
- (**ledgerr-mcp**) removed `pub` from `parse_ingest_pdf_request` and `parse_ingest_statement_rows_request`; both had no external callers
12+
- (**ledgerr-mcp**) renamed catalog/descriptor trio: `tool_catalog``tool_names`, `tool_catalog_with_features``tool_names_for`, `tool_list_entries``tool_descriptors`; names now distinguish "names only" from "names + schemas"
13+
- (**ledgerr-mcp**) routed `handle_ontology_export_snapshot` through `TurboLedgerService` instead of calling `OntologyStore::load` directly; added `OntologyExportSnapshotRequest`/`OntologyExportSnapshotResponse` types, service method, and covering test
14+
- (**ledgerr-mcp**) removed vestigial `McpAdapter` struct — only method discarded its service reference immediately; no call sites existed in the crate
15+
416
- - -
517
## v1.3.6 - 2026-04-16
618
#### Bug Fixes

crates/ledgerr-mcp/src/bin/ledgerr-mcp-server.rs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ fn handle_request(request: Value) -> Option<Value> {
4646
})),
4747
"notifications/initialized" => None,
4848
"tools/list" => {
49-
let tools = mcp_adapter::tool_list_entries();
49+
let tools = mcp_adapter::tool_descriptors();
5050
Some(json!({
5151
"jsonrpc": "2.0",
5252
"id": id,
@@ -58,7 +58,7 @@ fn handle_request(request: Value) -> Option<Value> {
5858
let tool_name = params.get("name").and_then(Value::as_str).unwrap_or("");
5959
let result = match tool_name {
6060
mcp_adapter::LIST_ACCOUNTS_TOOL => {
61-
mcp_adapter::list_accounts_tool_result(global_service())
61+
mcp_adapter::handle_list_accounts(global_service())
6262
}
6363
"l3dg3rr_get_pipeline_status" => {
6464
let status = mcp_adapter::get_pipeline_status(true, true, true, Vec::new());
@@ -72,105 +72,105 @@ fn handle_request(request: Value) -> Option<Value> {
7272
}
7373
"proxy_docling_ingest_pdf" => {
7474
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
75-
mcp_adapter::ingest_pdf_tool_result(
75+
mcp_adapter::handle_ingest_pdf(
7676
global_service(),
7777
&arguments,
7878
Some(format!("mcp-call-{id}")),
7979
)
8080
}
8181
"proxy_rustledger_ingest_statement_rows" => {
8282
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
83-
mcp_adapter::ingest_statement_rows_tool_result(
83+
mcp_adapter::handle_ingest_statement_rows(
8484
global_service(),
8585
&arguments,
8686
Some(format!("mcp-call-{id}")),
8787
)
8888
}
8989
mcp_adapter::GET_RAW_CONTEXT_TOOL => {
9090
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
91-
mcp_adapter::get_raw_context_tool_result(global_service(), &arguments)
91+
mcp_adapter::handle_get_raw_context(global_service(), &arguments)
9292
}
9393
mcp_adapter::ONTOLOGY_QUERY_PATH_TOOL => {
9494
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
95-
mcp_adapter::ontology_query_path_tool_result(global_service(), &arguments)
95+
mcp_adapter::handle_ontology_query_path(global_service(), &arguments)
9696
}
9797
mcp_adapter::ONTOLOGY_EXPORT_SNAPSHOT_TOOL => {
9898
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
99-
mcp_adapter::ontology_export_snapshot_tool_result(&arguments)
99+
mcp_adapter::handle_ontology_export_snapshot(global_service(), &arguments)
100100
}
101101
mcp_adapter::RECON_VALIDATE_TOOL
102102
| mcp_adapter::RECON_RECONCILE_TOOL
103103
| mcp_adapter::RECON_COMMIT_TOOL => {
104104
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
105-
mcp_adapter::reconciliation_tool_result(global_service(), tool_name, &arguments)
105+
mcp_adapter::dispatch_reconciliation(global_service(), tool_name, &arguments)
106106
}
107107
mcp_adapter::HSM_TRANSITION_TOOL
108108
| mcp_adapter::HSM_STATUS_TOOL
109109
| mcp_adapter::HSM_RESUME_TOOL => {
110110
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
111-
mcp_adapter::hsm_tool_result(global_service(), tool_name, &arguments)
111+
mcp_adapter::dispatch_hsm(global_service(), tool_name, &arguments)
112112
}
113113
mcp_adapter::EVENT_HISTORY_TOOL => {
114114
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
115-
mcp_adapter::event_history_tool_result(global_service(), &arguments)
115+
mcp_adapter::handle_event_history(global_service(), &arguments)
116116
}
117117
mcp_adapter::EVENT_REPLAY_TOOL => {
118118
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
119-
mcp_adapter::event_replay_tool_result(global_service(), &arguments)
119+
mcp_adapter::handle_event_replay(global_service(), &arguments)
120120
}
121121
mcp_adapter::TAX_ASSIST_TOOL => {
122122
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
123-
mcp_adapter::tax_assist_tool_result(global_service(), &arguments)
123+
mcp_adapter::handle_tax_assist(global_service(), &arguments)
124124
}
125125
mcp_adapter::TAX_EVIDENCE_CHAIN_TOOL => {
126126
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
127-
mcp_adapter::tax_evidence_chain_tool_result(global_service(), &arguments)
127+
mcp_adapter::handle_tax_evidence_chain(global_service(), &arguments)
128128
}
129129
mcp_adapter::TAX_AMBIGUITY_REVIEW_TOOL => {
130130
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
131-
mcp_adapter::tax_ambiguity_review_tool_result(global_service(), &arguments)
131+
mcp_adapter::handle_tax_ambiguity_review(global_service(), &arguments)
132132
}
133133
// P0 tools
134134
mcp_adapter::CLASSIFY_INGESTED_TOOL => {
135135
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
136-
mcp_adapter::classify_ingested_tool_result(global_service(), &arguments)
136+
mcp_adapter::handle_classify_ingested(global_service(), &arguments)
137137
}
138138
mcp_adapter::QUERY_FLAGS_TOOL => {
139139
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
140-
mcp_adapter::query_flags_tool_result(global_service(), &arguments)
140+
mcp_adapter::handle_query_flags(global_service(), &arguments)
141141
}
142142
mcp_adapter::QUERY_AUDIT_LOG_TOOL => {
143143
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
144-
mcp_adapter::query_audit_log_tool_result(global_service(), &arguments)
144+
mcp_adapter::handle_query_audit_log(global_service(), &arguments)
145145
}
146146
// P1 tools
147147
mcp_adapter::CLASSIFY_TRANSACTION_TOOL => {
148148
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
149-
mcp_adapter::classify_transaction_tool_result(global_service(), &arguments)
149+
mcp_adapter::handle_classify_transaction(global_service(), &arguments)
150150
}
151151
mcp_adapter::RECONCILE_EXCEL_CLASSIFICATION_TOOL => {
152152
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
153-
mcp_adapter::reconcile_excel_classification_tool_result(
153+
mcp_adapter::handle_reconcile_excel_classification(
154154
global_service(),
155155
&arguments,
156156
)
157157
}
158158
mcp_adapter::GET_SCHEDULE_SUMMARY_TOOL => {
159159
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
160-
mcp_adapter::get_schedule_summary_tool_result(global_service(), &arguments)
160+
mcp_adapter::handle_get_schedule_summary(global_service(), &arguments)
161161
}
162162
// P2 tools
163163
mcp_adapter::EXPORT_CPA_WORKBOOK_TOOL => {
164164
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
165-
mcp_adapter::export_cpa_workbook_tool_result(global_service(), &arguments)
165+
mcp_adapter::handle_export_cpa_workbook(global_service(), &arguments)
166166
}
167167
mcp_adapter::ONTOLOGY_UPSERT_ENTITIES_TOOL => {
168168
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
169-
mcp_adapter::ontology_upsert_entities_tool_result(global_service(), &arguments)
169+
mcp_adapter::handle_ontology_upsert_entities(global_service(), &arguments)
170170
}
171171
mcp_adapter::ONTOLOGY_UPSERT_EDGES_TOOL => {
172172
let arguments = params.get("arguments").cloned().unwrap_or(Value::Null);
173-
mcp_adapter::ontology_upsert_edges_tool_result(global_service(), &arguments)
173+
mcp_adapter::handle_ontology_upsert_edges(global_service(), &arguments)
174174
}
175175
_ => mcp_adapter::unknown_tool_result(tool_name),
176176
};

crates/ledgerr-mcp/src/lib.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,19 @@ pub struct ExportCpaWorkbookResponse {
230230
pub sheets_written: usize,
231231
}
232232

233+
#[derive(Debug, Clone, PartialEq, Eq)]
234+
pub struct OntologyExportSnapshotRequest {
235+
pub ontology_path: PathBuf,
236+
}
237+
238+
#[derive(Debug, Clone)]
239+
pub struct OntologyExportSnapshotResponse {
240+
pub entities: Vec<OntologyEntity>,
241+
pub edges: Vec<OntologyEdge>,
242+
pub entity_count: usize,
243+
pub edge_count: usize,
244+
}
245+
233246
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
234247
pub enum ScheduleKindRequest {
235248
ScheduleC,
@@ -414,6 +427,19 @@ impl TurboLedgerService {
414427
self.ontology_query_path(request)
415428
}
416429

430+
pub fn ontology_export_snapshot(
431+
&self,
432+
request: OntologyExportSnapshotRequest,
433+
) -> Result<OntologyExportSnapshotResponse, ToolError> {
434+
let store = OntologyStore::load(&request.ontology_path)?;
435+
Ok(OntologyExportSnapshotResponse {
436+
entity_count: store.entities.len(),
437+
edge_count: store.edges.len(),
438+
entities: store.entities,
439+
edges: store.edges,
440+
})
441+
}
442+
417443
pub fn validate_reconciliation_stage_tool(
418444
&self,
419445
request: ReconciliationStageRequest,

0 commit comments

Comments
 (0)