libreoffice-mcp

libreoffice-mcp

Enables interaction with LibreOffice documents (Writer, Calc, Impress, Draw) via MCP, supporting document management, data analysis, and database operations using the OooDev library.

Category
Visit Server

README

LibreOffice MCP (WIP)

Explanation of the Refactor

Why OooDev?

The OooDev library, as detailed in api_documentation.md, provides a Pythonic abstraction over the LibreOffice UNO API, with classes like CalcDoc, WriteDoc, and utilities for charts, forms, and macros. It simplifies tasks like document creation, cell manipulation, and styling, reducing the need for low-level UNO interface queries (e.g., UnoRuntime.queryInterface). OooDev also supports modern Python features (e.g., type hints, context managers) and integrates with extensions like APSO and OooDev.oxt, making it ideal for a 1:1 MCP mapping.

Key Changes from Your Original Implementation

  1. OooDev Integration:

    • Replaced direct UNO API calls (e.g., XSpreadsheetDocument, XTextDocument) with OooDev classes (CalcDoc, WriteDoc).
    • Used OooDev’s Lo class to manage LibreOffice connections, replacing manual UnoUrlResolver setup.
    • Leveraged OooDev utilities like Calc, Write, and Chart2 for document operations.
  2. Preserved Features:

    • Kept all your original tools: open_document, close_document, get_sheet_names, get_cell_value, set_cell_value, create_new_sheet, insert_text, create_chart, and apply_style.
    • Enhanced these tools to use OooDev methods (e.g., CalcDoc.get_sheet_names() instead of XSpreadsheetDocument.getSheets()).
    • Maintained the parse_cell_address helper, though OooDev’s CalcDoc.rng() method reduces its necessity in some cases.
  3. New Base Tools:

    • Added run_query, list_tables, create_table, and insert_data to support LibreOffice Base operations, using OooDev’s database access methods.
    • These tools align with the com::sun::star::sdb namespace from api.md but use OooDev’s simplified interfaces.
  4. New Data Analysis Tools:

    • Added create_pivot_table, sort_range, and calculate_statistics to enhance Calc’s data analysis capabilities.
    • Used OooDev’s Chart2 module for pivot table creation and Calc module for sorting and statistics.
  5. Additional Tools:

    • Added new_document to create new documents of various types, leveraging OooDev’s create_doc methods.
    • Added save_document to save documents using OooDev’s save_doc.
    • Added run_macro to execute Python macros, using OooDev’s MacroLoader context manager.
    • Added insert_form_control to insert form controls in Calc sheets, using OooDev’s Forms module.

Alignment with OooDev Features

  • Document Management: Uses WriteDoc, CalcDoc, DrawDoc for Writer, Calc, Draw, and Impress documents, covering com::sun::star::text, sheet, draw, and presentation namespaces.
  • Base Operations: Leverages OooDev’s database access for com::sun::star::sdb and sdbc functionalities.
  • Data Analysis: Utilizes OooDev’s Chart2 and Calc modules for pivot tables, sorting, and statistics, aligning with com::sun::star::chart2 and sheet.
  • Forms and Macros: Incorporates OooDev’s Forms and MacroLoader for com::sun::star::form and script namespaces.
  • Styling: Uses OooDev’s style methods (e.g., Write.style) for com::sun::star::style.

Benefits of the Refactor

  • Pythonic Interface: OooDev’s classes and methods are more intuitive and reduce boilerplate compared to UNO’s interface queries.
  • Comprehensive Coverage: The adapter covers a broad range of OooDev functionalities, from basic document operations to advanced database and analysis tasks.
  • Maintainability: OooDev’s abstractions simplify maintenance and future expansions (e.g., adding Math or more form controls).
  • Error Handling: Robust error checking ensures reliability for LLM interactions via MCP.

Limitations and Future Enhancements

  • Base Document Handling: The current Base tools use raw UNO interfaces for database operations, as OooDev’s Base support is less developed. Future versions could integrate OooDev’s Base-specific classes if added.
  • Additional Tools: More OooDev features (e.g., ooodev.units for unit conversions, ooodev.form for advanced forms, ooodev.draw for shapes) could be added as tools.
  • Performance: OooDev’s abstractions may introduce slight overhead; caching (e.g., Lo.cache) could be implemented for frequent operations.

