SyncroMSP MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCP_AUTH | No | Enable or disable OAuth authentication (true or false) | true |
| MCP_PORT | No | HTTP listen port (used when MCP_TRANSPORT=http) | 8080 |
| MCP_BASE_URL | No | Public HTTPS URL for Docker deployment (e.g., https://mcp.yourcompany.com) | |
| MCP_TOOL_MODE | No | Tool mode: 'flat' (all tools) or 'navigation' (lazy domains) | flat |
| MCP_TRANSPORT | No | Transport mode: 'stdio' (local) or 'http' (Docker/remote) | stdio |
| SYNCRO_API_KEY | Yes | Your Syncro API token | |
| MCP_AUTH_SECRET | No | Access key for OAuth; minimum 32 characters, required for Docker | |
| SYNCRO_SUBDOMAIN | Yes | Your Syncro subdomain (the part before .syncromsp.com) | |
| MCP_I_UNDERSTAND_INSECURE | No | Must be 'true' to disable auth (foot-gun guard) |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| tickets_listA | List tickets with optional filters. Returns paginated results. |
| tickets_getB | Get a single ticket by ID with full details |
| tickets_createA | Create a new ticket. Requires customer_id and subject at minimum. Note: line_items cannot be added inline during creation -- use tickets_add_line_item after the ticket is created. |
| tickets_updateB | Update an existing ticket. Only provided fields will be changed. |
| tickets_deleteA | DELETE a ticket permanently. This action cannot be undone. The user MUST confirm before executing this. |
| tickets_get_commentsC | Get all comments on a ticket |
| tickets_commentA | Add a comment to a ticket. Three comment modes: (1) Email reply: hidden=false, do_not_email=false sends email to customer. (2) Public note: hidden=false, do_not_email=true is visible on portal/invoice but no email sent. (3) Private note: hidden=true, do_not_email=true is tech-only and invisible to customer. Note: subject is REQUIRED or the API returns 422. |
| tickets_add_line_itemA | Add a line item (product/service charge) to a ticket. Note: name and description are REQUIRED even when using product_id (unlike invoices/estimates which auto-fill from catalog). |
| tickets_remove_line_itemA | Remove a line item from a ticket. The user MUST confirm before executing this. |
| tickets_update_line_itemB | Update a line item on a ticket |
| tickets_add_timerA | Add a timer entry to a ticket for time tracking. Note: start_at is REQUIRED (API returns 422 without it). duration_minutes auto-calculates end_time from start_at. |
| tickets_update_timerC | Update a timer entry on a ticket |
| tickets_delete_timerA | Delete a timer entry from a ticket. The user MUST confirm. |
| tickets_charge_timerB | Charge a timer entry on a ticket (convert to billable line item) |
| tickets_attach_fileA | Attach a file to a ticket via URL |
| tickets_delete_attachmentA | Delete an attachment from a ticket. The user MUST confirm. |
| tickets_printB | Generate a printable PDF for a ticket |
| tickets_settingsA | Get ticket system settings |
| tickets_list_commentsA | List ticket comments across multiple tickets as a flat paginated feed (distinct from tickets_get_comments which is scoped to one ticket). Sorted by ticket_id ASC, created_at DESC. Scope via ticket_search_id, ticket_id, customer_id, contact_id, user_id, status, mine, or date filters. comment_created_after/before filter at the comment level; the other date filters operate on the parent ticket. |
| tickets_blueprints_listA | List Ticket Blueprints available for ticket creation (hidden ones are excluded). Returns id, name, role, and children_count for each blueprint. |
| tickets_blueprints_applyA | Create tickets from a Blueprint -- spawns the parent ticket and any child tickets defined by the blueprint, all assigned to the given customer. Returns { ticket_id, child_ticket_ids }. |
| customers_listA | List customers with optional filters. Returns paginated results. |
| customers_getA | Get a single customer by ID with full details |
| customers_createA | Create a new customer. Note: phone and mobile fields auto-create entries in the phones sub-resource. |
| customers_updateB | Update an existing customer. Only provided fields will be changed. |
| customers_deleteA | DELETE a customer permanently. The user MUST confirm before executing. |
| customers_latestB | Get the most recently created customers |
| customers_autocompleteB | Autocomplete search for customers by name or business |
| customers_list_phonesA | List phone numbers for a customer |
| customers_create_phoneB | Add a phone number to a customer |
| customers_update_phoneC | Update a phone number for a customer |
| customers_delete_phoneA | Delete a phone number from a customer. The user MUST confirm. |
| assets_listB | List customer assets with optional filters. Returns paginated results. |
| assets_getA | Get a single asset by ID with full details |
| assets_list_by_contactA | List the assets linked to one contact, sorted by name. 50 per page. |
| assets_createA | Create a new customer asset. Note: asset_type_name must match an existing type in the account. Custom properties on create are IGNORED -- set them via assets_update after creation. |
| assets_updateA | Update an existing asset. Use this to set asset properties (hdd, manufacturer, model, os, cpu_name, ram, last_boot) after creation, as properties on create are ignored. Pass policy_folder_id to move the asset to a same-customer policy folder (see policies_list_folders). |
| assets_get_patchesB | Get patch information for an asset (available OS/software patches) |
| assets_get_installed_applicationsA | Get the paginated list of software applications installed on an asset. Returns name, vendor, version, and installed_at (falls back to first-seen date when no explicit install date is recorded). |
| assets_chat_infoB | Get chat information for assets by IDs |
| contacts_listC | List contacts with optional filters |
| contacts_getA | Get a single contact by ID |
| contacts_createB | Create a new contact for a customer |
| contacts_updateB | Update an existing contact |
| contacts_deleteA | DELETE a contact permanently. The user MUST confirm. |
| invoices_listB | List invoices with optional filters |
| invoices_getA | Get a single invoice by ID |
| invoices_createA | Create a new invoice. Note: line_items in the create body are IGNORED by the API -- add line items via invoices_add_line_item after creation. |
| invoices_updateB | Update an existing invoice |
| invoices_deleteA | DELETE an invoice permanently. The user MUST confirm. |
| invoices_get_ticketC | Get the ticket associated with an invoice |
| invoices_printB | Generate a printable PDF for an invoice |
| invoices_emailC | Email an invoice to the customer |
| invoices_publishA | Publish a draft invoice so it becomes a normal invoice. Needs draft invoices turned on for the account (404 otherwise). Refunds cannot be drafts, so Syncro refuses to publish them. |
| invoices_convert_to_draftA | Turn a published invoice back into a draft so it can be edited before re-publishing. Needs draft invoices turned on for the account (404 otherwise). Syncro refuses (422) if a payment has been applied, the invoice was posted to an accounting provider, or it is a refund. |
| invoices_add_line_itemA | Add a line item to an invoice. When using product_id, only product_id + quantity are needed -- the API auto-fills name, cost, and price from the product catalog. |
| invoices_update_line_itemB | Update a line item on an invoice |
| invoices_delete_line_itemB | Delete a line item from an invoice. The user MUST confirm. |
| estimates_listB | List estimates with optional filters |
| estimates_getB | Get a single estimate by ID |
| estimates_createA | Create a new estimate. Note: line_items array in the create body is IGNORED by the API -- add line items via estimates_add_line_item after creation. |
| estimates_updateB | Update an existing estimate |
| estimates_deleteA | DELETE an estimate permanently. The user MUST confirm. |
| estimates_printB | Generate a printable PDF for an estimate |
| estimates_emailC | Email an estimate to the customer |
| estimates_convert_to_invoiceB | Convert an estimate to an invoice |
| estimates_add_line_itemA | Add a line item to an estimate. When using product_id, only product_id + quantity are needed -- the API auto-fills name, cost, and price from the product catalog. |
| estimates_update_line_itemC | Update a line item on an estimate |
| estimates_delete_line_itemB | Delete a line item from an estimate. The user MUST confirm. |
| appointments_listC | List appointments with optional date range filter |
| appointments_getB | Get a single appointment by ID |
| appointments_createA | Create a new appointment. When possible, link to a ticket via ticket_id -- this auto-populates the description with ticket details and the location from the customer address. |
| appointments_updateC | Update an existing appointment |
| appointments_deleteA | DELETE an appointment. The user MUST confirm. |
| appointments_list_typesA | List appointment types |
| appointments_get_typeB | Get an appointment type by ID |
| appointments_create_typeB | Create a new appointment type. Note: location_type is REQUIRED (API returns 422 without it). Integer value where 0 = 'customer'. |
| appointments_update_typeC | Update an appointment type |
| appointments_delete_typeA | DELETE an appointment type. The user MUST confirm. |
| products_listC | List products/inventory items |
| products_getB | Get a product by ID |
| products_createA | Create a new product. Note: products have no DELETE endpoint -- use products_update with disabled=true instead. Custom properties on create may be ignored -- set via products_update after creation. |
| products_updateC | Update a product |
| products_barcodeB | Look up a product by barcode/UPC |
| products_categoriesB | List product categories |
| products_add_imagesB | Add images to a product |
| products_delete_imageC | Delete an image from a product. The user MUST confirm. |
| products_update_location_qtyC | Update product quantity at a location |
| products_list_serialsB | List serial numbers for a product |
| products_create_serialB | Create a serial number for a product |
| products_update_serialC | Update a product serial |
| products_attach_serial_to_line_itemC | Attach serial numbers to a line item |
| products_list_skusC | List SKUs for a product |
| products_create_skuB | Create a SKU for a product |
| products_update_skuC | Update a product SKU |
| products_delete_skuA | DELETE a product SKU. The user MUST confirm. |
| payments_listC | List payments |
| payments_getA | Get a single payment by ID |
| payments_createC | Record a payment. Use apply_payments to distribute a payment across multiple invoices. |
| payments_list_methodsA | List available payment methods |
| payments_list_profilesA | List stored payment profiles for a customer |
| payments_get_profileC | Get a payment profile by ID |
| payments_create_profileB | Create a stored payment profile for a customer |
| payments_update_profileC | Update a payment profile |
| payments_delete_profileA | Delete a payment profile. The user MUST confirm. |
| leads_listC | List leads/opportunities |
| leads_getA | Get a lead by ID |
| leads_createB | Create a new lead. Note: leads have no DELETE endpoint. To soft-delete, use leads_update with disabled=true. |
| leads_updateC | Update an existing lead |
| contracts_listD | List contracts |
| contracts_getA | Get a contract by ID |
| contracts_createA | Create a new contract. Note: there is no 'notes' field -- 'description' is the only text field. The activity/notes section in the UI is not API-accessible. |
| contracts_updateB | Update a contract. Note: there is no 'notes' field -- 'description' is the only text field. The activity/notes section in the UI is not API-accessible. |
| contracts_deleteA | DELETE a contract (soft-delete -- GET returns null after deletion, not 404). The user MUST confirm. |
| rmm_list_alertsC | List RMM alerts |
| rmm_get_alertA | Get an RMM alert by ID |
| rmm_create_alertA | Create an RMM alert. Note: formatted_output (not in swagger) populates the 'Details' field in the UI. description maps to the 'Type' field. Include properties with trigger and description keys to match real alert structure. |
| rmm_mute_alertB | Mute an RMM alert. Requires mute_for parameter. |
| rmm_delete_alertA | DELETE (soft-resolve) an RMM alert. Sets resolved=true -- the alert is still readable via GET after deletion. The user MUST confirm. |
| rmm_schedule_scriptA | Run an RMM script on one asset, now or once at a later time. Recurring schedules are not allowed through the API. No API lists scripts, so get script_id from the script's page in Syncro. This runs code on a customer machine: the user MUST confirm. |
| scheduling_listC | List recurring invoice schedules |
| scheduling_getC | Get a schedule by ID |
| scheduling_createA | Create a recurring invoice schedule. Always create with paused=true to prevent auto-firing during setup. Note: invoice-side fields (invoice name, employee, template, billing terms, memo) are NOT settable via API. |
| scheduling_updateC | Update a schedule |
| scheduling_deleteA | DELETE a schedule. The user MUST confirm. |
| scheduling_add_line_itemA | Add a line item to a recurring invoice schedule. Needs name or product_id. Pricing is in cents (retail_cents, cost_cents) or dollars (price_retail, price_cost). recurring_type_id picks the line type, e.g. 4 bills a customer's assets by type and 9 bills the assets in a policy folder; the type-specific fields only apply to their type. |
| scheduling_remove_line_itemB | Remove a line item from a schedule. The user MUST confirm. |
| scheduling_update_line_itemB | Update a line item on a schedule. Takes the same fields as scheduling_add_line_item; only the fields you send change. |
| time_list_timersA | List ticket timers across tickets. Filter by ticket, technician, timer state, customer, or derived billing status. Use status 'running' or 'paused' to find a timer to pause or stop. |
| time_create_timerA | Start a live timer on a ticket for the API token's technician (user_id cannot be set). If that technician already has a running or paused timer on the ticket, Syncro resumes and returns it instead of making a second one. Omit billable to use the account default. For logging past work, use tickets_add_timer instead. |
| time_start_timerA | Start a timer that has never run, or resume a paused one. Syncro returns 422 if the timer is already running or stopped. |
| time_pause_timerA | Pause a running timer. Syncro returns 422 if the timer is not running. |
| time_stop_timerA | Stop a running or paused timer. If the account has 'charge timers by default' turned on, this also adds the charge line item to the ticket; otherwise charge it afterwards with tickets_charge_timer (timer_entry_id = this timer's ID). Syncro returns 422 if the timer is already stopped. |
| time_update_timerA | Change whether a ticket timer is billable. To start, pause, or stop a timer use time_start_timer, time_pause_timer, or time_stop_timer; to change notes or duration use tickets_update_timer. |
| time_list_timelogsC | List employee time logs (clock in/out records) |
| time_update_timelogC | Update a time log entry (clock in/out, lunch, notes) |
| time_get_last_timelogA | Get the most recent time log entry for the current user |
| admin_searchA | Global search across Syncro (tickets, customers, assets, invoices, etc.) |
| admin_get_meA | Get the currently authenticated user's profile |
| admin_list_usersB | List all users/technicians |
| admin_get_userC | Get a user by ID |
| admin_get_settingsB | Get system settings |
| admin_get_tabsA | Get settings tabs configuration |
| admin_get_printingB | Get printing settings |
| admin_list_vendorsC | List vendors |
| admin_get_vendorB | Get a vendor by ID |
| admin_create_vendorC | Create a new vendor. Note: there is no delete endpoint for vendors. |
| admin_update_vendorC | Update a vendor |
| admin_list_wikiC | List wiki pages |
| admin_get_wikiB | Get a wiki page by ID |
| admin_create_wikiC | Create a wiki page |
| admin_update_wikiC | Update a wiki page |
| admin_delete_wikiA | DELETE a wiki page. The user MUST confirm. |
| admin_list_portal_usersC | List customer portal users |
| admin_create_portal_userA | Create a customer portal user. Always provide contact_id to associate a person/name -- without it the portal user shows as an anonymous email. |
| admin_update_portal_userD | Update a portal user |
| admin_delete_portal_userB | DELETE a portal user. The user MUST confirm. |
| admin_create_portal_invitationC | Send a portal invitation to a user |
| admin_list_canned_responsesC | List canned ticket responses |
| admin_create_canned_responseB | Create a canned response |
| admin_update_canned_responseC | Update a canned response |
| admin_delete_canned_responseA | DELETE a canned response. The user MUST confirm. |
| admin_get_canned_settingsC | Get canned response settings |
| admin_caller_idB | Look up caller information by phone number |
| admin_create_user_deviceB | Register a user device for push notifications |
| admin_get_user_deviceB | Get a user device by ID |
| admin_update_user_deviceC | Update a user device |
| admin_list_ticket_formsC | List new ticket forms |
| admin_get_ticket_formC | Get a ticket form by ID |
| admin_process_ticket_formC | Submit/process a new ticket form |
| admin_list_worksheetsC | List worksheet results for a ticket |
| admin_get_worksheetC | Get a worksheet result by ID |
| admin_create_worksheetB | Create a worksheet result for a ticket. Note: worksheet_template_id is required and must reference an existing admin-configured template. |
| admin_update_worksheetD | Update a worksheet result |
| admin_delete_worksheetB | DELETE a worksheet result. The user MUST confirm. |
| admin_list_purchase_ordersC | List purchase orders |
| admin_get_purchase_orderB | Get a purchase order by ID |
| admin_create_purchase_orderC | Create a purchase order |
| admin_update_purchase_orderA | Update a purchase order. Only status, general_notes, shipping_cents, delivery_tracking, and vendor_id can be changed. Syncro rejects the 'Finished' status while any line item is still unreceived. |
| admin_add_po_attachmentA | Attach a file (vendor quote, invoice, packing slip) to a purchase order. Give exactly one source: file_url (a direct download link; works everywhere), file_path (a file on this computer; local installs only), or file_base64 (only for tiny files you create yourself, like a short CSV, because the whole file must be written out). Allowed: JPEG, PNG, GIF, PDF, CSV, XLS, XLSX. Max 10 MB and 10 files per PO; the extension must match the real file type. |
| admin_receive_purchase_orderC | Receive a line item on a purchase order |
| admin_add_po_line_itemA | Add a line item to a purchase order. Note: the product must have maintain_stock=true or the API returns 422. |
| admin_list_itemsB | List items (global item catalog) |
| admin_list_line_itemsA | List line items across invoices/tickets |
| admin_otp_loginB | Login with a one-time password code |
| policies_list_foldersA | List policy folders for a customer. customer_id is required. Returns paginated results with each folder's parent_id, partial_policy_id (policy attached at this folder), and effective_policy_id (inherited policy). |
| policies_get_folderA | Get a single policy folder by ID with full details. |
| policies_create_folderA | Create a new policy folder under an existing parent folder. customer_id, name, and parent_id are all required -- folders cannot be created at the root level (the root folder is auto-created per customer). Use policies_list_folders first to find the root or desired parent folder ID. |
| policies_update_folderA | Update an existing policy folder. Use this to rename, re-parent, or attach/detach a partial policy. Set partial_policy_id to null to detach the policy at this folder; the effective_policy_id then inherits from the parent. |
| policies_delete_folderA | DELETE a policy folder permanently. The folder must not have child folders (422 otherwise). This action cannot be undone -- the user MUST confirm before executing this. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 190 tools
Many tools have clearly distinct purposes (e.g., tickets_list vs customers_get), but significant overlaps exist between timer tools (tickets_add_timer vs time_create_timer, time_start_timer, time_stop_timer) and comment tools (tickets_get_comments vs tickets_list_comments), which could lead to misselection despite descriptive hints.
Tools mostly follow a consistent domain_prefix_action pattern (e.g., tickets_list, customers_get, invoices_create), but minor deviations like the 'time_' prefix for ticket timers and non-verb names (products_barcode, customers_latest) slightly break the otherwise predictable convention.
With 190 tools, the set is extremely bloated far beyond a well-scoped range. Even for a large platform like SyncroMSP, this volume creates significant noise and makes it difficult for an agent to discover and select the right tool.
The surface covers most major domains with CRUD and lifecycle operations, but notable gaps exist such as no assets_delete and no payments_update. Agents can often work around these (e.g., using disabled=true for soft-delete), so the gaps are minor.