Server data from the Official MCP Registry
Clover POS for a single merchant: sales, inventory, orders, customers (reads + safe writes).
Clover POS for a single merchant: sales, inventory, orders, customers (reads + safe writes).
Valid MCP server (0 strong, 4 medium validity signals). 1 known CVE in dependencies Imported from the Official MCP Registry. 1 finding(s) downgraded by scanner intelligence.
5 files analyzed · 2 issues found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
This plugin requests these system permissions. Most are normal for its category.
Set these up before or after installing:
Environment variable: CLOVER_MERCHANT_ID
Environment variable: CLOVER_ACCESS_TOKEN
Environment variable: CLOVER_REGION
Environment variable: CLOVER_SANDBOX
Environment variable: CLOVER_AUTH_MODE
Environment variable: CLOVER_REFRESH_TOKEN
Environment variable: CLOVER_OAUTH_CLIENT_ID
Environment variable: CLOVER_OAUTH_CLIENT_SECRET
Add this to your MCP configuration file:
{
"mcpServers": {
"io-github-sbolivarlol-clover-mcp": {
"env": {
"CLOVER_REGION": "your-clover-region-here",
"CLOVER_SANDBOX": "your-clover-sandbox-here",
"CLOVER_AUTH_MODE": "your-clover-auth-mode-here",
"CLOVER_MERCHANT_ID": "your-clover-merchant-id-here",
"CLOVER_ACCESS_TOKEN": "your-clover-access-token-here",
"CLOVER_REFRESH_TOKEN": "your-clover-refresh-token-here",
"CLOVER_OAUTH_CLIENT_ID": "your-clover-oauth-client-id-here",
"CLOVER_OAUTH_CLIENT_SECRET": "your-clover-oauth-client-secret-here"
},
"args": [
"clover-mcp"
],
"command": "uvx"
}
}
}From the project's GitHub README.
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.2 — 23 tools, both auth modes, 198 tests. Runs locally (stdio, single merchant) or remotely over HTTP with OAuth (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.
Sales summaries and payment reports
Inventory lookups and low-stock alerts
Order history and open-order inspection
Customer search and creation
Safe writes: update item prices, set stock quantities, create customers
Employee, shift, category, modifier, tax, and device lookups; best-selling items
What it cannot do (by design): process refunds, capture payments, void charges, delete records. Those stay in the Clover dashboard. Multi-tenant hosted mode (many merchants behind one deploy) needs a persistent credential store — planned for v2 phase 2.
| Tool | Kind | Notes |
|---|---|---|
get_merchant_info | read | name, currency, timezone, country |
get_sales_summary | read | aggregated window (see Sales summary semantics) |
list_payments | read | SUCCESS payments in a window |
list_orders / get_order / list_open_orders | read | order history + detail |
list_items / get_item / list_low_stock_items | read | inventory + stock |
list_categories / list_modifiers / list_taxes | read | catalog structure (v1.1) |
list_devices | read | Clover terminals (v1.1) |
get_top_items | read | best-sellers by units in a window (v1.1) |
list_employees / get_employee | read | PINs never returned (v1.1, EMPLOYEES_R) |
list_shifts / list_active_shifts | read | clock-in/out records (v1.1, EMPLOYEES_R) |
search_customers / get_customer | read | cards never returned |
create_customer | write | additive; idempotency dup-check + dry_run |
set_item_price_cents | write | optimistic-lock pre-check, bounds, dry_run |
set_item_stock_quantity | write | absolute (not delta), pre-check, 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 |
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 |
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.
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/
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.
Be the first to review this server!
by Modelcontextprotocol · Developer Tools
Read, search, and manipulate Git repositories programmatically
by Modelcontextprotocol · Developer Tools
Web content fetching and conversion for efficient LLM usage
by Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.