
Research
/Security News
Popular npm Packages in the keyv and Cacheable Namespaces Compromised in Active Supply Chain Attack
Popular npm packages keyv and cacheable compromised.
clover-mcp
Advanced tools
MCP server for the Clover POS REST API — sales, inventory, orders, customers, and employees for small businesses
MCP server for the Clover POS REST API — gives AI assistants (Claude, Cursor, etc.) read and safe-write access to a Clover merchant's sales, inventory, orders, and customers.
Status: v0.7.0 — 47 tools, 6 prompts, both auth modes, 240 tests. Runs locally (stdio, single merchant) or remotely over HTTP with OAuth, single- or multi-tenant (see docs/DEPLOY.md). Endpoint contracts are sandbox-verified in docs/endpoints.md.
⚠️ Independent project — not affiliated with, endorsed by, or sponsored by Clover Network, LLC or Fiserv, Inc. "Clover" is a trademark of its respective owner and is used here only nominatively to describe interoperability. Provided as is, without warranty — see Legal & disclaimer.
What it cannot do (by design): process refunds, capture payments, void charges, delete records. Those stay in the Clover dashboard.
| Tool | Kind | Notes |
|---|---|---|
get_merchant_info / get_merchant_properties | read | profile + POS config (banking fields never returned) |
get_sales_summary | read | aggregated window (see Sales summary semantics) |
list_payments / list_refunds / list_tenders | read | payments, refunds, tender types |
list_orders / get_order / list_open_orders / list_order_types | read | order history + detail |
list_items / get_item / list_low_stock_items | read | inventory + stock |
list_categories / list_modifiers / list_taxes / list_item_groups / list_attributes / list_tags / list_discounts | read | catalog structure |
list_tip_suggestions / get_default_service_charge | read | tip presets + service-charge config |
list_devices / list_opening_hours / list_cash_events | read | terminals, hours, cash-drawer log |
get_top_items | read | best-sellers by units in a window |
list_employees / get_employee / list_shifts / list_active_shifts / list_roles | read | PINs never returned (EMPLOYEES_R) |
search_customers / get_customer | read | cards never returned |
whoami | read | multi-tenant identity diagnostic (no secrets) |
summarize_sales / inventory_reorder_suggestions / detect_sales_anomalies / suggest_item_categories / draft_customer_message | AI | reason via your client's model; read-only suggestions |
create_customer / update_customer | write | dup-check + dry_run; update confirms via elicitation |
create_item / create_category / create_order / add_line_item | write | guarded: dry_run + confirm before writing |
set_item_price_cents / set_item_stock_quantity | write | optimistic-lock pre-check, bounds, dry_run |
Every tool carries MCP behaviour annotations (readOnlyHint / destructiveHint / idempotentHint) so clients can parallelize reads and prompt before writes.
uvx clover-mcp # coming soon after PyPI publish
Or from source:
git clone https://github.com/SBolivarLoL/clover-mcp-server
cd clover-mcp-server
uv pip install -e .
Copy .env.example to .env and fill in your values:
cp .env.example .env
Required:
| Variable | Description |
|---|---|
CLOVER_MERCHANT_ID | Your Clover merchant ID |
CLOVER_ACCESS_TOKEN | Your Clover API access token |
Optional:
| Variable | Default | Description |
|---|---|---|
CLOVER_REGION | na | na, eu, or la |
CLOVER_SANDBOX | false | true to use the Clover sandbox |
CLOVER_AUTH_MODE | token | token or oauth_refresh |
token — paste a static access token. Works for sandbox and single-merchant production use. If the token expires, regenerate it in the Clover Developer Dashboard.oauth_refresh — the server auto-refreshes on expiry and persists the new token pair to CLOVER_TOKEN_STORE (default: ~/.config/clover-mcp/tokens.json, mode 0600). Clover refresh tokens are single-use, so the rotated pair is written back after each refresh. Run scripts/get_sandbox_token.py to obtain tokens — it writes them straight to the store, so you only set CLOVER_AUTH_MODE, CLOVER_OAUTH_CLIENT_ID, CLOVER_OAUTH_CLIENT_SECRET, and CLOVER_MERCHANT_ID in .env (no token values needed). Pasting CLOVER_ACCESS_TOKEN / CLOVER_REFRESH_TOKEN into .env still works as an alternative.Use a least-privilege token. Grant only the permission scopes the tools you actually use require (see the table below). A read-only deployment needs no
*_Wscopes at all. Don't reuse a production token in sandbox or vice versa.
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"clover": {
"command": "uvx",
"args": ["clover-mcp"],
"env": {
"CLOVER_MERCHANT_ID": "your_merchant_id",
"CLOVER_ACCESS_TOKEN": "your_token",
"CLOVER_REGION": "na"
}
}
}
}
Add to .cursor/mcp.json in your project (or ~/.cursor/mcp.json globally):
{
"mcpServers": {
"clover": {
"command": "uvx",
"args": ["clover-mcp"],
"env": {
"CLOVER_MERCHANT_ID": "your_merchant_id",
"CLOVER_ACCESS_TOKEN": "your_token"
}
}
}
}
Your token must have the following Clover permission scopes:
| Permission | Used by |
|---|---|
MERCHANT_R | get_merchant_info |
ORDERS_R | list_orders, get_order, list_open_orders |
PAYMENTS_R | list_payments, get_sales_summary (payments + refunds) |
ORDERS_R | …also get_top_items |
INVENTORY_R | list_items, get_item, list_low_stock_items, list_categories, list_modifiers, list_taxes, list_discounts |
INVENTORY_W | set_item_price_cents, set_item_stock_quantity |
CUSTOMERS_R | search_customers, get_customer |
CUSTOMERS_W | create_customer |
EMPLOYEES_R | list_employees, get_employee, list_shifts, list_active_shifts (optional) |
MERCHANT_R | …also list_devices, list_tenders, list_order_types, list_opening_hours, list_cash_events, list_tip_suggestions, get_default_service_charge |
Read scopes (*_R) are probed at startup; the server warns about any missing ones (it no longer exits — a hosted server must still start) and the affected tools return a 403 when called. EMPLOYEES_R is optional. Write scopes (*_W) are not probed (a probe would mutate data) — a missing write scope surfaces as a 403 the first time you call that tool. Permission changes on a Clover app require the merchant to reinstall the app.
By default this runs locally over stdio for a single merchant. To run it remotely:
server.py:mcp,
enable the platform's built-in auth, and set single-merchant Clover env vars.
The platform handles OAuth, HTTPS, and transport — no IdP setup, and do not
set CLOVER_TRANSPORT/CLOVER_AUTH_* (that path needs an IdP and will fail).server.py:create_server, which makes clover-mcp an OAuth
2.1 resource server (validates your IdP's JWTs, publishes Protected Resource
Metadata per RFC 9728, routes by token claim) and refuses to start without an
IdP so it can't run open.Full setup for both in docs/DEPLOY.md. How SSO/SAML, SCIM, audit, and multi-tenant authorization fit: docs/enterprise-identity.md.
get_sales_summary makes the accounting explicit so the LLM can explain it:
result=SUCCESS payment amounts. FAIL/AUTH/uncaptured PRE_AUTH are excluded./refunds endpoint (Clover refunds are separate objects with a positive amount, not negative payments). Voids are counted from voided payments. Both are reported separately (refund_count/refund_amount, void_count) — never netted into payment_count. net_sales = gross_sales - refund_amount.gross_sales via payment totals.note flags the window when any are present.uv pip install -e ".[dev]"
pytest
ruff check src/
mypy src/clover_mcp/
Correctness eval + latency/load benchmark against a sandbox:
uv run python scripts/benchmark.py — methodology, results, and failure analysis
in docs/eval.md.
Architecture (diagrams + module map): docs/ARCHITECTURE.md.
Run a 5-minute demo: uv run python scripts/demo.py (or the runbook in
docs/DEMO.md).
All observability output goes to stderr (stdout carries the MCP stdio protocol).
Audit logging (on by default) — every write emits one structured JSON line:
{"audit":"write","method":"PUT","path":"/items/…","status":200,"merchant":"…"}.
No request bodies or secrets. Disable with CLOVER_AUDIT_LOG=false.
Latency logging — set CLOVER_LATENCY_LOG=true to emit a latency_ms line
per Clover HTTP call.
Distributed tracing (optional) — install the OpenTelemetry extra and point it at your collector; every Clover call becomes a span. Without it, tracing is a zero-cost no-op (no dependency added):
uv pip install -e ".[otel]"
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
export OTEL_SERVICE_NAME=clover-mcp
See SECURITY.md for the vulnerability disclosure policy.
This is not legal advice. The notes below describe the project's intent and the operator's responsibilities.
MIT — see LICENSE.
FAQs
MCP server for the Clover POS REST API — sales, inventory, orders, customers, and employees for small businesses
The pypi package clover-mcp receives a total of 90 weekly downloads. As such, clover-mcp popularity was classified as not popular.
We found that clover-mcp demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
/Security News
Popular npm packages keyv and cacheable compromised.

Security News
A misconfiguration gave three Anthropic models internet access, and one, believing it was in a simulation, shipped a credential-stealing package to PyPI.

Security News
/Company News
Socket has joined the new Composer and Packagist sponsorship program as a launch sponsor, supporting the team that keeps PHP's package ecosystem secure.