This release reworks the tool surface. No existing caller breaks: every
former tool name stays callable as an alias, it is simply no longer
advertised in tools/list. Custom endpoints and agent prompts configured
with old names keep working.
Changed
- Redundant tools merged (#11) — 163 tools down to 140. Tools that differed only by verb now take an
action:calc_sheet(was create/rename/delete/list/switch/summary),calc_chart(create/edit/delete/info/list),calc_condformat,calc_comment,calc_search(search/replace),gallery_query(list/search/get) andtable_structure(add/delete rows or columns).image_list,frame_listandtable_listabsorbed their detail counterparts — pass a name to get one item's detail instead of the list. Nothing breaks: every former name stays callable, with the arguments its name implied pinned automatically (add_table_rows→table_structurewithaction=add, axis=rows). Measured: a Calc session drops from 63 tools / 10,467 tokens to 47 / 8,908 (-14.9%); Writer from 100 / 17,283 to 94 / 16,666 - Tools renamed to a
domain_verbconvention (#11) — 156 of the 163 tools were inconsistently named (insert_imagevsdocs_gallery_listvsget_document_info), which made the set hard to scan and hard for an LLM to pick from. They now share a prefix per domain:image_*,text_*,table_*,nav_*,doc_*,calc_*,draw_*,shape_*,frame_*,style_*,comment_*,change_*,link_*,section_*,bookmark_*,header_footer_*,workflow_*,task_*,summary_*,batch_*,job_*,gallery_*/docgallery_*. Nothing breaks: every former name remains callable as an alias, it is simply no longer advertised intools/list. Shape tools are prefixedshape_rather thandraw_because they work on any document type with a drawing layer, not just Draw/Impress tools/listpayload cut by ~17% (#11) — the_documentmeta-parameter is injected on ~96 tools, so its description was repeated ~96 times and made up 31% of the entire schema payload; it is now terse. Multi-type tools also shipped theircalc/drawoption blocks to Writer sessions (and vice versa) even though only the block matching the active document type can apply — the inapplicable ones are now dropped (the full schema is still sent when no document is open). Measured on a Writer document: 20,767 → 17,281 tokens for the same 100 tools
Added
- Tool aliases (#11) — a tool can declare
aliases = [...]: former names stay callable but are never advertised intools/list, so renaming a tool no longer breaks existing callers. Custom-endpoint tool filters andtools/callboth resolve through the alias map, so an endpoint configured with a tool's old name keeps working
Fixed
make testis a usable gate again — the suite aborted during collection, so nothing was actually gated on it.tests/legacy/(13 files) importedcore.*andchatbot, packages removed in the framework rewrite; the two that did import contained no assertion at all. They are gone (git history keeps them). Five config tests still expected anelson.jsonthat has not existed since config moved to the LibreOffice registry, and three tool-registry tests asserted an error contract replaced by structured MCP errors. 77 tests pass, none fail- Config writes could vanish silently —
ConfigServicestores values in the LibreOffice configuration registry, and a write with no UNO context returned without storing anything and without a word in the log, so a later read quietly returned the default. It now warns, reports whether the value was stored, and accepts an in-memory store (which is what makes the service testable outside LibreOffice) - A logo inserted into a header no longer overlaps the body text (#18) — reported by @braklo on 0.9.4. The image was anchored
AT_CHARACTER, so it floated above the text without contributing to the line height: the header kept its original height and the image spilled over the header text and down into the body. Images inserted into a header or footer are now anchoredAS_CHARACTER(in the text flow) and the region is set to grow with its content, so it sizes itself to the image with no manual step.set_header_footergains anauto_heightparameter andget_header_footernow reportsauto_heightandheight_mm;insert_imageacceptswriter.auto_height: falseto opt out - HTTP server failed to start after a restart — relaunching LibreOffice raced the previous process releasing the port, so the bind failed with
[Errno 98] Address already in useand the server never came up (theHTTP server readyline was never logged). The socket now setsallow_reuse_addressand retries the bind briefly before giving up with a plain message naming the port. A failed start also no longer discards the handle to an already-running server, and the server is not started twice - Aliased calls were wrongly rejected when no document was open (#11) — the
requires_docpre-check bypassed alias resolution, so a tool invoked by a former name looked unknown and was treated as requiring an open document