QR Hero Developer Docs

MCP

Tool catalog

25 tools registered on the QR Hero MCP server. Each tool shares the same Sanctum token abilities, organization scoping, rate limits, and metering as the REST API. Endpoint: https://mcp.qrhero.com/mcp. Tokens require the mcp.access ability plus any tool-specific ability.

Machine-readable schema: https://docs.qrhero.com/mcp/schema.json

Confirm-then-execute safety model

Destructive and high-volume bulk MCP tools return a dry-run preview on the first call. Execute by calling again with confirm: true and the confirmation_id from the preview.

  • Confirmation TTL: 300 seconds
  • Bulk create threshold: 10 rows (above this requires confirmation)
  • Guarded tools: codes_delete</code>, <code class="docs-inline-code">codes_bulk_create</code>, <code class="docs-inline-code">codes_bulk_update_status
First call (dry run)
Returns { requires_confirmation: true, confirmation_id, preview }
Second call (execute)
Same arguments plus confirm: true and confirmation_id

REST bulk import uses a separate two-phase flow with confirm_token via POST /v1/qr-codes/bulk and POST /v1/qr-codes/bulk/{import_ulid}/confirm.

Client setup

Claude Desktop

Config: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)

{
    "mcpServers": {
        "qrhero": {
            "url": "https://mcp.qrhero.com/mcp",
            "headers": {
                "Authorization": "Bearer YOUR_QRHERO_TOKEN"
            }
        }
    }
}

Claude Code

Config: Project or user MCP settings (claude mcp add)

{
    "command": "claude mcp add qrhero --transport http https://mcp.qrhero.com/mcp --header \"Authorization: Bearer YOUR_QRHERO_TOKEN\""
}

Cursor

Config: .cursor/mcp.json (project) or Cursor Settings → MCP

{
    "mcpServers": {
        "qrhero": {
            "url": "https://mcp.qrhero.com/mcp",
            "headers": {
                "Authorization": "Bearer YOUR_QRHERO_TOKEN"
            }
        }
    }
}

ChatGPT

Config: ChatGPT → Settings → Connectors → Custom MCP (when available)

{
    "url": "https://mcp.qrhero.com/mcp",
    "authentication": "Bearer token",
    "note": "Use a token with mcp.access and the abilities required by the tools you need."
}

Windsurf

Config: Windsurf Settings → MCP → Add server

{
    "mcpServers": {
        "qrhero": {
            "serverUrl": "https://mcp.qrhero.com/mcp",
            "headers": {
                "Authorization": "Bearer YOUR_QRHERO_TOKEN"
            }
        }
    }
}

VS Code (GitHub Copilot)

Config: .vscode/mcp.json or user settings MCP section

{
    "servers": {
        "qrhero": {
            "type": "http",
            "url": "https://mcp.qrhero.com/mcp",
            "headers": {
                "Authorization": "Bearer YOUR_QRHERO_TOKEN"
            }
        }
    }
}

All tools

Each tool includes typed input/output schemas and copy-pasteable cURL, JavaScript, Python, PHP, and C# examples.

status_read

Health check and token context (GET /v1/status).

REST mapping
GET /v1/status
Ability
Any valid token on an API-enabled plan

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"status\":\"ok\",\"version\":\"v1\",\"organization\":{\"ulid\":\"01HXYZORGULID000000000001\",\"name\":\"Acme Marketing\",\"slug\":\"acme-marketing\"},\"plan\":{\"code\":\"professional\",\"name\":\"Professional (annual)\"},\"api\":{\"rate_limit_per_min\":120,\"calls_included_month\":50000,\"calls_used_month\":1240},\"token\":{\"name\":\"CI automation\",\"abilities\":[\"codes.view\",\"codes.create\",\"mcp.access\"]}}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "status_read",
        "arguments": []
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "status_read",
        "arguments": []
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "status_read",
        "arguments": []
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "status_read",
        "arguments": []
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"status_read","arguments":[]}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

organization_read

Read organization profile (GET /v1/organization).

REST mapping
GET /v1/organization
Ability
Any valid token on an API-enabled plan

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"data\":{\"ulid\":\"01HXYZORGULID000000000001\",\"name\":\"Acme Marketing\",\"slug\":\"acme-marketing\",\"locale\":\"en\",\"currency\":\"EUR\",\"plan\":{\"code\":\"professional\",\"name\":\"Professional (annual)\"},\"created_at\":\"2026-01-15T10:00:00+00:00\",\"updated_at\":\"2026-07-01T08:30:00+00:00\"}}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "organization_read",
        "arguments": []
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "organization_read",
        "arguments": []
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "organization_read",
        "arguments": []
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "organization_read",
        "arguments": []
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"organization_read","arguments":[]}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

analytics_read

Read scan analytics rollup (GET /v1/analytics).

REST mapping
GET /v1/analytics
Ability
analytics.view

Input schema

Field Type Required Description
range integer optional 7, 30, or 90 days (default 30).
dimension string optional country | device | referrer | language
brand_ulid string optional Optional brand scope.
code_ulid string optional Optional code scope.

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"data\":{\"scope_level\":\"organization\",\"range_days\":30,\"totals\":{\"scans\":1240,\"uniques\":890,\"unique_rate\":0.718},\"time_series\":[{\"date\":\"2026-06-07\",\"scans\":42},{\"date\":\"2026-06-08\",\"scans\":38}],\"dimension\":\"country\",\"dimension_label\":\"Country\",\"dimension_breakdown\":[{\"label\":\"DK\",\"scans\":520,\"uniques\":410},{\"label\":\"DE\",\"scans\":310,\"uniques\":240}],\"child_breakdown\":[{\"key\":\"01HXYZCODEULID000000000001\",\"label\":\"Launch 2026\",\"scans\":620,\"uniques\":480}]}}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "analytics_read",
        "arguments": {
            "range": "example",
            "dimension": "example",
            "brand_ulid": "01HXYZDOMAINULID0000000001",
            "code_ulid": "example"
        }
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "analytics_read",
        "arguments": {
            "range": "example",
            "dimension": "example",
            "brand_ulid": "01HXYZDOMAINULID0000000001",
            "code_ulid": "example"
        }
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "analytics_read",
        "arguments": {
            "range": "example",
            "dimension": "example",
            "brand_ulid": "01HXYZDOMAINULID0000000001",
            "code_ulid": "example"
        }
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "analytics_read",
        "arguments": {
            "range": "example",
            "dimension": "example",
            "brand_ulid": "01HXYZDOMAINULID0000000001",
            "code_ulid": "example"
        }
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"analytics_read","arguments":{"range":"example","dimension":"example","brand_ulid":"01HXYZDOMAINULID0000000001","code_ulid":"example"}}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

analytics_export

Export analytics payload with csv_rows (GET /v1/analytics/export).

REST mapping
GET /v1/analytics/export
Ability
analytics.export

Input schema

Field Type Required Description
range integer optional 7, 30, or 90 days (default 30).
dimension string optional country | device | referrer | language
brand_ulid string optional Optional brand scope.
code_ulid string optional Optional code scope.

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"data\":{\"scope_level\":\"organization\",\"range_days\":30,\"totals\":{\"scans\":1240,\"uniques\":890,\"unique_rate\":0.718},\"time_series\":[{\"date\":\"2026-06-07\",\"scans\":42},{\"date\":\"2026-06-08\",\"scans\":38}],\"dimension\":\"country\",\"dimension_label\":\"Country\",\"dimension_breakdown\":[{\"label\":\"DK\",\"scans\":520,\"uniques\":410},{\"label\":\"DE\",\"scans\":310,\"uniques\":240}],\"child_breakdown\":[{\"key\":\"01HXYZCODEULID000000000001\",\"label\":\"Launch 2026\",\"scans\":620,\"uniques\":480}],\"csv_rows\":[{\"date\":\"2026-06-07\",\"country\":\"DK\",\"scans\":42}]}}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "analytics_export",
        "arguments": {
            "range": "example",
            "dimension": "example",
            "brand_ulid": "01HXYZDOMAINULID0000000001",
            "code_ulid": "example"
        }
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "analytics_export",
        "arguments": {
            "range": "example",
            "dimension": "example",
            "brand_ulid": "01HXYZDOMAINULID0000000001",
            "code_ulid": "example"
        }
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "analytics_export",
        "arguments": {
            "range": "example",
            "dimension": "example",
            "brand_ulid": "01HXYZDOMAINULID0000000001",
            "code_ulid": "example"
        }
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "analytics_export",
        "arguments": {
            "range": "example",
            "dimension": "example",
            "brand_ulid": "01HXYZDOMAINULID0000000001",
            "code_ulid": "example"
        }
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"analytics_export","arguments":{"range":"example","dimension":"example","brand_ulid":"01HXYZDOMAINULID0000000001","code_ulid":"example"}}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

brands_list

List brands (GET /v1/brands).

REST mapping
GET /v1/brands
Ability
brands.view

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"data\":[{\"ulid\":\"01HXYZBRANDULID00000000001\",\"name\":\"Summer Campaign\",\"slug\":\"summer-campaign\",\"brand_kit\":{\"primary_color\":\"#0f3460\",\"secondary_color\":\"#e94560\"},\"settings\":{\"locale\":\"en\"},\"primary_domain\":{\"ulid\":\"01HXYZDOMAINULID0000000001\",\"host\":\"links.example.com\"},\"created_at\":\"2026-02-01T12:00:00+00:00\",\"updated_at\":\"2026-07-01T08:30:00+00:00\"}]}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "brands_list",
        "arguments": []
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "brands_list",
        "arguments": []
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "brands_list",
        "arguments": []
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "brands_list",
        "arguments": []
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"brands_list","arguments":[]}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

brands_create

Create a brand (POST /v1/brands).

REST mapping
POST /v1/brands
Ability
brands.manage

Input schema

Field Type Required Description
name string required Brand name.
slug string optional Optional alpha_dash slug.
brand_kit object optional Optional brand kit object.
settings object optional Optional settings object.
primary_domain_ulid string optional Optional primary domain ULID.

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"data\":{\"ulid\":\"01HXYZBRANDULID00000000001\",\"name\":\"Summer Campaign\",\"slug\":\"summer-campaign\",\"brand_kit\":{\"primary_color\":\"#0f3460\",\"secondary_color\":\"#e94560\"},\"settings\":{\"locale\":\"en\"},\"primary_domain\":{\"ulid\":\"01HXYZDOMAINULID0000000001\",\"host\":\"links.example.com\"},\"created_at\":\"2026-02-01T12:00:00+00:00\",\"updated_at\":\"2026-07-01T08:30:00+00:00\"}}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "brands_create",
        "arguments": {
            "name": "Automation token",
            "slug": "launch-2026",
            "brand_kit": {
                "primary_color": "#4f46e5"
            },
            "settings": {
                "locale": "en"
            },
            "primary_domain_ulid": "01HXYZDOMAINULID0000000001"
        }
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "brands_create",
        "arguments": {
            "name": "Automation token",
            "slug": "launch-2026",
            "brand_kit": {
                "primary_color": "#4f46e5"
            },
            "settings": {
                "locale": "en"
            },
            "primary_domain_ulid": "01HXYZDOMAINULID0000000001"
        }
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "brands_create",
        "arguments": {
            "name": "Automation token",
            "slug": "launch-2026",
            "brand_kit": {
                "primary_color": "#4f46e5"
            },
            "settings": {
                "locale": "en"
            },
            "primary_domain_ulid": "01HXYZDOMAINULID0000000001"
        }
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "brands_create",
        "arguments": {
            "name": "Automation token",
            "slug": "launch-2026",
            "brand_kit": {
                "primary_color": "#4f46e5"
            },
            "settings": {
                "locale": "en"
            },
            "primary_domain_ulid": "01HXYZDOMAINULID0000000001"
        }
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"brands_create","arguments":{"name":"Automation token","slug":"launch-2026","brand_kit":{"primary_color":"#4f46e5"},"settings":{"locale":"en"},"primary_domain_ulid":"01HXYZDOMAINULID0000000001"}}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

