Skip to main content
Glama
Shopmonkey MCP Server

Shopmonkey MCP Server

Shopmonkey MCP Server

CI

A Model Context Protocol (MCP) server that wraps the Shopmonkey REST API (v3), enabling AI agents and LLMs to interact with shop management data — work orders, customers, vehicles, inventory, appointments, payments, labor, canned services, webhooks, and more.

Features

  • 70 tools across 12 resource groups covering the Shopmonkey API

  • Dual transport — stdio for local/desktop use, Streamable HTTP for cloud deployment

  • Shopmonkey API key authentication (Bearer token to Shopmonkey REST API)

  • Automatic retry with exponential backoff on rate limits (429) and server errors (5xx)

  • Request concurrency control (max 5 simultaneous API calls)

  • 30-second request timeout per call

  • Multi-location support via SHOPMONKEY_LOCATION_ID or per-request locationId

  • Descriptive error messages surfacing Shopmonkey error codes and messages

  • HTTP transport includes bearer auth, health check endpoint, and graceful shutdown

  • Works with Claude Desktop, Cursor, Claude Code, Claude.ai, and any MCP-compatible client

Related MCP server: Thinkific MCP Server

Quick Start

git clone https://github.com/AbbottDevelopments/shopmonkey-mcp-server.git
cd shopmonkey-mcp-server
npm install
npm run build

Copy .env.example to .env and add your Shopmonkey API key:

cp .env.example .env
# Edit .env — set SHOPMONKEY_API_KEY to your key

Start the server:

# stdio (local use with Claude Desktop, Cursor, Claude Code)
npm start

# HTTP (cloud deployment, Claude.ai)
npm run start:http

Transports

The server ships two entry points sharing a single tool registry — use whichever matches your deployment target.

stdio (local use)

node dist/index.js
# or: npm start

Your MCP client spawns this process directly. Used by Claude Desktop, Cursor, and Claude Code. See MCP Client Configuration below.

Streamable HTTP (cloud deployment)

PORT=3000 node dist/http.js
# or: npm run start:http

The HTTP server listens on PORT (default 3000) and handles MCP requests at /. Required for cloud deployment (Railway, Render) and for connecting to Claude.ai.

HTTP features:

  • Authentication — Set MCP_AUTH_TOKEN to require Authorization: Bearer <token> on all MCP requests. Open access when unset (local development).

  • Health check — GET /health and GET / return {"status":"ok"} for load balancer probes.

  • Graceful shutdown — Clean exit on SIGTERM/SIGINT with a 5-second timeout.

For cloud deployment instructions, see docs/DEPLOYMENT.md.

Tool Reference

Work Orders (5 tools)

Tool

Description

list_orders

List work orders with filters (status, customer, location). Valid statuses: Estimate, RepairOrder, Invoice

get_order

Get full work order details

create_order

Create a new work order

update_order

Update work order fields; reports which persisted

update_service

Update a service's name or note on an order

Order deletion is not supported by the Shopmonkey API. See docs/LIMITATIONS.md for details.

Customers (6 tools)

Tool

Description

search_customers

Find customers by name, email or phone (see LIMITATIONS: unverified filter)

search_customers_by_email

Search for a customer by email address

search_customers_by_phone

Search for a customer by phone number

get_customer

Get full customer profile

create_customer

Create a new customer (name and address fields)

update_customer

Update customer information

Email and phone are sub-resources in Shopmonkey. After creating a customer, use POST /v3/customer/:id/email and /phone_number to attach contact info. See docs/LIMITATIONS.md.

Vehicles (7 tools)

Tool

Description

list_vehicles_for_customer

List all vehicles for a specific customer

lookup_vehicle_by_vin

Look up a vehicle by VIN number

lookup_vehicle_by_plate

Look up a vehicle by license plate and region

list_vehicle_owners

List owners associated with a vehicle

get_vehicle

Get full vehicle details

create_vehicle

Add a vehicle (optionally linked to a customer)

update_vehicle

Update vehicle data

Inventory & Parts (4 tools)

Tool

Description

list_inventory_parts

List parts inventory

get_inventory_part

Get single part details

list_inventory_tires

List tire inventory

search_parts

Search parts catalog by query

Appointments (4 tools)

Tool

