Skip to main content
Glama

CI License: MIT Node MCP

English · 简体中文

sticker-mcp

An MCP server that lets AI send expressive stickers (表情包) directly into the chat, rendered inline via MCP Apps. Comes with a standalone web admin page for managing the sticker library, and tools that let the AI add new stickers for you.

Features

  • Inline sticker rendering — send_sticker renders the image in the conversation via a ui:// MCP Apps widget (works on claude.ai and ChatGPT web).

  • AI judgement built in — tool descriptions teach the AI to check the library (list_available_stickers) and pick a sticker matching the conversation's mood, proactively.

  • AI can grow the library — create_sticker_upload gives the AI a one-time upload URL on this sticker library for attached image bytes; add_sticker still accepts an existing image URL. On local stdio there is also add_sticker_by_path.

  • Standalone admin page — /admin is a plain web page (no MCP host needed): drag & drop / paste upload, batch add, tag editing, search, delete. Optionally protected by ADMIN_TOKEN.

  • Simple storage — JSON + image files on disk. No database.

Related MCP server: cove-sticker-mcp

Live preview

Project showcase: https://show.asashiki.com/projects/sticker-mcp.html

Tools

Tool

Purpose

send_sticker

Pick a sticker by emotion/scene query (or exact stickerId) and render it in chat. Random pick among multiple matches. On no match, returns the catalog so the AI can retry.

list_available_stickers

Catalog of {id, name, tags} — the AI calls this once per conversation to know what moods it can express.

add_sticker

Download an image from an existing public http(s) URL as a sticker with name + tags. It does not accept base64/data URIs.

create_sticker_upload

Create a 10-minute one-time PUT URL on this sticker library so the AI can upload attached image bytes directly here, without third-party image hosts.

add_sticker_by_path

(stdio/local only) Add a sticker from a local file path.

Transports & endpoints

  • Local stdio: node dist/stdio.js (or npm run dev:stdio).

  • Remote Streamable HTTP: node dist/server.js, MCP endpoint at MCP_HTTP_PATH (default /mcp/sticker, /mcp kept as alias).

  • HTTP server also serves: /images/:filename (sticker images for the widget), /admin (management page), /api/stickers (REST for the admin page), /api/stickers/upload/:token (one-time direct uploads created by the MCP tool), /healthz.

Quick start (local)

npm install
npm run build
npm start            # Streamable HTTP on :3000
# or stdio for Claude Desktop:
npm run start:stdio

Claude Desktop (stdio)

{
  "mcpServers": {
    "sticker": {
      "command": "node",
      "args": ["path/to/sticker-mcp/dist/stdio.js"]
    }
  }
}