brands_update

Update a brand (PATCH /v1/brands/{brand_ulid}).

REST mapping
PATCH /v1/brands/{brand_ulid}
Ability
brands.manage

Input schema

Field Type Required Description
brand_ulid string required Brand ULID.
name string optional Brand name.
slug string optional Optional alpha_dash slug.
brand_kit object optional Optional brand kit object.
settings object optional Optional settings object.
primary_domain_ulid string optional Optional primary domain ULID.

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"data\":{\"ulid\":\"01HXYZBRANDULID00000000001\",\"name\":\"Summer Campaign\",\"slug\":\"summer-campaign\",\"brand_kit\":{\"primary_color\":\"#0f3460\",\"secondary_color\":\"#e94560\"},\"settings\":{\"locale\":\"en\"},\"primary_domain\":{\"ulid\":\"01HXYZDOMAINULID0000000001\",\"host\":\"links.example.com\"},\"created_at\":\"2026-02-01T12:00:00+00:00\",\"updated_at\":\"2026-07-01T08:30:00+00:00\"}}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "brands_update",
        "arguments": {
            "name": "Automation token",
            "slug": "launch-2026",
            "brand_kit": {
                "primary_color": "#4f46e5"
            },
            "settings": {
                "locale": "en"
            },
            "primary_domain_ulid": "01HXYZDOMAINULID0000000001"
        }
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "brands_update",
        "arguments": {
            "name": "Automation token",
            "slug": "launch-2026",
            "brand_kit": {
                "primary_color": "#4f46e5"
            },
            "settings": {
                "locale": "en"
            },
            "primary_domain_ulid": "01HXYZDOMAINULID0000000001"
        }
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "brands_update",
        "arguments": {
            "name": "Automation token",
            "slug": "launch-2026",
            "brand_kit": {
                "primary_color": "#4f46e5"
            },
            "settings": {
                "locale": "en"
            },
            "primary_domain_ulid": "01HXYZDOMAINULID0000000001"
        }
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "brands_update",
        "arguments": {
            "name": "Automation token",
            "slug": "launch-2026",
            "brand_kit": {
                "primary_color": "#4f46e5"
            },
            "settings": {
                "locale": "en"
            },
            "primary_domain_ulid": "01HXYZDOMAINULID0000000001"
        }
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"brands_update","arguments":{"name":"Automation token","slug":"launch-2026","brand_kit":{"primary_color":"#4f46e5"},"settings":{"locale":"en"},"primary_domain_ulid":"01HXYZDOMAINULID0000000001"}}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

domains_list

List domains (GET /v1/domains).

REST mapping
GET /v1/domains
Ability
domains.view

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"data\":[{\"ulid\":\"01HXYZDOMAINULID0000000001\",\"host\":\"links.example.com\",\"type\":\"custom\",\"status\":\"active\",\"ssl_status\":\"active\",\"is_primary\":true,\"is_shared\":false,\"verified_at\":\"2026-02-01T12:05:00+00:00\",\"verification\":{\"txt_record_name\":\"_qrhero-verify.links.example.com\",\"txt_record_value\":\"qrhero-verify=abc123\",\"cname_target\":\"qr.qrhero.link\"},\"created_at\":\"2026-02-01T12:00:00+00:00\",\"updated_at\":\"2026-07-01T08:30:00+00:00\"}]}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "domains_list",
        "arguments": []
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "domains_list",
        "arguments": []
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "domains_list",
        "arguments": []
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "domains_list",
        "arguments": []
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"domains_list","arguments":[]}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

domains_create

Add a custom domain (POST /v1/domains).

REST mapping
POST /v1/domains
Ability
domains.manage

Input schema

Field Type Required Description
host string required Hostname, e.g. links.example.com.
verify boolean optional Attempt immediate TXT verification.

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"data\":{\"ulid\":\"01HXYZDOMAINULID0000000001\",\"host\":\"links.example.com\",\"type\":\"custom\",\"status\":\"active\",\"ssl_status\":\"active\",\"is_primary\":true,\"is_shared\":false,\"verified_at\":\"2026-02-01T12:05:00+00:00\",\"verification\":{\"txt_record_name\":\"_qrhero-verify.links.example.com\",\"txt_record_value\":\"qrhero-verify=abc123\",\"cname_target\":\"qr.qrhero.link\"},\"created_at\":\"2026-02-01T12:00:00+00:00\",\"updated_at\":\"2026-07-01T08:30:00+00:00\"}}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "domains_create",
        "arguments": {
            "host": "links.example.com",
            "verify": true
        }
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "domains_create",
        "arguments": {
            "host": "links.example.com",
            "verify": true
        }
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "domains_create",
        "arguments": {
            "host": "links.example.com",
            "verify": true
        }
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "domains_create",
        "arguments": {
            "host": "links.example.com",
            "verify": true
        }
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"domains_create","arguments":{"host":"links.example.com","verify":true}}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

