Pod

Available as Markdown and JSON. Pod is also available over MCP.

Reported issues for Nelson MCP — LibreOffice Desktop Extension

Pod holds 19 of 30 GitHub reports that passed its relevance review. This can include external user reports, maintainer-confirmed bugs, and concrete feature gaps. Treat them as evidence to inspect, not a count of distinct defects.

Back to Nelson MCP — LibreOffice Desktop Extension.

Most discussed

MCP edits are recorded as tracked changes even when Record Changes is off — please consider an opt-out

Summary

With Edit → Track Changes → Record Changes switched off in the LibreOffice UI, edits performed through Nelson MCP tools are still written into xl/revisions/ on save. Manual edits typed in the UI are correctly not recorded.

Steps to reproduce

  1. Open a .xlsx in LibreOffice Calc.
  2. Make sure Edit → Track Changes → Record Changes is off.
  3. Via MCP: write_cell_range -> Price!A60 = "TEST2"
  4. By hand in the UI: type Price!A61 = "manual test" 5.…

Read the thread · 2026-07-21 · closed · external user · 10 comments

/health reports a stale active document after doc_open, while doc_info and doc_list_open are correct

The document block that /health returns does not reflect a document opened through doc_open. It either reports no document at all, or reports one with doc_type: null and a doc_id that belongs to no open document. The tools themselves are fine throughout: doc_info and doc_list_open always return the correct, stable id.

Measured on 0.14.0 against a freshly started GUI instance, six opens in total, each one a separate MCP session, .xlsx in Calc:

| after doc_open, /health…

Read the thread · 2026-09-19 · closed · external user · 9 comments

doc_open on an already open document creates a second view, both reported active, and closing one drops the file lock

Version 0.14.0 (.oxt), LibreOffice Calc, Linux, HTTP MCP transport.

Calling doc_open with the path of a document that is already open does not return the existing document. It opens a second view of the same file, and the state that follows is hard for a caller to reason about.

Reproduction:

  1. open a spreadsheet from outside Nelson: soffice /tmp/doc_01.xlsx
  2. doc_open({file_path: "/tmp/doc_01.xlsx"})
  3. doc_list_open

What you get:

Read the thread · 2026-09-19 · closed · external user · 8 comments

doc_close ignores _document, closes the active document instead, and reports success when it closed nothing

Version 0.12.1 (.oxt), LibreOffice Calc, Linux, HTTP MCP transport.

doc_close has three separate faults that compound each other.

1. _document is ignored. doc_close({_document: "id:<B>"}) does not close B — it closes the active document. The response echoes "active_document": "<B>", so from the outside it looks like the right thing happened.

2. It returns ok even when it closed nothing. In a batch of 13 calls I got "Document closed." 13 times; exactly one document…

Read the thread · 2026-08-20 · open · external user · 8 comments

MCP session dies on LibreOffice restart — could the server accept re-initialization on the same endpoint?

Nelson runs inside LibreOffice, so every restart of the application invalidates the MCP session. The next tool call then returns:

-32000: Session expired (server restarted). Please re-initialize the MCP connection.

The message is clear and the server behaves correctly. The friction is on the client side: the MCP client still lists the server as connected, so a dead session and a live one look identical until a call fails. Recovering requires the user to disconnect and reconnect the server…

Read the thread · 2026-08-21 · closed · external user · 6 comments

Deadlock on cold start when LibreOffice is launched with a document: no window ever appears

When LibreOffice is started cold with a document on the command line, it sometimes never shows a window. The process stays alive, port 8766 is bound, and the desktop taskbar keeps a dead "starting" entry that does nothing when clicked. Killing the process and opening the same file again works, so this is a startup race rather than a permanent failure.

This is easy to hit in daily use: opening a spreadsheet attachment from a mail client launches soffice --calc <file> while no LibreOffice…

Read the thread · 2026-08-14 · open · external user · 6 comments

save_document_as does not rebind the document — a later save_document overwrites the original file

Summary

save_document_as writes the target file and returns status: ok with the new file_url, but the open document stays bound to its original location. A subsequent save_document therefore writes back to the original file, while the file created by save_document_as stays frozen at the moment of the call.

The tool description says: "The document adopts the new file as its location (like File > Save As, not an export)." The observed behaviour is the opposite — it acts like…

Read the thread · 2026-07-21 · closed · external user · 6 comments

Add fit_image tool to auto-fit an image within its frame

Context

After manually rotating an image in LibreOffice (portrait → landscape), the AI assistant needs to resize the image to fit inside its existing frame. Currently this requires:

  1. Reading the frame dimensions
  2. Knowing the image's actual pixel ratio (which may have changed after rotation)
  3. Manually calculating the correct width/height
  4. Calling set_image_properties with both dimensions (risk of breaking the ratio)
  5. Optionally resizing the frame if the image doesn't fit

This…

Read the thread · 2026-04-08 · closed · 6 comments

Most recent

/health and doc_info treat the Start Center as a document after the first tools/list

On a fresh LibreOffice started without a file, with the Start Center current, /health is correct (available: false) until the first tools/list. After it, /health reports available: true with doc_type: null and a doc_id that is new on every start. doc_info without _document resolves to that same id and fails with execution_error, message getURL, while doc_list_open returns 0 documents. The state stays until a document is opened; after a doc_open and doc_close, a…

Read the thread · 2026-09-27 · open · external user · 1 comment

OnStartApp bootstrap deadlocks LibreOffice startup when RecoveryInfo/Crashed=true (Solar Mutex × Recovery SynchronousDispatch)

OnStartApp bootstrap deadlocks LibreOffice startup when RecoveryInfo/Crashed=true — Solar Mutex × Recovery SynchronousDispatch

Environment

Symptom

After any LibreOffice crash that leaves RecoveryInfo/Crashed=true in the user's…

Read the thread · 2026-08-20 · open · external user · 5 comments

doc_open returns ok before the document is resolvable as active — the next tool call fails with no_document (retryable: false)

The first tool call that targets the active document immediately after doc_open fails, even though doc_open returned ok and doc_list_open lists the document:

{"status":"error","code":"no_document","message":"No document open in LibreOffice.",
 "retryable":false,"hint":"Use doc_create or doc_open first."}

doc_open apparently returns before the newly opened document becomes resolvable as the current/active component. Measured on 0.12.1 in a single MCP session (one…

Read the thread · 2026-07-26 · closed · external user · 5 comments

A prefix that disagrees with sheet_name is accepted silently on the write paths, not refused

Two loose ends from #30, both small, found while verifying that fix on 0.12.1.

Your comment said a prefix wins over sheet_name and that disagreeing between the two is an error rather than a silent choice. The guard is there in CalcBridge.resolve(), but the write paths don't go through it:

calc_write_range  start_cell="Summary.B4"  values=[["CONFLICT"]]  sheet_name="Sources"
  → ok, "Wrote 1 rows, 1 cols starting at B4."
     Summary.B4 = 'CONFLICT'      Sources.B4 = None

calc_comment…

[Read the thread](https://github.com/quazardous/nelson-mcp/issues/33) · 2026-07-25 · closed · external user · 5 comments

### Generated chart names collide across sheets, and the failure surfaces as an empty error message

Found while verifying #30 on 0.12.1. This one only became reachable because of that fix — until charts could land on more than one sheet, the counter always matched.

`create_chart` names a new chart `Chart_{len(charts)}`, counting the charts on the target sheet. The name has to be unique across the whole document though, so the second chart on a different sheet asks for `Chart_0` again and `addNewByName` throws:

chart on Capex from A1:B4 → ok (Chart_0) another chart…

Read the thread · 2026-07-25 · closed · external user · 5 comments

A chart built from a sheet-qualified data_range lands on the data sheet, not the active one

Follow-up from #30, found while verifying that fix on 0.12.1.

A sheet-qualified data_range is accepted now and the chart does get built — but it is added to the sheet the data lives on, rather than the active one. Your comment on #30 described the opposite, and it was the case you asked me to confirm, so here is what I see.

Workbook has four sheets, Capex active:

calc_chart create  data_range="'Data Sheet'.A1:B5"  chart_type="bar"
                   title="cross-sheet"  position="D1"…

[Read the thread](https://github.com/quazardous/nelson-mcp/issues/31) · 2026-07-25 · closed · external user · 5 comments

### Sheet-qualified ranges (Sheet1.A1:C5) are always rejected, though the tool description advertises them

The `read_cell_range` description advertises sheet-qualified ranges:

> `range_name`: Cell range(s) (e.g. **A1:D10, Sheet1.A1:C5**) or list of ranges/cells…

The parser never accepts one. It isn't about spaces in the name — a single-word sheet fails just as reliably:

read_cell_range {"range_name": "Summary.D4:D6"} → Invalid cell range format: 'SUMMARY.D4:D6' read_cell_range {"range_name": "Sources.A1:A3"} → Invalid cell range format: 'SOURCES.A1:A3' read_cell_range {"range_name":…

Read the thread · 2026-07-25 · closed · external user · 4 comments

Per-module enable/disable, so users can turn off what they do not use

Spun off from #15, which asked for launchers and text-to-image to be separate plugins. The underlying goal — do not run what I do not use — is right; splitting into separate .oxt files is an expensive way to get it (rationale in #15). This is the cheap way.

Current state

Exactly one module can be turned off: mcp, via its enabled config key. Every other module loads unconditionally. There is no generic mechanism — nothing in ModuleBase or the bootstrap consults an enable flag.

So…

Read the thread · 2026-07-25 · closed · 2 comments

text_search_fulltext silently misses text frames that text_search finds

Spun off from #7 as the one concrete, reproducible defect left in it.

Nelson has two search backends over the same document and they disagree. The index-backed one returns nothing rather than saying it does not cover the content — a silent wrong answer, which is the worst failure mode for an agent, since it will conclude the text is not there.

Reproduction

A Writer document with an image inserted via image_insert, which wraps it in a captioned text frame (caption: logo):


[Read the thread](https://github.com/quazardous/nelson-mcp/issues/28) · 2026-07-25 · closed · 3 comments

### Guide tool selection: the instructions field, misleading affordances, and the unbuilt tool broker

Spun off from #2. That issue reported an LLM **creating a new document instead of opening the one the user named**, and ignoring the headings it was asked to use. Everything done since (custom endpoints, document-type filtering, the #11 rename and merges) reduced *how many* tools the model sees — none of it addressed *how it chooses*. Three concrete gaps, cheapest first.

## 1. The `instructions` field is wasted

`initialize` returns an `instructions` string that MCP clients inject straight…

[Read the thread](https://github.com/quazardous/nelson-mcp/issues/27) · 2026-07-25 · closed · 4 comments

### Declare tools.listChanged: true and emit list_changed when the active document type changes

## Summary

Nelson filters its tool list by the type of the currently open document — a great design for keeping context small (~27 generic tools with no document, 61 with a Calc document, ~96 with a Writer document; measured on v0.8.2, `minimal` preset). However, `initialize` declares:

```json
"capabilities": {"tools": {"listChanged": false}}

With listChanged: false, MCP clients cache the tool list once at connect time and never re-fetch it. The two features interact badly:

  1. A…

Read the thread · 2026-07-23 · closed · external user · 3 comments

The remaining reports are on the project's issue tracker.