URL shortener + QR (wx93.me)
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Shorten up to 1,000 URLs in one call (Automation plan). Returns one result per input, in order.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http wx93 https://wx93.me/mcp
Shorten up to 1,000 URLs in one call (Automation plan). Returns one result per input, in order.
| Argument | Type | Description |
|---|---|---|
| links* | array |
{
"type": "object",
"required": [
"links"
],
"properties": {
"links": {
"type": "array",
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The long http(s) URL to shorten."
},
"alias": {
"type": "string",
"description": "Custom short code (Pro and up), 3-64 of A-Z a-z 0-9 - _."
},
"title": {
"type": "string"
},
"domain": {
"type": "string",
"description": "Which host the short link uses: wx93.me (default), or a verified custom domain of yours (Automation)."
},
"expires_in": {
"type": "string",
"description": "Lifetime like 90m, 12h, 7d, 2w, 1y. Omit for never."
},
"redirect_type": {
"enum": [
301,
302,
307,
308
],
"type": "integer",
"description": "Pro and up. Default 302."
}
},
"additionalProperties": false
},
"maxItems": 1000
}
},
"additionalProperties": false
}Make one invite link (single use, 30 days). A new account that signs up through it gets a week of Pro, and so does the inviter. The link is shown once.
| Argument | Type | Description |
|---|---|---|
| note | string | Who it is for; only the inviter sees it. |
{
"type": "object",
"properties": {
"note": {
"type": "string",
"description": "Who it is for; only the inviter sees it."
}
},
"additionalProperties": false
}Save a styled QR code to the account and return it with a PNG preview. Dynamic types (url, vcard, event, links) encode a wx93 short link: scans are counted and the content can change after printing (vcard, event and links get a hosted page). Static types (text, wifi, email, phone, sms, whatsapp, geo, crypto) carry their content directly. Data keys per type: url {url}; vcard {first, last?, org?, title?, phone?, email?, url?, address?, note?}; event {title, start, end?, tz?, location?, description?, url?}; links {title, description?, links: "Label | https://… per line"}; text {text}; wifi {ssid, password?, encryption? WPA|WEP|nopass, hidden?}; email {to, subject?, body?}; phone {number}; sms {number, message?}; whatsapp {number, message?}; geo {lat, lng, label?}; crypto {coin, address, amount?, label?}.
| Argument | Type | Description |
|---|---|---|
| data* | object | The type's fields (see the description). |
| name | string | |
| type* | string | |
| alias | string | Dynamic codes, Pro and up: a custom short code. |
| style | object | How the code looks. Colours are hex. Too little contrast between fg and bg is refused. |
| domain | string | Dynamic codes: wx93.me (default) or a verified custom domain. |
{
"type": "object",
"required": [
"type",
"data"
],
"properties": {
"data": {
"type": "object",
"description": "The type's fields (see the description)."
},
"name": {
"type": "string"
},
"type": {
"enum": [
"url",
"vcard",
"event",
"links",
"text",
"wifi",
"email",
"phone",
"sms",
"whatsapp",
"geo",
"crypto"
],
"type": "string"
},
"alias": {
"type": "string",
"description": "Dynamic codes, Pro and up: a custom short code."
},
"style": {
"type": "object",
"properties": {
"bg": {
"type": "string",
"description": "Background colour."
},
"fg": {
"type": "string",
"description": "Module colour, e.g. #0b0d10."
},
"ecc": {
"enum": [
"L",
"M",
"Q",
"H"
],
"type": "string",
"description": "Error correction. A logo forces H."
},
"eye": {
"type": "string",
"description": "Colour of the three corner eyes; defaults to fg."
},
"dots": {
"enum": [
"square",
"rounded",
"dots"
],
"type": "string"
},
"margin": {
"type": "integer",
"maximum": 10,
"minimum": 0
},
"eye_ball": {
"enum": [
"square",
"rounded",
"circle"
],
"type": "string"
},
"eye_frame": {
"enum": [
"square",
"rounded",
"circle"
],
"type": "string"
},
"transparent": {
"type": "boolean"
}
},
"description": "How the code looks. Colours are hex. Too little contrast between fg and bg is refused.",
"additionalProperties": false
},
"domain": {
"type": "string",
"description": "Dynamic codes: wx93.me (default) or a verified custom domain."
}
},
"additionalProperties": false
}Have wx93 POST link events to an https URL (Automation plan): link.created when a link is made, link.clicked on every human click. Deliveries are signed CloudEvents (Standard Webhooks headers, plus x-wx93-signature). Returns the signing secret once. events: link.created, link.clicked, link.* or *; omit for all.
| Argument | Type | Description |
|---|---|---|
| url* | string | https URL that receives the POSTs. |
| events | array | |
| description | string |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "https URL that receives the POSTs."
},
"events": {
"type": "array",
"items": {
"type": "string"
}
},
"description": {
"type": "string"
}
},
"additionalProperties": false
}Delete one of your links. It stops resolving at once.
| Argument | Type | Description |
|---|---|---|
| ref* | string | The link id, its code, or the whole short URL. |
{
"type": "object",
"required": [
"ref"
],
"properties": {
"ref": {
"type": "string",
"description": "The link id, its code, or the whole short URL."
}
},
"additionalProperties": false
}Delete a saved QR code (and, for a dynamic one, its short link).
| Argument | Type | Description |
|---|---|---|
| id* | string | The QR code id (a UUID from create_qr_code or list_qr_codes). |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The QR code id (a UUID from create_qr_code or list_qr_codes)."
}
},
"additionalProperties": false
}Remove a webhook endpoint.
| Argument | Type | Description |
|---|---|---|
| id* | string | The webhook endpoint id (from list_webhooks or create_webhook). |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The webhook endpoint id (from list_webhooks or create_webhook)."
}
},
"additionalProperties": false
}Where a wx93.me short link goes, without following it.
| Argument | Type | Description |
|---|---|---|
| url* | string |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string"
}
},
"additionalProperties": false
}One of your links.
| Argument | Type | Description |
|---|---|---|
| ref* | string | The link id, its code, or the whole short URL. |
{
"type": "object",
"required": [
"ref"
],
"properties": {
"ref": {
"type": "string",
"description": "The link id, its code, or the whole short URL."
}
},
"additionalProperties": false
}One saved QR code, with the image as PNG and links to SVG and print-ready PDF.
| Argument | Type | Description |
|---|---|---|
| id* | string | The QR code id (a UUID from create_qr_code or list_qr_codes). |
| size | integer |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The QR code id (a UUID from create_qr_code or list_qr_codes)."
},
"size": {
"type": "integer",
"maximum": 2048,
"minimum": 64
}
},
"additionalProperties": false
}Clicks for one of your links: totals (people, QR scans, unique visitors, bots), and on Pro+ daily counts, referrers, countries, cities, devices, OS, browsers, a weekday-by-hour heatmap, week over week and the latest visits.
| Argument | Type | Description |
|---|---|---|
| tz | string | IANA time zone for the heatmap, e.g. America/New_York. Default UTC. |
| ref* | string | The link id, its code, or the whole short URL. |
| days | integer | |
| source | string | Only QR scans, or only plain clicks. |
{
"type": "object",
"required": [
"ref"
],
"properties": {
"tz": {
"type": "string",
"description": "IANA time zone for the heatmap, e.g. America/New_York. Default UTC."
},
"ref": {
"type": "string",
"description": "The link id, its code, or the whole short URL."
},
"days": {
"type": "integer",
"maximum": 365,
"minimum": 1
},
"source": {
"enum": [
"qr",
"link"
],
"type": "string",
"description": "Only QR scans, or only plain clicks."
}
},
"additionalProperties": false
}The signed-in account's invite links: how many are left (3 per account) and which were used.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}The account's short links, newest first, with click counts.
| Argument | Type | Description |
|---|---|---|
| q | string | Filter by URL, code or title. |
| limit | integer |
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Filter by URL, code or title."
},
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1
}
},
"additionalProperties": false
}The account's saved QR codes, newest first, with what each encodes and its scan count.
| Argument | Type | Description |
|---|---|---|
| q | string | Filter by name or content. |
| limit | integer |
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Filter by name or content."
},
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1
}
},
"additionalProperties": false
}Your webhook endpoints and the event types wx93 sends (link.created, link.clicked).
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Scans of a dynamic QR code: people, unique visitors, bots; on Pro+ daily series, countries, cities, devices, OS, browsers, a weekday-by-hour heatmap, week over week, the last hour and the latest scans.
| Argument | Type | Description |
|---|---|---|
| id* | string | The QR code id (a UUID from create_qr_code or list_qr_codes). |
| tz | string | IANA time zone for the heatmap. |
| days | integer | |
| source | string |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The QR code id (a UUID from create_qr_code or list_qr_codes)."
},
"tz": {
"type": "string",
"description": "IANA time zone for the heatmap."
},
"days": {
"type": "integer",
"maximum": 365,
"minimum": 1
},
"source": {
"enum": [
"qr",
"link"
],
"type": "string"
}
},
"additionalProperties": false
}Redeem a wx93 credit code (CR-XXXX-XXXX-XXXX-XXXX) on the signed-in account. It adds days of the Pro plan.
| Argument | Type | Description |
|---|---|---|
| code* | string |
{
"type": "object",
"required": [
"code"
],
"properties": {
"code": {
"type": "string"
}
},
"additionalProperties": false
}Replace an endpoint's signing secret. Returns the new one; the old one stops working at once.
| Argument | Type | Description |
|---|---|---|
| id* | string | The webhook endpoint id (from list_webhooks or create_webhook). |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The webhook endpoint id (from list_webhooks or create_webhook)."
}
},
"additionalProperties": false
}Shorten a URL with wx93.me and return the short link. Works without an account (free links open through a short ad page for people; bots and previews get the direct redirect). Signed-in Pro and Automation links redirect directly and can have aliases.
| Argument | Type | Description |
|---|---|---|
| url* | string | The long http(s) URL to shorten. |
| alias | string | Custom short code (Pro and up), 3-64 of A-Z a-z 0-9 - _. |
| title | string | |
| domain | string | Which host the short link uses: wx93.me (default), or a verified custom domain of yours (Automation). |
| expires_in | string | Lifetime like 90m, 12h, 7d, 2w, 1y. Omit for never. |
| redirect_type | integer | Pro and up. Default 302. |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The long http(s) URL to shorten."
},
"alias": {
"type": "string",
"description": "Custom short code (Pro and up), 3-64 of A-Z a-z 0-9 - _."
},
"title": {
"type": "string"
},
"domain": {
"type": "string",
"description": "Which host the short link uses: wx93.me (default), or a verified custom domain of yours (Automation)."
},
"expires_in": {
"type": "string",
"description": "Lifetime like 90m, 12h, 7d, 2w, 1y. Omit for never."
},
"redirect_type": {
"enum": [
301,
302,
307,
308
],
"type": "integer",
"description": "Pro and up. Default 302."
}
},
"additionalProperties": false
}Send a webhook.test event to an endpoint now and say how it went.
| Argument | Type | Description |
|---|---|---|
| id* | string | The webhook endpoint id (from list_webhooks or create_webhook). |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The webhook endpoint id (from list_webhooks or create_webhook)."
}
},
"additionalProperties": false
}Change where one of your links goes, its title, expiry or redirect type.
| Argument | Type | Description |
|---|---|---|
| ref* | string | The link id, its code, or the whole short URL. |
| url | string | |
| title | string | |
| expires_in | string | |
| redirect_type | integer |
{
"type": "object",
"required": [
"ref"
],
"properties": {
"ref": {
"type": "string",
"description": "The link id, its code, or the whole short URL."
},
"url": {
"type": "string"
},
"title": {
"type": "string"
},
"expires_in": {
"type": "string"
},
"redirect_type": {
"enum": [
301,
302,
307,
308
],
"type": "integer"
}
},
"additionalProperties": false
}Change a saved code's name, content (merged into its data) or style. A dynamic code keeps working after printing; a static one changes its picture.
| Argument | Type | Description |
|---|---|---|
| id* | string | The QR code id (a UUID from create_qr_code or list_qr_codes). |
| data | object | |
| name | string | |
| style | object | How the code looks. Colours are hex. Too little contrast between fg and bg is refused. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The QR code id (a UUID from create_qr_code or list_qr_codes)."
},
"data": {
"type": "object"
},
"name": {
"type": "string"
},
"style": {
"type": "object",
"properties": {
"bg": {
"type": "string",
"description": "Background colour."
},
"fg": {
"type": "string",
"description": "Module colour, e.g. #0b0d10."
},
"ecc": {
"enum": [
"L",
"M",
"Q",
"H"
],
"type": "string",
"description": "Error correction. A logo forces H."
},
"eye": {
"type": "string",
"description": "Colour of the three corner eyes; defaults to fg."
},
"dots": {
"enum": [
"square",
"rounded",
"dots"
],
"type": "string"
},
"margin": {
"type": "integer",
"maximum": 10,
"minimum": 0
},
"eye_ball": {
"enum": [
"square",
"rounded",
"circle"
],
"type": "string"
},
"eye_frame": {
"enum": [
"square",
"rounded",
"circle"
],
"type": "string"
},
"transparent": {
"type": "boolean"
}
},
"description": "How the code looks. Colours are hex. Too little contrast between fg and bg is refused.",
"additionalProperties": false
}
},
"additionalProperties": false
}Change a webhook endpoint: url, events, description, or enabled (true turns a switched-off endpoint back on).
| Argument | Type | Description |
|---|---|---|
| id* | string | The webhook endpoint id (from list_webhooks or create_webhook). |
| url | string | |
| events | array | |
| enabled | boolean | |
| description | string |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The webhook endpoint id (from list_webhooks or create_webhook)."
},
"url": {
"type": "string"
},
"events": {
"type": "array",
"items": {
"type": "string"
}
},
"enabled": {
"type": "boolean"
},
"description": {
"type": "string"
}
},
"additionalProperties": false
}Recent webhook deliveries with their payloads and results, for one endpoint or all of them.
| Argument | Type | Description |
|---|---|---|
| id | string | The webhook endpoint id (from list_webhooks or create_webhook). |
| limit | integer |
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The webhook endpoint id (from list_webhooks or create_webhook)."
},
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1
}
},
"additionalProperties": false
}The signed-in account, its plan and this month's usage.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 11, 2026.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.