Skip to content

Releases: cmeans/mcp-clipboard

v2.2.1

16 Apr 19:20
8d945f8

Choose a tag to compare

Bug-fix and test-hardening release. No new features.

Added

  • Strengthened test_paste_large_content_truncated with a size-bound assertion so it can no longer pass if truncation regresses. Closes #70.
  • Strengthened test_format_destination_ragged_rows with per-format structural assertions for jira/confluence (||/| cell parsing) and html (<th>/<td> counts). Closes #71.

Changed

  • tests/test_server.py adds an autouse fixture that resets the module global cb._backend around every test, replacing scattered manual resets in backend-detection and env-override tests. Closes #72.

Fixed

  • Subprocess reaping on timeout in _run_subprocess and _run_with_stdin. After proc.kill(), the process is now awaited via asyncio.wait_for(proc.wait(), timeout=1.0) so the pipes are drained and the child is fully reaped. Closes #69.
  • detect_content_type no longer misclassifies English prose containing "from " or "import " mid-sentence. Strong patterns now anchor to the start of a line. Closes #68.
  • clipboard_paste instruction file now describes the slack format accurately: monospace code block with a dashed-underline header row. Closes #73.
  • detect_content_type no 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_formats now deduplicates MIME types; public.utf8-plain-text and public.plain-text no longer both surface as text/plain. Closes #74.
  • clipboard_copy now validates mime_type against _MIME_RE before 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

12 Apr 23:16
47a3cd3

Choose a tag to compare

What's New

Added

  • clipboard_copy write-side size limit (default 1 MiB, configurable via MCP_CLIPBOARD_MAX_WRITE_BYTES) (#27)
  • MCP_CLIPBOARD_BACKEND env 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.typed PEP 561 marker for downstream type checkers (#33)

Fixed

  • Security: HTML table output now escapes cell values with html.escape(), preventing XSS (#15)
  • _TextExtractor uses 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

12 Apr 17:38

Choose a tag to compare

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

12 Apr 16:20

Choose a tag to compare

What's New

Added

  • Parametrized escaping test matrix covering special characters across all 8 output formats (#18)
  • ruff linter/formatter and mypy type 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_image rejects 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.yml to ci.yml

Full changelog: v2.0.2...v2.1.0

v2.0.2

05 Apr 05:34

Choose a tag to compare

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-clipboard

Full changelog: https://github.com/cmeans/mcp-clipboard/blob/main/CHANGELOG.md

v2.0.1

05 Apr 03:34

Choose a tag to compare

Added

  • Server icons (light/dark SVG) embedded as data URIs via FastMCP icons parameter
  • PyPI, CI, license, and download badges in README

Fixed

  • Claude Code install command now uses --scope user for global availability

Install

# Claude Code (global)
claude mcp add clipboard --scope user -- uvx mcp-clipboard

# pip
pip install mcp-clipboard

Full changelog: https://github.com/cmeans/mcp-clipboard/blob/main/CHANGELOG.md

v2.0.0 — mcp-clipboard

05 Apr 01:34
bfb2185

Choose a tag to compare

Breaking Changes

  • Renamed PyPI package from clipboard-mcp-server to mcp-clipboard
  • Renamed Python package from clipboard_mcp to mcp_clipboard
  • Renamed CLI command from clipboard-mcp to mcp-clipboard
  • Renamed debug env var from CLIPBOARD_MCP_DEBUG to MCP_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-clipboard

Full changelog: https://github.com/cmeans/mcp-clipboard/blob/main/CHANGELOG.md

v1.3.0 — Destination-aware output formats

15 Mar 22:39
0639e83

Choose a tag to compare

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

15 Mar 20:12
1a9ab0f

Choose a tag to compare

What's new

  • Schema inferenceclipboard_paste gains include_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

15 Mar 20:12
a3101a1

Choose a tag to compare

What's new

  • RTF read supportclipboard_paste now reads text/rtf from the clipboard on all platforms:
    • macOS: via osascript/NSPasteboard (public.rtf UTI)
    • Windows: via PowerShell DataFormats::Rtf
    • Linux (Wayland/X11): already worked via pass-through MIME — no changes needed
  • When HTML and plain text are both empty, clipboard_paste tries 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"]
    }
  }
}