clipboard-mcp-server
Enables reading, writing, and inspecting the system clipboard on Linux, with support for X11 via xclip and Wayland via wl-clipboard, including semantic format mapping and size limits.
Enables reading, writing, and inspecting the system clipboard on macOS, supporting text, HTML, RTF, and PNG image formats via native clipboard utilities.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@clipboard-mcp-serverread the clipboard contents"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Overview
The system clipboard across macOS, Linux (X11/Wayland), and Windows. Read, write, and inspect text, HTML, RTF, and image content from any MCP client. Runs as a stdio process or a local Streamable HTTP server.
Tools
Tool | Description |
| Read clipboard contents in a specified format (text, HTML, RTF, image, or auto-select richest) |
| Write plain text or HTML to the clipboard, replacing current contents, or clear it outright |
| List available clipboard formats and byte sizes without reading full content |
Related MCP server: mcp-clipboard
Capability reference
clipboard_read tool
autoreturns the richest format explicitly present — priority: image > html > rtf > text — moving on to the next one when a listed format can't be read (an image no decoder accepts);formatrequests a specific one insteadSize limits: 512 KB for text/HTML/RTF, 5 MB for images (raw bytes before base64 expansion)
Content above the limit reads via
offset/limitslicing — passoffsetto read a bounded window (limitis optional, at least 4, and clamped to the format's size limit) and follow the returnednextOffsetuntilcompleteistrueEvery read returns
representationId, an opaque token for the value and format it was cut from — the same across full and sliced reads of an unchanged value. Pass it back with eachnextOffset: if another application copied in between (even a same-size replacement), orautonow resolves to a different format, the continuation returns no bytes and fails withrepresentation_changed. Linux and Windows derive it from a SHA-256 of the full representation, macOS fromNSPasteboard.changeCountimagereturns base64-encoded PNG data, withwidth/heightwhenever the capture carries a readable PNG header. Only a response holding the whole image attaches an image block; image slices are PNG byte chunks, not standalone images — a partial slice carries its base64 and byte range in the text, and the chunks are base64-decoded separately and their bytes concatenated in offset orderA text, HTML, RTF, or image format that is present but zero bytes long returns empty content, not an error (a zero-byte image attaches no image block)
Typed errors:
format_unavailablewhen the requested format isn't on the clipboard (or the clipboard is empty),content_too_largewhen nooffset/limitwas given and content exceeds the size limit,representation_changedwhen the clipboard changed after the slice that returned the givenrepresentationId, or while the read itself was running,clipboard_unavailablewhen the platform helper is missing or can't reach the desktop session,inspect_unreadablewhenautocan't read the clipboard's type listing (an explicit format reads without it)
clipboard_write tool
Exactly one of
contentorclear: true— an emptycontent, both, or neither is rejected as invalid inputformat: "html"writes HTML; macOS and Windows also publish an auto-generated, tag-stripped plain-text fallback. Linux has no stripped fallback — Wayland also offers the markup under the plain-text types, and X11 advertises onlytext/htmlbut answers a plain-text request (e.g.UTF8_STRING) with the same markup, so a plain-text paste can receive raw HTMLTyped
clipboard_unavailableerror when the platform helper is missing or can't reach the desktop sessionclear: trueremoves every representation instead of writing (needsxselalongsidexclipon Linux X11) and returnscleared: true,byteSize: 0, noformatReturns
previousContent— the plain text on the clipboard immediately before the write or clear, for undoing an unintended overwrite — absent when the clipboard was empty, held no text representation, or that text exceeded the 512 KB read limitSize limit: 1 MB, past which a typed
content_too_largeerror is returnedNot registered when
CLIPBOARD_READ_ONLYis set, which gates clearing along with writing
clipboard_inspect tool
Returns
primaryFormat(richest present — image > html > rtf > text — orempty) andavailableFormats— only the formatsclipboard_readcan return, each backed by at least one representation that was read (the one exception: an image whose bytes no decoder accepts is listed, but reading it asimagefailsformat_unavailable, andautomoves on to the next format)Returns
rawTypes— every raw platform type identifier (UTIs on macOS, TARGETS on X11/Wayland, format names on Windows) with its measuredbytes, where0means present and empty; a type the platform doesn't size (e.g.TARGETS) has nobytes, and one whose data was nil or unreadable carriesmeasurementFailed: trueand nobytes— never a false zeroTyped
inspect_unreadableerror when the platform helper's output cannot be read, instead of reporting an empty clipboard; typedclipboard_unavailablewhen the helper is missing or can't reach the desktop session
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
Clipboard-specific:
Cross-platform backend detection at startup — macOS (osascript/JXA), Linux X11 (xclip), Linux Wayland (wl-clipboard), Windows (PowerShell 5.1+)
Semantic format mapping — platform-native type identifiers (UTIs, TARGETS, Windows format names) mapped to
text,html,rtf,imageacross all backendsPlatform-aware HTML writes — macOS and Windows publish HTML plus a stripped plain-text fallback; on Linux the HTML is the only payload, which plain-text paste targets can also receive
Image support — every backend returns PNG as base64 with width/height (Linux backends read them from the PNG header)
Agent-friendly output:
Size-guarded I/O — reads and writes over the format limit fail with a typed
content_too_largeerror carrying byte/limit metadata, rather than truncating silentlyBounded continuation —
clipboard_readslices oversized content withoffset/limitandnextOffsetinstead of forcing a single all-or-nothing read, andrepresentationIdmakes a clipboard change between slices fail loudly instead of splicing two values togetherUndo support —
clipboard_writereturnspreviousContentso an unintended overwrite can be revertedDiscriminated failure —
format_unavailable,content_too_large,representation_changed,inspect_unreadable, andclipboard_unavailableare typed reasons with recovery hints, not generic errors; each backend classifies its helper's outcomes itself (across wl-clipboard and xclip release spellings), so an empty clipboard, an absent format, and an unreachable helper never blur together
Getting started
Add the following to your MCP client configuration file.
{
"mcpServers": {
"clipboard-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/clipboard-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"clipboard-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/clipboard-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcpPrerequisites
Bun 1.4.0+ or Node.js 24+.
macOS: No additional tools required — osascript is built in.
Linux X11: xclip must be installed. xsel is additionally required for clipboard_write's clear mode — it is the only one of the two that can hand the selection back rather than owning an empty one.
apt install xclip xsel # Debian/Ubuntu
pacman -S xclip xsel # ArchLinux Wayland: wl-clipboard must be installed.
apt install wl-clipboard # Debian/Ubuntu
pacman -S wl-clipboard # ArchWindows: PowerShell 5.1+ (built-in on Windows 10 and later).
Configuration
Variable | Description | Default |
| Transport: |
|
| Port for HTTP server. |
|
| Hostname for HTTP server. |
|
| Endpoint path for the HTTP server. |
|
| Max inbound JSON-RPC request body, in bytes. Raised above the framework's 1 MiB default so a full-size |
|
| HTTP session mode: |
|
| Auth mode: |
|
| Log level ( |
|
| Enable OpenTelemetry instrumentation. |
|
| Serve the clipboard read-only. When |
|
See .env.example for the full list of optional overrides.
Running the server
Local development
# One-time build
bun run rebuild
# Run the built server
bun run start:stdio
# or
bun run start:httpChecks and tests
bun run devcheck # Lint, format, typecheck, security
bun run test # Vitest test suiteProject structure
Path | Purpose |
| Entry point — registers tools via |
| Tool definitions: |
| Platform backends (macOS, Linux X11, Wayland, Windows) and service facade |
| Vitest tests for tools and backends |
| Agent workflow skills (add-tool, field-test, polish-docs-meta, etc.) |
Development guide
See CLAUDE.md for the full developer protocol — tool patterns, service patterns, error handling, logging conventions, and the checklist for shipping changes. The short version:
Handlers throw, framework catches — tool logic catches only to act on a backend's typed outcome: map it to a declared error reason, or move
autoon to the next formatUse
ctx.logfor request-scoped loggingNo Docker — this server needs direct host OS access (JXA/NSPasteboard, xclip, wl-clipboard, PowerShell), none of which work inside a container
Contributing
Issues welcome at github.com/cyanheads/clipboard-mcp-server. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
Apache 2.0 — see LICENSE.
This server cannot be deployed
Maintenance
Related MCP Connectors
Read and write shared BitsWeave context, projects, tasks, and work sessions through MCP.
Shared memory and actions for Claude, Kiro, OpenAI, Cursor, and other MCP-compatible AI clients.
Render, verify, describe, and safely edit Mermaid diagrams through MCP.
tldr-pages MCP — fetched from the canonical github repo.
Related MCP Servers
- AlicenseAqualityFmaintenanceProvides tools for reading and writing system clipboard data across Linux, macOS, Windows, and WSL platforms.2AGPL 3.0
- AlicenseAqualityBmaintenanceMCP 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.447 PyPI4Apache 2.0
- FlicenseBqualityDmaintenanceProvides MCP tools to copy text to and paste text or images from the macOS clipboard using AppleScript.31-
- AlicenseNot gradedqualityFmaintenanceMCP server that gives AI agents access to your Maus clipboard on macOS, enabling them to write clean text into history, search, and manage clipboard items locally.6 npmMIT