clippy

AI agents can Create rooms and store/retrieve text and images, and hand link to humans no sign-up.

我该使用它吗

质量与安全性

A
描述质量
100%
模式完整度
99%
命名质量
61%
投毒风险
100%
权限匹配度
100%
协议合规性
100%

发现(9)

  • LOWTool 'create-room-tool' doesn't follow camelCase/snake_case在 create-room-tool 中
  • LOWTool 'store-item-tool' doesn't follow camelCase/snake_case在 store-item-tool 中
  • LOWTool 'store-image-tool' doesn't follow camelCase/snake_case在 store-image-tool 中
  • LOWTool 'list-items-tool' doesn't follow camelCase/snake_case在 list-items-tool 中
  • LOWTool 'room-status-tool' doesn't follow camelCase/snake_case在 room-status-tool 中
  • LOWTool 'update-item-tool' doesn't follow camelCase/snake_case在 update-item-tool 中
  • LOWTool 'delete-item-tool' doesn't follow camelCase/snake_case在 delete-item-tool 中
  • LOWTool 'clear-room-tool' doesn't follow camelCase/snake_case在 clear-room-tool 中
  • LOWTool 'set-room-password-tool' doesn't follow camelCase/snake_case在 set-room-password-tool 中

基于对工具定义和协议合规性的自动分析。

上下文开销

~3,713token 数(工具定义)
~4.5 KB典型响应大小
对注意力有显著影响(占 128k 上下文窗口的 2.90%)

这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。

安装

一键安装

将以下内容添加到你的 `claude_desktop_config.json` 文件中:

{
  "mcpServers": {
    "clippy": {
      "url": "https://useclippy.cc/mcp"
    }
  }
}

远程端点

https://useclippy.cc/mcpstreamable-http

它能做什么

工具清单

工具(9)

🟢 只读🟡 写入🔴 删除⚪ 未知
🟡create-room-tool(password)

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": {
      "description": "Optional. Lock the new room with this password so only holders of the password (or the owner_token) can read/write it.",
      "type": "string"
    }
  }
}

输出模式

{
  "type": "object",
  "properties": {
    "code": {
      "description": "The new 6-character room code.",
      "type": "string"
    },
    "url": {
      "description": "Human-shareable URL that opens the room on any device.",
      "type": "string"
    },
    "owner_token": {
      "description": "Private token granting password control over the room. Keep secret.",
      "type": "string"
    },
    "locked": {
      "description": "Whether the room is password-protected.",
      "type": "boolean"
    }
  },
  "required": [
    "code",
    "url",
    "owner_token",
    "locked"
  ]
}
🟡store-item-tool(room, text, device, password, owner_token)

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",
  "properties": {
    "room": {
      "description": "The 6-character room code (or a Clippy share URL / #CODE link). The room is created if new.",
      "type": "string"
    },
    "text": {
      "description": "The text content to store (a snippet, link, message, etc.). Up to 200,000 characters.",
      "type": "string"
    },
    "device": {
      "description": "Optional short label for who is posting (max 64 chars). Defaults to \"AI Agent\" so humans can tell agent posts apart.",
      "type": "string"
    },
    "password": {
      "description": "Required only if the room is password-protected and you are not using owner_token.",
      "type": "string"
    },
    "owner_token": {
      "description": "Optional. The room owner_token; bypasses the password on a locked room.",
      "type": "string"
    }
  },
  "required": [
    "room",
    "text"
  ]
}

输出模式

