Overview
Conversion follows the Punycode algorithm from RFC 3492. When `text` contains a dot it is treated as a domain: it is split into labels, and in `encode` mode only labels with non-ASCII characters are converted and given the `xn--` prefix, while plain labels such as `de` are left alone. In `decode` mode only labels starting with `xn--` are decoded. Without a dot the whole string is converted as a single label. The input is not lower-cased or normalised first, so `München` and `münchen` encode differently; normalise input before calling if you need registry-style results.
Invalid Punycode in `decode` mode, such as digits outside the alphabet, a truncated sequence or a value that is not a character, returns a 400 that names `text`. `isDomain` is true when the input contains a dot.
`isIDN` is true when the Unicode form contains a non-ASCII character or the ASCII form contains an `xn--` label, so `example.com` returns false. `scripts` lists the writing systems found in labels that contain non-ASCII letters, with digits, hyphens and combining accents ignored. `mixedScript` is true when any label mixes scripts outside the combinations used by real languages (Japanese Han with Hiragana, Katakana and Latin; Korean Han with Hangul and Latin; Chinese Han with Bopomofo and Latin). It catches Latin-and-Cyrillic style spoofs, not same-script look-alikes such as `rn` for `m`. On the Free plan `isIDN` and `mixedScript` are null.
Live Test Punycode Converter Skill Skill →
The tool
Once your client is connected to the VerveKit server, this appears in its tool list as PunycodeConverterSkill. It is read-only and open-world — it fetches and never mutates anything on your side — so most clients call it without asking you to confirm.
{
"name": "PunycodeConverterSkill",
"arguments": {
"text": "münchen.de"
}
}You do not name the tool yourself; the model picks it. Asking about münchen.de in the terms this skill covers is enough for it to reach for PunycodeConverterSkill on its own — naming it explicitly also works, and is the way to force the call.
Connecting
One server URL covers every skill in the catalog, including this one. Authorization is OAuth: the client opens a browser once, and there is no key to paste into a config file.
{
"mcpServers": {
"vervekit": {
"url": "https://api.vervekit.com/v1/mcp"
}
}
}https://api.vervekit.com/v1/mcpPer-client setup — Claude, Cursor, VS Code, ChatGPT — is on the MCP setup page.
Arguments
These are the properties on the tool's inputSchema, so a well-behaved client validates them before the call is made. Premium arguments are accepted on every plan but only take effect on plans that include them.
| Argument | Type | Description |
|---|---|---|
textRequired | string | Unicode text or domain to encode (max 1000 characters) length 0–1000 |
modeOptional | string | Conversion modeencodedecodedefault encode |
What the model gets back
The result carries a structuredContent object matching the tool's declared outputSchema, so a client reads fields without parsing prose. status is "ok" and error is null on success; a null field means the value was not available for that input, not that the call failed.
{
"status": "ok",
"error": null,
"data": {
"input": "münchen.de",
"output": "xn--mnchen-3ya.de",
"mode": "encode",
"isIDN": true,
"isDomain": true,
"scripts": [
"Latin"
],
"mixedScript": false
}
}
Response fields
Paths are relative to data. Premium fields are absent rather than zeroed on plans that do not include them, so check for presence instead of comparing to 0.
| Field | Type | Example | Description |
|---|---|---|---|
input | string | münchen.de | Original Punycode text provided for decoding conversion |
output | string | xn--mnchen-3ya.de | Decoded Unicode text converted from Punycode format |
mode | string | encode | Conversion mode used for the transformation operation |
isIDNPremium | boolean | true | Indicates if result is valid internationalized domain name |
isDomain | boolean | true | Whether the input was treated as a domain name (that is, it contained a dot) rather than a single label. |
scripts | array | ["Latin"] | Writing systems (Latin, Cyrillic, Greek, Han, etc.) detected in the domain's non-ASCII labels. Empty for a plain ASCII domain; a single entry for a legitimate international domain |
mixedScriptPremium | boolean | false | True when a single domain label mixes writing systems in a way no real language does (e.g. Latin combined with Cyrillic) — the signature of a homograph / look-alike phishing domain. Legitimate combinations such as Japanese (Han + Hiragana/Katakana) are not flagged. Detects cross-script spoofs, not same-script look-alikes |
Failure modes
Errors come back as tool errors carrying a sentence the model can act on, not a bare status code. Error handling covers the full list.
| Status | What it means |
|---|---|
400 / 422 | The arguments did not validate. The message names the offending one. |
401 | The OAuth session is invalid or expired — reconnect the server. |
403 | Blocked by a key restriction or an IP allow-list. Never a bad identity. |
404 | This skill is not part of VerveKit. Check the catalog. |
429 | Out of credits, or a brief rate limit. The message tells them apart. |
A call costs 1 credit each time the tool actually runs; a model that reasons about the tool without calling it costs nothing.
Use cases
- Domain Registration
- Verify and convert international domain names
- Web Development
- Handle IDN domains in applications
- Email Systems
- Process internationalized email addresses
- Security
- Detect homograph attacks using similar-looking Unicode characters
Other ways to use Punycode Converter Skill
Set up Punycode Converter Skill on VerveKit, or reach the same source a different way. Your VerveKit account and credits work on all of them — one key, one balance.
Related
More in Data Conversion: