Skip to main content
Glama
RepairDesk MCP Server

RepairDesk MCP Server

by odiecay

RepairDesk MCP Server

Use your AI assistant to work in RepairDesk: find a ticket, add your bench notes, upload a quote, log repair time or update a customer's details by asking in plain English. This connects an MCP-compatible assistant to your store through the RepairDesk API.

Built by a RepairDesk shop for other RepairDesk shops, with Codey and Warden (our shop's AI assistant) working through real test records together. It works with Claude Code, Claude Desktop, Codex CLI, OpenCode and other compatible MCP clients. You do not need Warden or our shop setup to use it.

Current source version: 2.1.2 — 40 tools, up from the original 7. Install from this GitHub repository for the new features. The npm package reference remains at 1.0.0; this update has not been published to npm.

This is an independent project, not an official RepairDesk product. It makes real changes in the store connected to your API credentials.

Contents

Related MCP server: RogerRoger MCP Server

What you can ask it to do

Start with the kind of thing you'd ask someone at the next bench. For example:

  • "Look up T-12345 and tell me what's been done so far."

  • "Add an internal note: tested with our spare CPU, boots normally. Customer's CPU still won't POST."

  • "Upload this quote PDF to T-12345." Attachments stay internal to the ticket; uploading one does not email it to the customer.

  • "Add these photos to the pre-condition section."

  • "Start the repair timer on this ticket." Later: "Stop the timer."

  • "Add 15 minutes of repair time to T-12345."

  • "Preview a text to the customer with their name, device and ticket number." Then, after checking it: "Send that message."

  • "Create a customer with these contact details and SMS consent."

  • "Book this customer in tomorrow at 1 pm for 15 minutes at $0." The assistant uses your booking details; RepairDesk may send its configured reminders.

  • "Change this test item's selling price to $19.95 and cost to $7.50, keeping its stock and SKU as they are."

  • "Show me unpaid invoices from last month."

The assistant can look up the customer, ticket and device IDs itself. Be specific about which record to change, especially when a ticket has more than one device. Your clear instruction to make a change is authorization; it should not need to ask you the same question again. Status changes can trigger RepairDesk's automatic SMS/email, so check the known notification issue below.

What's new

The original version had seven tools for tickets, customer/invoice lookups, inventory search, employees and shop reference data. This update adds 33 tools:

Area

Added in this update

Bench work

Ticket attachments, pre/post-condition photos, repair timers/manual time and the documented ticket-update/status routes

Customer messages

Direct ticket SMS and email, message preview and supported name/device substitutions, SMS inbox

Customers and bookings

Customer creation/update, appointment creation/listing, available slots and booking reference data

Stock and devices

Inventory creation/update, conditions/locations, transfer lookup, brand/model creation and trade-in creation/update/conversion

Money and reporting

Invoice creation, recording received payments, ticket-to-invoice conversion, transaction reports, payroll and call logs

Parts and purchasing

Parts/service lookups and purchase-order item details

The tools also handle decimal prices, preserve supported existing inventory fields during updates, read back supported changes and coordinate API rate limits across server processes. Writes are never automatically retried after a failure or timeout. The endpoint map lists every added tool and route.

What we've tested and what still needs work

We've worked through the main workflows in a live shop using designated test records, checking API results against the website and messages actually received. That includes PDF attachments, pre/post photos, timers, flagged notes, ticket field edits, personalised direct SMS/email, customer creation/update, appointments, basic inventory creation/pricing/updates and brand creation. There are also 44 passing automated tests using synthetic data.

There are still limits to be aware of:

  • Automatic status SMS: both API status routes saved the status but sent literal placeholders in our test. The same change through the website filled them correctly. Direct MCP SMS/email now substitutes supported fields before sending; this does not fix RepairDesk's separate automatic messages.

  • Appointment reminders: our test booking saved correctly, but its reminder had blank name, appointment detail and shop phone fields. The exact cause is unconfirmed.

  • Inventory: setting a nonzero Minimum Price and clearing Long Description were ignored in our tests. The MCP reports mismatches or unverified fields instead of treating API acceptance as proof that every change saved.

  • Still awaiting live tests: model creation, trade-in writes, invoice/payment writes and specialised inventory cases such as serialized items, nonzero stock changes and multiple stores. Those tools are available; they are not all verified end to end.

See the validation record for the evidence and remaining checks. Having a tool for an endpoint does not mean every workflow has passed a live test.

Quick start

You need a RepairDesk API credential, Node.js and an AI client that supports local MCP servers. The setup script handles the basic connection. Uploads need one extra folder setting, explained below.

1. Install Node.js (if you don't have it)

Download and install from nodejs.org — get the "LTS" version. This installs both node and npm. To check it worked, open a terminal and run:

node --version

You should see something like v22.x.x (Node 18 or higher is supported).

2. Get the code

If you have Git:

git clone https://github.com/odiecay/repairdesk-mcp.git
cd repairdesk-mcp

If you don't: click the green Code button on the GitHub repo page → Download ZIP → unzip it somewhere → open a terminal in that folder.

3. Get your RepairDesk API key

In your RepairDesk admin: Settings → API. Copy the key shown there — the setup script asks for it in the next step. Treat it like a password: this integration can read and change shop records using the access that credential allows (see Security).

4. Run the setup script

node setup.mjs

The script installs dependencies if needed, asks for your API key and assistant, and configures Claude Code, Claude Desktop, Codex CLI or OpenCode. If automatic configuration is unavailable or an entry needs manual attention, it prints the configuration to use. Other MCP clients can use that configuration too.

Keep your API key private when running setup or sharing screenshots. You do not need to give this project or the assistant your RepairDesk website login.

If you'd rather do it by hand — or your client isn't one of the four above — see Manual setup below instead. Either way, run npm install yourself first if you skip the script.

5. Try it

Restart or reconnect your AI client after setup, then ask: "Using RepairDesk, list my 5 most recent tickets." A fresh connection to this version exposes 40 tools. Start with a read so you can check that it is connected to the right store.

6. Enable attachments and photos, if you want them

Add REPAIRDESK_UPLOAD_ROOTS to the RepairDesk entry's env / environment settings, then reconnect. This is an extra setting; the setup script does not ask for upload folders. Use a folder on the machine running the MCP server:

Server platform

Example setting value

Windows

C:\RepairDesk Files;D:\Job Photos

Linux/macOS

/srv/quotes:/srv/job-photos

In a JSON configuration, escape Windows backslashes, for example: "REPAIRDESK_UPLOAD_ROOTS": "C:\\RepairDesk Files;D:\\Job Photos". Choose folders containing the files you want to attach. Uploads remain disabled until this is set. See the upload example for file limits and how ticket attachments differ from condition photos.

Updating an existing installation

If you installed with Git, run these commands in your existing checkout:

git pull --ff-only
npm ci

If Git reports local changes or a diverged branch, keep those changes and resolve that first. Do not overwrite a customised installation. If you installed from a ZIP, download a fresh copy, install its dependencies with npm ci, and point your MCP entry at the new server.mjs; retain your existing credential settings.

Then restart or reconnect the MCP client. Replacing files does not update an already-running server process. Check that the connection reports 2.1.2 and 40 tools; seeing only seven means you are still using the old server or entry. You do not need to run setup again if your existing entry already points at the updated checkout. Add the upload-folder setting above if it is not configured.

This release is in GitHub source. Updating the old npm package alone will not install these changes.

Manual setup

Skip this if node setup.mjs already worked for you. Otherwise, run npm install in this folder first, then wire up your client by hand:

Run this from anywhere, replacing the path with the full path to where you unzipped/cloned the folder, and the key with your real one:

claude mcp add repairdesk \
  --env REPAIRDESK_API_KEY=your_key_here \
  --env REPAIRDESK_USER_AGENT=YourShopName-MCP/1.0 \
  -- node /full/path/to/repairdesk-mcp/server.mjs

Open (or create) the config file for your OS:

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

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

  • Linux: ~/.config/Claude/claude_desktop_config.json

Add this (merge it with anything already in mcpServers if the file isn't empty):

{
  "mcpServers": {
    "repairdesk": {
      "command": "node",
      "args": ["/full/path/to/repairdesk-mcp/server.mjs"],
      "env": {
        "REPAIRDESK_API_KEY": "your_key_here",
        "REPAIRDESK_USER_AGENT": "YourShopName-MCP/1.0"
      }
    }
  }
}

Save the file, then fully quit and reopen Claude Desktop (not just close the window).

Edit (or create) ~/.codex/config.toml and add:

[mcp_servers.repairdesk]
command = "node"
args = ["/full/path/to/repairdesk-mcp/server.mjs"]

[mcp_servers.repairdesk.env]
REPAIRDESK_API_KEY = "your_key_here"
REPAIRDESK_USER_AGENT = "YourShopName-MCP/1.0"

Start a new Codex session and run /mcp to confirm it connected. (Codex also has an interactive codex mcp add command if you prefer that over editing the file — check codex mcp add --help for the exact flags on your installed version.)

Open (or create) the config file for your OS:

  • Mac/Linux: ~/.config/opencode/opencode.json

  • Windows: %APPDATA%\opencode\opencode.json

Add this (merge it with anything already in mcp if the file isn't empty):

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "repairdesk": {
      "type": "local",
      "command": ["node", "/full/path/to/repairdesk-mcp/server.mjs"],
      "enabled": true,
      "environment": {
        "REPAIRDESK_API_KEY": "your_key_here",
        "REPAIRDESK_USER_AGENT": "YourShopName-MCP/1.0"
      }
    }
  }
}

Restart OpenCode to pick it up.

The command/args/env shape used above (Claude Code/Desktop) is the de facto standard — most MCP clients follow it, just in a different settings file. Check your client's docs for where that file lives; the block itself should work as-is.

Use the full, absolute path to server.mjs (e.g. /Users/you/repairdesk-mcp/server.mjs or C:\Users\you\repairdesk-mcp\server.mjs) — a relative path will fail because your AI client doesn't run from inside this folder.

Tools reference

Version 2 exposes 40 tools: the original seven convenience tools plus 33 operations from RepairDesk’s published API. See the complete endpoint map for each tool, HTTP route, and authorization requirement.

Area

Capabilities

Tickets

Search/read/create, notes, documented line updates, status changes, technician assignment with read-back verification

Files

Internal ticket attachments, pre/post condition images; single or multiple server-local files

Repair time

Start/stop repair timers and add manual time to a specific ticket line

Messages

Ticket email and SMS, SMS inbox; sends require explicit user authorization

Customers

Search/read/create/update

Inventory

Search/create/update, reference information, trade-in create/update/conversion, transfers

Invoices

Read/create, due amount, record a received payment, convert ticket to invoice

Purchasing

Purchase orders and item-level details; no purchase-order creation endpoint is documented

Appointments

List/create, available slots and booking reference data

Reports

Payment transactions by payment date, payroll shifts/monthly reports, Phone Pro call logs

Reference data

Parts, services by category, brands/models, employees and existing shop reference lookups

New tools expose the published request schemas: path contains URL identifiers, query contains filters, and body contains JSON/form fields. IDs in these tools are RepairDesk's internal numeric IDs, not the number printed after T-. Use repairdesk_tickets with ticket_id: "T-12345" to resolve a displayed ticket number, then use summary.id and the appropriate devices[].id.

Writes require confirmed: true after the user authorizes the concrete action. An explicit request to do that action already supplies authorization; clients should not ask the same question twice. Existing note addition remains ungated. Statuses can trigger automatic customer notifications. Creating invoices or recording payments is never a side effect of uploading a quote. The payment tool records a received payment; it is not a card-payment gateway.

Upload example

Set REPAIRDESK_UPLOAD_ROOTS to the directories whose files the server may upload. Use the platform path separator (: on Linux/macOS, ; on Windows). Paths are on the machine running the MCP server, not necessarily the operator's desktop. Symlinks are resolved before checking allowed roots. Uploads are disabled when no roots are configured.

{
  "body": {"ticket_id": 12345, "ticket_inv_id": 67890, "notes": "Approved quote"},
  "file_paths": ["/srv/quotes/Customer - T-12345/Quote.pdf"],
  "confirmed": true
}

Call repairdesk_attachments with that payload. RepairDesk permits up to 10 files, 15 MB each, and excludes HTML. These attachments are internal: staff open them in RepairDesk; upload does not send them to the customer or publish to the portal. RepairDesk may save a condition image and still return an error. Inspect the ticket’s pre/post image list before retrying to avoid duplicates. For repairdesk_condition_images, use body.ticket_inv_id, body.condition (pre or post) and file_paths for JPG/PNG/GIF images.

Repair timer example

{
  "body": {"id": 12345, "ticketInvId": 67890, "timerAction": "custom", "minutes": 15},
  "confirmed": true
}

Call repairdesk_ticket_status_timer. Use start or stop instead of custom for a live timer. Status and timer target one line, never all ticket lines implicitly. The existing repairdesk_tickets_write accepts ticket_line_id and requires it when multiple lines exist; it now reads changes back before reporting them as verified. Use repairdesk_ticket_update for the full documented payload, including line prices/parts and pre/post condition fields. The API can create lines when unknown line IDs are supplied: inspect IDs before submitting.

Messages and status changes

Status changes are performed through the MCP using the documented API. The server defaults to REPAIRDESK_STATUS_MODE=api; a website login is not required. User-authorized status writes read the ticket before and after, validate the selected repair line, verify the saved status, and inspect newly recorded communications. Existing-ticket status updates return a separate notifications result: malformed_template, recorded, none_observed, or unverified. A saved status is not proof of correct notification rendering or delivery.

A controlled test found that both documented status-write routes saved the status but sent automatic SMS containing literal customer/device placeholders. The equivalent website change on the same ticket rendered them correctly. The upstream cause is unresolved; all documented status parameters were supplied. Do not claim this integration fixes RepairDesk's automatic notification renderer.

The convenience ticket tool and dedicated status tool skip an already-applied status to avoid duplicate notifications. A combined timer request still performs the timer action without reapplying that status. General ticket updates may also contain other edits and are not skipped; prefer the dedicated tool for status changes. Never retry an uncertain write or send a second corrective message automatically. Communication history may be truncated, omit email bodies, or arrive later; absence at readback does not prove no notification was sent.

REPAIRDESK_STATUS_MODE=web is an optional administrator policy to block status writes, not the standard workflow. confirmed=true cannot override it. Existing MCP clients must reconnect to load a new server version. Ticket creation remains available and can trigger its own configured notifications; its rendering has not been verified by the existing-ticket comparison.

Direct SMS/email tools can accept plain text or supported placeholders. The MCP fetches the ticket and substitutes actual values before sending through the normal RepairDesk messaging API. This works with any compatible MCP client; there is no dependency on a particular assistant, shop, or customer name.

Placeholder

Ticket field

{customer_first_name}, {customer_last_name}

Linked customer's first/last name

{customer_name}, {customer name}

Linked customer's full name

{manufacturer_name}

Selected repair line's manufacturer

{Device_Name}, {Device Name}, {device_name}

Selected repair line's device name

{repair_category}

Selected repair line's repair category

{Ticket_Id}, {ticket_id}

Display ticket number

{Status}, {status}

Selected repair line's current status

Use preview=true to inspect the rendered message without sending. For a ticket with multiple repair lines, supply top-level ticket_line_id when using device, category or status placeholders. Unknown tokens, unavailable values and invalid line selections stop the send. Record values inserted into HTML email bodies are escaped. Sending still requires confirmed=true; previewing does not.

These are MCP-supported substitutions, not a claim about RepairDesk's native macro set. The public API does not document template management or per-request suppression of automatic status notifications. Our rendering runs on direct messages and cannot intercept RepairDesk's separate automatic status messages.

Inventory updates

repairdesk_inventory_update accepts changed fields in body, plus the matching item ID in path.id and body.id. Before writing it looks up the exact item ID and fills in existing readable values: the upstream PUT clears omitted core fields and requires the product name even for price changes. Decimal prices and costs are supported despite the published schema declaring them as integers. Prices are sent with the preserved tax-inclusive setting and stored retail price.

Inspect mismatches, unverified_fields and write_performed in the result. Successful API acceptance does not prove every field saved. Live testing found minimum_price ignored; GET does not expose Long Description (notes). A contradicting write response is flagged, while independent verification of notes still requires the website. Do not automatically retry a completed or uncertain write. Full coverage of serialized, warranty, valuation and multi-store behavior has not been established by the basic test item.

See validation results for what was tested live versus what was only checked with synthetic requests.

Scope and compatibility

The checked-in request definitions come from the official OpenAPI specification, reviewed 19 October 2026. All 58 documented business operations have a tool route; this is endpoint coverage, not a claim that every parameter has been live-tested. The original seven tools retain their focused inputs; the new tools use the published request schemas. There are no documented public estimate or webhook management operations in this snapshot.

Authentication supports an API key or an externally managed OAuth access token. Set REPAIRDESK_ACCESS_TOKEN to use Bearer authentication; it takes precedence over the API key. This server does not run the OAuth consent flow, store refresh tokens, or expose token exchange/revocation as model tools. Manage token renewal outside the conversation. Restart clients to discover new tools after upgrading.

Three paths in the published spec repeat /v1 despite a base URL ending in /v1. The client normalizes these so uploads and messages use one /v1 segment. GET requests retry once only for short, explicit Retry-After intervals. Writes never retry automatically: after a timeout or ambiguous result inspect the target record before trying again.

The GitHub source is version 2.1.2. This change does not publish an npm release; server.json retains the previous 1.0.0 npm package reference until a separate registry release is prepared. Install this source checkout to use the new tools.

All configuration options

Add optional settings to the env/environment block your client's config uses. The setup script configures the basic connection, not every option below. Most MCP clients do not read a .env file automatically; .env.example lists values for reference.

Variable

Required

Default

Purpose

REPAIRDESK_API_KEY

Key or access token

—

Your RepairDesk API key

REPAIRDESK_BASE_URL

No

https://api.repairdesk.co/api/web/v1

Override the API base URL

REPAIRDESK_USER_AGENT

No

RepairDesk-MCP/<version>

User-Agent sent on every request. Set this to your own shop/tool name if you like — it just can't be empty (see Troubleshooting)

REPAIRDESK_MIN_INTERVAL_MS

No

1250

Minimum ms between outbound API calls — see rate limiting below

REPAIRDESK_LOG_DIR

No

logs beside server.mjs

Where mcp_audit.log is written; an explicit relative path is relative to the process working directory

REPAIRDESK_ACCESS_TOKEN

No

—

Externally managed OAuth Bearer token; takes precedence over API key

REPAIRDESK_UPLOAD_ROOTS

No

Empty

Allowed server-side upload directories; empty disables uploads

REPAIRDESK_TIMEOUT_MS

No

60000

Request and response-body timeout

REPAIRDESK_CONFIG

No

config.json beside server.mjs

Credential JSON file used when neither credential environment variable is set

REPAIRDESK_STATUS_MODE

No

api

Use API status writes; optional administrator policy web blocks status writes

REPAIRDESK_STATE_DIR

No

~/.cache/repairdesk-mcp

Shared request pacing/cooldown state for server processes

Alternative: config file instead of env vars. If your setup makes env vars awkward, create a config.json (gitignored) next to server.mjs:

{
  "repairdesk_api_key": "your_key_here",
  "repairdesk_base_url": "https://api.repairdesk.co/api/web/v1"
}

It's re-read on every API call, so you can rotate the key without restarting the server. If either credential environment variable is set, the file is not loaded. In that case set a custom base URL with REPAIRDESK_BASE_URL too.

Rate limiting

RepairDesk's API help page states 50 requests per minute. This server defaults to 1250ms between requests (about 48/minute). Updated MCP processes sharing the same credential and state directory coordinate their request starts using a file lock. The default state directory is ~/.cache/repairdesk-mcp; set REPAIRDESK_STATE_DIR to share it across installations. It stores timestamps under a hashed credential identifier, not credentials or customer data. Older processes, other apps and other machines can still consume the account's request allowance.

A 429 establishes a shared cooldown. Missing Retry-After defaults to 60 seconds. GETs retry once only when the explicit cooldown is at most 30 seconds; longer cooldowns return an actionable retry-later error. Writes never automatically retry, including uploads, messages and payments. Shared pacing waits are bounded so a tool does not hang indefinitely. Inspect records after an uncertain result before repeating a write.

Troubleshooting

"RepairDesk API returned 401 Unauthorized" / "Unauthorized" in the response Your API key is wrong, was revoked, or wasn't picked up. Double-check the key in Settings → API in RepairDesk, and that it's spelled correctly in your MCP client's config (not a stray space, not still YOUR_REPAIRDESK_API_KEY_HERE). Fully restart your AI client after any config change — most don't reload MCP config live.

Requests fail immediately / look like they're being blocked, not authenticated RepairDesk's Cloudflare blocks requests with an empty or default-looking User-Agent. Don't set REPAIRDESK_USER_AGENT to an empty string.

HTTP 429 or shared request cooldown Wait for the reported cooldown. Reconnect older MCP processes to enable shared pacing, and check for other integrations using the same account. If needed, raise REPAIRDESK_MIN_INTERVAL_MS (for example, 2000). Do not repeatedly retry sends, payments or uploads. An API error may require inspecting the target first.

"Ticket T-XXXXX not found — could not resolve to internal ID" Check the order ID is correct and exists in this RepairDesk store. If you have the internal numeric ID instead, that works too — pass it directly.

"request failed or timed out" Check connectivity to api.repairdesk.co from the machine running the server and check REPAIRDESK_BASE_URL. The default request timeout is 60 seconds. A timeout after a write does not establish whether RepairDesk saved it; inspect the record before trying again.

Your AI assistant doesn't see the tools, or still shows only seven

  • Confirm the path in args is absolute, not relative, and actually points at server.mjs.

  • Confirm you ran npm install in that folder (missing node_modules = the server can't start).

  • Fully quit and restart your AI client — don't just close the chat window.

  • Run node /full/path/to/server.mjs directly in a terminal — if it errors, you'll see the actual problem instead of a generic "tool not available" from your client.

node setup.mjs says it couldn't find claude/codex on your PATH That's fine — it falls back to printing the config block for you to paste in by hand (see Manual setup). This just means that CLI isn't installed or isn't on your PATH; it doesn't mean the MCP server itself is broken.

Still stuck? Open an issue on this repo with the error message (redact your API key first if it appears anywhere in the output).

FAQ

Is this an official RepairDesk tool? No. It's independently built and maintained, using RepairDesk's public API. Use it at your own discretion.

Does this cost anything to run? There is no fee from this project. Your RepairDesk plan, messaging/provider charges and AI assistant costs still apply according to your own services.

Can I use this with something other than Claude? Yes — MCP is an open standard. setup.mjs configures Claude Code, Claude Desktop, Codex CLI, and OpenCode directly; anything else that speaks MCP over stdio (Cursor, Windsurf, etc.) can use this server too, via the manual config in Manual setup.

Can I run this for multiple RepairDesk stores? Yes — register it multiple times under different names (e.g. repairdesk-store1, repairdesk-store2) in your MCP client, each with its own REPAIRDESK_API_KEY.

Can these tools email/text customers? Yes: explicit ticket email/SMS tools are available, and status changes can trigger RepairDesk's own notifications. The tool requires confirmed: true for those writes. Only set it for the user-authorized ticket, recipient and action.

Testing

Run npm ci then npm test. Tests cover MCP stdio discovery, request schemas, file boundaries, multipart construction, status/field read-back, authentication, rate limits, secret redaction and uncertain write outcomes. They use synthetic fixtures and mocked HTTP responses, not a live shop.

Live verification should use an explicitly designated test ticket/customer with contact details controlled by the operator. Keep payment, invoice and inventory writes in a sandbox unless the operator specifically authorizes real records.

Security

Your API credentials allow access to shop records, including customer and financial data. Keep them in your private client configuration or a protected credential file. config.json and .env are gitignored; do not commit filled-in copies, audit logs or real customer evidence. The assistant/client you choose receives the data returned by the tools.

For bug reports, use redacted errors and synthetic examples. Report security issues privately where the repository host supports it; do not include secrets or customer data in a public issue or pull request.

License

MIT — see LICENSE. Provided as-is, no warranty — you're responsible for how you use it against your own RepairDesk account.

Available Tools

7 tools
repairdesk_customersB

Look up customers by name, phone, email, or ID.

NameRequiredDescriptionDefault
pageNo
actionYes
keywordNoSearch by name, phone, or email
pagesizeNo
customer_idNo

TDQS

B3.1/5.0
Behavior3/5

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

With no annotations, the description carries the burden of behavioral disclosure. It states 'look up' which suggests a read-only operation, and the action enum (list/get) reinforces this. However, it does not explicitly confirm read-only semantics, nor does it mention pagination behavior or any permissions required. The description is adequate but leaves room for inference about side effects and constraints.

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

Conciseness4/5

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

The description is a single concise sentence with no redundancy. It efficiently conveys the core purpose. However, it could include a bit more detail (e.g., mention of action modes) without losing conciseness, so it's not a perfect 5.

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

Completeness2/5

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

The tool has 5 parameters including an action enum and pagination, yet the description does not explain the 'action' parameter, the difference between list and get, or how pagination works. It also doesn't address how 'customer_id' vs 'keyword' are used together. For a tool of this complexity, the description is incomplete and requires the agent to infer critical usage details from the schema alone.

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

Parameters2/5

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

The schema description coverage is only 20% (only 'keyword' is described). The tool description adds partial meaning by mentioning name, phone, email, or ID, mapping roughly to 'keyword' and 'customer_id', but it does not explain the 'action' parameter, nor does it clarify how 'keyword' and 'customer_id' relate or when to use each. It also omits pagination parameters (page, pagesize). The description adds some value but insufficiently compensates for the low schema coverage.

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 clearly states the action (look up) and resource (customers), and lists the search fields. It is distinct from sibling tools (tickets, invoices, etc.) which target different resources. However, it does not mention the 'action' parameter that distinguishes between listing and getting a single customer, leaving some ambiguity about the exact operation.

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 this tool is for customer lookup but provides no explicit guidance on when to use it versus alternatives. Since siblings are for other resources, the use case is fairly obvious, yet there is no mention of scenarios like retrieving a specific customer vs. browsing all customers, which the action parameter addresses.

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

repairdesk_employeesC

List employees/technicians.

NameRequiredDescriptionDefault
pageNo
pagesizeNo

TDQS

C2.6/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says 'List', which implies a read operation, but it does not disclose pagination behavior, return format, or any side effects. For a simple listing tool, the lack of even basic behavioral context (e.g., that results are paged) leaves the agent guessing about what to expect.

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

Conciseness4/5

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

The description is a single, concise sentence that front-loads the verb and resource. It is not verbose or redundant, and it follows a clear structure. However, it is so terse that it borders on under-specification, but the dimension is about conciseness and structure, not completeness, so it earns a 4.

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

Completeness2/5

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

Given no output schema and no annotations, the description should at least hint at pagination and typical response characteristics. The description covers only the basic action and does not mention that results may be paged (as implied by the parameters) or what fields to expect. An agent cannot fully anticipate the tool's behavior from this description alone.

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

Parameters1/5

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

Schema description coverage is 0%, and the description does not mention the 'page' or 'pagesize' parameters at all. Since the schema properties have no descriptions, the agent has no explanation of these parameters beyond their names and defaults. The description fails to compensate for the lack of schema documentation.

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 clearly states the action ('List') and the resource ('employees/technicians'). It is not a tautology and provides a specific verb+resource pair. However, it does not explicitly differentiate from sibling tools, though no other sibling handles employees, so it is reasonably distinct.

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 provides no guidance on when to use this tool versus alternatives. It does not mention any conditions, exclusions, or contexts where another tool like repairdesk_tickets or repairdesk_customers would be more appropriate. The only intended use is implicit from the resource name.

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

repairdesk_inventoryC

Search inventory/parts stock.

NameRequiredDescriptionDefault
pageNo
keywordNo
pagesizeNo

TDQS

C2.4/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. The tool is a search, which implies a read-only operation, but the description does not state that explicitly, nor does it mention pagination behavior, response structure, or any side effects. It only states the purpose without disclosing observable behaviors or constraints. Both the read-only nature and pagination are left entirely to inference.

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

Conciseness3/5

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

The description is a single short sentence with no fluff or redundancy, which is technically concise. However, it is under-specified for an agent; the brevity does not earn its place because it omits essential information. It is neither front-loaded with useful details nor structured to guide usage. It is compact but not informative, so a middle score is appropriate.

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

Completeness1/5

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

For a tool with 3 parameters, no output schema, and no annotations, the description is severely incomplete. It does not explain what the search returns, what fields are searched, how to paginate, or what a typical response looks like. An agent cannot confidently call this tool correctly because it lacks the context needed to construct a valid query or interpret results. The description is virtually absent.

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

Parameters1/5

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

The input schema has 0% coverage (no descriptions for page, keyword, or pagesize), so the description must compensate and explain parameter meaning. It does not mention any of the parameters at all. The agent is left to guess what 'keyword' searches against (e.g., part name, SKU) and how pagination is applied. The description provides zero value beyond the schema structure.

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

Purpose4/5

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

The description states a clear action ('Search') and a clear resource ('inventory/parts stock'). It distinguishes the tool from siblings like repairdesk_tickets, repairdesk_customers, and repairdesk_invoices by naming the resource domain. However, it could be more specific about what 'inventory/parts' means in the repair-desk context (e.g., parts availability), but the core purpose is unambiguous.

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 provides no guidance on when to use this tool versus alternatives. It does not mention any context such as 'use this to find parts available for a repair' or 'use this to check stock levels.' There are no exclusions or references to sibling tools. The only implied usage is searching inventory, which is not explicit enough to route an agent effectively.

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

repairdesk_invoicesC

Search invoices, get details, or check due/outstanding amounts.

NameRequiredDescriptionDefault
pageNo
actionYes
statusNo
keywordNo
to_dateNo
pagesizeNo
from_dateNo
invoice_idNo

TDQS

C2.7/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions three distinct operations but does not disclose side effects, permission requirements, rate limits, or return behavior. The description adds little beyond what the tool name implies, leaving the agent uncertain about operational impact.

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

Conciseness4/5

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

The description is a single concise sentence with no waste, front-loading the core purpose. However, given the tool's complexity (8 parameters, 3 actions), it is under-specified. The conciseness itself is good, but the structure lacks the necessary detail to be fully valuable.

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

Completeness1/5

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

The tool has 8 parameters, an action enum, and no output schema, yet the description provides almost no contextual information. It does not explain how the three actions map to the enum values, what each parameter does, or what the response format looks like. This is critically incomplete for an agent to use effectively.

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

Parameters1/5

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

Schema description coverage is 0% because the description does not mention any parameters. It fails to explain the meaning of action values, how keyword filtering works, date ranges, pagination, or the purpose of invoice_id. With 8 parameters and zero description coverage, the agent is left to guess parameter usage from the schema alone, which is insufficient.

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

Purpose5/5

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

The description states a clear verb+resource: search, get details, and check amounts specifically for invoices. It distinguishes itself from sibling tools that handle tickets, customers, etc., even though it doesn't name them. The three actions are explicit and convey the tool's scope.

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 tool versus alternatives. It does not mention any exclusions, prerequisites, or conditions for using one action over another. An agent must infer usage context from the action enum, but the description provides no such context.

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

repairdesk_shop_infoB

Look up reference data: devices, categories, statuses, colors, networks, tax classes, payment methods, referral sources, repair types, service types, locations, problems (by device), trade-ins, purchase orders.

NameRequiredDescriptionDefault
pageNo
brandNoFilter devices by brand
lookupYes
keywordNo
pagesizeNo
device_idNoRequired when lookup=problems
device_nameNoFilter devices by name

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations provided, the description must carry the full burden of disclosing behavioral traits. It indicates a read operation ('look up') and hints at a dependency for problems ('by device'), but it does not explicitly state that the tool is read-only, has no side effects, requires authentication, or handles pagination. The description lacks essential behavioral context for an agent to call it safely without assumptions.

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

Conciseness4/5

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

The description is compact, consisting of a single sentence that front-loads the verb and resource. It efficiently enumerates the lookup types without unnecessary filler. While the list is long, it is still concise and well-structured, earning a high but not perfect score for brevity.

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

Completeness2/5

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

Given the tool's complexity (7 parameters, one required, low schema coverage, no output schema), the description is far too sparse. It does not explain return values, pagination behavior, required dependencies (e.g., device_id for problems), or how to effectively use filters. An agent would need to infer much from the sparse schema descriptions, making the tool under-documented.

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

Parameters2/5

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

Schema description coverage is only 43% (only brand, device_id, and device_name have descriptions), so the description needs to compensate by explaining parameter usage. However, it only lists the lookup enum values and mentions 'problems (by device)' without tying that to the device_id parameter. It does not clarify the role of page, pagesize, keyword, or how filters work, leaving a significant semantic gap.

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

Purpose5/5

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

The description uses a clear verb ('Look up') and a specific resource ('reference data'), then enumerates the exact entity types supported. This makes the tool's purpose unambiguous and distinguishes it from siblings like repairdesk_tickets or repairdesk_inventory, which handle operational entities rather than lookups.

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 this tool is for retrieving reference data, and its distinct name and content signal a different usage context from the sibling tools. However, there is no explicit statement about when to use this tool versus alternatives, nor exclusions for when not to use it. The guidance is only implied by the tool's nature, not stated.

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

repairdesk_ticketsB

Search and look up repair tickets. List tickets filtered by status, date, keyword, or tech. Get full details by ticket ID.

NameRequiredDescriptionDefault
pageNo
actionYes"list" to search, "get" for specific ticket
statusNoFilter by status (Pending, In Progress, Repaired, etc.)
keywordNoSearch keyword (customer name, device, etc.)
to_dateNoEnd date as Unix timestamp
pagesizeNo
from_dateNoStart date as Unix timestamp
ticket_idNoTicket ID (for action=get)
assigned_toNoFilter by assigned employee ID

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of disclosing behavior. It uses read-oriented verbs ('search', 'look up', 'list', 'get') implying a non-destructive operation, but it never explicitly states that no changes are made. It also discloses filtering capabilities but omits details like pagination behavior or any side effects, which is a moderate gap for a read tool.

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

Conciseness5/5

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

The description is two sentences with no fluff. It front-loads the primary action and then lists the filter options in a logical order. Every word contributes to understanding the tool's purpose and usage.

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 search tool with no output schema and moderate complexity (9 parameters, but only one required), the description covers the main actions (list with filters, get by ID). It does not explicitly mention pagination or the response format, but given the simple read nature and the schema covering parameters, it is reasonably complete. A slightly more detailed mention of return contents would push it higher.

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 78% (slightly below the high threshold), so the description partially compensates by enumerating filter categories (status, date, keyword, tech) and mentioning 'get by ticket ID'. This maps to several parameters, but it adds little beyond the schema's own descriptions, which already explain each parameter's purpose. Overall, it meets the baseline for a moderately covered 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?

The description clearly identifies the tool as a search/lookup for repair tickets with specific verbs (search, look up, list, get) and a resource (repair tickets). It effectively conveys the read-only nature, though it does not explicitly mention the sibling write tool or contrast itself, so it stops short of full differentiation.

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 implies the tool is for reading/searching but provides no explicit guidance on when to use this tool versus alternatives like repairdesk_tickets_write. There are no statements about when not to use it or prerequisites, leaving the agent to infer usage context from the action enum and filter descriptions.

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

repairdesk_tickets_writeA

Create/update tickets, add notes, assign techs. WARNING: Status changes may trigger automatic customer SMS/email! Statuses that notify: Repaired, Ready for Pickup, Completed, Waiting on Customer, Waiting For Quote, Cancelled. ALWAYS confirm with user before status changes.

NameRequiredDescriptionDefault
noteNoNote text (for add_note)
actionYes
statusNoTicket status — MAY TRIGGER NOTIFICATION
confirmedNoMust be true for status changes
device_idNoDevice type ID (for create)
note_typeNointernal or diagnosticinternal
ticket_idNoTicket ID (for update/add_note/assign)
service_idNoService/repair item ID
customer_idNoCustomer ID (for create)
device_nameNoDevice name/model
service_nameNoService name
security_codeNoDevice PIN/password
serial_numberNo
technician_idNoEmployee ID (for assign)
additional_notesNoInternal notes

TDQS

A4.2/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It discloses the major side effect: status changes may trigger automatic customer SMS/email and lists the specific statuses that notify. It also mandates confirmation. This covers the primary behavioral risk, though it does not mention authentication or rate limits, which is acceptable for this context.

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

Conciseness5/5

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

The description is concise and effective: a single sentence states the purpose, then a warning in caps draws attention to the critical side effect and the confirmation requirement. Every sentence earns its place with no fluff, and the critical warning is front-loaded.

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?

The tool is complex with 15 parameters and multiple actions, but the schema provides detailed per-parameter descriptions and the action enum clarifies usage. The description covers the essential context: what the tool does and the notification risk. It does not need to explain return values since there is no output schema. The description is sufficiently complete for an agent to call it correctly with the schema's help.

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 87%, so the schema already explains most parameters well (e.g., note, ticket_id, customer_id). The description's warning about status notifications adds context to the status parameter, but the schema already includes 'MAY TRIGGER NOTIFICATION'. The description does not add significant semantic value beyond the schema; it meets the baseline for high schema coverage.

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

Purpose5/5

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

The description clearly states the tool's actions: create/update tickets, add notes, assign techs. It names the specific resource (tickets) and verb, distinguishing it from the read-focused sibling repairdesk_tickets. The purpose is unambiguous and not a tautology.

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 description includes explicit guidance to always confirm with the user before status changes, which is critical for safe usage. It implies this is the write tool vs. the read tool repairdesk_tickets, though it does not explicitly name alternatives. The confirmation requirement is a clear usage rule.

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. 7 tool updatesv1.0.0
    • First observedrepairdesk_customers
    • First observedrepairdesk_employees
    • First observedrepairdesk_inventory
    • First observedrepairdesk_invoices
    • First observedrepairdesk_shop_info
    • First observedrepairdesk_tickets
    • First observedrepairdesk_tickets_write

TDQS

B3.3/5.0

Scored across 7 tools

Disambiguation5/5

Each tool targets a distinct domain entity (tickets, customers, invoices, inventory, employees, reference data), with read and write operations clearly separated. There is no overlap or ambiguity between tool purposes.

Naming Consistency4/5

All tools share a consistent 'repairdesk_' prefix and noun-based names (customers, invoices, inventory, etc.). The 'tickets' vs 'tickets_write' pair introduces a minor inconsistency, but overall the naming pattern is predictable and clear.

Tool Count5/5

Seven tools is well-scoped for a repair shop management domain. Each tool covers a necessary function without redundancy, making the set compact and purposeful.

Completeness4/5

The surface provides full ticket lifecycle (search, create, update), customer lookup, invoice queries, inventory search, employee list, and reference data. Minor gaps like ticket deletion or invoice creation exist, but the core workflows are covered.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    Enables AI assistants to manage RogerRoger CRM data including people, organizations, lists, tags, and tasks through standardized MCP tools.
    22
    3 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to read and manage a Jobkeepr field service business including jobs, customers, scheduling, estimates, invoices, and payments via MCP.
    19
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to query and operate a help desk and service desk through MCP over HTTP, including tickets, requester communications, internal notes, attachments, stage and SLA history, time entries, clients, requesters, desks, knowledge base, contracts, and billing/satisfaction reports.
    MIT