Description

list_appointments

List appointments with date and status filters

get_appointment

Get full appointment details

create_appointment

Book a new appointment

update_appointment

Reschedule or update an appointment

Payments (3 tools)

Tool

Description

list_payments

List payments for an order

get_payment

Get payment details

create_payment

Record a payment (amountCents — integer cents, e.g., $150.50 = 15050)

All money values use integer cents with *Cents naming. Never send decimal dollar amounts.

Technicians & Labor (5 tools)

Tool

Description

list_labor

List labor line items on a service

assign_technician

Assign a technician to labor lines; verified by read-back

list_timeclock

Technician clock-in/clock-out events

list_users

List shop users and technicians

get_user

Get user/technician profile

Services & Canned Services (23 tools)

Tool

Description

list_services

List services on work orders

list_canned_services

List pre-built service templates

get_canned_service

Get canned service details with line items

create_canned_service

Create a new canned service template

update_canned_service

Update a canned service

delete_canned_service

Delete a canned service template

list_customer_deferred_services

List deferred (recommended but not yet performed) services

Canned service line items — 5 types (fee, labor, part, subcontract, tire) with add/update/remove operations:

Fee

Labor

Part

Subcontract

Tire

add_canned_service_fee

add_canned_service_labor

add_canned_service_part

add_canned_service_subcontract

add_canned_service_tire

update_canned_service_fee

update_canned_service_labor

update_canned_service_part

update_canned_service_subcontract

update_canned_service_tire

remove_canned_service_fee

remove_canned_service_labor

remove_canned_service_part

remove_canned_service_subcontract

remove_canned_service_tire

Webhooks (5 tools)

Tool

Description

list_webhooks

List all registered webhooks

get_webhook

Get webhook details

create_webhook

Register a new webhook endpoint with trigger types

update_webhook

Update a webhook

delete_webhook

Delete a webhook

Supported triggers: Appointment, Customer, Inspection, Inventory, Message, Order, Payment, PurchaseOrder, User, Vehicle, Vendor

Reports — Composite (3 tools)

Tool

Description

report_revenue_summary

Revenue totals by status and paid/unpaid split for a date range

report_appointment_summary

Appointment counts by confirmation status for a date range

report_open_estimates

Open unauthorized estimates with age-in-days calculation

Reports are composited from list endpoints (max 100 records per report). Use tighter date ranges for larger shops.

Workflow & Locations (2 tools)

Tool

Description

list_workflow_statuses

Get pipeline/workflow stages

list_locations

List shop locations

MCP Client Configuration

Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "shopmonkey": {
      "command": "node",
      "args": ["dist/index.js"],
      "cwd": "/path/to/shopmonkey-mcp-server",
      "env": {
        "SHOPMONKEY_API_KEY": "your_api_key_here"
      }
    }
  }
}

Cursor

Add to your Cursor MCP settings:

{
  "mcpServers": {
    "shopmonkey": {
      "command": "node",
      "args": ["dist/index.js"],
      "cwd": "/path/to/shopmonkey-mcp-server",
      "env": {
        "SHOPMONKEY_API_KEY": "your_api_key_here"
      }
    }
  }
}

Claude Code

claude mcp add shopmonkey -e SHOPMONKEY_API_KEY=your_api_key_here -- node /path/to/shopmonkey-mcp-server/dist/index.js

Claude.ai (HTTP transport)

Deploy dist/http.js to Railway or Render with SHOPMONKEY_API_KEY and MCP_AUTH_TOKEN set as environment variables. See docs/DEPLOYMENT.md for the full guide.

Documentation

Document

Description

Architecture

System design, dual transport, tool module pattern, client resilience

Capabilities

All 70 tools with use-case descriptions

Changelog

Release history

Credits

Fork authors whose field reports drive this project

API Provenance

Why v1.0.0 called endpoints that do not exist

Limitations

Unsupported operations with rationale and workarounds

Deployment

Railway + Doppler single-tenant deployment guide

Multi-Tenant Future

Future-work exploration for multi-shop deployment

Environment Variables

Variable

Required

Default

Description

SHOPMONKEY_API_KEY

Yes

—

Shopmonkey API key (Settings > Integration > API Keys)

SHOPMONKEY_BASE_URL

No

https://api.shopmonkey.cloud/v3

API base URL

SHOPMONKEY_LOCATION_ID

No

—

Scope all queries to one location (multi-location shops)

MCP_AUTH_TOKEN

Cloud: Yes

—

Bearer token for HTTP transport authentication. Required for cloud deployment — omitting it makes the endpoint public.

PORT

No

3000

HTTP transport listening port

MCP_READ_ONLY

No

—

Set to true to hide and refuse every tool that can change data

The server automatically loads .env via dotenv if present. You can also pass variables through your shell or MCP client config.

Development

npm run build        # Compile TypeScript
npm run dev          # Watch mode (tsc --watch)
npm start            # Start stdio server
npm run start:http   # Start HTTP server
npm test             # Run test suite (requires build first)

The test suite includes 186 tests across 9 test files covering mock API behavior, MCP protocol compliance, error paths, and transport validation.

Error Handling

The server handles common API scenarios:

  • Missing API key — Descriptive error with setup instructions

  • Rate limiting (429) — Automatic retry with exponential backoff (up to 3 attempts), respects Retry-After header

  • Server errors (500, 502, 503, 504) — Automatic retry with backoff

  • Request timeout — 30-second abort with clear error message

  • Network failures — Retry with backoff, readable error messages

  • API errors — Surfaces Shopmonkey error codes (API-xxxxx, ORM-xxxxx) and human-readable message field

API Reference

License

MIT

Available Tools

69 tools
add_canned_service_feeA

Add a fee line item to an existing canned service template.

Inputs: cannedServiceId (required), name, notes, quantity, +4 more.

add_canned_service_laborA

Add a labor line item to an existing canned service template.

Inputs: cannedServiceId (required), name, note, hours, +3 more.

add_canned_service_partB

Add a part line item to an existing canned service template.

Inputs: cannedServiceId (required), name, note, taxable, +4 more.

add_canned_service_subcontractB

Add a subcontract line item to an existing canned service template.

Inputs: cannedServiceId (required), name, notes, quantity, +4 more.

add_canned_service_tireA

Add a tire line item to an existing canned service template.

Inputs: cannedServiceId (required), name, notes, quantity, +4 more.

add_service_to_orderA

Add a service to a work order. Pass fromCannedServiceId to copy an existing canned service template (its labor, parts, fees) onto the order in one call, or pass name/note/pricing to create a custom one-off service instead.

Inputs: orderId (required), name, note, pricing, +1 more.

assign_labelA

Assign an existing label (found via list_labels) to an entity such as an Order or Customer.

Inputs: entity (required), labelId (required), entityId (required).

assign_technicianA

Assign a technician to one or more labor line items on a work order. Use list_services (orderId) to find the serviceId, list_labor (orderId + serviceId) to find labor IDs, and list_users to find the technician's user ID.

Inputs: orderId (required), laborIds (required), technicianId (required).

create_appointmentB

Book a new appointment in Shopmonkey.

Inputs: notes, title, endDate, orderId, +4 more.

create_canned_serviceA

Create a new canned service template in Shopmonkey. Canned services are reusable service bundles that can be added to work orders.

Inputs: name, express, lumpSum, pricing, +5 more.

create_customerB

Create a new customer in Shopmonkey.

Inputs: zip, city, state, address, +2 more.

create_orderA

Create a new work order in Shopmonkey.

Inputs: name, status, vehicleId, customerId, +1 more.

create_paymentA

Record a new payment in Shopmonkey.

Inputs: orderId (required), amountCents (required), notes, method.

create_vehicleB

Add a new vehicle to Shopmonkey, optionally linked to a customer.

Inputs: vin, make, year, color, +4 more.

create_webhookA

Create a new webhook in Shopmonkey. Use this to register Make.com or other endpoint URLs that receive Shopmonkey event notifications.

Inputs: url (required), name (required), triggers (required), secret, +2 more.

delete_canned_serviceA

Delete a canned service template by ID.

Inputs: id (required).

delete_webhookA

Delete a webhook by ID.

Inputs: id (required).

get_appointmentA

Get detailed information about a single appointment by its ID.

Inputs: id (required).

get_canned_serviceB

Get detailed information about a single canned service template by its ID.

Inputs: id (required).

get_customerA

Get detailed information about a single customer by their ID.

Inputs: id (required).

get_inventory_partB

Get detailed information about a single inventory part by its ID.

Inputs: id (required).

get_labelA

Get a single label by its ID.

Inputs: id (required).

get_orderB

Get detailed information about a single work order by its ID.

Inputs: id (required).

get_paymentB

Get detailed information about a single payment by its ID.

Inputs: id (required).

get_userA

Get detailed information about a single shop user or technician by their ID.

Inputs: id (required).

get_vehicleB

Get detailed information about a single vehicle by its ID.

Inputs: id (required).

get_webhookA

Get details of a single webhook by ID.

Inputs: id (required).

list_appointmentsA

List appointments from Shopmonkey. Supports filtering and pagination. Date-filtered queries are routed through the /appointment/search endpoint, which applies the range server-side.

Inputs: skip, limit, endDate, startDate, +2 more.

list_canned_servicesA

List pre-built canned service templates from Shopmonkey. These are reusable service templates that can be added to work orders.

Inputs: skip, limit, locationId.

list_customer_deferred_servicesA

List deferred services (recommended-but-not-yet-performed work) for a customer. Useful for revenue-opportunity surfacing in chat.

Inputs: customerId (required), skip, limit.

list_inventory_partsC

List parts from Shopmonkey inventory. Supports pagination.

Inputs: skip, limit, locationId.

list_inventory_tiresB

List tires from Shopmonkey inventory. Supports pagination.

Inputs: skip, limit, locationId.

list_labelsA

List labels defined in Shopmonkey (custom tags such as "Warranty" or "Fleet"). Filter by exact name to find a label ID before assigning it.

Inputs: name, skip, limit, entity.

list_laborA

List the labor line items on a service. Shopmonkey nests labor under order > service, so both orderId and serviceId are required — call list_services with an orderId first to get the serviceId.

Inputs: orderId (required), serviceId (required).

list_locationsA

List all shop locations in Shopmonkey. Useful for multi-location shops to identify location IDs for filtering other resources.

Inputs: skip, limit.

list_ordersB

List work orders from Shopmonkey. Filter by status, customer ID, date range, or location.

Inputs: skip, limit, status, customerId, +1 more.

list_paymentsA

List payments from Shopmonkey. Supports filtering and pagination.

Inputs: skip, limit, orderId, locationId.

list_servicesA

List the services on a work order. Shopmonkey nests services under their order — there is no flat service list — so orderId is required.

Inputs: orderId (required), skip, limit.

list_timeclockA

List technician time clock events. Track clock-in/clock-out for shop staff.

Inputs: skip, limit, userId, endDate, +2 more.

list_usersB

List shop users and technicians from Shopmonkey.

Inputs: skip, limit, locationId.

list_vehicle_ownersB

List all customers who own or are associated with a specific vehicle.

Inputs: vehicleId (required).

list_vehicles_for_customerA

List all vehicles associated with a specific customer.

Inputs: customerId (required), skip, limit.

list_webhooksA

List all registered webhooks in Shopmonkey.

Inputs: skip, limit.

list_workflow_statusesC

List workflow/pipeline status stages from Shopmonkey. Shows the progression stages work orders move through.

Inputs: locationId.

lookup_vehicle_by_plateA

Look up a vehicle in Shopmonkey by its license plate and region.

Inputs: plate (required), region (required).

lookup_vehicle_by_vinB

Look up a vehicle in Shopmonkey by its VIN (Vehicle Identification Number).

Inputs: vin (required).

remove_canned_service_feeB

Remove a fee line item from a canned service template.

Inputs: itemId (required), cannedServiceId (required).

remove_canned_service_laborA

Remove a labor line item from a canned service template.

Inputs: itemId (required), cannedServiceId (required).

remove_canned_service_partA

Remove a part line item from a canned service template.

Inputs: itemId (required), cannedServiceId (required).

remove_canned_service_subcontractA

Remove a subcontract line item from a canned service template.

Inputs: itemId (required), cannedServiceId (required).

remove_canned_service_tireA

Remove a tire line item from a canned service template.

Inputs: itemId (required), cannedServiceId (required).

report_appointment_summaryA

Generate an appointment summary for a date range. Counts appointments by confirmation status (Confirmed/Declined/NoResponse). Uses the /appointment/search endpoint, which filters by date server-side.

Inputs: endDate (required), startDate (required), locationId.

report_open_estimatesA

List all open (unauthorized) estimates, showing their age in days. Useful for follow-up on stale estimates. Pages the full estimate list each call; check the returned truncated flag if the shop is very large.

Inputs: locationId.

report_revenue_summaryA

Generate a revenue summary for orders INVOICED within a date range (filtered on invoicedDate, not order creation date). Aggregates by status and splits paid vs. unpaid revenue. Pages the full order list each call for a consistent total — check the returned truncated flag if the shop is very large.

Inputs: endDate (required), startDate (required), locationId.

search_customersA

Search customers in Shopmonkey by query string. Supports full-body search with pagination.

Inputs: skip, limit, query, locationId.

search_customers_by_emailA

Search for a customer in Shopmonkey by email address.

Inputs: email (required).

search_customers_by_phoneA

Search for a customer in Shopmonkey by phone number.

Inputs: phoneNumber (required).

search_partsA

Search the parts catalog in Shopmonkey. Use for finding parts by name, number, or description.

Inputs: query (required), skip, limit.

update_appointmentC

Update or reschedule an existing appointment.

Inputs: id (required), notes, title, endDate, +4 more.

update_canned_serviceB

Update an existing canned service template by ID.

Inputs: id (required), name, express, lumpSum, +5 more.

update_canned_service_feeC

Update a fee line item on a canned service template.

Inputs: itemId (required), cannedServiceId (required), name, notes, +5 more.

update_canned_service_laborA

Update a labor line item on a canned service template.

Inputs: itemId (required), cannedServiceId (required), name, note, +4 more.

update_canned_service_partB

Update a part line item on a canned service template.

Inputs: itemId (required), cannedServiceId (required), name, note, +6 more.

update_canned_service_subcontractC

Update a subcontract line item on a canned service template.

Inputs: itemId (required), cannedServiceId (required), name, notes, +5 more.

update_canned_service_tireC

Update a tire line item on a canned service template.

Inputs: itemId (required), cannedServiceId (required), name, notes, +5 more.

update_customerC

Update an existing customer's information.

Inputs: id (required), zip, city, state, +3 more.

update_orderC

Update fields on an existing work order.

Inputs: id (required), name, status, vehicleId, +1 more.

update_vehicleC

Update an existing vehicle's information.

Inputs: id (required), vin, make, year, +5 more.

update_webhookB

Update an existing webhook by ID.

Inputs: id (required), url, name, secret, +3 more.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    B3.2/5.0

    Scored across 69 tools

    Disambiguation4/5

    Most tools have distinct verb-noun names and clear descriptions, but some pairs like list_inventory_parts vs. search_parts and list_appointments vs. report_appointment_summary could cause minor confusion. Overall, an agent can usually tell them apart.

    Naming Consistency4/5

    Names consistently follow snake_case verb_noun structures, but there is slight inconsistency among read operations: get, list, search, lookup, and report are all used for similar retrieval purposes. Still, the naming is mostly predictable and readable.

    Tool Count1/5

    With 69 tools, this is far beyond the typical well-scoped range and falls into the extreme category. The large number of nested canned-service line-item operations contributes to the bulk, making the surface area heavy and difficult to navigate.

    Completeness4/5

    The toolset covers the core Shopmonkey entities—customers, vehicles, orders, appointments, payments, inventory, webhooks, reports, labels, and canned services—quite thoroughly. A few main-entity delete operations are absent, but this may reflect domain constraints rather than a gap.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Provides AI agents with 36 specialized tools for complete vehicle dealership management through the StockSpark/Carspark API, including inventory management, vehicle listings, image handling, pricing optimization, and multi-portal publishing.
      1
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Enables AI assistants to perform full CRUD operations on Snipe-IT inventory systems, managing assets, users, licenses, and more via 39 tools.
      40
      38
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables AI assistants to natively interact with Dolibarr ERP/CRM through its REST API, providing over 30 tools for managing customers, contacts, products, quotes, orders, invoices, stock, projects, contracts, interventions, and PDF generation, while supporting complex workflow orchestration and read-only security modes.
      MIT