Skip to main content
Glama
ericyangpan

Scan QRCode MCP Server

by ericyangpan

Scan QRCode MCP Server

MCP server that decodes QR codes from either a data URL (base64) or an HTTP(S) image URL and returns the decoded text.

Features

  • Two precise tools for decoding:

    • decode_qrcode_data_url — accepts imageDataUrl

    • decode_qrcode_image_url — accepts imageUrl

  • Decodes common image formats (PNG, JPEG, etc.).

  • Deterministic behavior with clear errors for invalid inputs.

Related MCP server: mcp-qrcode

Getting Started

Configure this MCP server in your client using either npx (recommended) or the global binary.

Standard config (recommended, uses npx):

{
  "mcpServers": {
    "qrcode": {
      "command": "npx",
      "args": [
        "scan-qrcode-mcp@latest"
      ]
    }
  }
}

Alternative using the global binary (after npm i -g scan-qrcode-mcp):

{
  "mcpServers": {
    "qrcode": {
      "command": "scan-qrcode-mcp",
      "args": []
    }
  }
}

Follow the MCP install guide: https://modelcontextprotocol.io/quickstart/user Use the Standard config JSON above (name it qrcode).

Use the Claude Code CLI to add the QR MCP server:

claude mcp add qrcode npx scan-qrcode-mcp@latest

Follow: https://code.visualstudio.com/docs/copilot/chat/mcp-servers#_add-an-mcp-server Or install via VS Code CLI (npx example):

code --add-mcp '{"name":"qrcode","command":"npx","args":["scan-qrcode-mcp@latest"]}'

Edit ~/.codex/config.toml and add one of the following:

[mcp_servers.qrcode]
command = "npx"
args = ["scan-qrcode-mcp@latest"]

or, if you installed globally:

[mcp_servers.qrcode]
command = "scan-qrcode-mcp"

Settings -> MCP -> Add new MCP Server. Name: qrcode. Either use npx scan-qrcode-mcp@latest or the global binary.

Notes:

  • Requires Node.js 18.17+.

  • If using the global binary but scan-qrcode-mcp is not found, ensure your global npm bin is on PATH and restart the client.

Project Structure

src/
  server.ts
  services/
    qrcode-service.ts
  utils/
    data-url.ts
tests/
  services/
    qrcode.spec.ts

Scripts

  • npm i: Install dependencies.

  • npm run dev: Start MCP server in watch mode (stdio transport).

  • npm run build: Compile TypeScript to dist/.

  • npm start: Run compiled server from dist/.

  • npm test: Run unit tests with coverage (Vitest).

  • npm run lint / npm run format: Lint and format.

Usage

The server uses stdio transport and exposes two tools:

  • decode_qrcode_data_url

    • Input: { imageDataUrl: string }data:<mime>;base64,<data> URL for the QR image

  • decode_qrcode_image_url

    • Input: { imageUrl: string }http(s) URL to the QR image

Examples (pseudo-JSON-RPC over MCP):

Decode from data URL

{
  "method": "tools/call",
  "params": {
    "name": "decode_qrcode_data_url",
    "arguments": { "imageDataUrl": "data:image/png;base64,..." }
  }
}

Decode from image URL

{
  "method": "tools/call",
  "params": {
    "name": "decode_qrcode_image_url",
    "arguments": { "imageUrl": "https://example.com/qr.png" }
  }
}

Response text content contains the decoded string.

Configuration

  • Requires Node.js 18.17+ for built-in fetch.

  • No environment variables are required.

Security Notes

  • Only http(s) is allowed for imageUrl. Data URLs must be base64-encoded.

  • Do not pass untrusted remote URLs without appropriate allowlisting in your environment.

License

MIT

Available Tools

2 tools
decode_qrcode_data_urlC

Decode a QR code from a data URL (data:;base64,...)

ParametersJSON Schema
NameRequiredDescriptionDefault
imageDataUrlYesImage data URL (base64) of the QR image.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool decodes QR codes from data URLs but doesn't mention error handling, performance characteristics, or what happens with invalid inputs. For a tool with no annotation coverage, this leaves significant gaps in understanding its behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that directly states the tool's function and input format without unnecessary details. It is front-loaded and wastes no words, making it easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of annotations and output schema, the description is incomplete. It doesn't explain what the tool returns (e.g., decoded text, error messages) or address potential complexities like handling malformed data URLs. For a decoding tool with no structured output information, more context is needed to understand its full operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, with the single parameter 'imageDataUrl' well-documented in the schema. The description adds minimal value by reiterating the data URL format but doesn't provide additional context like examples or constraints beyond what the schema already specifies, meeting the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Decode a QR code') and the input source ('from a data URL'), making the purpose specific and understandable. However, it doesn't explicitly differentiate from its sibling tool 'decode_qrcode_image_url', which likely handles different input formats, leaving some ambiguity about when to choose one over the other.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, such as its sibling 'decode_qrcode_image_url'. It mentions the input format but doesn't specify scenarios where a data URL is appropriate or compare it to other decoding methods, leaving usage context unclear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

decode_qrcode_image_urlC

Decode a QR code from an HTTP(S) image URL

ParametersJSON Schema
NameRequiredDescriptionDefault
imageUrlYesHTTP(S) URL to the QR image.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the action 'decode' but does not describe what happens on failure (e.g., invalid URL, non-QR image), rate limits, authentication needs, or output format. For a tool with zero annotation coverage, this is a significant gap in transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that directly states the tool's purpose without any wasted words. It is appropriately sized and front-loaded, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (decoding QR codes from URLs) and lack of annotations and output schema, the description is incomplete. It does not explain what the tool returns (e.g., decoded text, error messages) or behavioral aspects like error handling. For a tool with no structured output or annotations, more context is needed to be fully helpful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, with the parameter 'imageUrl' fully documented in the schema as 'HTTP(S) URL to the QR image.' The description adds no additional meaning beyond this, such as format examples or constraints. With high schema coverage, the baseline score of 3 is appropriate as the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'decode' and the resource 'QR code from an HTTP(S) image URL', making the purpose specific and understandable. However, it does not explicitly differentiate from its sibling tool 'decode_qrcode_data_url', which likely handles data URLs instead of HTTP(S) URLs, so it misses full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus its sibling 'decode_qrcode_data_url' or other alternatives. It implies usage for HTTP(S) URLs but lacks explicit when/when-not instructions or prerequisites, leaving the agent to infer context without clear direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updates
    • First observeddecode_qrcode_data_url
    • First observeddecode_qrcode_image_url

TDQS

B3.2/5.0

Scored across 2 tools

Disambiguation5/5

The two tools have clearly distinct purposes: one decodes QR codes from data URLs, while the other decodes from HTTP(S) image URLs. There is no overlap or ambiguity between them, making it easy for an agent to select the correct tool based on the input source.

Naming Consistency5/5

Both tools follow a consistent verb_noun pattern with 'decode_qrcode_' as a prefix, followed by 'data_url' and 'image_url'. The naming is uniform and predictable, using snake_case throughout without any deviations.

Tool Count3/5

With only two tools, the server feels thin for a QR code decoding domain, as it might lack operations like encoding QR codes or handling local file inputs. However, the count is reasonable for a minimal decoding-focused server, though it borders on being too limited.

Completeness2/5

The server is severely incomplete for QR code operations, as it only provides decoding from two specific input types (data URLs and image URLs). There are significant gaps, such as no encoding tools, no support for local files, and no error handling or validation tools, which could lead to agent failures in broader use cases.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers