Skip to main content
Glama
Novigante

mcp-loyverse

by Novigante

mcp-loyverse

npm License: Apache-2.0 Node.js MCP

A local-first, read-only MCP server for the Loyverse POS API that lets AI assistants query receipts, items, employees, customers, stores, and sales analytics — built for secure local use with Personal Access Tokens.

What & Why

mcp-loyverse bridges the Model Context Protocol (MCP) and the Loyverse POS API so that AI assistants like Claude can answer business questions about your point-of-sale data directly:

  • "What were today's total sales?" — answered in a single tool call

  • "Which was the best-selling item this week?" — aggregated automatically

  • "Show me the top employees by sales this month" — with name resolution

Instead of the AI making dozens of paginated API calls, high-level analytics tools handle pagination, filtering, and aggregation internally, returning concise summaries that are token-efficient.

Related MCP server: toconline-mcp

Features

  • 15 MCP tools (1 system + 11 resource + 3 analytics)

  • Automatic pagination for analytics — no manual cursor handling

  • Date presetstoday, yesterday, this_week, this_month, last_7_days, last_30_days

  • Timezone-aware date resolution (configurable, defaults to UTC)

  • Read-only — only GET requests, no data modification

  • Secure — token never appears in logs or error messages

  • Structured logging to stderr with configurable log level

  • Retry logic — exponential backoff on 429 (rate limit), single retry on 5xx

  • Safety limits — max 10,000 receipts per analytics query, 90-day max date range

Requirements

Quick Start

No cloning or building required — just add the server to your MCP client:

Claude Code (CLI)

claude mcp add loyverse \
  -e LOYVERSE_API_TOKEN=your_personal_access_token_here \
  -e DEFAULT_TIMEZONE=America/Mexico_City \
  -- npx mcp-loyverse

Claude Desktop

Add to your config file:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "loyverse": {
      "command": "npx",
      "args": ["mcp-loyverse"],
      "env": {
        "LOYVERSE_API_TOKEN": "your_personal_access_token_here",
        "DEFAULT_TIMEZONE": "America/Mexico_City"
      }
    }
  }
}

Other MCP clients

Any MCP-compatible client that supports stdio transport can connect. Use the command npx mcp-loyverse with the environment variables listed in Configuration.

Install from source

If you prefer to run from a local clone:

git clone https://github.com/novigante/mcp-loyverse.git
cd mcp-loyverse
npm install
npm run build

Then use node /path/to/mcp-loyverse/dist/index.js instead of npx mcp-loyverse in the examples above.

Verify

Ask your AI assistant: "Run the healthcheck tool" — it should return server status and configuration info.

Configuration

Variable

Required

Default

Description

LOYVERSE_API_TOKEN

Yes

Loyverse Personal Access Token

LOYVERSE_BASE_URL

No

https://api.loyverse.com/v1.0

API base URL

DEFAULT_TIMEZONE

No

UTC

Timezone for date presets (e.g. America/Mexico_City)

LOG_LEVEL

No

info

Log verbosity: debug, info, warn, error

MCP_READ_ONLY

No

true

Read-only mode (always true in v0.1)

Available Tools

System

Tool

Description

healthcheck

Server status, version, and configuration check

Resource (CRUD read-only)

Tool

Description

Key Inputs

list_receipts

Search receipts by date, store, or receipt numbers

period, from/to, store_id, receipt_numbers

get_receipt

Get full receipt details

receipt_number

list_items

List catalog items

items_ids, limit, cursor

get_item

Get item details by ID

item_id

list_employees

List employees (staff, waiters, cashiers)

employee_ids, limit, cursor

get_employee

Get employee details by ID

employee_id

list_customers

List customers, optionally filter by email

customer_ids, email, limit, cursor

get_customer

Get customer details by ID

customer_id

list_stores

List all stores

store_ids, show_deleted

get_store

Get store details by ID

store_id

get_merchant

Get merchant profile and currency settings

(none)

Analytics (high-level, auto-paginated)

Tool

Description

Key Inputs

sales_summary

Revenue, receipt count, average ticket, taxes, tips

period, from/to, store_id

top_selling_items

Top items ranked by quantity or sales amount

period, metric, limit

top_employees_by_sales

Top employees by sales or receipt count (resolves names)

period, metric, limit

Example Prompts

  • "What were today's total sales?"

  • "Show me the top 5 best-selling items this week"

  • "Which employee had the highest sales this month?"

  • "List all receipts from yesterday"

  • "Get the details of receipt number R-1234"

  • "What was the average ticket amount this week?"

  • "What currency does the merchant use?"

Architecture

src/
  config/         Configuration (env validation, secrets, logger)
  loyverse/       HTTP client, API error handling, resource clients
  domain/         Analytics: pure aggregation functions, receipt collector
  tools/          MCP tool definitions and handlers
    _shared/      Date range helpers, pagination, result builders
  mcp/            MCP server setup and tool registry
  index.ts        Entry point (stdio transport)

Each tool exports { definition, handler }. The toolRegistry.ts wires definitions into the MCP server. Analytics tools compose the receipt collector (auto-pagination) with pure aggregation functions.

Security

  • Read-only — only HTTP GET requests to the Loyverse API

  • Token protection — the API token never appears in logs, error messages, or tool responses

  • Secret redaction — structured log data is automatically sanitized

  • Local-first — runs on your machine via stdio transport; no external server or network exposure

Limitations (v0.1)

  • Read-only — no creating, updating, or deleting resources

  • PAT only — no OAuth flow; requires a Personal Access Token

  • stdio only — no HTTP/SSE transport (designed for local MCP clients)

  • No caching — every tool call fetches fresh data from the API

  • Analytics limit — max 10,000 receipts per query; max 90-day date range

Roadmap

  • Publish to npm (npx mcp-loyverse)

  • Write tools (create/update items, customers)

  • OAuth 2.0 authentication flow

  • HTTP/SSE transport for remote deployment

  • Response caching with TTL

  • Webhook support for real-time updates

  • Inventory and stock level tools

Testing

Unit tests

npm test                   # 194 tests (Vitest)
npm run test:watch         # Watch mode
npx vitest run tests/tools/salesSummary.test.ts  # Single file

Integration tests

End-to-end tests that exercise all 15 tools against the live Loyverse API via the MCP protocol (stdio transport). Validates connectivity, resource reads, analytics, cross-data consistency, error handling, and pagination.

Prerequisites: a .env file with a valid LOYVERSE_API_TOKEN.

cp .env.example .env
# Edit .env — set your real LOYVERSE_API_TOKEN
npm run build
node tests/integration/run-integration.mjs

The script connects as an MCP client, runs 40 tests across 6 phases, and writes raw results to tests/integration/results.json.

Phase

Tests

What it validates

1. Connectivity

2

Healthcheck, merchant auth

2. Resources

13

List/get for all 6 entities, filters

3. Analytics

7

Sales summary, top items, top employees

4. Cross-validation

5

Data consistency between tools

5. Error handling

9

Invalid IDs, missing params, server stability

6. Pagination

4

Cursor-based pagination per resource

See docs/integration-test-plan.md for detailed validation criteria.

Contributing

  1. Fork the repository

  2. Create a feature branch (git checkout -b feature/my-feature)

  3. Write tests first (TDD) — npm test

  4. Implement your changes

  5. Run integration tests locally (requires your own LOYVERSE_API_TOKEN)

  6. Verify: npm run build && npm test && npm run lint

  7. Submit a pull request — CI must pass before merge

Releasing

Releases are published to npm automatically via GitHub Actions. Only repository maintainers can create releases.

  1. Merge all desired changes to main via PR

  2. Update the version in package.json (npm version patch|minor|major) and merge via PR

  3. Create a GitHub Release with tag vX.Y.Z matching package.json

  4. The workflow builds, tests, and publishes to npm with provenance

License

Apache-2.0

Available Tools

15 tools
get_customerB
Read-only

Get full details of a specific customer by their ID

ParametersJSON Schema
NameRequiredDescriptionDefault
customer_idYesThe customer UUID to look up

TDQS

B3.1/5.0
Behavior2/5

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

The readOnlyHint=true annotation already establishes this is a safe lookup. The description adds essentially nothing beyond that: no indication of what 'full details' contains, no behavior for a missing or malformed customer_id, and no pagination/return notes.

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 efficient sentence, front-loaded with the verb and resource, with no wasted words.

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 one-parameter read tool with no output schema, the description covers the essentials but omits what 'full details' actually returns and how not-found or invalid-ID cases behave. Adequate but with clear gaps.

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%, and the schema already documents customer_id as 'The customer UUID to look up' with minLength 1. The phrase 'by their ID' merely restates this, so baseline 3 applies.

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?

States a specific verb and resource ('Get ... a specific customer') plus the lookup key ('by their ID'). It is clearly distinct from the sibling list_customers, though it never explicitly names that alternative.

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?

No guidance on when to use this versus list_customers or the other get_* siblings, and no prerequisites or error conditions mentioned. Usage must be inferred from the name alone.

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

get_employeeC
Read-only

Get full details of a specific employee by their ID

ParametersJSON Schema
NameRequiredDescriptionDefault
employee_idYesThe employee UUID to look up

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, so the safe-read profile is covered elsewhere. Beyond that the description adds essentially nothing — no note on what 'full details' includes, whether the lookup errors on a missing ID, or any auth/pagination context.

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?

One short sentence with the resource and key front-loaded and no filler. It is appropriately sized, though it is so terse that it misses opportunities to add real value.

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 one-parameter read tool with annotations covering safety and no output schema, this is minimally adequate. The vague phrase 'full details' leaves the agent without any sense of the returned shape or error behavior, which the description could have supplied.

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 coverage is 100% and the single parameter is fully documented as an employee UUID in the schema. The description's 'by their ID' only restates the schema field, so the baseline 3 applies.

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?

States a specific verb (get) and resource (employee) plus the lookup key (ID), which is enough to separate it from list_employees and the other entity getters. It does not explicitly name a sibling or scope constraint, so it falls short of a 5.

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 gives no indication of when to prefer this over list_employees or the other get_* siblings, nor any prerequisites. It simply states what it does; usage must be inferred entirely from the name.

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

get_itemB
Read-only

Get full details of a specific item by its ID

ParametersJSON Schema
NameRequiredDescriptionDefault
item_idYesThe item UUID to look up

TDQS

B3.3/5.0
Behavior3/5

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

The readOnlyHint annotation already establishes that this is a safe, non-mutating read, so the description is not carrying the full behavioral burden. It adds the phrase 'full details', hinting at return completeness, but says nothing about lookup failure, permissions, or response shape.

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 with the resource first and the lookup key second; there is no filler to remove.

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 one-parameter read-only lookup this is close to sufficient, but with no output schema the promise of 'full details' is left undefined, and nothing tells the agent how a missing or invalid item ID is handled.

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 coverage is 100% and the item_id property is already documented as 'The item UUID to look up', so the schema does the heavy lifting. The description's 'by its ID' merely restates that one parameter without adding format or constraint detail.

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 gives a specific verb ('Get') and resource ('full details of a specific item') and states the lookup key ('by its ID'), which distinguishes it from the list_items sibling by implying single-record retrieval. It never names or contrasts with siblings, so differentiation is inferential rather than explicit.

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?

There is no when-to-use guidance and no alternative named. An agent must infer that this is the right call when it already holds an item ID, and that list_items is the path when it does not; nothing in the text states that.

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

get_merchantA
Read-only

Get merchant profile including business name and currency settings (code and decimal places)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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

readOnlyHint=true already declares this as a safe read, so the bar is lower. The description usefully names the returned fields, but says nothing about authentication needs, whether the merchant is inferred from context (no parameters), or failure 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?

A single tight sentence with the resource and returned fields front-loaded; no filler or redundancy.

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?

With no output schema, the description needs to convey the return shape, and it does list the key fields (business name, currency code, decimal places). It is adequate, though it does not state that these are the only fields or note any nested structure.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline of 4 applies. The description correctly implies no input is needed and instead describes what comes back.

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?

States a specific verb (Get) and resource (merchant) and enumerates the returned content (business name, currency code and decimal places). It is clearly distinguishable from the sibling get_employee/get_customer tools by resource, though it never explicitly contrasts itself with them.

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 implies usage as the merchant profile lookup, but gives no explicit when-to-use or when-not-to-use guidance. Since no sibling covers merchant settings, the intended usage is inferable but not stated.

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

get_receiptB
Read-only

Get full details of a specific receipt by its receipt number

ParametersJSON Schema
NameRequiredDescriptionDefault
receipt_numberYesThe receipt number to look up

TDQS

B3.4/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, so safety is covered by structured data. The description adds only 'full details', with no mention of what is returned, whether a missing receipt errors, or any auth/rate-limit context — minimal value beyond the annotation.

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?

One sentence, zero waste, front-loaded with the verb and resource. Nothing could be removed without losing information.

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 trivial single-parameter read with 100% schema coverage and a readOnlyHint annotation, plus no output schema to explain, the description is essentially sufficient. Only the meaning of 'full details' relative to the list response is left unstated.

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 coverage is 100% and the single parameter is fully documented in the schema, so baseline is 3. The description's 'by its receipt number' merely restates the parameter's role without adding format, example, or validation detail.

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?

States a specific verb (get), resource (receipt), and scope (full details of a specific receipt), with the singular form implicitly contrasting with the sibling list_receipts. It does not explicitly name or differentiate from siblings, which keeps it short of a 5.

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 'by its receipt number' — the agent can infer this is the lookup path once an identifier is known and that list_receipts is the discovery path. No explicit when-to-use or when-not-to-use statement is provided.

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

get_storeB
Read-only

Get full details of a specific store by its ID

ParametersJSON Schema
NameRequiredDescriptionDefault
store_idYesThe store UUID to look up

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered by structured data. The description adds the retrieval scope ('full details of a specific store') but nothing about return format, pagination, or error behavior when the ID does not exist.

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?

A single efficient sentence with the resource and lookup key front-loaded. No wasted words, though it is perhaps minimally under-specified rather than tightly optimized.

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 simple single-param read tool with annotations covering safety, this is adequate. No output schema exists, but the description does not need to detail returns; still, it could note what 'full details' encompasses or the not-found case given no output schema.

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 coverage is 100% and the single parameter is fully documented as 'The store UUID to look up'. The description adds no syntax or format detail beyond what the schema provides, so baseline 3 applies.

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?

States a specific verb and resource ('Get full details of a specific store by its ID'). Clear and unambiguous, but does not differentiate from the sibling 'list_stores' or explain what 'full details' includes versus the list variant.

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 'by its ID' implies usage when you have a store_id, and the sibling list_stores implies the alternative for browsing all stores. But no explicit when-to-use/when-not guidance or named alternative is provided.

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

healthcheckB
Read-only

Check server status and configuration

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior3/5

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

readOnlyHint=true already tells the agent this is a safe, non-mutating call. The description only adds that both 'status' and 'configuration' are covered, without noting auth requirements, latency, or failure semantics — modest added value over the annotation.

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?

A single short sentence with no filler, and the purpose is front-loaded. It is terse to the point of being slightly under-specified, but nothing is wasted.

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?

With no output schema, the description carries the burden of explaining what 'status and configuration' means in return terms, and it does not — no mention of response shape, failure reporting, or which configuration is inspected. For a diagnostic tool this is a real but minor gap.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to explain beyond what the schema provides; the baseline for a parameterless tool applies.

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 gives a specific verb ('Check') and resource ('server status and configuration'), so the agent knows exactly what the tool does. It does not name or contrast with any sibling, but the siblings are all business-domain data tools (employees, receipts, items), so the distinction is obvious from the domain alone.

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?

There is no statement of when to invoke this tool versus alternatives, nor any prerequisite or diagnostic-triggering context. The agent must infer that this is a connectivity/diagnostic probe from the name and description alone.

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

list_customersA
Read-only

List customers. Filter by IDs or email. Returns customer profiles with visit history and spending totals.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailNoFilter by exact email address
limitNoResults per page (1-250)
cursorNoPagination cursor from previous response
customer_idsNoComma-separated customer UUIDs to filter

TDQS

A3.8/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, so the description usefully adds that results are customer profiles enriched with visit history and spending totals. It still omits pagination behavior and result-size expectations, but it goes meaningfully beyond the safety hint.

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?

Three tight sentences with the core action front-loaded and no redundant filler; every clause carries distinct information.

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?

With no output schema, the description steps in to summarize the return payload (profiles, visit history, spending totals) and the filter options, which is sufficient for a read-only list tool. Slightly more on pagination or empty-result behavior would make it fully complete.

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 all four parameters are already documented with formats and bounds (1-250, UUID lists, cursor). The description's mention of ID/email filtering merely echoes the schema without adding syntax or constraint detail, making the baseline 3 appropriate.

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?

States a specific verb and resource ('List customers') and identifies the supported filters. However, it never distinguishes itself from the sibling get_customer, leaving the agent to infer the list-vs-single split from names alone.

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?

'Filter by IDs or email' implies the filtering use case, but there is no explicit statement of when to call this instead of get_customer or list_receipts, nor any prerequisite or exclusion guidance.

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

list_employeesA
Read-only

List employees (waiters, cashiers, staff). Use to resolve employee names from IDs found in receipts.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoResults per page (1-250)
cursorNoPagination cursor from previous response
employee_idsNoComma-separated employee UUIDs to filter

TDQS

A3.8/5.0
Behavior3/5

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

readOnlyHint=true already establishes this is a safe read. The description adds that results map IDs to names, which hints at return content, but says nothing about pagination behavior, default page size, or whether the employee_ids filter is required. With annotations covering safety, this is modest added value.

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?

Two short sentences, zero filler. The resource is named first and the use case follows immediately.

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 simple read-only list tool with full schema documentation and no output schema, the description covers purpose and the motivating use case. The only gap is pagination/cursor behavior, which is minor given the schema already describes the cursor parameter.

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%, and the parameters (limit, cursor, employee_ids) are self-documented with defaults, bounds, and format hints. The description adds no parameter-level detail (e.g., that employee_ids expects UUIDs from receipts), so baseline 3 applies.

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?

States a specific verb and resource ('List employees') and even enumerates what counts as an employee (waiters, cashiers, staff), which is useful domain context. It does not explicitly contrast itself with the sibling get_employee, but the 'list' framing makes the bulk-vs-single distinction reasonably clear.

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

Usage Guidelines4/5

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

Gives a concrete trigger: 'Use to resolve employee names from IDs found in receipts,' which tells the agent exactly when this tool is the right call. It stops short of naming the alternative (get_employee) for single-record lookups or stating when not to use it, so it is clear context without exclusions.

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

list_itemsA
Read-only

List items from the catalog. Useful to look up item names, prices, SKUs, and categories.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoResults per page (1-250)
cursorNoPagination cursor from previous response
items_idsNoComma-separated item UUIDs to filter
show_deletedNoInclude soft-deleted items (default false)

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds the returned-field context (names, prices, SKUs, categories) but says nothing about pagination behavior, the cursor/limit mechanics, or the soft-delete default that an agent needs to reason about results.

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?

Two short sentences, front-loaded with the action and resource, with no filler. Efficient, though the second sentence is more of a field inventory than actionable guidance.

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 read-only list tool with a fully-described schema and no output schema, the description is adequate: it names the resource and the fields surfaced. It is only missing a note on pagination and deletion filtering, which the schema partly covers.

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 all four parameters (limit, cursor, items_ids, show_deleted) are already documented in the schema with defaults and bounds. The description adds no parameter-level detail, so the baseline 3 applies.

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?

Clear verb+resource ("List items from the catalog") that an agent can distinguish from the singular get_item sibling by the list/get prefix. The second sentence clarifies the fields exposed, but there is no explicit differentiation from list-oriented siblings like list_receipts or list_stores beyond the resource noun.

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?

"Useful to look up item names, prices, SKUs, and categories" implies a usage context but never states when to prefer this over get_item or how it relates to siblings. No exclusions or prerequisites are given.

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

list_receiptsA
Read-only

Search receipts (tickets) by date range, store, or receipt numbers. Returns receipt summaries with totals, line items, and payment info. Use date presets (today, yesterday, this_week, this_month) or explicit from/to range.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date (ISO 8601) for explicit date range
fromNoStart date (ISO 8601) for explicit date range
limitNoResults per page (1-250)
cursorNoPagination cursor from previous response
periodNoDate preset for filtering receipts
store_idNoFilter by store UUID
receipt_numbersNoComma-separated receipt numbers to look up

TDQS

A3.9/5.0
Behavior4/5

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

With readOnlyHint already declaring a safe read, the description adds return-shape context (summaries with totals, line items, payment info), which is real value absent an output schema. It does not disclose pagination behavior or the default/limit semantics, so it stops short of full transparency.

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?

Three tight sentences with the purpose front-loaded, filters second, and the how-to-use hint last. Each sentence carries weight, though the receipt/ticket parenthetical and the returns clause could be marginally tightened.

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 7-parameter, zero-required list tool with no output schema, the description covers what it does, what comes back, and the date-filtering modes. The notable gap is pagination behavior despite cursor/limit parameters, but otherwise an agent has enough to invoke it correctly.

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 every parameter (period, from, to, store_id, receipt_numbers, limit, cursor) is already documented in the schema. The description names the date-filter styles but adds no format, precedence, or interaction detail beyond what the schema provides, so the baseline of 3 applies.

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?

States a specific verb (search/list) and resource (receipts, clarified as tickets) plus the filter axes available. An agent can distinguish it from get_receipt (single lookup) and other list_* siblings without opening the schema.

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 last sentence tells the agent how to use the date filters (presets vs explicit from/to), which is genuine usage guidance. However, it never states when to choose this tool over get_receipt for a known receipt, nor any prerequisites or exclusions, leaving the core routing decision implied.

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

list_storesB
Read-only

List all stores. The stores endpoint does not support pagination — all stores are returned at once.

ParametersJSON Schema
NameRequiredDescriptionDefault
store_idsNoComma-separated store UUIDs to filter
show_deletedNoInclude soft-deleted stores (default false)

TDQS

B3.3/5.0
Behavior3/5

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

Annotations declare readOnlyHint=true, so the safety profile is clear. The description adds a useful behavioral trait: the endpoint does not support pagination and returns all stores at once. However, it does not mention other traits like default filtering behavior or rate limits, so with annotations already covering the mutation hint, this is moderately transparent.

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?

Two concise sentences that are front-loaded with the primary action and immediately follow with critical implementation detail. No extraneous information.

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 simple list tool with full schema coverage for two optional parameters and no output schema, the description covers the operation and a key behavioral note (no pagination). However, it lacks guidance on filtering behavior or when to use filters, which would be helpful given the sibling tools.

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 parameter meanings are fully documented in the schema. The description does not add any parameter-level details, but since the schema already handles this, the baseline score of 3 is appropriate.

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?

States a specific verb ('List') and resource ('stores'), making the operation clear. It does not explicitly differentiate from the sibling 'get_store' (single store retrieval), but the plural 'stores' and 'List all' imply bulk listing, which is a reasonable distinction.

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?

No guidance is provided on when to use this tool versus alternatives like 'get_store' (single store) or when to filter using 'store_ids' or 'show_deleted'. The description only states what the tool does, not when it is appropriate.

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

sales_summaryA
Read-only

Get a sales summary for a given period: total revenue, receipt count, average ticket, discounts, taxes, and tips. Use presets (today, yesterday, this_week, this_month) or explicit date range.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date (ISO 8601) for explicit date range
fromNoStart date (ISO 8601) for explicit date range
periodNoDate preset for the summary period
store_idNoFilter by store UUID

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. Beyond that, the description discloses the aggregate fields returned, which is useful since there is no output schema, but it omits behavioral details such as whether period and from/to are mutually exclusive or which wins on conflict.

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?

Two tight sentences with the return payload front-loaded and the input mechanism second. No filler or redundancy.

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?

With no output schema, the description usefully enumerates the metrics returned, and the readOnly annotation covers safety. The remaining gap is the undocumented interaction between the period preset and the explicit from/to range, which an agent must guess at.

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 all four parameters, making 3 the baseline. The description only restates the preset-vs-date-range distinction and lists four of the six enum presets, adding little beyond the schema.

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?

States a specific verb and resource ('Get a sales summary') and enumerates the exact metrics returned (revenue, receipt count, average ticket, discounts, taxes, tips), which distinguishes it from list-oriented siblings. It does not, however, explicitly contrast itself with related siblings like top_selling_items or list_receipts.

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 sentence 'Use presets ... or explicit date range' gives parameter-usage direction, implicitly signaling this tool is for aggregate reporting over a period. There is no explicit when-to-use vs alternatives guidance and no mention of precedence when both period and from/to are supplied.

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

top_employees_by_salesA
Read-only

Get the top employees (waiters/cashiers) by sales amount or receipt count. Answers: Which waiter sold the most this month?

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date (ISO 8601) for explicit date range
fromNoStart date (ISO 8601) for explicit date range
limitNoNumber of top employees to return (1-50)
metricNoRanking metric: by total sales amount or by number of receiptssales_amount
periodNoDate preset for the period
store_idNoFilter by store UUID

TDQS

A4/5.0
Behavior3/5

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

readOnlyHint=true already tells the agent this is a safe read. The description adds the ranking semantics (by amount or receipt count) but says nothing about ordering direction, ties, or whether the returned list is truncated — minor additions over the annotation baseline.

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?

Two compact sentences, front-loaded with purpose and followed by a concrete usage example. No filler, every clause earns its place.

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 read-only ranking query with no output schema, the description conveys intent, subject, and metric options adequately. It stops short of describing the response shape or how period interacts with from/to, but nothing critical for correct invocation is missing.

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%, including enum values, defaults, and the limit range, so the schema carries the full parameter burden. The description restates the two metric options but adds no syntax or interaction detail (e.g., period vs from/to precedence), so baseline 3 is correct.

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?