Remote deployment (claude.ai / ChatGPT web)

  1. Copy .env.example to .env and set at least PUBLIC_BASE_URL (public HTTPS origin) — the widget loads sticker images from PUBLIC_BASE_URL/images/*, and that origin is written into the widget CSP. Without it, images are inlined as base64 (fine locally, brittle in hosted iframes).

  2. docker compose up -d (or run node dist/server.js behind your reverse proxy).

  3. Reverse-proxy https://your-domain/mcp/sticker to the container's :3000 (same path), plus /images/*, /admin, /api/*.

  4. In claude.ai -> Settings -> Connectors -> add custom connector with URL https://your-domain/mcp/sticker. If MCP_AUTH_PASSWORD is set, the connector will use OAuth dynamic client registration and show the password authorization page.

Hosts cache ui:// resources by URI. If you modify the widget, bump the version suffix in src/widget/sticker-view-html.ts (mcp-app-v2.html → v3 ...).

Configuration

See .env.example. Summary:

Variable

Default

Meaning

PUBLIC_BASE_URL

(empty)

Public HTTPS origin; enables URL-based images + CSP. Required for web AI clients.

PORT

3000

HTTP port.

MCP_HTTP_PATH

/mcp/sticker

Streamable HTTP MCP route.

ALLOWED_ORIGINS

PUBLIC_BASE_URL origin

CORS allowlist, comma separated.

MCP_AUTH_PASSWORD

(empty)

Optional password gate for remote connectors. Leave empty to disable auth.

DATA_DIR

./data

stickers.json + images/.

ADMIN_TOKEN

(empty)

If set, /admin + /api/* require it (Bearer header or ?token=).

OAuth password auth

Set MCP_AUTH_PASSWORD to enable a minimal OAuth Authorization Code flow for remote connectors. The server exposes OAuth discovery and dynamic client registration, so clients that support automatic registration can connect without a manually configured Client ID. During connection, enter the configured password on the authorization page.

Development

npm run dev          # HTTP server with reload
npm run typecheck
npm run build        # server (tsup) + widget (IIFE) + admin assets

Code layout: src/mcp.ts (tool/resource registration) · src/server.ts (HTTP transport + REST + static) · src/stdio.ts (local transport) · src/storage.ts (JSON + sharp) · src/widget/ (MCP Apps widget) · src/admin/ (standalone admin page).

License

MIT

Available Tools

5 tools
add_stickerAdd StickerA

Add an image to the sticker library from an existing public http(s) image URL only. Do not pass data:image URIs or base64 here. If you have the user's attached image bytes/file, call create_sticker_upload instead and upload the original bytes directly to this sticker library. Do not use third-party image hosts. If the user already described what the image is, do not spend tokens visually analyzing it; use the user's description to choose the name and tags. If the user did not describe it, inspect the image enough to choose a short name plus 1-8 emotion/scene tags. Supported formats: png / jpeg / gif / webp / avif, max 8MB.

Inputs: name (required), emotions (required), imageUrl (required). Returns: name, method, emotions, maxBytes, +2 more

add_sticker_by_pathAdd Sticker From Local PathA

Add a new sticker from an image file on this computer (local/stdio mode only). Use when the user gives a local file path. Supported: png / jpeg / gif / webp / avif, max 8MB.

Inputs: name (required), emotions (required), filePath (required).

create_sticker_uploadCreate Sticker Upload URLA

Create a one-time upload URL on this sticker library for the user's attached image bytes/file. Use this when adding a sticker from an attachment. After this tool returns, upload the original image bytes directly to uploadUrl with HTTP PUT and Content-Type image/png, image/jpeg, image/gif, image/webp, or image/avif. The sticker is saved as soon as the PUT succeeds; do not call add_sticker afterwards. Do not upload the image to third-party image hosts. Do not curl the MCP endpoint. If the user already told you what the image is, skip visual analysis and use that description for the name and tags. If not, inspect the image enough to name and tag it. The URL expires in 10 minutes.

Inputs: name (required), emotions (required).

list_available_stickersList Available StickersA
Read-only

List every sticker in the library with its id, name and emotion/scene tags. Call this once early in a conversation (or when send_sticker reports no match) so you know which moods you can express; afterwards you can call send_sticker directly.

Inputs: no named parameters.

send_stickerSend StickerA
Read-only

Send an expressive sticker (meme/表情包) that renders as an image in the chat. Use this proactively whenever a sticker would make the reply more fun or expressive — reacting to good/bad news, greeting, teasing, celebrating, comforting. Pick query based on the conversation's mood (an emotion or scene word such as 开心 / 委屈 / 干杯 / good night). If you have not seen the library yet in this conversation, call list_available_stickers first and choose a tag from it. If several stickers match, a random one is chosen — you can pass stickerId to force an exact sticker.

Inputs: query (required), stickerId. Returns: id, name, emotions, imageUrl, +2 more

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A4.4/5.0

    Scored across 5 tools

    Disambiguation5/5

    Each tool has a clearly distinct purpose: listing, sending, and three ways to add stickers (URL, attachment, local path). The descriptions explicitly delineate when to use each add variant, so an agent should never be unsure which tool fits.

    Naming Consistency4/5

    All names follow a verb_noun snake_case pattern, but 'list_available_stickers' and 'create_sticker_upload' are slightly more verbose than the simple 'send_sticker' and 'add_sticker'. Minor deviations exist, but the pattern is still readable and predictable.

    Tool Count5/5

    Five tools is well within the ideal 3-15 range. Each tool covers a distinct aspect of sticker management—listing, sending, and adding via three different input sources—without unnecessary redundancy.

    Completeness4/5

    The core use case (list and send stickers) is fully covered, and adding stickers supports the three common input types. Missing delete/update operations are minor gaps for a sticker library, but they don't hinder the primary functionality.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers