feat(mcp): declarative op table and per-variant request validation

- Define Ty, Param, Rule, and OpDef in src/mcp_ops.rs for all 39 mutations
- Generate Draft 2020-12 schema using per-op anyOf variants with op enum discriminators
- Disambiguate colliding properties (replace, center, name) across mutation variants
- Add pre-dispatch validator enforcing required fields, rules, and parameter types
- Emit unknown parameter warnings into response warnings
- Introduce target_document_id for entities_copy_to with deprecated document_id fallback
- Update unit tests and automation smoke assertions
This commit is contained in:
Karim Jerbi committed 2026-09-30 16:54:45 +01:00
1 parent 74c48ff5e3
commit 6951cc2a7a
5 files changed
+1169 -411

No files matched your search

+9 -4
View File
@@ -52,7 +52,8 @@ def legacy(server: Path) -> None:
names = set(definitions)
assert names == TOOLS, names
execute_request = definitions["ocs_execute"]["inputSchema"]["properties"]["request"]
assert len(execute_request["oneOf"]) == 39
variants = execute_request.get("anyOf") or execute_request.get("oneOf")
assert len(variants) == 39
op_enum = execute_request["properties"]["op"]["enum"]
for shipped in ("entities_create", "entities_delete", "entities_transform",
"block_define", "block_delete", "file_identity", "xdata_set",
@@ -65,15 +66,19 @@ def legacy(server: Path) -> None:
assert "text_search" in definitions["ocs_read"]["inputSchema"]["properties"]["op"]["enum"]
assert "text_audit" in definitions["ocs_read"]["inputSchema"]["properties"]["op"]["enum"]
assert execute_request["properties"]["steps"]["maxItems"] == 64
assert execute_request["properties"]["cmd"]["examples"][0] == "LINE 0,0 10,10"
variant_map = {
v["properties"]["op"].get("const") or v["properties"]["op"]["enum"][0]: v
for v in variants
}
assert variant_map["run"]["properties"]["cmd"]["type"] == "string"
assert "set_properties" in execute_request["properties"]["op"]["enum"]
assert "save_verified" in execute_request["properties"]["op"]["enum"]
assert "record_schema" in definitions["ocs_read"]["inputSchema"]["properties"]["op"]["enum"]
assert "audit" in definitions["ocs_read"]["inputSchema"]["properties"]["op"]["enum"]
read_parameters = definitions["ocs_read"]["inputSchema"]["properties"]["parameters"]["properties"]
assert {"collection", "where", "paths", "target_format", "target_version"} <= set(read_parameters)
assert execute_request["properties"]["target_version"]["enum"][0] == "R14"
assert execute_request["properties"]["kind"]["enum"] == [
assert variant_map["save_verified"]["properties"]["target_version"]["enum"][0] == "R14"
assert variant_map["input"]["properties"]["kind"]["enum"] == [
"text", "token", "point", "entity", "structure", "selection", "enter"
]
for name in {"ocs_sessions", "ocs_read", "ocs_execute"}: