Skip to main content
Glama
klokain

paybysquare-generator

by klokain

PayBySquare Generator

A comprehensive Node.js/TypeScript library for PayBySquare QR codes: Generate, decode, and validate payment QR codes. PayBySquare is a Slovak national standard for payment QR codes adopted by the Slovak Banking Association (SBA).

npm version License: MIT

Features

Generation

  • ✅ Simple JSON-based API

  • ✅ Generates QR codes as PNG buffers or files

  • ✅ Supports all PayBySquare payment fields

  • ✅ Customizable QR code styling (size, colors, error correction)

Decoding

  • ✅ Decode PayBySquare QR codes from PNG buffers

  • ✅ Extract payment data back to JSON format

  • ✅ Round-trip verification (lossless encoding/decoding)

Compliance & Validation

  • ✅ IBAN checksum validation (mod-97 algorithm)

  • ✅ Field format compliance checking

  • ✅ Banking standards validation (BIC/SWIFT, currency codes)

  • ✅ Detailed compliance reports with error severity levels

Development

  • ✅ Full TypeScript support with type definitions

  • ✅ Zero UI dependencies - pure function-based API

  • ✅ ESM module format (Node.js >= 18)

  • ✅ Thoroughly tested (96 unit tests with 90%+ coverage)

  • MCP Server - Use with Claude Desktop and other MCP clients

Related MCP server: toreador-mcp-server

Breaking Changes

MCP Server v1.1.0 (January 2026)

⚠️ Breaking Change: generate_paybysquare tool now returns file paths instead of base64-encoded images

The MCP server's generate_paybysquare tool has been updated to save QR codes as files and return file paths instead of returning binary data as base64. This change provides better LLM context efficiency and makes generated QR codes persistent for later use.

Before (v1.0.0):

{
  "success": true,
  "imageBase64": "iVBORw0KGgoAAAANSUhEUg...",
  "size": 12345,
  "message": "QR code generated successfully"
}

After (v1.1.0):

{
  "success": true,
  "filePath": "/Users/username/paybysquare-qr-codes/paybysquare-1705331234567-a3f2.png",
  "fileName": "paybysquare-1705331234567-a3f2.png",
  "message": "QR code generated and saved successfully"
}

Migration:

  • QR codes are now saved to ~/paybysquare-qr-codes/ by default

  • Use the outputDirectory option to specify a custom save location

  • Access the generated file using the returned filePath

  • Note: The core library functions (generatePayBySquare, generatePayBySquareToFile) remain unchanged

Enhanced Documentation:

  • Tool descriptions now emphasize that beneficiaryName is REQUIRED

  • swift (BIC code) is now marked as RECOMMENDED for international payments

Benefits:

  • Reduced token usage (file paths vs. base64 data)

  • Better LLM context efficiency

  • Persistent QR codes for later reference

  • Easier integration with file-based workflows

Note: This change only affects the MCP server. The core Node.js/TypeScript library API remains fully backward compatible.

Installation

npm install paybysquare-generator

Requirements

  • Node.js >= 18.0.0

  • ESM module support

Quick Start

import { generatePayBySquare } from 'paybysquare-generator';

// Generate a payment QR code
const buffer = await generatePayBySquare({
  iban: 'SK9611000000002918599669',
  beneficiaryName: 'John Doe',
  amount: 100.50,
  currency: 'EUR',
  variableSymbol: '123456',
  paymentNote: 'Invoice payment'
});

// buffer is a PNG image as Buffer - save it, send it, etc.

API Reference

generatePayBySquare(input, options?)

Generates a PayBySquare QR code PNG from payment data.

Parameters:

  • input: PayBySquareInput - Payment data (see below)

  • options?: GenerationOptions - Optional QR code generation options

Returns: Promise<Buffer> - PNG image as a Node.js Buffer

Throws:

  • ValidationError - If input data is invalid

  • EncodingError - If payment data encoding fails

  • GenerationError - If QR code PNG generation fails

generatePayBySquareToFile(input, filePath, options?)

Generates a PayBySquare QR code and saves it to a file.

Parameters:

  • input: PayBySquareInput - Payment data

  • filePath: string - Path where to save the PNG file

  • options?: GenerationOptions - Optional QR code generation options

Returns: Promise<void>

decodePayBySquare(buffer)

Decodes a PayBySquare QR code from a PNG buffer back to payment data.

Parameters:

  • buffer: Buffer - PNG image buffer containing PayBySquare QR code

Returns: Promise<PayBySquareInput> - Decoded payment data

Throws:

  • DecodingError - If QR code cannot be read or decoded

Example:

import { readFile } from 'fs/promises';
import { decodePayBySquare } from 'paybysquare-generator';

const qrBuffer = await readFile('./payment-qr.png');
const paymentData = await decodePayBySquare(qrBuffer);

console.log(paymentData.iban, paymentData.amount);

isCompliant(input)

Simple pass/fail compliance check for payment data.

Parameters:

  • input: PayBySquareInput - Payment data to validate

Returns: boolean - true if fully compliant, false otherwise

Example:

import { isCompliant } from 'paybysquare-generator';

const isValid = isCompliant({
  iban: 'SK9611000000002918599669',
  beneficiaryName: 'Test'
});

console.log(isValid); // true or false

checkCompliance(input)

Detailed compliance report with errors, warnings, and severity levels.

Parameters:

  • input: PayBySquareInput - Payment data to validate

Returns: Promise<ComplianceResult> - Structured compliance report

Example:

import { checkCompliance } from 'paybysquare-generator';

const report = await checkCompliance(paymentData);

if (!report.isCompliant) {
  console.log('Errors:', report.errors);
  console.log('Warnings:', report.warnings);
  console.log('Details:', report.details);
}

ComplianceResult:

interface ComplianceResult {
  isCompliant: boolean;
  errors: ComplianceIssue[];     // Critical issues preventing payment
  warnings: ComplianceIssue[];   // Non-critical issues
  details: {
    ibanValid: boolean;
    fieldsValid: boolean;
    bankingStandardsValid: boolean;
    totalIssues: number;
  };
}

interface ComplianceIssue {
  type: 'error' | 'warning';
  field: string;
  message: string;
  severity: 'critical' | 'major' | 'minor';
}

checkQRCompliance(buffer)

Check compliance of a QR code directly from PNG buffer.

Parameters:

  • buffer: Buffer - PNG image buffer containing QR code

Returns: Promise<ComplianceResult> - Compliance report for decoded data

verifyRoundTrip(input)

Verify that payment data survives encoding and decoding without loss.

Parameters:

  • input: PayBySquareInput - Original payment data

Returns: Promise<RoundTripResult> - Round-trip verification result

Example:

import { verifyRoundTrip } from 'paybysquare-generator';

const result = await verifyRoundTrip(originalData);

if (!result.isLossless) {
  console.log('Data loss detected:', result.differences);
}

RoundTripResult:

interface RoundTripResult {
  isLossless: boolean;
  differences: FieldDifference[];
  input: PayBySquareInput;    // Original data
  decoded: PayBySquareInput;  // Data after encode/decode cycle
}

interface FieldDifference {
  field: string;
  original: any;
  decoded: any;
}

Input Data Format

PayBySquareInput

interface PayBySquareInput {
  // Required fields
  iban: string;                    // e.g., "SK9611000000002918599669"
  beneficiaryName: string;         // Recipient name (max 70 chars)

  // Optional payment details
  amount?: number;                 // Payment amount (positive number)
  currency?: string;               // ISO 4217 code (default: "EUR")
  variableSymbol?: string;         // 1-10 digits
  constantSymbol?: string;         // 1-4 digits
  specificSymbol?: string;         // 1-10 digits
  paymentNote?: string;            // Max 140 characters
  dueDate?: string;                // ISO format: "YYYY-MM-DD"
  swift?: string;                  // SWIFT/BIC code
  originatorReference?: string;    // Reference info

  // Optional beneficiary address
  beneficiaryAddress?: {
    street?: string;               // Max 70 characters
    city?: string;                 // Max 70 characters
  };
}

GenerationOptions

interface GenerationOptions {
  width?: number;                  // QR code width in pixels (default: 300)
  margin?: number;                 // Margin around QR code (default: 4)
  errorCorrectionLevel?: 'L' | 'M' | 'Q' | 'H';  // Default: 'M'
  color?: {
    dark?: string;                 // Dark color (default: '#000000')
    light?: string;                // Light color (default: '#ffffff')
  };
  removeAccents?: boolean;         // Remove diacritics (default: true)
}

