clipboard-mcp
About
MCP server that reads and writes the system clipboard — tables, text, code, JSON, URLs, images, and more. Preserves spreadsheet structure (rows/columns) that is lost when pasting into Claude directly. Claude can also write results back to your clipboard.
Details
- Author
- cmeans
- Categories
- Productivity, Other, File Management
Jump to
Step 2: Install the platform clipboard tool (Linux only)
macOS and Windows have everything they need built in. Linux needs one CLI utility:
Platform status:Linux with Wayland is tested and actively used. Windows has been exercised end-to-end on a QEMU Windows guest (a real Windows-only encoding bug,](https://docs.astral.sh/uv/getting-started/installation/)[#129, was found and fixed via that testing in v2.5.x). X11 and macOS implementations are complete but unverified beyond the unit tests. Bug reports and PRs are welcome.
An MCP server that gives your AI assistant direct access to your system clipboard: read what you copied, or write clean text straight to it. Works with any MCP-compatible client, including Claude Code, Claude Desktop, Cursor, Windsurf, and others.
When you copy cells from Google Sheets or Excel and paste into a chat input, the tabular structure (rows and columns) is destroyed. It arrives as a flat string with no delimiters. The model has to guess where one cell ends and the next begins, and it often guesses wrong.
mcp-clipboard preserves it.Instead of pasting, tell your assistant to "read my clipboard." The server reads the clipboard directly, detects tabular data from the HTML that spreadsheet apps put on the clipboard, and returns it as a properly formatted Markdown table, JSON, or CSV. No structure lost, no guessing.
Bonus: it also fixes copying from Claude Code
Claude Code's terminal renderer adds 2-character padding, hard line breaks at ~80 columns, and trailing whitespace to all output. When you select and copy text from the terminal, those artifacts come along for the ride:
echo "this is a long command that wraps and breaks when you paste it because of the hard newlines and leading spaces"
This has been reported repeatedly on the claude-code repo (issues #4686, #6827, #7670, #13378, #15199, #25040, #25427, #26016) with dozens of upvotes and no fix shipped.
mcp-clipboard sidesteps the problem entirely.Instead of copying text from the terminal, ask Claude Code to put it on your clipboard:
"Copy that command to my clipboard"
Claude Code callsclipboard_copy, writes the clean text directly to your system clipboard, and you paste it wherever you need it. No padding, no hard wraps, no cleanup.
Tip:To make this automatic, add a line to your project or globalCLAUDE.md:
When you produce a shell command for the user to run, also copy it to the clipboard using clipboard_copy.
Claude Code will then copy every command it suggests without you having to ask.
Bonus: read your X11/Wayland selection without Ctrl-C
Linux desktops have two clipboards: theCLIPBOARDthat Ctrl-C / Ctrl-V uses, and thePRIMARYselection. PRIMARY is whatever text you currently have highlighted, pasted by middle-click. It updates as soon as you select something; you don't have to copy it.
mcp-clipboard reads PRIMARY too. Passselection="primary"toclipboard_paste,clipboard_read_raw, orclipboard_list_formatsand the server reads the selection buffer instead of the Ctrl-C clipboard. Some workflows this enables:
- Terminal triage.An error message scrolls past, mouse-select it, ask the model what it means. Your Ctrl-C buffer stays intact for whatever you had on it.
- vim / IDE visual selection.v-select a function, ask the model to explain it or refactor it.
- Browser / PDF reading.Drag-select a paragraph, ask "what's this saying?" without leaving the reading flow.
- Two-buffer workflows.Keep a snippet in CLIPBOARD (Ctrl-C) and pull a different one through PRIMARY in the same conversation.
Linux only. macOS and Windows have no equivalent buffer; passingselection="primary"on those platforms returns a clear error.
mcp-clipboardis a Python package on PyPI. Any Python tool that can install and launch console-script entry points works for running it as an MCP server. The two most common choices arepipxanduv; both appear in the install-counts badges at the top of this README and both are in active use. Pick whichever you have or prefer:
- pipx: install instructions per platform are in theofficial pipx install docs. On most distros pipx is available via the system package manager (apt,dnf,pacman,brew, etc.).
- uv: install instructions per platform are in theofficial uv install docs. Astral documents package-manager paths, signed standalone-binary downloads, and shell installers for each platform.
The rest of this section shows commands for both runners; substitute the one you installed.
Step 2: Install the platform clipboard tool (Linux only)
macOS and Windows have everything they need built in. Linux needs one CLI utility:
Platform status:Linux with Wayland is tested and actively used. Windows has been exercised end-to-end on a QEMU Windows guest (a real Windows-only encoding bug,#129, was found and fixed via that testing in v2.5.x). X11 and macOS implementations are complete but unverified beyond the unit tests. Bug reports and PRs are welcome.
Step 3: Verify mcp-clipboard works on your system
Before wiring it into a client, confirm the package installs and detects your platform correctly. With pipx:
Both forms fetch the package on demand without a permanent install (usepipx install mcp-clipboardoruv tool install mcp-clipboardfirst if you'd rather install it persistently). Expected output:
mcp-clipboard 2.5.1 Platform: ... Backend: ... (detected) OK: mcp-clipboard should work on this system.
If you seeBackend: NOT AVAILABLE, follow the platform-specific hint in the error message (typically: install the Linux clipboard tool from Step 2) and re-run.
Step 4: Register the server with your MCP client
The MCP host launchesmcp-clipboardvia acommand+argspair. Both pipx and uv expose a one-shot run subcommand that fetches and executes the package, so the most convenient configs use those forms.
claude mcp add clipboard --scope user -- pipx run mcp-clipboard
claude mcp add clipboard --scope user -- uvx mcp-clipboard
Locate your Claude Desktop config file (paste the path into your file manager's address bar to jump straight there):
- Linux:~/.config/Claude/claude_desktop_config.json
- macOS:~/Library/Application Support/Claude/claude_desktop_config.json
- Windows:%APPDATA%\Claude\claude_desktop_config.json
Add an entry tomcpServersusing one of the forms below. With pipx:
{ "mcpServers": { "clipboard": { "command": "pipx", "args": ["run", "mcp-clipboard"] } } }
{ "mcpServers": { "clipboard": { "command": "uvx", "args": ["mcp-clipboard"] } } }
Save the file, thenfully quit and relaunch Claude Desktopfor the new server to load.
Windows tip:Claude Desktop caches the environment (includingPATH) from the moment it launches. Ifpipx/uvxwas installed after Claude Desktop was started, Claude Desktop will not see it until restart. If the snippet above produces "Server failed to start" or a "command not found" style error in the MCP logs, right-click the Claude Desktop tray icon, chooseQuit, then reopen Claude Desktop. A taskbar-X close just hides the window; the cached environment is still there.
Any client that supports MCP stdio servers can use mcp-clipboard. Common one-shot forms arepipx run mcp-clipboardanduvx mcp-clipboard; if you've installed mcp-clipboard persistently (pipx install mcp-clipboardoruv tool install mcp-clipboard), the resultingmcp-clipboardbinary onPATHalso works as thecommand. Consult your client's documentation for how to register MCP servers.
The client should callclipboard_pasteand return the content. If you copied a spreadsheet selection or a URL beforehand, you'll see it formatted appropriately.
If nothing happens or you get a tool error, re-run--check(whichever runner you used in Step 3) to confirm the package install is healthy, then check your client's MCP server logs (each MCP host exposes them differently; consult your client's documentation).
If you prefer a local clone instead of installing from PyPI:
git clone https://github.com/cmeans/mcp-clipboard.git cd mcp-clipboard uv sync
Then point your client at the local install:
{ "mcpServers": { "clipboard": { "command": "uv", "args": [ "run", "--directory", "/path/to/mcp-clipboard", "mcp-clipboard" ] } } }
Environment variables can be passed via the"env"key in the config.
Most Linux users won't need to set any of these. Override if auto-detection fails (multiple compositors, non-standard socket path, or containerized environments).
Copy anything (spreadsheet cells, code, text, a URL, JSON, an image), then:
- "Paste my clipboard"
- "Read my clipboard"
- "What's on my clipboard?"
- "I copied some data, take a look"
Your assistant callsclipboard_pasteand returns the content with structure preserved.
When your agent generates a command, code block, or any text you need to use elsewhere:
- "Copy that to my clipboard"
- "Put that command on my clipboard"
- "Copy that as HTML" (writestext/htmlso rich-text apps paste with formatting)
The agent callsclipboard_copyand the clean text goes straight to your system clipboard. No terminal rendering artifacts, just clean text. This is especially useful with Claude Code (seeabove).
Tip: auto-copy behavior.By default the agent only copies to the clipboard when you ask. If you want commands and code blocks copied automatically, add this to your system prompt (e.g. in a Claude Desktop project or Claude Code's CLAUDE.md):
When you output a command or code block that the user is likely to paste elsewhere, proactively copy it to the clipboard using clipboard_copy.
When the clipboard contains tabular data,output_formatcontrols the format:
- "Read my clipboard as Slack" →output_format=slack
- "Convert my clipboard to Jira table" →output_format=jira
- "Give me that as HTML" →output_format=html
Addinclude_schema=trueto get a column-type summary alongside the table:
"Read my clipboard with schema"
Inferred types:integer,float,currency,percentage,date,boolean,text. Uses majority-wins per column — if no type accounts for more than half the non-empty cells, the column is typed astext. Empty cells are skipped; the header row is excluded from inference.
This is useful when handing tabular data to Claude for SQLCREATE TABLEstatements, Pandasdtypemappings, or validation rules — Claude gets the types upfront instead of guessing from the data.
The server includes MCP instructions that tell the client when to use the clipboard tools, but results vary by model and client. If the agent doesn't pick up on your intent, be explicit: "copy that to my clipboard" or "read what I copied" work most reliably.
If you have access to a custom system prompt (e.g. in a Claude Desktop project or a custom agent), you can reinforce the behavior:
When the user asks to copy output, use clipboard_copy to write it to the system clipboard. When the user references data not in the conversation, check the clipboard using clipboard_paste.
- Platform detection:At startup, the server detects your clipboard backend (Wayland, X11, macOS, or Windows) and selects the appropriate system commands.
- Reading (clipboard_paste):Calls the platform's clipboard read command. Triestext/htmlfirst (Google Sheets and Excel put<table>markup on the clipboard), parses with Python's built-inhtml.parser. Falls back totext/plaintab-separated values, thentext/rtf, then checks for images.
- Writing text (clipboard_copy):Pipes text to the platform's clipboard write command (wl-copy,xclip -selection clipboard,pbcopy, or PowerShellSet-Clipboard). Supports amime_typeparameter for writing typed content (e.g.text/html,text/rtf,image/svg+xml).
- Writing images (clipboard_copy_image):Decodes base64 PNG or JPEG bytes and writes them to the platform's clipboard viawl-copy --type,xclip -target, NSPasteboardsetData:forType:(macOS), orClipboard::SetImage(Windows). Magic bytes are validated against the declared MIME type before any subprocess runs.
- Image passthrough on read:If the clipboard contains an image (PNG, etc.), it's returned as a base64-encoded MCP image content block that the model can see and analyze.
- Content classification:Non-tabular text content is classified as JSON, URL, code, or plain text and returned with appropriate formatting (pretty-printed JSON, fenced code blocks, etc.).
- Audio and video are not supported.If the clipboard contains audio or video, the server reports the format but cannot return the content.
- Image write supports PNG and JPEG only viaclipboard_copy_image.Pass-through, no re-encoding. Other binary formats (GIF, WebP, TIFF, BMP) are not yet writable. SVG rides the typed-text path viaclipboard_copy(mime_type="image/svg+xml")since SVG is XML.
- Writing multiple MIME types atomically is not supportedon Wayland/X11.wl-copyandxclipcarry a single MIME per invocation, soclipboard_copy_markdownwrites onlytext/htmlon those platforms. On Wayland,wl-copyauto-advertisestext/plainfor UTF-8 content but the bytes returned are the rendered HTML markup (not the markdown source) — vim users pasting after the tool runs will see<h1>...etc. On X11, plain-text targets see an empty clipboard. For a plain-text paste of the markdown source, callclipboard_copy(markdown_source)directly. macOS and Windows do support atomic multi-format writes via NSPasteboard /DataObject.
- Text content is truncated at 50KBto avoid overwhelming the model's context window.
- Platform coverage is uneven.Linux with Wayland is tested and actively used. Windows has been exercised end-to-end on a QEMU Windows guest as of v2.5.x (which surfaced and resolved a Windows-only UTF-8 stdin encoding bug,#129). X11 and macOS implementations are complete and have unit tests but have not been verified beyond that. Bug reports and PRs are welcome, especially for X11 and macOS.
# Install with dev dependencies uv sync --extra dev # Run tests uv run pytest # Run the server directly (stdio mode) uv run mcp-clipboard # Run with debug logging uv run mcp-clipboard --debug # Test with MCP Inspector uv run mcp dev src/mcp_clipboard/server.py
Debug logging can also be enabled viaMCP_CLIPBOARD_DEBUG=1, which is useful when the server is launched by Claude Desktop or Claude Code.
mcp-clipboard/ ├── src/mcp_clipboard/ │ ├── __init__.py # Package version │ ├── server.py # MCP server, tool definitions, debug logging │ ├── clipboard.py # Platform-agnostic clipboard backend │ ├── parser.py # HTML table parser, formatters, content detection │ ├── instructions/ # Tool and server descriptions (loaded at startup) │ │ ├── server.md │ │ ├── clipboard_copy.md │ │ ├── clipboard_copy_image.md │ │ ├── clipboard_copy_markdown.md │ │ ├── clipboard_paste.md │ │ ├── clipboard_read_raw.md │ │ ├── clipboard_list_formats.md │ │ └── clipboard_version.md │ └── icons/ # SVG icons for MCP client display (light/dark) │ ├── mcp-clipboard-logo-light.svg │ └── mcp-clipboard-logo-dark.svg ├── tests/ │ ├── test_parser.py # Parser and formatter tests │ └── test_server.py # Server, backend, and Wayland detection tests ├── .github/ │ ├── workflows/ │ │ ├── publish.yml # PyPI publish on v tags (OIDC trusted publisher) │ │ └── test-publish.yml # TestPyPI publish on test-v tags │ └── ISSUE_TEMPLATE/ # Bug report, feature request, platform test forms ├── pyproject.toml ├── CHANGELOG.md ├── CLAUDE.md # Claude Code project guidance ├── LICENSE # Apache 2.0 └── README.md
This project was designed and built in collaboration withClaude Code(Anthropic's CLI for Claude). Architecture, design decisions, and release management were driven by the human; implementation, testing, code review, and documentation were delegated conversationally, with Claude writing code, catching stale docs, and filling test coverage gaps across every commit.
Carryo is a remote MCP server for sharing Claude or ChatGPT-created HTML artifacts as live links.
Read and edit Word (.docx) documents with track changes, comments, footnotes, and structural validation. 18 tools with OOXML-level paraId validation and document auditing.
Read and write data from Microsoft Excel files. Supports text, formulas, sheet creation, and Windows-only live editing.
Interact with Google Docs and Google Drive for document creation, editing, and file management, with support for shared drives.
Create, read, and manipulate Microsoft Word documents.
Manage notes and files in an Obsidian vault. Requires the Obsidian Local REST API plugin.
A server for manipulating PDF files, including merging, page extraction, and searching.
Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.




