copynpaste-mcp
v0.3.3
Published
MCP server for copynpaste: convert text formatting between apps via the copynpaste API (Slack, Discord, WhatsApp, Telegram, Reddit, Teams, Markdown, Google Docs, Notion).
Maintainers
Readme
copynpaste-mcp
An MCP server that converts text formatting between apps (Slack, Discord, WhatsApp,
Telegram, Reddit, Microsoft Teams, Markdown, and more), backed by the
copynpaste.xyz HTTP API. It runs over stdio and forwards
conversions to the API, so usage is tracked and rich-text sources work too. Point it
elsewhere with COPYNPASTE_API_URL.
Tools
convert_text{ text, from, to }-> the converted textlist_formats-> the supported source and target formatscheck_quota-> this account's tier and how many free words are left today
Your key
Set COPYNPASTE_API_KEY to a key created at https://copynpaste.xyz/keys. A key
made there is tied to your account, so whatever plan the account has applies wherever
you use the key.
Without one, the server mints an anonymous key on first run and caches it in
~/.config/copynpaste/<api-host>.key (mode 600), so restarts reuse it. For the
default API that file is ~/.config/copynpaste/copynpaste.xyz.key. That file is managed
by the client and may be replaced or deleted automatically, so a key of your own belongs
in COPYNPASTE_API_KEY, never there. Anonymous keys get the smallest allowance and
cannot be revoked or listed, so they are for trying it out, not for running on.
If the cached key ever stops being accepted, the server discards it and mints a replacement automatically, so a conversion recovers on the next call without you doing anything. Deleting that file by hand has the same effect, and the path is spelled out here so it stays findable. Versions before 0.3.1 did not recover on their own, so an install from before then may need the file deleted once.
A key set in COPYNPASTE_API_KEY is never replaced. If that key is rejected you get
the error rather than a silent switch to an anonymous key, because swapping it would
quietly drop you to the smallest allowance.
Limits
| | Free, account-bound | Free, anonymous | Monthly | Lifetime | | --- | --- | --- | --- | --- | | Per conversion | 250 words / 2500 chars | 250 words / 2500 chars | 100,000 chars | 100,000 chars | | Words per day | 5,000 | 1,000 per address | 100,000 | 250,000 | | Requests per day | — | — | 5,000 | 5,000 |
The daily budget counts words, not requests, so splitting a long document into smaller conversions does not raise it. An unlock — one-time or monthly, the same purchase as the web app — removes the per-conversion length limit and raises the daily budget: https://copynpaste.xyz/keys.
The paid daily budgets exist so one automated client cannot degrade the service for
everyone. They are set far above any human workflow, and check_quota reports what is
left on every tier, so a long job can be planned rather than interrupted. Accounts that
bought before these budgets were introduced are not subject to them.
These limits apply to the API and MCP, where conversion happens on the server. The web app at https://copynpaste.xyz converts in your browser and is not metered this way.
Call check_quota before a long job to see what is left, rather than discovering it
mid-task.
Sources: markdown, slack, whatsapp, discord, telegram, reddit, teams,
plus rich HTML sources gdocs, notion, word, gmail (pass the copied HTML).
Targets: the symbol set plus plain (strip formatting) and social (Unicode
bold/italic for X and LinkedIn).
Install
npx -y copynpaste-mcpPublished on the public npm registry as
copynpaste-mcp. No registry
configuration and no auth token, for installing or for running.
Use with Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"copynpaste": {
"command": "npx",
"args": ["-y", "copynpaste-mcp"],
"env": { "COPYNPASTE_API_KEY": "cnp_your_key_here" }
}
}
}Omit the env block to run anonymously at the smaller allowance.
Or run from a local build instead:
"command": "node", "args": ["/absolute/path/to/mcp/dist/index.js"] (after npm install && npm run build).
Remote transport
The same tools also run on a Cloudflare Worker over Streamable HTTP. It is a
compatibility spike, not a public connector: auth is a forwarded x-api-key header
rather than the OAuth 2.1 + dynamic client registration flow the MCP spec wants for a
public remote endpoint. The URL is deliberately not published — a URL in a
published README is a public connector in practice whatever the heading above it says,
and this one's auth is weaker than the spec requires. Use the stdio server above.
src/tools.ts holds the tool definitions; src/index.ts is the stdio entry and
src/worker.ts the Worker entry, so both transports serve exactly the same tools.
Build (local)
npm install
npm run build