Clippy MCP
Clippy is a cross-device clipboard service that provides an MCP server for AI agents. It allows agents to create rooms, store and retrieve text, links, and images, and manage room access without requiring user sign-up. The server exposes tools like create-room, store-item, and list-items to facilitate seamless data sharing between devices.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://useclippy.cc/mcpWhat its tools do
9 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Read-only (2)
Can change data (2)
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Create a new room for sharing data
- Store text or image items in a room
- List existing items in a room
- Manage room access and passwords
Source and maintenance
- Maintenance checked
Protocol and capabilities
- Server
- Clippy 1.0.0
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 9 advertised
- Resources
- 1 advertised
- Resource templates
- 0 advertised
- Prompts
- 1 advertised
{
"tools": {
"listChanged": false
},
"prompts": {
"listChanged": false
},
"resources": {
"listChanged": false
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
9 advertised
create-room-tool — Create Clippy Room
Create a brand-new Clippy room and get back its 6-character code, a private owner_token, and a share URL. Use this when you want a fresh shared clipboard to push content to a user (hand them the URL) or to coordinate with other agents. Keep the owner_token private — it grants password control over the room.
{
"type": "object",
"properties": {
"password": {
"type": "string",
"description": "Optional. Lock the new room with this password so only holders of the password (or the owner_token) can read/write it."
}
}
}{
"type": "object",
"required": [
"code",
"url",
"owner_token",
"locked"
],
"properties": {
"url": {
"type": "string",
"description": "Human-shareable URL that opens the room on any device."
},
"code": {
"type": "string",
"description": "The new 6-character room code."
},
"locked": {
"type": "boolean",
"description": "Whether the room is password-protected."
},
"owner_token": {
"type": "string",
"description": "Private token granting password control over the room. Keep secret."
}
}
}{}store-item-tool — Store Item in Clippy Room
Post a piece of text to a Clippy room so it appears on every device and agent watching that room. The room is created automatically if it does not exist yet. Subscribed devices receive a push notification. This is how you "send" something to a user or leave a note for another agent. Returns the stored item.
{
"type": "object",
"required": [
"room",
"text"
],
"properties": {
"room": {
"type": "string",
"description": "The 6-character room code (or a Clippy share URL / #CODE link). The room is created if new."
},
"text": {
"type": "string",
"description": "The text content to store (a snippet, link, message, etc.). Up to 200,000 characters."
},
"device": {
"type": "string",
"description": "Optional short label for who is posting (max 64 chars). Defaults to \"AI Agent\" so humans can tell agent posts apart."
},
"password": {
"type": "string",
"description": "Required only if the room is password-protected and you are not using owner_token."
},
"owner_token": {
"type": "string",
"description": "Optional. The room owner_token; bypasses the password on a locked room."
}
}
}{
"type": "object",
"required": [
"code",
"url",
"item"
],
"properties": {
"url": {
"type": "string",
"description": "Human-shareable URL that opens the room on any device."
},
"code": {
"type": "string",
"description": "The room code the item was stored in."
},
"item": {
"type": "object",
"required": [
"id",
"device",
"edited",
"hasImage",
"imageCount"
],
"properties": {
"id": {
"type": "string",
"description": "The item id (UUID)."
},
"text": {
"type": [
"string",
"null"
],
"description": "The text content, or null for image-only items."
},
"device": {
"type": "string",
"description": "Label for who posted the item."
},
"edited": {
"type": "boolean",
"description": "Whether the item was edited after it was created."
},
"images": {
"type": "array",
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Absolute URL to fetch the image bytes."
},
"mime": {
"type": "string",
"description": "Image MIME type."
},
"size": {
"type": [
"integer",
"null"
],
"description": "Image size in bytes."
},
"position": {
"type": "integer",
"description": "0-based position in the gallery."
}
}
},
"description": "Attached images, ordered by position. Present only when hasImage is true."
},
"hasImage": {
"type": "boolean",
"description": "Whether the item has one or more images."
},
"imageUrl": {
"type": "string",
"description": "Legacy convenience: URL of the first image. Present only when hasImage is true."
},
"createdAt": {
"type": [
"integer",
"null"
],
"description": "Creation time, Unix milliseconds."
},
"imageMime": {
"type": "string",
"description": "Legacy convenience: MIME type of the first image."
},
"imageSize": {
"type": [
"integer",
"null"
],
"description": "Legacy convenience: size of the first image in bytes."
},
"updatedAt": {
"type": [
"integer",
"null"
],
"description": "Last-update time, Unix milliseconds."
},
"imageCount": {
"type": "integer",
"description": "Number of images attached to the item."
}
},
"description": "The stored item."
}
}
}{}store-image-tool — Store Image in Clippy Room
Post one or more images (PNG, JPEG, GIF, or WEBP) to a Clippy room so they appear on every device watching it, optionally with a text caption. Pass each image as a base64 string or a data: URI. The room is created if it does not exist. Subscribed devices get a push notification. Returns the stored item, including direct URLs to fetch each image.
{
"type": "object",
"required": [
"room",
"images"
],
"properties": {
"room": {
"type": "string",
"description": "The 6-character room code (or a Clippy share URL / #CODE link). The room is created if new."
},
"text": {
"type": "string",
"description": "Optional caption to store alongside the image(s). Up to 200,000 characters."
},
"device": {
"type": "string",
"description": "Optional short label for who is posting (max 64 chars). Defaults to \"AI Agent\"."
},
"images": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 10,
"minItems": 1,
"description": "One or more images, each a base64-encoded PNG/JPEG/GIF/WEBP or a data: URI (e.g. \"data:image/png;base64,iVBOR...\"). Up to 10 images, 10 MB each."
},
"password": {
"type": "string",
"description": "Required only if the room is password-protected and you are not using owner_token."
},
"owner_token": {
"type": "string",
"description": "Optional. The room owner_token; bypasses the password on a locked room."
}
}
}{
"type": "object",
"required": [
"code",
"url",
"item"
],
"properties": {
"url": {
"type": "string",
"description": "Human-shareable URL that opens the room on any device."
},
"code": {
"type": "string",
"description": "The room code the image was stored in."
},
"item": {
"type": "object",
"required": [
"id",
"device",
"edited",
"hasImage",
"imageCount"
],
"properties": {
"id": {
"type": "string",
"description": "The item id (UUID)."
},
"text": {
"type": [
"string",
"null"
],
"description": "The text content, or null for image-only items."
},
"device": {
"type": "string",
"description": "Label for who posted the item."
},
"edited": {
"type": "boolean",
"description": "Whether the item was edited after it was created."
},
"images": {
"type": "array",
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Absolute URL to fetch the image bytes."
},
"mime": {
"type": "string",
"description": "Image MIME type."
},
"size": {
"type": [
"integer",
"null"
],
"description": "Image size in bytes."
},
"position": {
"type": "integer",
"description": "0-based position in the gallery."
}
}
},
"description": "Attached images, ordered by position. Present only when hasImage is true."
},
"hasImage": {
"type": "boolean",
"description": "Whether the item has one or more images."
},
"imageUrl": {
"type": "string",
"description": "Legacy convenience: URL of the first image. Present only when hasImage is true."
},
"createdAt": {
"type": [
"integer",
"null"
],
"description": "Creation time, Unix milliseconds."
},
"imageMime": {
"type": "string",
"description": "Legacy convenience: MIME type of the first image."
},
"imageSize": {
"type": [
"integer",
"null"
],
"description": "Legacy convenience: size of the first image in bytes."
},
"updatedAt": {
"type": [
"integer",
"null"
],
"description": "Last-update time, Unix milliseconds."
},
"imageCount": {
"type": "integer",
"description": "Number of images attached to the item."
}
},
"description": "The stored item, including image URLs."
}
}
}{}list-items-tool — List Clippy Room Items
Read the items in a Clippy room (newest first). Use this to pick up text a user or another agent left for you, or to see what is currently in a shared room. Pass `since` (a millisecond timestamp from a previous call) to fetch only items added after that point. Image items include direct image URLs.
{
"type": "object",
"required": [
"room"
],
"properties": {
"room": {
"type": "string",
"description": "The 6-character room code (or a Clippy share URL / #CODE link)."
},
"limit": {
"type": "integer",
"description": "Optional. Maximum number of items to return (1–100). Defaults to 100."
},
"since": {
"type": "integer",
"description": "Optional. Return only items created strictly after this Unix timestamp in milliseconds. Use the `now` value from a previous call to poll incrementally."
},
"password": {
"type": "string",
"description": "Required only if the room is password-protected and you are not using owner_token."
},
"owner_token": {
"type": "string",
"description": "Optional. The room owner_token; bypasses the password on a locked room."
}
}
}{
"type": "object",
"required": [
"code",
"locked",
"count",
"items",
"now"
],
"properties": {
"now": {
"type": "integer",
"description": "Server time in Unix milliseconds; pass as `since` next call to poll incrementally."
},
"code": {
"type": "string",
"description": "The room code that was read."
},
"count": {
"type": "integer",
"description": "Number of items returned."
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"device",
"edited",
"hasImage",
"imageCount"
],
"properties": {
"id": {
"type": "string",
"description": "The item id (UUID)."
},
"text": {
"type": [
"string",
"null"
],
"description": "The text content, or null for image-only items."
},
"device": {
"type": "string",
"description": "Label for who posted the item."
},
"edited": {
"type": "boolean",
"description": "Whether the item was edited after it was created."
},
"images": {
"type": "array",
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Absolute URL to fetch the image bytes."
},
"mime": {
"type": "string",
"description": "Image MIME type."
},
"size": {
"type": [
"integer",
"null"
],
"description": "Image size in bytes."
},
"position": {
"type": "integer",
"description": "0-based position in the gallery."
}
}
},
"description": "Attached images, ordered by position. Present only when hasImage is true."
},
"hasImage": {
"type": "boolean",
"description": "Whether the item has one or more images."
},
"imageUrl": {
"type": "string",
"description": "Legacy convenience: URL of the first image. Present only when hasImage is true."
},
"createdAt": {
"type": [
"integer",
"null"
],
"description": "Creation time, Unix milliseconds."
},
"imageMime": {
"type": "string",
"description": "Legacy convenience: MIME type of the first image."
},
"imageSize": {
"type": [
"integer",
"null"
],
"description": "Legacy convenience: size of the first image in bytes."
},
"updatedAt": {
"type": [
"integer",
"null"
],
"description": "Last-update time, Unix milliseconds."
},
"imageCount": {
"type": "integer",
"description": "Number of images attached to the item."
}
}
},
"description": "The matching items, newest first."
},
"locked": {
"type": "boolean",
"description": "Whether the room is password-protected."
}
}
}{
"readOnlyHint": true,
"idempotentHint": true
}room-status-tool — Clippy Room Status
Check whether a Clippy room exists, whether it is password-protected, and how many items it holds — without reading the contents. Handy before deciding to read or write, or to confirm a code a user gave you is valid.
{
"type": "object",
"required": [
"room"
],
"properties": {
"room": {
"type": "string",
"description": "The 6-character room code (or a Clippy share URL / #CODE link)."
}
}
}{
"type": "object",
"required": [
"code",
"exists",
"locked",
"itemCount",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Human-shareable URL for the room."
},
"code": {
"type": "string",
"description": "The room code that was checked."
},
"exists": {
"type": "boolean",
"description": "Whether the room currently exists."
},
"locked": {
"type": "boolean",
"description": "Whether the room is password-protected."
},
"itemCount": {
"type": "integer",
"description": "Number of items currently in the room."
}
}
}{
"readOnlyHint": true,
"idempotentHint": true
}update-item-tool — Update Clippy Item
Edit the text of an existing item in a Clippy room, identified by its item id (the `id` field returned by store-item / list-items). Image bytes are immutable; this changes only the text.
{
"type": "object",
"required": [
"room",
"item_id",
"text"
],
"properties": {
"room": {
"type": "string",
"description": "The 6-character room code (or a Clippy share URL / #CODE link)."
},
"text": {
"type": "string",
"description": "The new text. For a text-only item this cannot be empty — delete it instead."
},
"item_id": {
"type": "string",
"description": "The item id (UUID) to edit, as returned in the `id` field of a stored/listed item."
},
"password": {
"type": "string",
"description": "Required only if the room is password-protected and you are not using owner_token."
},
"owner_token": {
"type": "string",
"description": "Optional. The room owner_token; bypasses the password on a locked room."
}
}
}{
"type": "object",
"required": [
"code",
"item"
],
"properties": {
"code": {
"type": "string",
"description": "The room code containing the item."
},
"item": {
"type": "object",
"required": [
"id",
"device",
"edited",
"hasImage",
"imageCount"
],
"properties": {
"id": {
"type": "string",
"description": "The item id (UUID)."
},
"text": {
"type": [
"string",
"null"
],
"description": "The text content, or null for image-only items."
},
"device": {
"type": "string",
"description": "Label for who posted the item."
},
"edited": {
"type": "boolean",
"description": "Whether the item was edited after it was created."
},
"images": {
"type": "array",
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Absolute URL to fetch the image bytes."
},
"mime": {
"type": "string",
"description": "Image MIME type."
},
"size": {
"type": [
"integer",
"null"
],
"description": "Image size in bytes."
},
"position": {
"type": "integer",
"description": "0-based position in the gallery."
}
}
},
"description": "Attached images, ordered by position. Present only when hasImage is true."
},
"hasImage": {
"type": "boolean",
"description": "Whether the item has one or more images."
},
"imageUrl": {
"type": "string",
"description": "Legacy convenience: URL of the first image. Present only when hasImage is true."
},
"createdAt": {
"type": [
"integer",
"null"
],
"description": "Creation time, Unix milliseconds."
},
"imageMime": {
"type": "string",
"description": "Legacy convenience: MIME type of the first image."
},
"imageSize": {
"type": [
"integer",
"null"
],
"description": "Legacy convenience: size of the first image in bytes."
},
"updatedAt": {
"type": [
"integer",
"null"
],
"description": "Last-update time, Unix milliseconds."
},
"imageCount": {
"type": "integer",
"description": "Number of images attached to the item."
}
},
"description": "The updated item."
}
}
}{}delete-item-tool — Delete Clippy Item
Delete a single item from a Clippy room by its item id (the `id` returned by store-item / list-items). Any images attached to the item are removed too. This cannot be undone.
{
"type": "object",
"required": [
"room",
"item_id"
],
"properties": {
"room": {
"type": "string",
"description": "The 6-character room code (or a Clippy share URL / #CODE link)."
},
"item_id": {
"type": "string",
"description": "The item id (UUID) to delete."
},
"password": {
"type": "string",
"description": "Required only if the room is password-protected and you are not using owner_token."
},
"owner_token": {
"type": "string",
"description": "Optional. The room owner_token; bypasses the password on a locked room."
}
}
}{
"type": "object",
"required": [
"code",
"deleted"
],
"properties": {
"code": {
"type": "string",
"description": "The room code that was targeted."
},
"deleted": {
"type": "boolean",
"description": "Whether an item was actually deleted (false if it did not exist)."
}
}
}{
"destructiveHint": true
}clear-room-tool — Clear Clippy Room
Delete ALL items in a Clippy room (and their images). Use with care — this wipes everything shared in the room and cannot be undone. The room itself continues to exist and can be reused.
{
"type": "object",
"required": [
"room"
],
"properties": {
"room": {
"type": "string",
"description": "The 6-character room code (or a Clippy share URL / #CODE link)."
},
"password": {
"type": "string",
"description": "Required only if the room is password-protected and you are not using owner_token."
},
"owner_token": {
"type": "string",
"description": "Optional. The room owner_token; bypasses the password on a locked room."
}
}
}{
"type": "object",
"required": [
"code",
"cleared"
],
"properties": {
"code": {
"type": "string",
"description": "The room code that was cleared."
},
"cleared": {
"type": "integer",
"description": "Number of items that were deleted."
}
}
}{
"destructiveHint": true
}set-room-password-tool — Set Clippy Room Password
Lock or unlock a Clippy room. Requires the room owner_token (returned by create-room). Pass a password to lock the room; pass an empty password to remove the lock. Only the owner can change this.
{
"type": "object",
"required": [
"room",
"owner_token"
],
"properties": {
"room": {
"type": "string",
"description": "The 6-character room code (or a Clippy share URL / #CODE link)."
},
"password": {
"type": "string",
"description": "The new password to lock the room with. Pass an empty string to remove the password and make the room open."
},
"owner_token": {
"type": "string",
"description": "The room owner_token proving you own this room. Required."
}
}
}{
"type": "object",
"required": [
"code",
"locked"
],
"properties": {
"code": {
"type": "string",
"description": "The room code whose lock state changed."
},
"locked": {
"type": "boolean",
"description": "Whether the room is now password-protected."
}
}
}{}Prompts
1 advertised
share-to-devices-prompt — Share to My Devices
Guides the agent to put a piece of content into a fresh Clippy room and hand the user a link they can open on their phone, laptop, or any other device.
- content
- The text you want available on the user's other devices (a snippet, link, note, etc.). (required)
Resources
1 advertised
usage-guide-resource — Clippy Usage Guide
A concise guide to what Clippy is and how an AI agent should use its tools to move content between itself, other agents, and a human's devices.
file://resources/usage-guide-resource90-day uptime
A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.
- 2026-11-06: 1 of 1 checks answered
- 2026-11-07: 2 of 2 checks answered
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 5744 ms
- 95th percentile latency
- 5744 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 5744 ms · metadata changed · 9 tool(s), 1 resource(s), 0 resource template(s), 1 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http clippy-mcp-useclippy https://useclippy.cc/mcpCodex
codex mcp add clippy-mcp-useclippy --url https://useclippy.cc/mcpCursor
{
"mcpServers": {
"clippy-mcp-useclippy": {
"url": "https://useclippy.cc/mcp"
}
}
}Cline
{
"mcpServers": {
"clippy-mcp-useclippy": {
"type": "streamableHttp",
"url": "https://useclippy.cc/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"clippy-mcp-useclippy": {
"type": "http",
"url": "https://useclippy.cc/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http clippy-mcp-useclippy https://useclippy.cc/mcpClaude Desktop
https://useclippy.cc/mcpWindsurf
{
"mcpServers": {
"clippy-mcp-useclippy": {
"serverUrl": "https://useclippy.cc/mcp"
}
}
}Let your agent find its tools
Find servers like Clippy MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.