Releases: cmeans/mcp-clipboard
v2.2.1
Bug-fix and test-hardening release. No new features.
Added
- Strengthened
test_paste_large_content_truncatedwith a size-bound assertion so it can no longer pass if truncation regresses. Closes #70. - Strengthened
test_format_destination_ragged_rowswith per-format structural assertions for jira/confluence (||/|cell parsing) and html (<th>/<td>counts). Closes #71.
Changed
tests/test_server.pyadds an autouse fixture that resets the module globalcb._backendaround every test, replacing scattered manual resets in backend-detection and env-override tests. Closes #72.
Fixed
- Subprocess reaping on timeout in
_run_subprocessand_run_with_stdin. Afterproc.kill(), the process is now awaited viaasyncio.wait_for(proc.wait(), timeout=1.0)so the pipes are drained and the child is fully reaped. Closes #69. detect_content_typeno longer misclassifies English prose containing "from " or "import " mid-sentence. Strong patterns now anchor to the start of a line. Closes #68.clipboard_pasteinstruction file now describes theslackformat accurately: monospace code block with a dashed-underline header row. Closes #73.detect_content_typeno longer misclassifies prose that starts with a lowercase strong-pattern keyword (e.g. "let me know", "from the desk of", "import tariffs affect trade"). Strong patterns are now MULTILINE regex patterns that require syntactic context. Closes #77.- macOS
_macos_list_formatsnow deduplicates MIME types;public.utf8-plain-textandpublic.plain-textno longer both surface astext/plain. Closes #74. clipboard_copynow validatesmime_typeagainst_MIME_REbefore writing to the clipboard, matching the read-path behavior. Closes #75.
Install
pip install mcp-clipboard==2.2.1
Full changelog: https://github.com/cmeans/mcp-clipboard/blob/v2.2.1/CHANGELOG.md
v2.2.0
What's New
Added
clipboard_copywrite-side size limit (default 1 MiB, configurable viaMCP_CLIPBOARD_MAX_WRITE_BYTES) (#27)MCP_CLIPBOARD_BACKENDenv var to override clipboard backend auto-detection (#29)- Stderr capture in clipboard write errors when
MCP_CLIPBOARD_DEBUG=1(#32) - Opt-in integration test suite for real clipboard tools (
uv run pytest -m integration) (#23) py.typedPEP 561 marker for downstream type checkers (#33)
Fixed
- Security: HTML table output now escapes cell values with
html.escape(), preventing XSS (#15) _TextExtractoruses depth counter instead of boolean for script/style skipping (#36)- MIME type validation regex tightened to reject nonsensical values (#35)
- JSON output uses type inference to detect headers -- never drops user-selected data (#30)
Full changelog: v2.1.1...v2.2.0
v2.1.1
What's New
Fixed
- Code detection: No longer false-positives on prose containing "return", "class", "public",
->,||,::(#20) - Windows image reader: Now honors requested MIME type instead of always returning PNG (#34)
- Truncation message: Says "50,000 characters" instead of misleading "50KB" (#37)
- Version import:
__version__no longer crashes when running from source (#28) - Date inference: Short-circuits on cells with no digits, skipping exception-driven parsing (#26)
Full changelog: v2.1.0...v2.1.1
v2.1.0
What's New
Added
- Parametrized escaping test matrix covering special characters across all 8 output formats (#18)
rufflinter/formatter andmypytype checker added to CI (#22)- QA workflow labels and automation
CONTRIBUTING.md,SECURITY.md,CODE_OF_CONDUCT.md
Fixed
- Markdown/Notion: Pipe (
|) and backslash in table cells are now escaped (#16) - Jira/Confluence: Pipe and backslash in table cells are now escaped (#17)
- macOS:
_macos_read_imagerejects unknown MIME types, preventing AppleScript injection (#24) - TSV parsing: Quoted fields with embedded tabs/newlines are now handled correctly (#21)
- Slack: Table format moved entirely into code block, fixing special character corruption and header/data alignment (#19, #31)
Changed
- CI workflow renamed from
test.ymltoci.yml
Full changelog: v2.0.2...v2.1.0
v2.0.2
Added
- Test coverage reporting via pytest-cov and Codecov (96% coverage)
- Coverage, PyPI, CI, license, and download badges in README
Fixed
- README logos now render on PyPI (absolute GitHub URLs)
- MCP server icons use GitHub-hosted URLs instead of data URIs (fixes Claude Desktop icon display)
Install
# Claude Code (global)
claude mcp add clipboard --scope user -- uvx mcp-clipboard
# pip
pip install mcp-clipboardFull changelog: https://github.com/cmeans/mcp-clipboard/blob/main/CHANGELOG.md
v2.0.1
Added
- Server icons (light/dark SVG) embedded as data URIs via FastMCP
iconsparameter - PyPI, CI, license, and download badges in README
Fixed
- Claude Code install command now uses
--scope userfor global availability
Install
# Claude Code (global)
claude mcp add clipboard --scope user -- uvx mcp-clipboard
# pip
pip install mcp-clipboardFull changelog: https://github.com/cmeans/mcp-clipboard/blob/main/CHANGELOG.md
v2.0.0 — mcp-clipboard
Breaking Changes
- Renamed PyPI package from
clipboard-mcp-servertomcp-clipboard - Renamed Python package from
clipboard_mcptomcp_clipboard - Renamed CLI command from
clipboard-mcptomcp-clipboard - Renamed debug env var from
CLIPBOARD_MCP_DEBUGtoMCP_CLIPBOARD_DEBUG
Other Changes
- License changed from MIT to Apache 2.0
- README rewritten with Claude Code clipboard padding workaround as key feature
Install
# Claude Code
claude mcp add clipboard --scope user -- uvx mcp-clipboard
# pip
pip install mcp-clipboardFull changelog: https://github.com/cmeans/mcp-clipboard/blob/main/CHANGELOG.md
v1.3.0 — Destination-aware output formats
What's new
Five new output_format values so you get paste-ready output for your target tool in a single read — no reformatting round-trip needed.
| Format | Destination |
|---|---|
slack |
Slack — *bold* header + space-aligned data in a monospace code block |
jira |
Jira — ||Header|| / |Cell| wiki markup |
confluence |
Confluence — same as jira (shared Atlassian wiki syntax) |
html |
Email, web, rich-text editors — <table> with <thead>/<th>/<tbody>/<td> |
notion |
Notion — GFM pipe table (Notion renders these natively) |
Examples:
- "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
Install / upgrade
{
"mcpServers": {
"clipboard": {
"command": "uvx",
"args": ["--from", "clipboard-mcp-server", "clipboard-mcp"]
}
}
}See README for full setup instructions.
Changelog
See CHANGELOG.md for full details.
v1.2.0 — Table schema inference
What's new
- Schema inference —
clipboard_pastegainsinclude_schema=true: when the clipboard contains a table, a Column types table is appended showing the inferred type for each column - Detected types:
integer,float,currency,percentage,date,boolean,text - Majority-wins per column — if no type accounts for more than half the non-empty cells, falls back to
text - Date detection supports ISO 8601 and common regional formats (
MM/DD/YYYY,DD/MM/YYYY,Month DD, YYYY, etc.) - Currency detects
$,£,€,¥prefix and suffix forms
Example: "Read my clipboard with schema"
Setup
{
"mcpServers": {
"clipboard": {
"command": "uvx",
"args": ["--from", "clipboard-mcp-server", "clipboard-mcp"]
}
}
}v1.1.0 — RTF clipboard read
What's new
- RTF read support —
clipboard_pastenow readstext/rtffrom the clipboard on all platforms:- macOS: via
osascript/NSPasteboard (public.rtfUTI) - Windows: via PowerShell
DataFormats::Rtf - Linux (Wayland/X11): already worked via pass-through MIME — no changes needed
- macOS: via
- When HTML and plain text are both empty,
clipboard_pastetries RTF as a fallback before checking for binary formats. RTF content is returned in a fenced code block labelled "rich text (RTF)", truncated at 50KB.
Known display limitation
Claude Desktop's markdown renderer strips backslashes from fenced code blocks, so RTF control words (\rtf1, \b, etc.) appear without their leading backslash in the display. The data is read correctly — Claude can still parse and act on the content.
Setup
{
"mcpServers": {
"clipboard": {
"command": "uvx",
"args": ["--from", "clipboard-mcp-server", "clipboard-mcp"]
}
}
}