Skip to main content
Glama

Main CI Test Build Release Dependabot Compose-Multiplatform Sqlite Kotlin OS Download AGPL-3.0 Listed on mcpservers.org Ask DeepWiki

✨ Features

  • πŸ”„ Real-time Sharing: Instantly share pasteboard content across devices, seamlessly.

  • πŸ–₯️ Unified Cross-platform: Consistent interface on Mac, Windows, and Linux. No need to change habits.

  • πŸ“‹ Rich Type Support: Handle various pasteboard types: Text, Color, URL, HTML, RTF, Image, File.

  • πŸ”’ End-to-End Encryption: Using asymmetric encryption to fully protect your data security.

  • 🌐 LAN-only Serverless: Local storage, serverless architecture. Privacy protection, in your control.

  • 🧹 Smart Space Management: Auto-cleanup options manage pasteboard storage without manual effort.

  • πŸ” Built-in OCR: Extract text from images locally β€” no network calls, your screenshots never leave the device.

  • πŸ€– MCP Server: Expose your pasteboard history to AI assistants (Claude, etc.) via the Model Context Protocol.

  • 🌍 Chrome Extension: Sync clipboard with the browser β€” copy on a web page, paste on any device.

  • ⌨️ Command-Line: Copy, paste, and search your history from the terminal and scripts. See the CLI guide.

Related MCP server: Claude Paste MCP

πŸ— Getting Started with Development

  1. clone the repository

    git clone https://github.com/CrossPaste/crosspaste-desktop.git
  2. Compile and run the application

    cd crosspaste-desktop
    ./gradlew app:run

First start will download JBR / gradle dependencies.

If you encounter the following error:

FAILURE: Build failed with an exception.

* What went wrong:
java.net.SocketException: Connection reset
> java.net.SocketException: Connection reset

you might need a VPN to download these dependencies.

To configure a proxy for gradle, add the following settings to gradle.properties, and adjust the parameters to match your proxy configuration:

systemProp.https.proxyHost=localhost
systemProp.https.proxyPort=8080
systemProp.https.proxyUser=userid
systemProp.https.proxyPassword=password
systemProp.http.nonProxyHosts=*.nonproxyrepos.com|localhost

Additionally, a series of technical blogs about CrossPaste is being published (approximately one article per week). If you're interested in developing cross-platform applications, you're welcome to read them.

🌍 Building the Chrome Extension

The Chrome extension lives in web/ and is built via Gradle. Node.js (>= 18) is required β€” the npmInstall task will fetch dependencies on first build.

  1. Build the extension

    ./gradlew :web:build

    The unpacked extension is emitted to web/dist/.

  2. Load it into Chrome

    • Open chrome://extensions/

    • Enable Developer mode in the top-right corner

    • Click Load unpacked and select the web/dist/ directory

The extension auto-discovers a CrossPaste desktop app running on the same machine and syncs clipboard content with it. To iterate on extension code, run npm run dev inside web/ for a fast Vite dev loop, then reload the extension in Chrome. The extension imports a Kotlin/JS core library produced by ./gradlew :core:jsBrowserProductionLibraryDistribution (also run as part of :web:build) β€” re-run that task whenever you change core/ sources.

πŸ—ΊοΈ Roadmap

CrossPaste is continuously evolving! v2.2 brings a full command-line mode β€” copy, paste, and search your history straight from the terminal. Here's what we're working on next:

  • Plugin system β€” let the community extend CrossPaste with custom paste types and integrations

This is just a small part of our plans. Want to learn more details and long-term plans? Check out our full roadmap.

πŸ™‹ FAQ

Here are some FAQs that have been collected. If you have other questions, please create an issue to let us know.

🀝 Support the project

  • 🌟 Star this repository: This is the easiest way to support CrossPaste and costs nothing.

  • πŸͺ² Report bugs: Report any bugs you find on the issue tracker.

  • πŸ“– Translate: Help translate and polish CrossPaste into your language.

  • πŸ“ Contribute: Code, comment on issues, and any contributions that can help the project are welcome.

  • πŸ’– Sponsor: Support financially via GitHub Sponsors to help with ongoing development and maintenance.

πŸ“ Contributors

πŸ’– Sponsors

Available Tools

5 tools
add_to_clipboardA