domains_update

Verify or update a domain (PATCH /v1/domains/{domain_ulid}).

REST mapping
PATCH /v1/domains/{domain_ulid}
Ability
domains.manage

Input schema

Field Type Required Description
domain_ulid string required Domain ULID.
verify boolean optional Re-check TXT ownership.
refresh_ssl boolean optional Refresh SSL status.
is_primary boolean optional Set as primary domain.

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"data\":{\"ulid\":\"01HXYZDOMAINULID0000000001\",\"host\":\"links.example.com\",\"type\":\"custom\",\"status\":\"active\",\"ssl_status\":\"active\",\"is_primary\":true,\"is_shared\":false,\"verified_at\":\"2026-02-01T12:05:00+00:00\",\"verification\":{\"txt_record_name\":\"_qrhero-verify.links.example.com\",\"txt_record_value\":\"qrhero-verify=abc123\",\"cname_target\":\"qr.qrhero.link\"},\"created_at\":\"2026-02-01T12:00:00+00:00\",\"updated_at\":\"2026-07-01T08:30:00+00:00\"}}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "domains_update",
        "arguments": {
            "verify": true,
            "refresh_ssl": true,
            "is_primary": true
        }
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "domains_update",
        "arguments": {
            "verify": true,
            "refresh_ssl": true,
            "is_primary": true
        }
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "domains_update",
        "arguments": {
            "verify": true,
            "refresh_ssl": true,
            "is_primary": true
        }
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "domains_update",
        "arguments": {
            "verify": true,
            "refresh_ssl": true,
            "is_primary": true
        }
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"domains_update","arguments":{"verify":true,"refresh_ssl":true,"is_primary":true}}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

codes_list

List QR codes (GET /v1/qr-codes).

REST mapping
GET /v1/qr-codes
Ability
codes.view

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"data\":[{\"ulid\":\"01HXYZCODEULID000000000001\",\"name\":\"Launch 2026\",\"slug\":\"acme-marketing/launch-2026\",\"type\":\"url\",\"status\":\"active\",\"public_url\":\"https://links.example.com/acme-marketing/launch-2026\",\"destination\":\"https://example.com/launch\",\"routing\":{\"rules\":[]},\"schedule\":{\"enabled\":false},\"password\":false,\"date_begin\":null,\"expire_at\":null,\"redirect_cap\":null,\"redirects_count\":142,\"utm_params\":null,\"device_routing\":null,\"language_routing\":null,\"tracking_pixels\":null,\"custom_js\":null,\"landing_config\":null,\"prelander_enabled\":false,\"prelander_seconds\":null,\"prelander_message\":null,\"brand\":{\"ulid\":\"01HXYZBRANDULID00000000001\",\"name\":\"Summer Campaign\"},\"domain\":{\"ulid\":\"01HXYZDOMAINULID0000000001\",\"host\":\"links.example.com\"},\"style\":{\"ulid\":\"01HXYZSTYLEULID00000000001\",\"name\":\"Brand default\"},\"created_at\":\"2026-03-01T09:00:00+00:00\",\"updated_at\":\"2026-07-01T08:30:00+00:00\"}]}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_list",
        "arguments": []
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_list",
        "arguments": []
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_list",
        "arguments": []
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_list",
        "arguments": []
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"codes_list","arguments":[]}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

codes_read

Read a QR code (GET /v1/qr-codes/{code_ulid}).

REST mapping
GET /v1/qr-codes/{code_ulid}
Ability
codes.view

Input schema

Field Type Required Description
code_ulid string required QR code ULID.

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"data\":{\"ulid\":\"01HXYZCODEULID000000000001\",\"name\":\"Launch 2026\",\"slug\":\"acme-marketing/launch-2026\",\"type\":\"url\",\"status\":\"active\",\"public_url\":\"https://links.example.com/acme-marketing/launch-2026\",\"destination\":\"https://example.com/launch\",\"routing\":{\"rules\":[]},\"schedule\":{\"enabled\":false},\"password\":false,\"date_begin\":null,\"expire_at\":null,\"redirect_cap\":null,\"redirects_count\":142,\"utm_params\":null,\"device_routing\":null,\"language_routing\":null,\"tracking_pixels\":null,\"custom_js\":null,\"landing_config\":null,\"prelander_enabled\":false,\"prelander_seconds\":null,\"prelander_message\":null,\"brand\":{\"ulid\":\"01HXYZBRANDULID00000000001\",\"name\":\"Summer Campaign\"},\"domain\":{\"ulid\":\"01HXYZDOMAINULID0000000001\",\"host\":\"links.example.com\"},\"style\":{\"ulid\":\"01HXYZSTYLEULID00000000001\",\"name\":\"Brand default\"},\"created_at\":\"2026-03-01T09:00:00+00:00\",\"updated_at\":\"2026-07-01T08:30:00+00:00\"}}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_read",
        "arguments": {
            "code_ulid": "01HXYZCODEULID000000000001"
        }
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_read",
        "arguments": {
            "code_ulid": "01HXYZCODEULID000000000001"
        }
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_read",
        "arguments": {
            "code_ulid": "01HXYZCODEULID000000000001"
        }
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_read",
        "arguments": {
            "code_ulid": "01HXYZCODEULID000000000001"
        }
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"codes_read","arguments":{"code_ulid":"01HXYZCODEULID000000000001"}}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

