MCP 서버

clippy

io.github.IDTitanium/clippy
커뮤니케이션 생산성 사용 불가 MCP 2026-07-28

이 MCP로 할 수 있는 일

Creates shared rooms for agents and people to store, retrieve, update, and receive notifications for text and images.

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.'}}}
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.'}}}
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).'}}}
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.'}}}
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.'}}}
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.'}}}
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.'}}}
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.'}}}
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.'}}}
추가됨
set-room-password-tool
2026년 9월 17일 12:42 PM
추가됨
clear-room-tool
2026년 9월 17일 12:42 PM
추가됨
delete-item-tool
2026년 9월 17일 12:42 PM
추가됨
update-item-tool
2026년 9월 17일 12:42 PM
추가됨
room-status-tool
2026년 9월 17일 12:42 PM
추가됨
list-items-tool
2026년 9월 17일 12:42 PM
추가됨
store-image-tool
2026년 9월 17일 12:42 PM
추가됨
store-item-tool
2026년 9월 17일 12:42 PM
추가됨
create-room-tool
2026년 9월 17일 12:42 PM