How to Use

  1. Setup: Ensure OooDev is installed (pip install ooo-dev-tools) and LibreOffice is running with a socket connection (port 2083).
  2. Run the Server: Start the FastAPI server with this adapter.
  3. Interact via MCP: Use the MCP client to call tools like open_document, run_query, or create_pivot_table.
  • Coverage Across Applications: The adapter now supports Writer, Calc, Impress, and Draw, with potential for more Base and Math tools to be added.
  • Rich Feature Set: It includes not just basic operations (e.g., opening documents, setting cell values) but also advanced features like styling, table insertion, image handling, charting, slide management, and shape drawing.
  • Cross-Cutting Functionality: Tools like saving, exporting to PDF, and managing document properties apply to all LibreOffice document types, enhancing versatility.
  • Error Handling: Each tool includes robust checks (e.g., document existence, type validation) to ensure reliability.

Old Documetnation

sudo useradd -m -s /bin/bash mcp-libreoffice
sudo mkdir -p /home/mcp-libreoffice/output
sudo chown -R mcp-libreoffice:mcp-libreoffice /home/mcp-libreoffice
sudo -u mcp-libreoffice soffice --headless --accept="socket,host=localhost,port=${LIBREOFFICE_PORT:-2083};urp;"

Original Features:

  • open_document: Opens a document from a URL and assigns it an ID.
  • close_document: Closes a document by its ID.
  • get_sheet_names: Retrieves all sheet names from a Calc spreadsheet.
  • get_cell_value: Gets the value (numeric, text, or formula) of a specified cell in a Calc sheet.
  • set_cell_value: Sets a cell’s value in a Calc sheet, handling both numbers and text.
  • get_text_content: Retrieves the full text content of a Writer document.
  • insert_text: Inserts text at a specific position in a Writer document.
  • create_chart: Creates a chart in a Calc sheet based on a data range and chart type.
  • parse_cell_address: Helper function to convert cell addresses (e.g., "A1") to column and row indices.
  • Spreadsheet Enhancements (Calc):
    • create_new_sheet: Adds a new sheet to a spreadsheet.
    • set_cell_formula: Sets a formula in a spreadsheet cell (e.g., "=SUM(A1:A10)").
  • Text Document Enhancements (Writer):
    • insert_table: Inserts a table with specified rows and columns at a position.
    • apply_style: Applies a paragraph style to a text range.
    • insert_image: Inserts an image from a URL at a specified position.
  • Additional Document Management:
    • save_document: Saves a document to a URL with a specified filter (e.g., "writer8" for ODT).
    • export_to_pdf: Exports a document to PDF format.
    • get_document_properties: Retrieves metadata like title, author, subject, and keywords.
    • set_document_properties: Updates document metadata.
  • Presentation Tools (Impress):
    • insert_slide: Inserts a new slide at a specified position in a presentation.
  • Drawing Tools (Draw):
    • add_shape: Adds a shape (e.g., rectangle, circle) to a Draw page with position and size.
  • Macro Execution:
    • run_macro: Runs a Basic macro stored in the document.

Base Tools

The following tools further enhance database management capabilities:

  • list_tables(doc_id: str) -> list[str]: Retrieves a list of all table names in the database.
  • delete_table(doc_id: str, table_name: str) -> str: Deletes a specified table from the database.
  • insert_data(doc_id: str, table_name: str, data: dict) -> str: Inserts a single row of data into a table, with column names and values provided as a dictionary.
  • List Tables: Use list_tables("doc_id") to get all table names in a database.
  • Delete Table: Call delete_table("doc_id", "table_name") to remove a table.
  • Insert Data: Use insert_data("doc_id", "table_name", {"ID": 1, "Name": "Test"}) to add a row.

Data Analysis Tools

These tools extend Calc’s data analysis capabilities:

  • create_chart(doc_id: str, sheet_name: str, data_range: str, chart_type: str, target_cell: str) -> str: Creates a chart (e.g., bar, line) from a data range and places it at the target cell.
  • apply_conditional_formatting(doc_id: str, sheet_name: str, range_address: str, condition: str, style: str) -> str: Applies conditional formatting to a range based on a condition (e.g., "value > 10") and a style.
  • group_range(doc_id: str, sheet_name: str, range_address: str, by_rows: bool) -> str: Groups rows or columns in a range for outlining purposes.
  • Create Chart: Use create_chart("doc_id", "Sheet1", "A1:B10", "bar", "C12") to create a bar chart.
  • Conditional Formatting: Apply with apply_conditional_formatting("doc_id", "Sheet1", "A1:A10", "A1>10", "Good"), assuming "Good" is a defined cell style.

Potential Additions

  • Base Tools: Create databases, manage forms, or run queries.
  • Math Tools: Insert and edit mathematical formulas.
  • Formatting Tools: Adjust font size, color, or alignment in Writer or Impress.
  • Animation/Transition Tools: Add animations to Impress slides.
  • Data Analysis Tools: Implement pivot tables or sorting in Calc.

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured