# 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](/mcp/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](https://github.com/quazardous/nelson-mcp/issues/22) · 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](https://github.com/quazardous/nelson-mcp/issues/41) · 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:

- two entries with different doc_ids for the…

[Read the thread](https://github.com/quazardous/nelson-mcp/issues/40) · 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](https://github.com/quazardous/nelson-mcp/issues/36) · 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](https://github.com/quazardous/nelson-mcp/issues/38) · 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](https://github.com/quazardous/nelson-mcp/issues/35) · 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](https://github.com/quazardous/nelson-mcp/issues/19) · 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](https://github.com/quazardous/nelson-mcp/issues/10) · 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](https://github.com/quazardous/nelson-mcp/issues/43) · 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

- **Nelson:** 0.12.1 (`nelson-0.12.1.oxt`)
- **LibreOffice:** 26.2.5.2 (openSUSE Tumbleweed distro build; upstream TDF 26.2.5)
- **VCL plugin:** Qt6 on KDE Plasma 6 Wayland
- **Python:** 3.13
- **OS:** openSUSE Tumbleweed, Linux 7.1.8

## Symptom

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

[Read the thread](https://github.com/quazardous/nelson-mcp/issues/37) · 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:

```json
{"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](https://github.com/quazardous/nelson-mcp/issues/34) · 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](https://github.com/quazardous/nelson-mcp/issues/32) · 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](https://github.com/quazardous/nelson-mcp/issues/30) · 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](https://github.com/quazardous/nelson-mcp/issues/29) · 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](https://github.com/quazardous/nelson-mcp/issues/24) · 2026-07-23 · closed · external user · 3 comments

The remaining reports are on [the project's issue tracker](https://github.com/quazardous/nelson-mcp/issues).