{
  "type": "object",
  "properties": {
    "code": {
      "description": "The room code the item was stored in.",
      "type": "string"
    },
    "url": {
      "description": "Human-shareable URL that opens the room on any device.",
      "type": "string"
    },
    "item": {
      "description": "The stored item.",
      "properties": {
        "id": {
          "description": "The item id (UUID).",
          "type": "string"
        },
        "text": {
          "description": "The text content, or null for image-only items.",
          "type": [
            "string",
            "null"
          ]
        },
        "device": {
          "description": "Label for who posted the item.",
          "type": "string"
        },
        "createdAt": {
          "description": "Creation time, Unix milliseconds.",
          "type": [
            "integer",
            "null"
          ]
        },
        "updatedAt": {
          "description": "Last-update time, Unix milliseconds.",
          "type": [
            "integer",
            "null"
          ]
        },
        "edited": {
          "description": "Whether the item was edited after it was created.",
          "type": "boolean"
        },
        "hasImage": {
          "description": "Whether the item has one or more images.",
          "type": "boolean"
        },
        "imageCount": {
          "description": "Number of images attached to the item.",
          "type": "integer"
        },
        "images": {
          "description": "Attached images, ordered by position. Present only when hasImage is true.",
          "items": {
            "properties": {
              "url": {
                "description": "Absolute URL to fetch the image bytes.",
                "type": "string"
              },
              "mime": {
                "description": "Image MIME type.",
                "type": "string"
              },
              "size": {
                "description": "Image size in bytes.",
                "type": [
                  "integer",
                  "null"
                ]
              },
              "position": {
                "description": "0-based position in the gallery.",
                "type": "integer"
              }
            },
            "type": "object",
            "required": [
              "url"
            ]
          },
          "type": "array"
        },
        "imageUrl": {
          "description": "Legacy convenience: URL of the first image. Present only when hasImage is true.",
          "type": "string"
        },
        "imageMime": {
          "description": "Legacy convenience: MIME type of the first image.",
          "type": "string"
        },
        "imageSize": {
          "description": "Legacy convenience: size of the first image in bytes.",
          "type": [
            "integer",
            "null"
          ]
        }
      },
      "type": "object",
      "required": [
        "id",
        "device",
        "edited",
        "hasImage",
        "imageCount"
      ]
    }
  },
  "required": [
    "code",
    "url",
    "item"
  ]
}
🟡store-image-tool(room, images, text, device, password, ...)

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",
  "properties": {
    "room": {
      "description": "The 6-character room code (or a Clippy share URL / #CODE link). The room is created if new.",
      "type": "string"
    },
    "images": {
      "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.",
      "minItems": 1,
      "maxItems": 10,
      "items": {
        "type": "string"
      },
      "type": "array"
    },
    "text": {
      "description": "Optional caption to store alongside the image(s). Up to 200,000 characters.",
      "type": "string"
    },
    "device": {
      "description": "Optional short label for who is posting (max 64 chars). Defaults to \"AI Agent\".",
      "type": "string"
    },
    "password": {
      "description": "Required only if the room is password-protected and you are not using owner_token.",
      "type": "string"
    },
    "owner_token": {
      "description": "Optional. The room owner_token; bypasses the password on a locked room.",
      "type": "string"
    }
  },
  "required": [
    "room",
    "images"
  ]
}

输出模式

{
  "type": "object",
  "properties": {
    "code": {
      "description": "The room code the image was stored in.",
      "type": "string"
    },
    "url": {
      "description": "Human-shareable URL that opens the room on any device.",
      "type": "string"
    },
    "item": {
      "description": "The stored item, including image URLs.",
      "properties": {
        "id": {
          "description": "The item id (UUID).",
          "type": "string"
        },
        "text": {
          "description": "The text content, or null for image-only items.",
          "type": [
            "string",
            "null"
          ]
        },
        "device": {
          "description": "Label for who posted the item.",
          "type": "string"
        },
        "createdAt": {
          "description": "Creation time, Unix milliseconds.",
          "type": [
            "integer",
            "null"
          ]
        },
        "updatedAt": {
          "description": "Last-update time, Unix milliseconds.",
          "type": [
            "integer",
            "null"
          ]
        },
        "edited": {
          "description": "Whether the item was edited after it was created.",
          "type": "boolean"
        },
        "hasImage": {
          "description": "Whether the item has one or more images.",
          "type": "boolean"
        },
        "imageCount": {
          "description": "Number of images attached to the item.",
          "type": "integer"
        },
        "images": {
          "description": "Attached images, ordered by position. Present only when hasImage is true.",
          "items": {
            "properties": {
              "url": {
                "description": "Absolute URL to fetch the image bytes.",
                "type": "string"
              },
              "mime": {
                "description": "Image MIME type.",
                "type": "string"
              },
              "size": {
                "description": "Image size in bytes.",
                "type": [
                  "integer",
                  "null"
                ]
              },
              "position": {
                "description": "0-based position in the gallery.",
                "type": "integer"
              }
            },
            "type": "object",
            "required": [
              "url"
            ]
          },
          "type": "array"
        },
        "imageUrl": {
          "description": "Legacy convenience: URL of the first image. Present only when hasImage is true.",
          "type": "string"
        },
        "imageMime": {
          "description": "Legacy convenience: MIME type of the first image.",
          "type": "string"
        },
        "imageSize": {
          "description": "Legacy convenience: size of the first image in bytes.",
          "type": [
            "integer",
            "null"
          ]
        }
      },
      "type": "object",
      "required": [
        "id",
        "device",
        "edited",
        "hasImage",
        "imageCount"
      ]
    }
  },
  "required": [
    "code",
    "url",
    "item"
  ]
}
🟢list-items-tool(room, since, limit, password, owner_token)

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",
  "properties": {
    "room": {
      "description": "The 6-character room code (or a Clippy share URL / #CODE link).",
      "type": "string"
    },
    "since": {
      "description": "Optional. Return only items created strictly after this Unix timestamp in milliseconds. Use the `now` value from a previous call to poll incrementally.",
      "type": "integer"
    },
    "limit": {
      "description": "Optional. Maximum number of items to return (1–100). Defaults to 100.",
      "type": "integer"
    },
    "password": {
      "description": "Required only if the room is password-protected and you are not using owner_token.",
      "type": "string"
    },
    "owner_token": {
      "description": "Optional. The room owner_token; bypasses the password on a locked room.",
      "type": "string"
    }
  },
  "required": [
    "room"
  ]
}