States a specific verb (Get) and resource (top employees by sales amount or receipt count), and the parenthetical '(waiters/cashiers)' clarifies what 'employee' means in this domain. The ranking metric alternatives in the sentence also distinguish it from sibling top_selling_items without naming it directly.

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

Usage Guidelines4/5

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

The sample question 'Which waiter sold the most this month?' pins down the intended analytical use case clearly. However, it gives no explicit guidance on when to prefer this over sales_summary or how to combine period vs from/to, so there's context but no exclusions or alternatives.

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

top_selling_itemsA
Read-only

Get the top-selling items for a period, ranked by quantity sold or by sales amount. Answers: What was the best-selling dish today?

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date (ISO 8601) for explicit date range
fromNoStart date (ISO 8601) for explicit date range
limitNoNumber of top items to return (1-50)
metricNoRanking metric: by quantity sold or by sales amountquantity
periodNoDate preset for the period
store_idNoFilter by store UUID

TDQS

A3.7/5.0
Behavior3/5

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

readOnlyHint=true already establishes this is a safe read, so the description only needs to add behavioral context. It discloses the ranking dimension, which is useful, but says nothing about how period interacts with from/to (mutually exclusive? precedence?), what happens when no date parameters are supplied despite zero required params, or the default period 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?

Two sentences, front-loaded with the core action and ranking modes, followed by a one-line example that grounds the use case. No redundant or filler text.

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 six-parameter, zero-required tool with no output schema, the description omits the most consequential behavioral detail: how period and the explicit from/to range combine, and what the tool returns when the caller supplies neither. Adequate but with a clear gap.

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 all six parameters are self-documenting; the baseline of 3 applies. The description's ranking clause only restates the metric enum values and adds no syntax or interplay detail beyond 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?

States a specific verb and resource ('Get the top-selling items'), plus the two ranking modes ('by quantity sold or by sales amount'). The resource is clearly distinct from the sibling top_employees_by_sales, and the example question ('What was the best-selling dish today?') pins the intent without opening a schema.

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 question-style example ('What was the best-selling dish today?') implies the intended usage scenario, but there is no explicit when-to-use guidance, no mention of when this is preferable to sales_summary, and no exclusions or prerequisites.

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. 15 tool updatesv0.1.1
    • First observedget_customer
    • First observedget_employee
    • First observedget_item
    • First observedget_merchant
    • First observedget_receipt
    • First observedget_store
    • First observedhealthcheck
    • First observedlist_customers
    • First observedlist_employees
    • First observedlist_items
    • First observedlist_receipts
    • First observedlist_stores
    • First observedsales_summary
    • First observedtop_employees_by_sales
    • First observedtop_selling_items

TDQS

A3.7/5.0

Scored across 15 tools

Disambiguation5/5

Each core entity (employees, receipts, items, customers, stores) has a clearly distinct list vs. get pair. Analytics tools such as sales_summary, top_selling_items, and top_employees_by_sales target different questions and do not overlap with the catalog or receipt lookup tools.

Naming Consistency4/5

The set predominantly follows a consistent snake_case verb_noun convention, e.g. list_employees, get_receipt, top_selling_items. The main deviation is healthcheck, which would be more consistent as health_check, but it is a minor and readable exception.

Tool Count5/5

With 15 tools, the server is comfortably scoped for a POS data and reporting integration. Each major entity gets list/get coverage, while analytics and healthcheck add clear value without bloating the surface.

Completeness4/5

The tool set covers list/get access for employees, receipts, items, customers, stores, and merchant profile, plus useful sales and ranking analytics. It lacks create/update/delete operations, but for a read-only reporting MCP server the surface is nearly complete.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A read-only MCP server that enables restaurant staff to query Veloce POS data using natural language, supporting sales summaries, payment breakdowns, and weekly reports.
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Local MCP server for TOCOnline accounting/invoicing API that enables AI assistants to manage customers, products, sales documents, and call arbitrary endpoints via natural language after OAuth login.
    67
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Exposes the Loyverse API as MCP tools to manage stores, products, inventory, customers, receipts, and more from AI assistants.
    54
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    MCP server for the Clover POS REST API that gives AI assistants read and safe-write access to a merchant's sales, inventory, orders, and customers.
    56
    MIT