返回资讯中心
外部精选
软件工程
#开发者实时流

Show HN: An open-source office suite with built-in MCP

MCP Docs is universal document editor, built with "native" AI integration. It started as sort of my own rewrite of Google Docs - but now its some kind of combination of Office suite, Google Docs, Sublime Text and Mac Pr…

Hacker News 最新scottpersinger2026/10/26 · 11 天前30 分钟阅读

以下正文同步自 Hacker News 最新,版权归原站所有,已转换为易读排版。

MCP Docs is universal document editor, built with "native" AI integration. It started as sort of my own rewrite of Google Docs - but now its some kind of combination of Office suite, Google Docs, Sublime Text and Mac Preview.

It runs locally on your computer, but also runs in the cloud - you can access the cloud version from either the local app or just a browser.

It supports editing all the standard Office documents:

But also offers quite capable editing for:

The app is a bit of a "bridge" between traditional productivity suites and the AI agents world.

mcp-docs-promo-github.mp4

Using MCP

MCP Docs offers two agent experiences:

For the internal assistant, you can provide either an LLM API key, OR you can connect your local coding agent (Codex or Claude). This second mode is convenient to take advantage of your existing coding agent setup and subscription, although the latency is a little higher than the built-in assistant.

Besides editing standard Office files (don't need to pay for Office!), and using the AI integration to supercharge your editing, some other interesting features include:

But probably the biggest feature is open source - add your own new features as you need them.

Current version of MCP Docs is "single player" - document sharing is coming later.

npx @freeflow-im/mcp-docs

This downloads the latest MCP Docs into /Applications (on Windows it runs its setup program, which installs it for you), offers to install the mcp-docs plugin (the app's MCP server and a skill on using it) into Claude Code and Codex, whichever you have, starts the app, and prints the app's MCP address for any other client. Run it again to update everything. --claude or --codex picks the agents without asking, --yes takes every one found. You can also download the app from the latest release (MCP-Docs-<version>-mac-arm64.zip for a Mac, MCP-Docs-<version>-win-x64-setup.exe for Windows); its notes say how to install it by hand. It needs a Mac with Apple silicon or Windows (x64).

npx @freeflow-im/mcp-docs --uninstall

removes the app, its data and settings, and agent config.

While the app runs it is an MCP server at http://127.0.0.1:39217/mcp (Streamable HTTP).

An agent gets about 60 tools: list, search, open, create, rename, move and delete files and folders; read and edit documents (as Markdown), presentations (slides, their elements and themes; render_slide shows it a slide as drawn) and spreadsheets (cells, formulas, formatting, sorting, filters, rows, columns and tabs); read PDFs as Markdown or convert them; look at and edit pictures, background removal included; import files from the web, or upload them from disk.

Assistant in the header (or ⌘K) opens a chat panel beside the file. Settings (File › Settings…, ⌘,) chooses what powers it:

Each file has its own chat, and the home page has one. See Assistant for how it works.

The folder's files are the file list and its directories are the library's folders (see Folders below; hidden entries and node_modules are skipped). A file's name in the list is its whole file name, extension included: the app never hides one. File → Open Folder… switches to another folder. Your folders need no account and nothing to sign in to; your web files do (see Your web files below).

The app's own data for a folder (the assistant's chats, pasted images, branch snapshots, deleted files) is kept under its data folder (~/Library/Application Support/MCP Docs/folders/ on macOS), not in the folder, so images pasted into a file are not part of the file. Its settings are kept there too, for every folder. The app talks to a server it starts on a loopback port (desktop/server.ts), which only answers the app's own windows and, through the MCP port, the agents you allowed.

npm install npm run desktop # build the client, then open the current directory in the desktop app npm run desktop -- ~/Documents # or a folder you name npm link # once, to get the mcp-docs-dev command: cd ~/Documents && mcp-docs-dev # open the directory you are in (after npm run build) npm test # vitest npm run typecheck

Requires Node 22.18+. The server runs TypeScript directly through Node's built-in type stripping and uses the built-in node:sqlite. CLAUDE.md explains the codebase.

On macOS the mcp-docs-dev command starts the app through LaunchServices, so the app itself (listed as Electron until it is packaged) is what macOS asks about and grants access to Downloads, Documents and Desktop, not the terminal; a folder it may not read shows a message saying so.

npm run desktop:win builds the Windows app with electron-builder into release/: its setup program (MCP-Docs-<version>-win-x64-setup.exe), for x64. It can be run on macOS; there the .exe keeps Electron's icon (the release, built on Windows, has the app's). It is not code-signed, so Windows shows its "unknown publisher" warning on first run. npm run desktop:pack builds the unpacked app for the machine it runs on, to try the packaged layout.

The packaged app holds the server's TypeScript as plain files (asar is off), which Electron's Node runs as it does in development. Started from its icon it reopens the folder it showed last, or opens your home folder the first time; a folder can also be given on its command line. It reads no .env.

npm run desktop:mac builds the macOS app and its zip in release/. A release is made by GitHub Actions (.github/workflows/desktop-release.yml):

Running the workflow by hand (Actions › Desktop release › Run workflow) builds both without publishing anything; the builds are kept as the run's artifacts for three days.