输出模式

{
  "type": "object",
  "properties": {
    "code": {
      "description": "The room code that was read.",
      "type": "string"
    },
    "locked": {
      "description": "Whether the room is password-protected.",
      "type": "boolean"
    },
    "count": {
      "description": "Number of items returned.",
      "type": "integer"
    },
    "items": {
      "description": "The matching items, newest first.",
      "items": {
        "properties": {
          "id": {
            "description": "The item id (UUID).",
            "type": "string"
          },
          "text": {
            "description": "The text content, or null for image-only items.",
            "type": [
              "string",
              "null"
            ]
          },
          "device": {
            "description": "Label for who posted the item.",
            "type": "string"
          },
          "createdAt": {
            "description": "Creation time, Unix milliseconds.",
            "type": [
              "integer",
              "null"
            ]
          },
          "updatedAt": {
            "description": "Last-update time, Unix milliseconds.",
            "type": [
              "integer",
              "null"
            ]
          },
          "edited": {
            "description": "Whether the item was edited after it was created.",
            "type": "boolean"
          },
          "hasImage": {
            "description": "Whether the item has one or more images.",
            "type": "boolean"
          },
          "imageCount": {
            "description": "Number of images attached to the item.",
            "type": "integer"
          },
          "images": {
            "description": "Attached images, ordered by position. Present only when hasImage is true.",
            "items": {
              "properties": {
                "url": {
                  "description": "Absolute URL to fetch the image bytes.",
                  "type": "string"
                },
                "mime": {
                  "description": "Image MIME type.",
                  "type": "string"
                },
                "size": {
                  "description": "Image size in bytes.",
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "position": {
                  "description": "0-based position in the gallery.",
                  "type": "integer"
                }
              },
              "type": "object",
              "required": [
                "url"
              ]
            },
            "type": "array"
          },
          "imageUrl": {
            "description": "Legacy convenience: URL of the first image. Present only when hasImage is true.",
            "type": "string"
          },
          "imageMime": {
            "description": "Legacy convenience: MIME type of the first image.",
            "type": "string"
          },
          "imageSize": {
            "description": "Legacy convenience: size of the first image in bytes.",
            "type": [
              "integer",
              "null"
            ]
          }
        },
        "type": "object",
        "required": [
          "id",
          "device",
          "edited",
          "hasImage",
          "imageCount"
        ]
      },
      "type": "array"
    },
    "now": {
      "description": "Server time in Unix milliseconds; pass as `since` next call to poll incrementally.",
      "type": "integer"
    }
  },
  "required": [
    "code",
    "locked",
    "count",
    "items",
    "now"
  ]
}
🟢room-status-tool(room)

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",
  "properties": {
    "room": {
      "description": "The 6-character room code (or a Clippy share URL / #CODE link).",
      "type": "string"
    }
  },
  "required": [
    "room"
  ]
}

输出模式

{
  "type": "object",
  "properties": {
    "code": {
      "description": "The room code that was checked.",
      "type": "string"
    },
    "exists": {
      "description": "Whether the room currently exists.",
      "type": "boolean"
    },
    "locked": {
      "description": "Whether the room is password-protected.",
      "type": "boolean"
    },
    "itemCount": {
      "description": "Number of items currently in the room.",
      "type": "integer"
    },
    "url": {
      "description": "Human-shareable URL for the room.",
      "type": "string"
    }
  },
  "required": [
    "code",
    "exists",
    "locked",
    "itemCount",
    "url"
  ]
}
🟡update-item-tool(room, item_id, text, password, owner_token)

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",
  "properties": {
    "room": {
      "description": "The 6-character room code (or a Clippy share URL / #CODE link).",
      "type": "string"
    },
    "item_id": {
      "description": "The item id (UUID) to edit, as returned in the `id` field of a stored/listed item.",
      "type": "string"
    },
    "text": {
      "description": "The new text. For a text-only item this cannot be empty — delete it instead.",
      "type": "string"
    },
    "password": {
      "description": "Required only if the room is password-protected and you are not using owner_token.",
      "type": "string"
    },
    "owner_token": {
      "description": "Optional. The room owner_token; bypasses the password on a locked room.",
      "type": "string"
    }
  },
  "required": [
    "room",
    "item_id",
    "text"
  ]
}

输出模式