codes_create

Create a QR code (POST /v1/qr-codes).

REST mapping
POST /v1/qr-codes
Ability
codes.create

Input schema

Field Type Required Description
slug string required Individual slug (stored as org-slug/slug).
destination string required Redirect destination URL.
domain_ulid string required Domain ULID.
name string optional Optional display name.
brand_ulid string optional Optional brand ULID.
style_ulid string optional Optional style ULID.
type string optional Code type (default redirect).
status string optional Optional status.
routing object optional Optional routing rules.
schedule object optional Optional schedule object.
password string optional Optional password (plan-gated).
redirect_cap integer optional Optional redirect cap (plan-gated).

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"data\":{\"ulid\":\"01HXYZCODEULID000000000001\",\"name\":\"Launch 2026\",\"slug\":\"acme-marketing/launch-2026\",\"type\":\"url\",\"status\":\"active\",\"public_url\":\"https://links.example.com/acme-marketing/launch-2026\",\"destination\":\"https://example.com/launch\",\"routing\":{\"rules\":[]},\"schedule\":{\"enabled\":false},\"password\":false,\"date_begin\":null,\"expire_at\":null,\"redirect_cap\":null,\"redirects_count\":142,\"utm_params\":null,\"device_routing\":null,\"language_routing\":null,\"tracking_pixels\":null,\"custom_js\":null,\"landing_config\":null,\"prelander_enabled\":false,\"prelander_seconds\":null,\"prelander_message\":null,\"brand\":{\"ulid\":\"01HXYZBRANDULID00000000001\",\"name\":\"Summer Campaign\"},\"domain\":{\"ulid\":\"01HXYZDOMAINULID0000000001\",\"host\":\"links.example.com\"},\"style\":{\"ulid\":\"01HXYZSTYLEULID00000000001\",\"name\":\"Brand default\"},\"created_at\":\"2026-03-01T09:00:00+00:00\",\"updated_at\":\"2026-07-01T08:30:00+00:00\"}}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_create",
        "arguments": {
            "slug": "launch-2026",
            "destination": {
                "url": "https://example.com"
            },
            "domain_ulid": "01HXYZDOMAINULID0000000001",
            "name": "Automation token",
            "brand_ulid": "01HXYZDOMAINULID0000000001",
            "style_ulid": "01HXYZDOMAINULID0000000001",
            "redirect_cap": 100,
            "password": "example",
            "routing": {
                "rules": []
            },
            "schedule": {
                "enabled": false
            }
        }
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_create",
        "arguments": {
            "slug": "launch-2026",
            "destination": {
                "url": "https://example.com"
            },
            "domain_ulid": "01HXYZDOMAINULID0000000001",
            "name": "Automation token",
            "brand_ulid": "01HXYZDOMAINULID0000000001",
            "style_ulid": "01HXYZDOMAINULID0000000001",
            "redirect_cap": 100,
            "password": "example",
            "routing": {
                "rules": []
            },
            "schedule": {
                "enabled": false
            }
        }
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_create",
        "arguments": {
            "slug": "launch-2026",
            "destination": {
                "url": "https://example.com"
            },
            "domain_ulid": "01HXYZDOMAINULID0000000001",
            "name": "Automation token",
            "brand_ulid": "01HXYZDOMAINULID0000000001",
            "style_ulid": "01HXYZDOMAINULID0000000001",
            "redirect_cap": 100,
            "password": "example",
            "routing": {
                "rules": []
            },
            "schedule": {
                "enabled": false
            }
        }
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_create",
        "arguments": {
            "slug": "launch-2026",
            "destination": {
                "url": "https://example.com"
            },
            "domain_ulid": "01HXYZDOMAINULID0000000001",
            "name": "Automation token",
            "brand_ulid": "01HXYZDOMAINULID0000000001",
            "style_ulid": "01HXYZDOMAINULID0000000001",
            "redirect_cap": 100,
            "password": "example",
            "routing": {
                "rules": []
            },
            "schedule": {
                "enabled": false
            }
        }
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"codes_create","arguments":{"slug":"launch-2026","destination":{"url":"https://example.com"},"domain_ulid":"01HXYZDOMAINULID0000000001","name":"Automation token","brand_ulid":"01HXYZDOMAINULID0000000001","style_ulid":"01HXYZDOMAINULID0000000001","redirect_cap":100,"password":"example","routing":{"rules":[]},"schedule":{"enabled":false}}}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

codes_update

Update a QR code (PATCH /v1/qr-codes/{code_ulid}).

REST mapping
PATCH /v1/qr-codes/{code_ulid}
Ability
codes.update

Input schema

Field Type Required Description
code_ulid string required QR code ULID.
destination string optional Redirect destination URL.
status string optional Optional status.
name string optional Optional display name.
routing object optional Optional routing rules.
redirect_cap integer optional Optional redirect cap.

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"data\":{\"ulid\":\"01HXYZCODEULID000000000001\",\"name\":\"Launch 2026\",\"slug\":\"acme-marketing/launch-2026\",\"type\":\"url\",\"status\":\"active\",\"public_url\":\"https://links.example.com/acme-marketing/launch-2026\",\"destination\":\"https://example.com/launch\",\"routing\":{\"rules\":[]},\"schedule\":{\"enabled\":false},\"password\":false,\"date_begin\":null,\"expire_at\":null,\"redirect_cap\":null,\"redirects_count\":142,\"utm_params\":null,\"device_routing\":null,\"language_routing\":null,\"tracking_pixels\":null,\"custom_js\":null,\"landing_config\":null,\"prelander_enabled\":false,\"prelander_seconds\":null,\"prelander_message\":null,\"brand\":{\"ulid\":\"01HXYZBRANDULID00000000001\",\"name\":\"Summer Campaign\"},\"domain\":{\"ulid\":\"01HXYZDOMAINULID0000000001\",\"host\":\"links.example.com\"},\"style\":{\"ulid\":\"01HXYZSTYLEULID00000000001\",\"name\":\"Brand default\"},\"created_at\":\"2026-03-01T09:00:00+00:00\",\"updated_at\":\"2026-07-01T08:30:00+00:00\"}}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_update",
        "arguments": {
            "destination": {
                "url": "https://example.com"
            },
            "status": "active",
            "name": "Automation token",
            "redirect_cap": 100,
            "routing": {
                "rules": []
            }
        }
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_update",
        "arguments": {
            "destination": {
                "url": "https://example.com"
            },
            "status": "active",
            "name": "Automation token",
            "redirect_cap": 100,
            "routing": {
                "rules": []
            }
        }
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_update",
        "arguments": {
            "destination": {
                "url": "https://example.com"
            },
            "status": "active",
            "name": "Automation token",
            "redirect_cap": 100,
            "routing": {
                "rules": []
            }
        }
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_update",
        "arguments": {
            "destination": {
                "url": "https://example.com"
            },
            "status": "active",
            "name": "Automation token",
            "redirect_cap": 100,
            "routing": {
                "rules": []
            }
        }
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"codes_update","arguments":{"destination":{"url":"https://example.com"},"status":"active","name":"Automation token","redirect_cap":100,"routing":{"rules":[]}}}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

codes_delete

Confirm-then-execute Destructive

Soft-delete a QR code. Always requires a dry-run preview first; call again with confirm: true to execute.

REST mapping
DELETE /v1/qr-codes/{code_ulid}
Ability
codes.delete

Input schema

Field Type Required Description
code_ulid string required QR code ULID.
confirm boolean optional Set to true on the second call to execute after reviewing the preview.
confirmation_id string optional Confirmation id returned by the dry-run preview.

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "[]"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_delete",
        "arguments": []
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_delete",
        "arguments": []
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_delete",
        "arguments": []
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_delete",
        "arguments": []
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"codes_delete","arguments":[]}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

codes_bulk_create

Confirm-then-execute

Create multiple QR codes. Above the configured row threshold, returns a dry-run preview first; call again with confirm: true to execute. At or below the threshold, creates immediately.

REST mapping
POST /v1/qr-codes/bulk
Ability
codes.create

Input schema

Field Type Required Description
rows array required Array of row objects.
defaults object optional Optional defaults applied to each row.
confirm boolean optional Set to true on the second call to execute after reviewing the preview.
confirmation_id string optional Confirmation id returned by the dry-run preview.

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"data\":{\"ulid\":\"01HXYZIMPORTULID0000000001\",\"type\":\"qr_codes\",\"status\":\"staged\",\"source\":\"api\",\"awaiting_confirmation\":true,\"total_rows\":2,\"processed_rows\":0,\"success_count\":0,\"failed_count\":0,\"skipped_count\":0,\"valid_row_count\":2,\"progress_percent\":0,\"preview_errors\":[],\"error_message\":null,\"has_error_report\":false,\"confirmed_at\":null,\"completed_at\":null,\"created_at\":\"2026-07-01T10:00:00+00:00\",\"updated_at\":\"2026-07-01T10:00:00+00:00\"},\"meta\":{\"confirm_token\":\"CONFIRM_TOKEN_FROM_STAGE\"}}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_bulk_create",
        "arguments": []
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_bulk_create",
        "arguments": []
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_bulk_create",
        "arguments": []
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_bulk_create",
        "arguments": []
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"codes_bulk_create","arguments":[]}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

codes_bulk_read

Read bulk import status (GET /v1/qr-codes/bulk/{import_ulid}).

REST mapping
GET /v1/qr-codes/bulk/{import_ulid}
Ability
codes.view

Input schema

Field Type Required Description
import_ulid string required Bulk import ULID.

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"data\":{\"ulid\":\"01HXYZIMPORTULID0000000001\",\"type\":\"qr_codes\",\"status\":\"awaiting_confirmation\",\"source\":\"api\",\"awaiting_confirmation\":true,\"total_rows\":2,\"processed_rows\":0,\"success_count\":0,\"failed_count\":0,\"skipped_count\":0,\"valid_row_count\":2,\"progress_percent\":0,\"preview_errors\":[],\"error_message\":null,\"has_error_report\":false,\"confirmed_at\":null,\"completed_at\":null,\"created_at\":\"2026-07-01T10:00:00+00:00\",\"updated_at\":\"2026-07-01T10:00:00+00:00\"}}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_bulk_read",
        "arguments": {
            "import_ulid": "01HXYZIMPORTULID0000000001"
        }
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_bulk_read",
        "arguments": {
            "import_ulid": "01HXYZIMPORTULID0000000001"
        }
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_bulk_read",
        "arguments": {
            "import_ulid": "01HXYZIMPORTULID0000000001"
        }
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_bulk_read",
        "arguments": {
            "import_ulid": "01HXYZIMPORTULID0000000001"
        }
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"codes_bulk_read","arguments":{"import_ulid":"01HXYZIMPORTULID0000000001"}}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

codes_bulk_confirm

Confirm and execute bulk import (POST /v1/qr-codes/bulk/{import_ulid}/confirm).

REST mapping
POST /v1/qr-codes/bulk/{import_ulid}/confirm
Ability
codes.create

Input schema

Field Type Required Description
import_ulid string required Bulk import ULID.
confirm_token string required Token from codes_bulk_create response.

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"data\":{\"ulid\":\"01HXYZIMPORTULID0000000001\",\"type\":\"qr_codes\",\"status\":\"awaiting_confirmation\",\"source\":\"api\",\"awaiting_confirmation\":true,\"total_rows\":2,\"processed_rows\":0,\"success_count\":0,\"failed_count\":0,\"skipped_count\":0,\"valid_row_count\":2,\"progress_percent\":0,\"preview_errors\":[],\"error_message\":null,\"has_error_report\":false,\"confirmed_at\":null,\"completed_at\":null,\"created_at\":\"2026-07-01T10:00:00+00:00\",\"updated_at\":\"2026-07-01T10:00:00+00:00\"}}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_bulk_confirm",
        "arguments": {
            "confirm_token": "CONFIRM_TOKEN_FROM_STAGE"
        }
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_bulk_confirm",
        "arguments": {
            "confirm_token": "CONFIRM_TOKEN_FROM_STAGE"
        }
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_bulk_confirm",
        "arguments": {
            "confirm_token": "CONFIRM_TOKEN_FROM_STAGE"
        }
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_bulk_confirm",
        "arguments": {
            "confirm_token": "CONFIRM_TOKEN_FROM_STAGE"
        }
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"codes_bulk_confirm","arguments":{"confirm_token":"CONFIRM_TOKEN_FROM_STAGE"}}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

codes_bulk_update_status

Confirm-then-execute MCP-only

Change status on multiple QR codes. Always requires a dry-run preview first; call again with confirm: true to execute.

REST mapping
No REST route — MCP-only operation
Ability
codes.update

Input schema

Field Type Required Description
ulids array required ULIDs of the QR codes whose status should change.
status string required New status value (e.g. active, disabled_manual).
confirm boolean optional Set to true on the second call to execute after reviewing the preview.
confirmation_id string optional Confirmation id returned by the dry-run preview.

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"data\":{}}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_bulk_update_status",
        "arguments": {
            "ulids": [
                "01HXYZCODEULID000000000001",
                "01HXYZCODEULID000000000002"
            ],
            "status": "disabled_manual"
        }
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_bulk_update_status",
        "arguments": {
            "ulids": [
                "01HXYZCODEULID000000000001",
                "01HXYZCODEULID000000000002"
            ],
            "status": "disabled_manual"
        }
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_bulk_update_status",
        "arguments": {
            "ulids": [
                "01HXYZCODEULID000000000001",
                "01HXYZCODEULID000000000002"
            ],
            "status": "disabled_manual"
        }
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "codes_bulk_update_status",
        "arguments": {
            "ulids": [
                "01HXYZCODEULID000000000001",
                "01HXYZCODEULID000000000002"
            ],
            "status": "disabled_manual"
        }
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"codes_bulk_update_status","arguments":{"ulids":["01HXYZCODEULID000000000001","01HXYZCODEULID000000000002"],"status":"disabled_manual"}}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

styles_list

List QR styles (GET /v1/qr-styles).

REST mapping
GET /v1/qr-styles
Ability
styles.manage

Input schema

Field Type Required Description
brand_ulid string optional Optional brand filter.

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"data\":[{\"ulid\":\"01HXYZSTYLEULID00000000001\",\"name\":\"Brand default\",\"config\":{\"type\":\"square\",\"margin\":2},\"is_preset\":true,\"brand\":{\"ulid\":\"01HXYZBRANDULID00000000001\",\"name\":\"Summer Campaign\"},\"created_at\":\"2026-03-01T09:00:00+00:00\",\"updated_at\":\"2026-07-01T08:30:00+00:00\"}]}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "styles_list",
        "arguments": {
            "brand_ulid": "01HXYZDOMAINULID0000000001"
        }
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "styles_list",
        "arguments": {
            "brand_ulid": "01HXYZDOMAINULID0000000001"
        }
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "styles_list",
        "arguments": {
            "brand_ulid": "01HXYZDOMAINULID0000000001"
        }
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "styles_list",
        "arguments": {
            "brand_ulid": "01HXYZDOMAINULID0000000001"
        }
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"styles_list","arguments":{"brand_ulid":"01HXYZDOMAINULID0000000001"}}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

styles_create

Create a QR style preset (POST /v1/qr-styles).

REST mapping
POST /v1/qr-styles
Ability
styles.manage

Input schema

Field Type Required Description
name string required Style name.
config object required qr_styles.config object.
brand_ulid string optional Optional brand ULID.
is_preset boolean optional Mark as preset style.

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"data\":{\"ulid\":\"01HXYZSTYLEULID00000000001\",\"name\":\"Brand default\",\"config\":{\"type\":\"square\",\"margin\":2},\"is_preset\":true,\"brand\":{\"ulid\":\"01HXYZBRANDULID00000000001\",\"name\":\"Summer Campaign\"},\"created_at\":\"2026-03-01T09:00:00+00:00\",\"updated_at\":\"2026-07-01T08:30:00+00:00\"}}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "styles_create",
        "arguments": {
            "name": "Automation token",
            "config": {
                "type": "square",
                "margin": 2
            },
            "brand_ulid": "01HXYZDOMAINULID0000000001",
            "is_preset": true
        }
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "styles_create",
        "arguments": {
            "name": "Automation token",
            "config": {
                "type": "square",
                "margin": 2
            },
            "brand_ulid": "01HXYZDOMAINULID0000000001",
            "is_preset": true
        }
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "styles_create",
        "arguments": {
            "name": "Automation token",
            "config": {
                "type": "square",
                "margin": 2
            },
            "brand_ulid": "01HXYZDOMAINULID0000000001",
            "is_preset": true
        }
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "styles_create",
        "arguments": {
            "name": "Automation token",
            "config": {
                "type": "square",
                "margin": 2
            },
            "brand_ulid": "01HXYZDOMAINULID0000000001",
            "is_preset": true
        }
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"styles_create","arguments":{"name":"Automation token","config":{"type":"square","margin":2},"brand_ulid":"01HXYZDOMAINULID0000000001","is_preset":true}}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

tokens_abilities

List assignable token abilities (GET /v1/tokens/abilities).

REST mapping
GET /v1/tokens/abilities
Ability
api.tokens.manage

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"assignable\":[\"codes.view\",\"codes.create\",\"analytics.view\"],\"all\":[\"codes.view\",\"codes.create\",\"analytics.view\",\"mcp.access\"]}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "tokens_abilities",
        "arguments": []
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "tokens_abilities",
        "arguments": []
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "tokens_abilities",
        "arguments": []
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "tokens_abilities",
        "arguments": []
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"tokens_abilities","arguments":[]}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

tokens_list

List API tokens (GET /v1/tokens).

REST mapping
GET /v1/tokens
Ability
api.tokens.manage

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"data\":[{\"id\":42,\"name\":\"CI automation\",\"abilities\":[\"codes.view\",\"codes.create\",\"mcp.access\"],\"last_used_at\":\"2026-07-01T07:55:00+00:00\",\"expires_at\":\"2027-12-31T23:59:59+00:00\",\"created_at\":\"2026-01-15T10:00:00+00:00\"}]}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "tokens_list",
        "arguments": []
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "tokens_list",
        "arguments": []
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "tokens_list",
        "arguments": []
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "tokens_list",
        "arguments": []
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"tokens_list","arguments":[]}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

tokens_create

Create an API token (POST /v1/tokens). Returns plain-text secret once.

REST mapping
POST /v1/tokens
Ability
api.tokens.manage

Input schema

Field Type Required Description
name string required Token label.
abilities array optional Ability list (default ["*"]).
expires_at string optional Optional ISO8601 expiry datetime.

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "{\"token\":\"1|plainTextSecretShownOnce\",\"data\":{\"id\":42,\"name\":\"CI automation\",\"abilities\":[\"codes.view\",\"codes.create\",\"mcp.access\"],\"expires_at\":\"2027-12-31T23:59:59+00:00\"}}"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "tokens_create",
        "arguments": {
            "name": "Automation token",
            "abilities": [
                "codes.view",
                "codes.create"
            ],
            "expires_at": "2027-12-31T23:59:59Z"
        }
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "tokens_create",
        "arguments": {
            "name": "Automation token",
            "abilities": [
                "codes.view",
                "codes.create"
            ],
            "expires_at": "2027-12-31T23:59:59Z"
        }
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "tokens_create",
        "arguments": {
            "name": "Automation token",
            "abilities": [
                "codes.view",
                "codes.create"
            ],
            "expires_at": "2027-12-31T23:59:59Z"
        }
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "tokens_create",
        "arguments": {
            "name": "Automation token",
            "abilities": [
                "codes.view",
                "codes.create"
            ],
            "expires_at": "2027-12-31T23:59:59Z"
        }
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"tokens_create","arguments":{"name":"Automation token","abilities":["codes.view","codes.create"],"expires_at":"2027-12-31T23:59:59Z"}}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

tokens_revoke

Destructive

Revoke an API token (DELETE /v1/tokens/{token_id}).

REST mapping
DELETE /v1/tokens/{token_id}
Ability
api.tokens.manage

Input schema

Field Type Required Description
token_id integer required Personal access token id.

Example response

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "content": [
            {
                "type": "text",
                "text": "[]"
            }
        ],
        "isError": false
    }
}

Response schema

Field Type Required Description
jsonrpc string required
id integer required
result.content array<object> optional
result.isError boolean optional

Code samples

curl -sS -X POST "https://mcp.qrhero.com/mcp" \
  -H "Authorization: Bearer YOUR_QRHERO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "tokens_revoke",
        "arguments": []
    }
}'
const response = await fetch('https://mcp.qrhero.com/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "tokens_revoke",
        "arguments": []
    }
}),
});

const data = await response.json();
console.log(data);
import requests

url = 'https://mcp.qrhero.com/mcp'
headers = {
    'Authorization': 'Bearer YOUR_QRHERO_TOKEN',
    'Content-Type': 'application/json',
}
payload = {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "tokens_revoke",
        "arguments": []
    }
}

response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.json())
<?php

$client = new GuzzleHttp\Client();

$response = $client->post('https://mcp.qrhero.com/mcp', [
    'headers' => [
        'Authorization' => 'Bearer YOUR_QRHERO_TOKEN',
        'Content-Type' => 'application/json',
    ],
    'json' => {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
        "name": "tokens_revoke",
        "arguments": []
    }
},
]);

$data = json_decode($response->getBody()->getContents(), true);
print_r($data);
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "YOUR_QRHERO_TOKEN");

var content = new StringContent(
    '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"tokens_revoke","arguments":[]}}',
    Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://mcp.qrhero.com/mcp", content);
response.EnsureSuccessStatusCode();

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);