A video file (.mp4, .m4v, .mov, .webm, .ogv) opens in a page with the browser's player. On the web, import one from the home page (the Import tile or a drop, 200 MB maximum); it is stored as the file it is, like a PDF. The server answers Range requests for stored files, so the player can seek without downloading the whole file. Whether a file plays depends on its codec: H.264 and VP8/VP9 play everywhere, while HEVC (the default of recent iPhones) does not play in every browser.

The file list shows one folder at a time. New folder creates one inside the folder being shown, clicking a folder opens it, and the breadcrumbs over the list lead back up; the folder is part of the address (/?folder=Reports/2026). New and imported files go into the folder being shown, Move to… in a file's menu moves it, and a folder can be deleted once it is empty. Typing anywhere on the page filters the folder being shown; Find files, under the filtered list, looks for the same text in the names of files and folders in every folder (GET /api/library/search?q=) and shows where each match is. In the desktop app that walks the mounted folder level by level for up to a minute, and says so when a very large tree could not be covered; with a home directory mounted, its Library is left out. The search is part of the address too (&q=plan, and &find=1 for Find files), and an open file's logo and breadcrumb links lead back to the list as it was, so the same results are there after looking at a file. Folders cannot be renamed or moved yet, and the assistant lists and creates files without regard to folders (what it creates lands at the top).

The switch over the files shows them as a list or as thumbnails (remembered per browser). A thumbnail is the image itself, a frame of a video, the first page of a PDF (drawn by pdf.js, loaded only then), or a small rendering of how a document, spreadsheet or presentation starts (shared/preview.ts, GET /api/library/preview/:id); each is fetched when its card scrolls into view. Excel, PowerPoint and Word files show an icon.

Clicking a file opens it in place, inside its folder: the page header shows the folders down to the file as breadcrumbs, each a link back to the file list there. The Open ↗ button on a row opens the file in a new browser tab instead; in the desktop app that is a new tab of the window (macOS) or a new window.

On the server a folder is a row (folders table, server/folders.ts) and each file records the path of its folder; in the desktop app folders are the directories of the mounted folder. GET /api/library?folder= returns a folder's folders, documents and stored files.

Path Contents

shared/ Workbook types, A1 helpers, value parsing and formatting, and the formula engine (tokenizer, parser, dependency-tracking evaluator, ~120 functions). Used by both client and server.

server/ Fastify API: auth (scrypt password hashes, hashed session tokens in httpOnly cookies) and sheet CRUD.

client/src/state/ WorkbookStore (patch-based undo/redo, incremental recalculation), AutoSaver, spreadsheet operations (ops.ts) and SheetController (selection, editing, clipboard and commands).

client/src/grid/ Canvas grid: virtualized rendering, frozen panes, hit testing, and the mouse and keyboard interaction.

client/src/deck/, client/src/doc/ The presentation and document editors (stores with undo/redo, controllers, views and toolbars).

Assistant

Assistant in the header (or ⌘K / Ctrl+K) opens a chat panel on the right. Ask it in plain language to read, write, edit, format, sort or restructure the open file, or to find, read, create and open others. It knows which file, tab and selection you're looking at. In the desktop app it runs on your API key or your local coding agent (see The assistant in the app); in the web version it uses Claude Sonnet 5.5 through the server's key by default (AGENT_MODEL switches it), and Settings lets a user use their own key instead, which is then not counted against the daily limit.

Screenshots: paste, drop or attach images (PNG, JPEG, GIF, WebP; up to four per message) in the chat and the assistant sees them, for example to transcribe a table from a screenshot into the sheet. Images are downscaled in the browser and stored with the conversation.

Blank presentation on the home page creates a slide deck (/d/<id>). A slide is a fixed 960×540 canvas (PowerPoint's 16:9 size) holding text boxes, images and shapes (rectangles, ellipses, triangles, diamonds, polygons, stars, arrows, chevrons, speech bubbles, hearts and lines; the table in shared/shapes.ts also maps each one to its PowerPoint preset). Slides are made from layouts (title, section header, title and body, two columns, title and image, blank), and a deck has a theme (light, dark, ocean, forest, sunset, paper) that sets its colors and fonts.

The assistant edits presentations too: read_deck, add_slides (layout plus plain content), update_slide (change the title, body, notes or layout of one slide), edit_elements (move, resize, restyle, add or remove elements), delete_slides, move_slide and set_deck_theme run in the browser against the open deck, and list_decks, create_deck (optionally with all its slides) and open_deck find, create and open decks. "Turn this spreadsheet into a short presentation" reads the sheet, creates the deck and opens it.

Decks are stored like spreadsheets (shared/deck.ts is the format; the sheets table has a kind column) and are listed with them on the home page. Branches and compare are for spreadsheets only.

Blank document on the home page creates a text document (/doc/<id>): a WYSIWYG editor for writing, built on ProseMirror. A document is a sequence of blocks (paragraphs, a title and subtitle, headings, bulleted and numbered lists, quotes, code blocks, images and horizontal rules) whose text can be bold, italic, underlined, struck through, code, linked, colored or highlighted, set in another font or size (the toolbar lists system fonts and a set loaded from Google Fonts), and aligned left, center, right or justified.

The assistant edits documents too. It sees a document as numbered blocks in Markdown (read_doc) and writes Markdown back: insert_content, replace_blocks and delete_blocks work on whole blocks, replace_text changes words in place, format_text makes text bold, italic, underlined, colored, highlighted or a link without retyping it, format_blo

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →