office-mcp: an MCP server for Word, Excel and PowerPoint in LibreChat

Share
office-mcp: an MCP server for Word, Excel and PowerPoint in LibreChat
Photo by Markus Winkler / Unsplash

office-mcp is an open-source MCP (Model Context Protocol) server that lets an LLM assistant create and edit Word, Excel and PowerPoint documents, with local or OneDrive storage. The repo just went public on GitHub under the MIT license. Here is why I built it and what comes next.

The gap: no office tooling inside LibreChat

I run LibreChat self-hosted as a multi-model conversational front-end (Claude, GPT, local models in the same interface). The tool layer stayed thin on the office side: producing a properly formatted .docx or .xlsx meant either pasting Markdown into Word by hand, wiring a pandoc chain server-side, or switching to Claude Desktop to use Anthropic’s docx skill.

The Anthropic skill is excellent, but it leans on docx-js (Node.js) with an unpack-edit-repack workflow that needs a shell. That fits an agent like Claude Code, not an MCP server exposing business tools to arbitrary conversational clients.

What office-mcp does

I ported the doctrine to pure Python (python-docxopenpyxlpython-pptx) and packaged it as a FastMCP server over the streamable-http transport, compatible with any standard MCP client (LibreChat, Claude Desktop, others).

The surface is deliberately small: 17 tools across four groups (Word, Excel, PowerPoint, filesystem), all “batched-by-intent”. docx_create takes the full document structure in a single call instead of forcing the LLM to chain create + N append + M insert. Same logic for xlsx_create (one LibreOffice recalc for every sheet) and pptx_create.

For storage, two backends are wired in: local:// (Docker volume) and od:// (user OneDrive via Microsoft Graph, delegated OAuth). The StorageBackend is an abstract interface, so SharePoint, S3 or Azure Blob can be added without touching the tools. Every mutating tool returns a signed download_url, so the file is one click away from the end user, with no upload-back dance.

Multi-user from day one: the user context is extracted from request headers, files are scoped per user, and the end user’s Graph token is forwarded as-is for /me/drive/* calls.

The repo: github.com/soulkill3r/office-mcp.

What comes next: a skill might replace the MCP server

LibreChat is working on native support for Skills. Once that ships, an MCP server like this one starts looking heavy. A skill is just a folder of instructions plus a few scripts the model runs directly: no FastMCP, no streamable-http, no container to keep up. The formatting doctrine, the Python engines (python-docxopenpyxlpython-pptx), and the templates port cleanly to that shape.

I expect to repackage office-mcp as a skill once LibreChat supports them. The MCP server form was the right answer for today, but a lighter shape wins when the runtime can host scripts directly.

Two pieces survive either way: the formatting doctrine (worth keeping out of every model’s improvisation) and a template catalog (themed .docx and .pptx files loadable per tenant). Whether they ship as MCP resources or as skill assets is an implementation detail.

Hopefully I can show you all that very soon. See you in the next post.

Yacine

Read more