# QR

QR and barcode toolkit for agents: encode text to staging PNG, decode from URL/base64, plus vCard, Wi-Fi, and EPC (SEPA) payment QR payloads. Encode/decode run off the event loop so web and other MCP tools stay responsive.

**Service id:** `qr`  
**Version:** `0.1.0`  
**Status:** `available`

## Authentication

MCP endpoint: `https://mcp.glc-rag.hu/mcp` (streamable HTTP)

**Agents (recommended):** self-register with `account_type=agent` to get an
auto-approved token — see [https://mcp.glc-rag.hu/guide/agent](https://mcp.glc-rag.hu/guide/agent).

Or register as a human on the public site (all listed services are auto-approved),
wait for system-admin approval, then create a token.

```http
Authorization: Bearer mcp_...
```

Cursor `mcp.json` example:

```json
{
  "mcpServers": {
    "qr": {
      "url": "https://mcp.glc-rag.hu/mcp",
      "headers": {
        "Authorization": "Bearer mcp_YOUR_TOKEN"
      }
    }
  }
}
```

## Tools

### `qr_create`

Encode text/URL into a QR PNG published to staging.

**Input schema:**

```json
{
  "type": "object",
  "properties": {
    "data": {
      "type": "string"
    },
    "error_correction": {
      "type": "string",
      "enum": [
        "L",
        "M",
        "Q",
        "H"
      ],
      "default": "M"
    },
    "box_size": {
      "type": "integer",
      "minimum": 1,
      "maximum": 40,
      "default": 8
    },
    "border": {
      "type": "integer",
      "minimum": 0,
      "maximum": 20,
      "default": 4
    },
    "fill": {
      "type": "string",
      "default": "#000000"
    },
    "back": {
      "type": "string",
      "default": "#ffffff"
    },
    "return_base64": {
      "type": "boolean",
      "default": false
    }
  },
  "required": [
    "data"
  ],
  "additionalProperties": false
}
```

**Examples:**

```json
{
  "data": "https://mcp.glc-rag.hu"
}
```

### `qr_read`

Decode QR codes from an image (URL or base64).

**Input schema:**

```json
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "Public/staging image URL"
    },
    "content_base64": {
      "type": "string",
      "description": "Small image base64"
    }
  },
  "additionalProperties": false
}
```

**Examples:**

```json
{
  "url": "https://mcp.glc-rag.hu/staging/EXAMPLE"
}
```

### `barcode_create`

Encode 1D barcode (code128/ean13/ean8/upc/isbn13/itf) to staging PNG.

**Input schema:**

```json
{
  "type": "object",
  "properties": {
    "data": {
      "type": "string"
    },
    "symbology": {
      "type": "string",
      "enum": [
        "code128",
        "ean13",
        "ean8",
        "upc",
        "isbn13",
        "itf"
      ],
      "default": "code128"
    },
    "write_text": {
      "type": "boolean",
      "default": true
    },
    "return_base64": {
      "type": "boolean",
      "default": false
    }
  },
  "required": [
    "data"
  ],
  "additionalProperties": false
}
```

**Examples:**

```json
{
  "data": "MCP-12345",
  "symbology": "code128"
}
```

### `barcode_read`

Decode 1D/QR barcodes from an image.

**Input schema:**

```json
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "Public/staging image URL"
    },
    "content_base64": {
      "type": "string",
      "description": "Small image base64"
    },
    "types_filter": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional zbar types: EAN13, CODE128, QRCODE, \u2026"
    }
  },
  "additionalProperties": false
}
```

**Examples:**

```json
{
  "url": "https://mcp.glc-rag.hu/staging/EXAMPLE"
}
```

### `vcard_qr_create`

Build a vCard 3.0 and encode it as a QR PNG.

**Input schema:**

```json
{
  "type": "object",
  "properties": {
    "full_name": {
      "type": "string"
    },
    "org": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "email": {
      "type": "string"
    },
    "phone": {
      "type": "string"
    },
    "url": {
      "type": "string"
    },
    "note": {
      "type": "string"
    },
    "address": {
      "type": "object",
      "properties": {
        "street": {
          "type": "string"
        },
        "city": {
          "type": "string"
        },
        "region": {
          "type": "string"
        },
        "postal": {
          "type": "string"
        },
        "country": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "error_correction": {
      "type": "string",
      "enum": [
        "L",
        "M",
        "Q",
        "H"
      ],
      "default": "M"
    },
    "box_size": {
      "type": "integer",
      "minimum": 1,
      "maximum": 40,
      "default": 8
    },
    "border": {
      "type": "integer",
      "minimum": 0,
      "maximum": 20,
      "default": 4
    },
    "fill": {
      "type": "string",
      "default": "#000000"
    },
    "back": {
      "type": "string",
      "default": "#ffffff"
    },
    "return_base64": {
      "type": "boolean",
      "default": false
    }
  },
  "required": [
    "full_name"
  ],
  "additionalProperties": false
}
```

**Examples:**

```json
{
  "full_name": "Kiss Anna",
  "email": "anna@example.com"
}
```

### `wifi_qr_create`

Build a WIFI: QR for network join (does not connect).

**Input schema:**

```json
{
  "type": "object",
  "properties": {
    "ssid": {
      "type": "string"
    },
    "password": {
      "type": "string"
    },
    "security": {
      "type": "string",
      "enum": [
        "WPA",
        "WEP",
        "nopass"
      ],
      "default": "WPA"
    },
    "hidden": {
      "type": "boolean",
      "default": false
    },
    "error_correction": {
      "type": "string",
      "enum": [
        "L",
        "M",
        "Q",
        "H"
      ],
      "default": "M"
    },
    "box_size": {
      "type": "integer",
      "minimum": 1,
      "maximum": 40,
      "default": 8
    },
    "border": {
      "type": "integer",
      "minimum": 0,
      "maximum": 20,
      "default": 4
    },
    "fill": {
      "type": "string",
      "default": "#000000"
    },
    "back": {
      "type": "string",
      "default": "#ffffff"
    },
    "return_base64": {
      "type": "boolean",
      "default": false
    }
  },
  "required": [
    "ssid"
  ],
  "additionalProperties": false
}
```

**Examples:**

```json
{
  "ssid": "Guest",
  "password": "secret",
  "security": "WPA"
}
```

### `payment_qr_create`

Build an EPC/SCT payment QR (EUR). Does not initiate a transfer.

**Input schema:**

```json
{
  "type": "object",
  "properties": {
    "profile": {
      "type": "string",
      "enum": [
        "epc"
      ],
      "default": "epc"
    },
    "iban": {
      "type": "string"
    },
    "name": {
      "type": "string",
      "description": "Beneficiary name"
    },
    "amount": {
      "type": "string",
      "description": "e.g. 12.34"
    },
    "currency": {
      "type": "string",
      "default": "EUR"
    },
    "remittance": {
      "type": "string"
    },
    "purpose": {
      "type": "string"
    },
    "bic": {
      "type": "string"
    },
    "error_correction": {
      "type": "string",
      "enum": [
        "L",
        "M",
        "Q",
        "H"
      ],
      "default": "M"
    },
    "box_size": {
      "type": "integer",
      "minimum": 1,
      "maximum": 40,
      "default": 8
    },
    "border": {
      "type": "integer",
      "minimum": 0,
      "maximum": 20,
      "default": 4
    },
    "fill": {
      "type": "string",
      "default": "#000000"
    },
    "back": {
      "type": "string",
      "default": "#ffffff"
    },
    "return_base64": {
      "type": "boolean",
      "default": false
    }
  },
  "required": [
    "iban",
    "name"
  ],
  "additionalProperties": false
}
```

**Examples:**

```json
{
  "profile": "epc",
  "iban": "DE89370400440532013000",
  "name": "Acme GmbH",
  "amount": "10.00",
  "remittance": "Invoice 42"
}
```

### `qr_status`

QR service health and limits.

**Input schema:**

```json
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
```

**Examples:**

```json
{}
```

## Usage notes

Create: qr_create / barcode_create / vcard_qr_create / wifi_qr_create / payment_qr_create → staging url. Read: upload image to staging then qr_read or barcode_read. payment_qr_create only builds EPC QR text — it does not send money. Credits apply per successful call; qr_status is free.

## Errors / limits

Invalid data/symbology, oversize input, missing libzbar, or busy semaphore → `{error, is_error}`. Empty decode → count=0 (still billed).

## Agent discovery

- Agent registration: `https://mcp.glc-rag.hu/guide/agent`
- Markdown: `https://mcp.glc-rag.hu/guide/qr.md`
- Index: `https://mcp.glc-rag.hu/llms.txt`
- MCP resource: `docs://qr`