Usage Examples

Minimal Payment

import { generatePayBySquare } from 'paybysquare-generator';
import { writeFile } from 'fs/promises';

const buffer = await generatePayBySquare({
  iban: 'SK9611000000002918599669',
  beneficiaryName: 'John Doe'
});

await writeFile('payment.png', buffer);

Complete Payment with All Fields

const buffer = await generatePayBySquare({
  iban: 'SK9611000000002918599669',
  beneficiaryName: 'Acme Corporation',
  amount: 150.50,
  currency: 'EUR',
  variableSymbol: '2026001',
  constantSymbol: '0308',
  paymentNote: 'Invoice #2026001',
  dueDate: '2026-02-15',
  swift: 'TATRSKBX',
  originatorReference: 'REF-2026-001',
  beneficiaryAddress: {
    street: 'Business Street 123',
    city: 'Bratislava 81108'
  }
});

Donation (No Fixed Amount)

// Amount can be omitted for voluntary donations
const buffer = await generatePayBySquare({
  iban: 'SK9611000000002918599669',
  beneficiaryName: 'Charity Organization',
  paymentNote: 'Voluntary donation'
});

Custom QR Code Styling

const buffer = await generatePayBySquare(
  {
    iban: 'SK9611000000002918599669',
    beneficiaryName: 'Shop Name',
    amount: 99.99
  },
  {
    width: 500,                    // Larger QR code
    margin: 2,                     // Smaller margin
    errorCorrectionLevel: 'H',     // High error correction
    color: {
      dark: '#1E40AF',             // Blue QR code
      light: '#FFFFFF'             // White background
    }
  }
);

Save Directly to File

import { generatePayBySquareToFile } from 'paybysquare-generator';

await generatePayBySquareToFile(
  {
    iban: 'SK9611000000002918599669',
    beneficiaryName: 'Recipient',
    amount: 25.00
  },
  './payment.png'
);

Error Handling

import {
  generatePayBySquare,
  ValidationError,
  EncodingError,
  GenerationError
} from 'paybysquare-generator';

try {
  const buffer = await generatePayBySquare({
    iban: 'INVALID',
    beneficiaryName: 'Test'
  });
} catch (error) {
  if (error instanceof ValidationError) {
    console.error('Invalid input:', error.message);
  } else if (error instanceof EncodingError) {
    console.error('Encoding failed:', error.message);
  } else if (error instanceof GenerationError) {
    console.error('QR generation failed:', error.message);
  }
}

Decoding QR Codes

import { decodePayBySquare } from 'paybysquare-generator';
import { readFile } from 'fs/promises';

// Read QR code from file
const qrBuffer = await readFile('./payment-qr.png');

// Decode payment data
const paymentData = await decodePayBySquare(qrBuffer);

console.log('IBAN:', paymentData.iban);
console.log('Beneficiary:', paymentData.beneficiaryName);
console.log('Amount:', paymentData.amount, paymentData.currency);
console.log('Variable Symbol:', paymentData.variableSymbol);

Simple Compliance Check

import { isCompliant } from 'paybysquare-generator';

const paymentData = {
  iban: 'SK9611000000002918599669',
  beneficiaryName: 'Test Merchant',
  amount: 100,
  currency: 'EUR'
};

if (isCompliant(paymentData)) {
  console.log('✓ Payment data is valid');
} else {
  console.log('✗ Payment data has issues');
}

Detailed Compliance Report

import { checkCompliance } from 'paybysquare-generator';

const paymentData = {
  iban: 'SK9999999999999999999999',  // Invalid checksum
  beneficiaryName: 'Test',
  amount: -50,  // Negative amount
  variableSymbol: 'ABC123',  // Should be digits only
  swift: 'INVALID'  // Invalid BIC format
};

const report = await checkCompliance(paymentData);

console.log('Compliant:', report.isCompliant);
console.log('\nErrors:');
report.errors.forEach(err => {
  console.log(`  [${err.severity}] ${err.field}: ${err.message}`);
});

console.log('\nValidation Details:');
console.log('  IBAN valid:', report.details.ibanValid);
console.log('  Fields valid:', report.details.fieldsValid);
console.log('  Banking standards valid:', report.details.bankingStandardsValid);
console.log('  Total issues:', report.details.totalIssues);

Round-Trip Verification

import { verifyRoundTrip } from 'paybysquare-generator';

const originalData = {
  iban: 'SK9611000000002918599669',
  beneficiaryName: 'Test Company',
  amount: 250.75,
  currency: 'EUR',
  variableSymbol: '123456',
  paymentNote: 'Testing round-trip'
};

const result = await verifyRoundTrip(originalData);

if (result.isLossless) {
  console.log('✓ Data perfectly preserved through encode/decode cycle!');
} else {
  console.log('✗ Data loss detected:');
  result.differences.forEach(diff => {
    console.log(`  ${diff.field}:`);
    console.log(`    Original: ${diff.original}`);
    console.log(`    Decoded:  ${diff.decoded}`);
  });
}

Validation Rules

The library performs comprehensive validation on all inputs:

  • IBAN: Required, must be valid format (2-letter country code + 2 digits + 11-30 alphanumeric)

  • Beneficiary Name: Required, max 70 characters

  • Amount: Optional, must be positive and finite when provided

  • Currency: Optional, must be 3-letter ISO 4217 code (default: EUR)

  • Variable Symbol: Optional, 1-10 digits only

  • Constant Symbol: Optional, 1-4 digits only

  • Specific Symbol: Optional, 1-10 digits only

  • Payment Note: Optional, max 140 characters

  • Due Date: Optional, must be ISO 8601 format (YYYY-MM-DD)

  • Address Fields: Optional, max 70 characters each

Running Examples

The repository includes comprehensive examples:

git clone https://github.com/yourusername/paybysquare-generator
cd paybysquare-generator
npm install
npm run example

This will generate several example QR codes demonstrating different use cases.

Running Tests

npm test              # Run tests once
npm run test:watch    # Run tests in watch mode
npm run test:coverage # Run tests with coverage report

Building from Source

npm run build         # Compile TypeScript to dist/

PayBySquare Standard

This library implements the PayBySquare standard version 1.1.0 as defined by the Slovak Banking Association (SBA). For more information:

Dependencies

Production

  • bysquare - Official PayBySquare encoder/decoder

  • qrcode - QR code PNG generator

  • jsqr - QR code scanner (pure JavaScript)

  • jimp - Image processing for QR code decoding

  • ibantools - IBAN validation with mod-97 checksum

TypeScript Support

This library is written in TypeScript and includes complete type definitions. All types are exported for your convenience:

import type {
  // Input/Output types
  PayBySquareInput,
  BeneficiaryAddress,
  GenerationOptions,

  // Compliance types
  ComplianceResult,
  ComplianceIssue,
  ComplianceDetails,
  RoundTripResult,
  FieldDifference
} from 'paybysquare-generator';

// Error classes are also exported
import {
  PayBySquareError,
  ValidationError,
  EncodingError,
  GenerationError,
  DecodingError
} from 'paybysquare-generator';

MCP Server

This library includes a Model Context Protocol (MCP) server that exposes all functionality to Claude and other MCP clients.

Available Tools

  • generate_paybysquare - Generate QR codes from payment data (saves to file, returns file path)

    • Required: beneficiaryName (recipient's full name)

    • Recommended: swift (BIC code for international transfers)

    • Optional: outputDirectory (custom save location, default: ~/paybysquare-qr-codes/)

  • decode_paybysquare - Decode QR codes to payment data (from base64-encoded PNG)

  • check_compliance - Validate payment data compliance with detailed error reports

  • verify_roundtrip - Verify lossless encoding/decoding (data integrity check)

Quick Setup

  1. Build the server:

    npm run build:mcp
  2. Configure Claude Desktop:

    Add to your claude_desktop_config.json:

    {
      "mcpServers": {
        "paybysquare": {
          "command": "node",
          "args": ["/absolute/path/to/paybysquare/dist/mcp-server/index.js"]
        }
      }
    }
  3. Restart Claude Desktop

Example Usage in Claude

Once configured, you can use natural language:

Generate a PayBySquare QR code for:
- IBAN: SK9611000000002918599669
- Beneficiary: John Doe
- Amount: 100.50 EUR
- SWIFT: TATRSKBX
- Payment note: Invoice #12345

Claude will generate the QR code and save it to a file, returning:

✓ QR code generated successfully!
File saved to: /Users/username/paybysquare-qr-codes/paybysquare-1705331234567-a3f2.png
Decode this PayBySquare QR code and tell me the payment details
[Attach image]
Check if this payment data is compliant with banking standards:
- IBAN: SK9611000000002918599669
- Beneficiary: Test Company
- Amount: 250 EUR
- SWIFT: TATRSKBX

Note: QR codes are automatically saved to ~/paybysquare-qr-codes/ by default. You can specify a custom directory using the outputDirectory option.

For detailed MCP server documentation, see mcp-server/README.md.

License

MIT

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Support

If you encounter any issues or have questions, please open an issue on GitHub.


Made with ❤️ for the Slovak developer community

Available Tools

4 tools
check_complianceA

Check payment data compliance with PayBySquare and banking standards. Returns detailed compliance report.

ParametersJSON Schema
NameRequiredDescriptionDefault
paymentYesPayment data to validate
detailedNoReturn detailed report (default: true)

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are present, so the description carries the full burden of behavioral disclosure. It does state that the tool returns a detailed compliance report, which is useful, but it does not mention side effects, authorization requirements, error behavior, or any constraints beyond the obvious check operation.

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 only two sentences with no filler. It front-loads the core action and scope, and the second sentence adds meaningful return-value information without redundancy.

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

Completeness3/5

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

For a validation tool, the description is adequate: it states the input, purpose, and return concept, and the nested payment schema is fully documented. However, with no output schema and no annotations, it would be stronger if it described the shape of the compliance report or what invalid results look like.

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?

Schema description coverage is 100%, so the baseline is 3. The description adds the PayBySquare and banking standards context, but it does not add parameter-specific guidance beyond what the schema already provides; the 'detailed' parameter's meaning and default are already documented in the schema.

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

Purpose5/5

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

The description uses a specific verb ('Check') and resource ('payment data compliance with PayBySquare and banking standards'), which clearly distinguishes it from sibling tools that generate, decode, or verify roundtrips. The first sentence alone lets an agent know what this tool does.

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

Usage Guidelines3/5

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

The purpose implies the tool should be used when payment data needs validation against PayBySquare and banking standards, but the description provides no explicit when-to-use or when-not-to-use guidance. It also does not name or contrast alternatives like generate_paybysquare or decode_paybysquare.

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

decode_paybysquareA

Decode a PayBySquare QR code from base64-encoded PNG image. Returns payment data.

ParametersJSON Schema
NameRequiredDescriptionDefault
imageBase64YesBase64-encoded PNG image containing PayBySquare QR code

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the disclosure burden. It clearly states the input format and that payment data is returned, but it does not explain error behavior, output structure, or any processing limitations. This is minimal but acceptable for a simple decoding tool.

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?

A single, front-loaded sentence conveys the action, input format, and result without filler. Every part earns its place.

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

Completeness3/5

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

The tool has one simple parameter and no output schema, so the description should clarify what 'payment data' contains for downstream use. The current phrase is functional but vague; an agent may not know what fields or format to expect from the decoded data.

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?

Schema description coverage is 100%, so the schema already documents imageBase64 adequately. The description's reference to 'base64-encoded PNG image' adds no meaning beyond what the parameter schema already provides.

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

Purpose5/5

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

Description states a specific verb ('Decode'), a clear resource ('PayBySquare QR code'), and the input format ('base64-encoded PNG image'). This distinguishes it from sibling generate_paybysquare, which creates rather than decodes.

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

Usage Guidelines3/5

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

Usage is implied by the verb and resource: the tool is for decoding a base64-encoded PayBySquare QR image. However, it does not explicitly mention alternatives like generate_paybysquare, check_compliance, or verify_roundtrip, nor does it say when not to use it.

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

generate_paybysquareA

Generate a PayBySquare QR code PNG image from payment data. REQUIRED: beneficiaryName (recipient's full name). RECOMMENDED: swift (BIC code for international transfers). Saves QR code to file and returns file path.

ParametersJSON Schema
NameRequiredDescriptionDefault
optionsNoQR code generation options
paymentYesPayment data

TDQS

A4/5.0
Behavior4/5

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

With no annotations present, the description carries the full disclosure burden. It explicitly discloses the main side effect—saving the QR code to a file—and the return behavior of providing a file path. It stops short of covering failure modes, overwrite behavior, or directory creation, so it is strong but not exhaustive.

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 concise and free of filler: it opens with the main action, then lists the required and recommended fields, then states the output behavior. Every sentence earns its place and the structure is easy for an agent to parse.

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

Completeness4/5

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

For a tool with a rich schema and no output schema, the description covers the essential guidance: what it generates, which fields matter most, and what it returns. Some gaps remain, such as not explicitly mentioning the required iban and not describing file-handling details, which prevents a perfect score.

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 input schema already documents all parameters and defaults at 100% coverage, so the baseline is 3. The description repeats the required beneficiaryName and recommended swift, but it does not add substantial new meaning beyond the schema, and it omits that iban is also required within the payment object.

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

Purpose5/5

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

The description states a specific verb and resource: generating a PayBySquare QR code PNG from payment data. This clearly distinguishes the tool from sibling tools such as decode_paybysquare, check_compliance, and verify_roundtrip, which serve different operations.

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

Usage Guidelines3/5

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

The description gives the core use case and highlights required and recommended fields, but it does not explicitly state when to select this tool over its siblings or when not to use it. Usage context is implied by the generation purpose rather than fully spelled out.

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

verify_roundtripB

Verify that payment data survives encoding/decoding without loss. Useful for testing data integrity.

ParametersJSON Schema
NameRequiredDescriptionDefault
paymentYesPayment data to verify

TDQS

B3.3/5.0
Behavior3/5

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

No annotations are present, so the description must carry the behavioral disclosure burden. It does reveal that the tool performs an encode/decode roundtrip and checks for data loss, which is meaningful. However, it gives no information about return values, success/failure signaling, side effects, or dependencies on the sibling tools.

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

Conciseness4/5

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

The description is concise and front-loaded with the core action. The second sentence adds a bit of context about the intended use, though it is somewhat generic and slightly redundant with the first sentence.

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?

With no output schema and no annotations, a verification tool should clarify what the caller receives on success or failure and how the verification is performed. The description only states intent, leaving the invocation contract under-specified for an agent to use confidently.

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?

Schema description coverage is 100% for the single 'payment' parameter, and the schema already describes it as 'Payment data to verify'. The tool description adds no parameter-specific meaning beyond the general roundtrip concept, so the schema carries the semantic weight.

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 states a specific action ('Verify') and a clear subject ('payment data survives encoding/decoding without loss'), which distinguishes it from the sibling generate/decode tools by emphasizing roundtrip integrity rather than encoding or decoding alone. However, it does not explicitly mention the generate-then-decode pipeline, so some disambiguation relies on the tool name.

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

Usage Guidelines3/5

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

The phrase 'Useful for testing data integrity' provides a clear general use case, implying when an agent might reach for this tool. However, it does not explicitly compare against generate_paybysquare, decode_paybysquare, or check_compliance, nor does it state when not to use this tool.

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. 4 tool updatesv1.0.0
    • First observedcheck_compliance
    • First observeddecode_paybysquare
    • First observedgenerate_paybysquare
    • First observedverify_roundtrip

TDQS

A4/5.0

Scored across 4 tools

Disambiguation5/5

Each tool has a clearly distinct role: generation, decoding, compliance checking, and roundtrip verification. No two tools appear to perform the same operation, and descriptions reinforce their separate purposes.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern: generate_paybysquare, decode_paybysquare, check_compliance, verify_roundtrip. The naming is predictable and readable.

Tool Count5/5

Four tools is well-scoped for a focused PayBySquare QR code utility. Each tool earns its place and there is no unnecessary bloat or sparse coverage.

Completeness5/5

The server covers the full core lifecycle for PayBySquare data: generate, decode, validate compliance, and confirm roundtrip integrity. No obvious missing operation is needed for the stated purpose.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables generation of QR codes from text or URLs in multiple formats (DataURL, SVG, terminal display) with customizable options like error correction, colors, and size. Supports batch processing of multiple QR codes and integrates seamlessly with MCP-compatible clients.
    4
    4
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to generate static Pix QR codes for Brazilian payments using natural language, with EMV 4.0 compliance and no external API required.
    2
    36 npm
    3
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Cloud-hosted MCP server that enables AI assistants to create, update, and manage QR codes on me-qr.com via OAuth, supporting types like URLs, Wi-Fi, vCards, PDFs, and images.
    MIT