Create a new item in the local clipboard history. This only appends to CrossPaste's history: it does not change the system clipboard and the item is not sent to other devices. Every call creates a new item, even for duplicate content, recorded with source 'MCP'. 'type' defaults to 'text'; supported types: text, url, html, rtf, color, file, image. For file/image, 'content' must be the absolute path of an existing file on this machine (images: png, jpg, jpeg, gif, bmp, webp, heic, heif, tiff, svg); the file is referenced by path, not copied. For color, 'content' may be #RGB, #RRGGBB, #RRGGBBAA, rgb(), rgba(), hsl(), hsla() or a CSS color name. html must contain extractable text and rtf must start with '{\rtf'. On success returns the new item's ID (usable with get_paste_item); on invalid input returns an error and nothing is stored.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoContent type: 'text' (default), 'url', 'html', 'rtf', 'color', 'file', 'image'. Unrecognized values are treated as 'text'.
contentYesThe content to store, interpreted according to 'type': plain text, a URL, an HTML or RTF document, a color value (e.g. #FF0000), or the absolute path of a file/image. Must not be blank.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare the write/non-idempotent/non-destructive profile, and the description adds genuinely new behavioral facts: every call creates a new item even for duplicate content, the source is recorded as 'MCP', files are referenced by path rather than copied, and invalid input stores nothing. That is exactly the beyond-annotation context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and the two key exclusions, then organized by parameter. It is long, but nearly every clause is a functional constraint rather than filler; only the extension enumeration is mildly list-heavy for a description block.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly covers the return contract (new item ID usable with get_paste_item) and the error path (invalid input stores nothing). Combined with the type-specific rules, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the baseline would be 3, but the description substantially exceeds it: per-type constraints (html must contain extractable text, rtf must start with '{\rtf'), the accepted image extensions, and the full color syntax list. These are validation rules the schema does not carry.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Create a new item in the local clipboard history') and immediately scopes it against the obvious misreadings: does not touch the system clipboard and is not synced to other devices. An agent can distinguish this from get_paste_item and search_clipboard without reading any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear context for when this tool applies (appending to CrossPaste history, not system clipboard) and it names get_paste_item as the consumer of the returned ID. It lacks an explicit 'use this instead of X' routing statement against siblings like search_clipboard, but the exclusion of system-clipboard semantics removes the main ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_clipboard_statsA
Read-onlyIdempotent

Report how much is stored in the local clipboard history. Read-only, no parameters. Returns plain text with the total item count and total size, then the count and size for each type (text, URL, HTML, RTF, image, file, color); sizes are human-readable (e.g. 1.2 MB). Use it for an overview only: use search_clipboard to see the items themselves and list_tags to see tags.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered. The description adds genuinely new behavioral context β€” the exact return content and that sizes are human-readable (e.g. 1.2 MB) β€” which matters since there is no output schema. It stops short of noting cost/pagination, but for a local no-arg stat call that is minor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose, then safety, then return format, then the usage boundary β€” a sensible order with no filler. The enumeration of types is slightly long but earns its place by substituting for a missing output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description takes on the burden of describing returns and does so concretely (total count/size plus per-type breakdown, human-readable units). Combined with the usage boundary and annotations, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline is 4; the description reinforces 'no parameters', confirming no filtering or scoping is possible. Nothing further is needed or available.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (report) and resource (amount stored in local clipboard history), and the return shape distinguishes it from sibling readers like search_clipboard and get_paste_item. An agent knows exactly what this produces without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly scopes usage to 'an overview only' and names the two alternatives that cover other needs: search_clipboard for the items themselves and list_tags for tags. This is a textbook when/when-not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_paste_itemA
Read-onlyIdempotent

Return the full content and metadata of one clipboard history item by its numeric ID. Read-only. IDs come from search_clipboard results or from add_to_clipboard. Output is plain text: a header (ID, type, source app, favorite flag, size, creation time, whether it came from a remote device) followed by the content: the text of text/html/rtf items, the URL and page title of links, hex and RGBA values of colors, or the file names of file/image items (binary data is not returned). Returns an error if 'id' is missing, not a number, or matches no existing item. Use search_clipboard first when the ID is not known.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesNumeric ID of the clipboard item, as reported by search_clipboard or add_to_clipboard

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly/idempotent/non-destructive), and the description goes well beyond them with output shape per item type, the explicit exclusion of binary data, and the exact error conditions. This is real added disclosure rather than restating annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose, ID sourcing, output format, errors, and the search fallback are packed densely and front-loaded, with no filler sentences. It is on the long side for a single-parameter getter, so it isn't maximally tight, but every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description takes on the return-value burden and does so by type (text/html/rtf, links, colors, files/images) plus the header fields and error behavior. An agent can call this and interpret the result without further documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3; the description adds value by explaining where valid IDs originate and enumerating the invalid cases ('missing, not a number, or matches no existing item'). It stops short of describing ID ranges or reuse semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return the full content and metadata of one clipboard history item by its numeric ID'), which cleanly separates it from list/search siblings. The singular 'one ... item' plus the ID keying makes the retrieval-vs-search distinction unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the sources of the ID (search_clipboard results or add_to_clipboard) and gives a routing rule: 'Use search_clipboard first when the ID is not known.' That is a concrete when-to-use and alternative in one line.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tagsA
Read-onlyIdempotent

List every tag defined in the local clipboard history. Read-only, no parameters. Tags are user-created labels (e.g. 'Favorite') attached to clipboard items. Returns plain text with the tag count followed by one line per tag, in the user's configured order, showing its numeric ID and name, or 'No tags found.' when there are none. Pass a tag name to the 'tag' parameter of search_clipboard to find the items carrying it. This tool cannot create, rename or delete tags.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial context beyond them: no parameters, plain-text return shape, ordering follows user configuration, and the exact empty-state string. It also explicitly bounds the tool as non-mutating, reinforcing what the annotations only imply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and scope, then progressively adds return format, workflow hand-off, and negative boundaries. Every sentence carries distinct information with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by describing the return format, ordering, and empty case, plus disambiguating what a tag is and how to use the result. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4; the description correctly reinforces this with 'no parameters' and adds nothing misleading. There is no parameter surface left to document.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List every tag defined in the local clipboard history') and defines what a tag is with a concrete example, so an agent can distinguish it from search_clipboard, get_clipboard_stats and the other siblings without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit downstream usage: 'Pass a tag name to the tag parameter of search_clipboard to find the items carrying it', which routes the agent to the correct sibling workflow, and rules out mutation ('cannot create, rename or delete tags'). It stops short of an explicit when-not-to-use statement, so it is clear context rather than full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_clipboardA
Read-onlyIdempotent