{
  "type": "object",
  "properties": {
    "code": {
      "description": "The room code containing the item.",
      "type": "string"
    },
    "item": {
      "description": "The updated item.",
      "properties": {
        "id": {
          "description": "The item id (UUID).",
          "type": "string"
        },
        "text": {
          "description": "The text content, or null for image-only items.",
          "type": [
            "string",
            "null"
          ]
        },
        "device": {
          "description": "Label for who posted the item.",
          "type": "string"
        },
        "createdAt": {
          "description": "Creation time, Unix milliseconds.",
          "type": [
            "integer",
            "null"
          ]
        },
        "updatedAt": {
          "description": "Last-update time, Unix milliseconds.",
          "type": [
            "integer",
            "null"
          ]
        },
        "edited": {
          "description": "Whether the item was edited after it was created.",
          "type": "boolean"
        },
        "hasImage": {
          "description": "Whether the item has one or more images.",
          "type": "boolean"
        },
        "imageCount": {
          "description": "Number of images attached to the item.",
          "type": "integer"
        },
        "images": {
          "description": "Attached images, ordered by position. Present only when hasImage is true.",
          "items": {
            "properties": {
              "url": {
                "description": "Absolute URL to fetch the image bytes.",
                "type": "string"
              },
              "mime": {
                "description": "Image MIME type.",
                "type": "string"
              },
              "size": {
                "description": "Image size in bytes.",
                "type": [
                  "integer",
                  "null"
                ]
              },
              "position": {
                "description": "0-based position in the gallery.",
                "type": "integer"
              }
            },
            "type": "object",
            "required": [
              "url"
            ]
          },
          "type": "array"
        },
        "imageUrl": {
          "description": "Legacy convenience: URL of the first image. Present only when hasImage is true.",
          "type": "string"
        },
        "imageMime": {
          "description": "Legacy convenience: MIME type of the first image.",
          "type": "string"
        },
        "imageSize": {
          "description": "Legacy convenience: size of the first image in bytes.",
          "type": [
            "integer",
            "null"
          ]
        }
      },
      "type": "object",
      "required": [
        "id",
        "device",
        "edited",
        "hasImage",
        "imageCount"
      ]
    }
  },
  "required": [
    "code",
    "item"
  ]
}
🔴delete-item-tool(room, item_id, password, owner_token)

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",
  "properties": {
    "room": {
      "description": "The 6-character room code (or a Clippy share URL / #CODE link).",
      "type": "string"
    },
    "item_id": {
      "description": "The item id (UUID) to delete.",
      "type": "string"
    },
    "password": {
      "description": "Required only if the room is password-protected and you are not using owner_token.",
      "type": "string"
    },
    "owner_token": {
      "description": "Optional. The room owner_token; bypasses the password on a locked room.",
      "type": "string"
    }
  },
  "required": [
    "room",
    "item_id"
  ]
}

输出模式

{
  "type": "object",
  "properties": {
    "code": {
      "description": "The room code that was targeted.",
      "type": "string"
    },
    "deleted": {
      "description": "Whether an item was actually deleted (false if it did not exist).",
      "type": "boolean"
    }
  },
  "required": [
    "code",
    "deleted"
  ]
}
🔴clear-room-tool(room, password, owner_token)

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",
  "properties": {
    "room": {
      "description": "The 6-character room code (or a Clippy share URL / #CODE link).",
      "type": "string"
    },
    "password": {
      "description": "Required only if the room is password-protected and you are not using owner_token.",
      "type": "string"
    },
    "owner_token": {
      "description": "Optional. The room owner_token; bypasses the password on a locked room.",
      "type": "string"
    }
  },
  "required": [
    "room"
  ]
}

输出模式

{
  "type": "object",
  "properties": {
    "code": {
      "description": "The room code that was cleared.",
      "type": "string"
    },
    "cleared": {
      "description": "Number of items that were deleted.",
      "type": "integer"
    }
  },
  "required": [
    "code",
    "cleared"
  ]
}
🔴set-room-password-tool(room, owner_token, 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",
  "properties": {
    "room": {
      "description": "The 6-character room code (or a Clippy share URL / #CODE link).",
      "type": "string"
    },
    "owner_token": {
      "description": "The room owner_token proving you own this room. Required.",
      "type": "string"
    },
    "password": {
      "description": "The new password to lock the room with. Pass an empty string to remove the password and make the room open.",
      "type": "string"
    }
  },
  "required": [
    "room",
    "owner_token"
  ]
}

输出模式

{
  "type": "object",
  "properties": {
    "code": {
      "description": "The room code whose lock state changed.",
      "type": "string"
    },
    "locked": {
      "description": "Whether the room is now password-protected.",
      "type": "boolean"
    }
  },
  "required": [
    "code",
    "locked"
  ]
}

社区

评价此服务器

证据

最近观测

已验证未记录版本9 个工具
已验证未记录版本9 个工具