Search or browse the local clipboard history. Read-only. Returns up to 'limit' items (default 20, max 100), newest first, each with its numeric ID, type, source app, favorite flag, size, creation time and a one-line summary; pass an ID to get_paste_item for the full content. Omit 'query' to list the most recent items; otherwise every keyword must match as a prefix of a word in the item's searchable text. 'type' and 'tag' narrow the results and can be combined; tag names come from list_tags. An unknown 'type' or 'tag' returns an error rather than an empty list. Use get_clipboard_stats for counts only and add_to_clipboard to create items.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoOnly return items carrying this tag, by exact tag name as shown by list_tags (e.g. 'Favorite').
typeNoOnly return items of this type: text, link, image, rtf, html, color, file (case-insensitive; note that URLs are type 'link').
limitNoMaximum number of results, 1-100 (default 20; out-of-range values are clamped)
queryNoSpace-separated keywords, prefix-matched (e.g. 'invoice 2026'). Omit or leave empty to list recent items.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the read-only/idempotent annotations, it discloses return shape and cardinality (up to 'limit' items, default 20, max 100, newest first, field list), matching semantics (every keyword must prefix-match a word in the searchable text), combination rules for 'type' and 'tag', and the notable error behavior for unknown type/tag instead of an empty list.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and read-only status, then return shape, then filtering rules, then sibling routing. Dense and mostly waste-free, though the limit/default/max clause and parts of the return-field list duplicate the schema and could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by enumerating returned fields and ordering, plus the error mode for unknown type/tag and the handoff to get_paste_item for full content. An agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: prefix-match semantics across multiple keywords, the coupling of 'query' omission with listing recent items, and the pointer to list_tags as the source of valid tag names. It does not add much on 'limit' beyond repeating the documented default/max.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Search or browse the local clipboard history') and immediately scopes it with 'Read-only.' It is clearly distinguishable from siblings like get_clipboard_stats (counts), add_to_clipboard (writes) and get_paste_item (full content by ID), all of which are named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing rules: omit 'query' to browse recent items, pass an ID to get_paste_item for full content, use get_clipboard_stats for counts only, use add_to_clipboard to create items, and get tag names from list_tags. When-to-use and when-to-use-something-else are both covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv2.2.1
    • Changedadd_to_clipboard2 fields changed
      • changedInput schema / properties / content / description
        Previous value: -"The content to add. Text/URL/HTML/RTF as string, color as color value (e.g. #FF0000), file/image as absolute file path"New value: +"The content to store, interpreted according to 'type': plain text, a URL, an HTML or RTF document, a color value (e.g. #FF0000), or the absolute path of a file/image. Must not be blank."
      • changedInput schema / properties / type / description
        Previous value: -"Content type: 'text' (default), 'url', 'html', 'rtf', 'color', 'file', 'image'"New value: +"Content type: 'text' (default), 'url', 'html', 'rtf', 'color', 'file', 'image'. Unrecognized values are treated as 'text'."
    • Changedget_paste_item1 field changed
      • changedInput schema / properties / id / description
        Previous value: -"The paste item ID"New value: +"Numeric ID of the clipboard item, as reported by search_clipboard or add_to_clipboard"
    • Changedsearch_clipboard4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of results (default: 20, max: 100)"New value: +"Maximum number of results, 1-100 (default 20; out-of-range values are clamped)"
      • changedInput schema / properties / query / description
        Previous value: -"Search keywords (optional, empty returns recent items)"New value: +"Space-separated keywords, prefix-matched (e.g. 'invoice 2026'). Omit or leave empty to list recent items."
      • changedInput schema / properties / tag / description
        Previous value: -"Filter by tag name (e.g. 'Favorite')"New value: +"Only return items carrying this tag, by exact tag name as shown by list_tags (e.g. 'Favorite')."
      • changedInput schema / properties / type / description
        Previous value: -"Filter by paste type: text, link, image, rtf, html, color, file"New value: +"Only return items of this type: text, link, image, rtf, html, color, file (case-insensitive; note that URLs are type 'link')."
  2. 5 tool updatesv2.2.0
    • First observedadd_to_clipboard
    • First observedget_clipboard_stats
    • First observedget_paste_item
    • First observedlist_tags
    • First observedsearch_clipboard

TDQS

A4.6/5.0

Scored across 5 tools

Disambiguation5/5

Each tool targets a clearly distinct action: full-content retrieval (get_paste_item), summary browsing (search_clipboard), aggregate counts (get_clipboard_stats), tag enumeration (list_tags), and creation (add_to_clipboard). The descriptions explicitly cross-reference each other to steer agents correctly, e.g. 'Use search_clipboard first when the ID is not known' and 'Use get_clipboard_stats for counts only.' No two tools overlap in purpose.

Naming Consistency5/5

All five names follow a strict verb_noun snake_case pattern: get_paste_item, get_clipboard_stats, list_tags, search_clipboard, add_to_clipboard. Verb style is uniform and the object/resource is always explicit, making the surface highly predictable.

Tool Count5/5

Five tools is well-scoped for a clipboard history server, covering the read paths (search, get, stats, tags) and the write path (add) without redundancy. Every tool earns its place and nothing feels padded or missing at the count level.

Completeness3/5

The read surface is thorough, but the write surface is thin: items can only be added, with no delete, update, or clear-history operation. The 'favorite' flag is surfaced in outputs but no tool can set it, and tags can be listed but never created or removed β€” notable gaps for a clipboard manager.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that gives Claude and other AI assistants access to your Maccy clipboard history, allowing search, retrieval, and management of copied content through natural conversation.
    9
    -
  • F
    license
    A
    quality
    D
    maintenance
    A Windows-native MCP server that enables users to paste images, Excel tables, rich text, and plain text directly into Claude via a dedicated popup interface. It supports multi-item management and format conversion to streamline sharing complex clipboard data with the model.
    1
    -
  • A
    license
    A
    quality
    B
    maintenance
    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.
    7
    74 PyPI
    4
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    A standalone clipboard history MCP server for macOS that monitors clipboard in real-time, stores history locally in SQLite, and exposes it to any MCP-compatible AI assistant.
    5
    MIT