Connectors · Accounting & finance
ServiceTitan MCP server for AI agents.
actionlake is an MCP gateway: one remote MCP server that connects Claude and other MCP clients to ServiceTitan and the rest of your systems. It gives your agent 591 ServiceTitan actions (331 reads, 218 writes and 42 that wait for a confirmation) and holds the ServiceTitan credential itself, so the agent never does. It paces ServiceTitan's limits and records every call.
100,000 free calls a month. No card, no email, no password: press Start a free sandbox on the next screen and keep the key it shows you.
claude mcp add --transport http actionlake https://connect.actionlake.com/mcpdo { action: "servicetitan.invoices.list", intent: "check which ServiceTitan account is connected"}# Retrieves a list of invoices. By default, all invoices will be returned regardless of status. · read · 1 upstream call- 591actionsin one signed file
- 331readlook, never change
- 218writecreate and update
- 42wait for a yesdestructive, confirmed first
Set up
Connect ServiceTitan in three steps.
- 01
Add actionlake to Claude.
Run the command once in Claude Code; its consent page can create a free sandbox: 100,000 calls a month, no card. In the Claude app, add a custom connector with the URL below and paste your key on the consent page. Creating a new sandbox from the Claude app is not yet tested by us.
https://connect.actionlake.com/mcp - 02
Connect ServiceTitan.
OAuth 2.0, client credentials. Paste the app's client id and secret; actionlake fetches and renews the token, and nobody has to sign in. actionlake stores what you paste write-only, sealed under your tenant's key.
client_idServiceTitan client ID: in ServiceTitan go to Settings > Integrations > API Application Access, connect your…client_secretServiceTitan client secret (shown once when generated for the tenant)app_keyYour ServiceTitan app keytenant_idYour ServiceTitan tenant id
account { op: "connections.requirements", service: "servicetitan" } # free: exactly what to paste, and what is found for you - 03
Make the first call. Check before a write.
Ask in plain words; Claude picks the action. Before anything changes,
checkvalidates the call and prices it, for free.do { action: "servicetitan.invoices.list" }# retrieves a list of invoices. by default, all invoices will be returned regardless of status. · read · 1 upstream callcheck { action: "servicetitan.invoices.create", input: { … } }# free: inputs, permissions, cost and confirmations, nothing sent
ServiceTitan at a glance
- Sign-in
- OAuth 2.0, client credentials. Paste the app's client id and secret; actionlake fetches and renews the token, and nobody has to sign in.
- You provide
client_idclient_secret- Setup fields
app_keytenant_id- Limits we pace to
- 60 calls a second, per connection
- API covered
- ServiceTitan (field service management: CRM, jobs, dispatch, pricebook, accounting, payroll) API ServiceTitan v2 tenant APIs (25 module OpenAPI 3.1 documents, 602 operations)
api.servicetitan.io - Built from
- ServiceTitan's documentation, read 22 October 2026developer.servicetitan.iodeveloper.servicetitan.iodeveloper.servicetitan.io
- Service file
- Version 1.0.0, signed (Ed25519)
- Cached reads
- 331 of 331 reads, for up to 5 minutes; a write clears what it affects
- Shared entities
- 17, so ask can line ServiceTitan up with your other systems
- Data
- Processed and stored in Sydney, Australia. No US region yet
Capabilities
What an AI agent can do in ServiceTitan.
591 actions in 25 areas. Every one carries its effect, so a key can allow the reads and hold the rest.
- 331readlook, never change
- 218writecreate and update
- 42destructivewait for a confirmation
CRM
8640 read · 35 write · 11 destructive
Gets a list of contacts · Gets a list of Customers · Gets a list of locations · Gets a list of leads
Accounting
7643 read · 31 write · 2 destructive
Retrieves a list of invoices. By default, all invoices will be returned regardless of status. · Gets a paginated list of payments · create adjustment invoice · update invoice
JPM
7545 read · 24 write · 6 destructive
Gets a list of projects · Gets a list of jobs · Creates a New Project · Gets a list of appointments
Inventory
5322 read · 30 write · 1 destructive
Get a list of purchase orders · Create a new purchase order · Get purchase order by Id · Get a list of vendors
Dispatch
4117 read · 18 write · 6 destructive
Assigns the list of technicians to the appointment · Gets a list of appointment assignments · Unassigns the list of technicians from the appointment · ArrivalWindows Create
Payroll
3828 read · 8 write · 2 destructive
Gets a list of payroll activity codes · Gets a list of employee payrolls · Provides export feed for activity codes · Provides export feed for gross pay items
Pricebook
3818 read · 15 write · 5 destructive
ClientSpecificPricing GetAllRateSheets · Post to add a new discount or fee to your pricebook · Get data on all of the discounts or fees in the pricebook. Supports optional search filtering. · Post to add new equipment to your pricebook
Memberships
3023 read · 7 write · 0 destructive
Provides export feed for invoice templates · Provides export feed for customer membership status changes · Provides export feed for membership types · Provides export feed for customer memberships
17 more areas · 154 actions
- Sales 25
- Settings 22
- Equipment systems 19
- Marketing 16
- Timesheets 12
- Findings 10
- Reporting 8
- Telecom 8
- Marketing ads 7
- Scheduling pro 5
- Task management 5
- Customer interactions 4
- Forms 4
- Service agreements 4
- Fleet pro 3
- Job booking 1
- Marketing reputation 1
Top actions
The ServiceTitan API, shaped for agents.
The ids your agent types, what each does, and the one name it shares with other systems. 90 of ServiceTitan's 90 action names are shared with at least one other connector, so an agent learns them once.
| Action | What it does | Effect | Same name in |
|---|---|---|---|
servicetitan.invoices.listRetrieves a list of invoices. By default, all invoices will be returned regardless of status. | Retrieves a list of invoices. By default, all invoices will be returned regardless of status. | read | finance.invoice.list101 connectors |
servicetitan.payments.listGets a paginated list of payments | Gets a paginated list of payments. | read | finance.payment.list75 connectors |
servicetitan.estimates.listEstimates GetList | Estimates GetList. | read | finance.quote.list52 connectors |
servicetitan.purchase_orders.listGet a list of purchase orders | Get a list of purchase orders. | read | finance.purchase_order.list45 connectors |
servicetitan.contacts.listGets a list of contacts | Gets a list of contacts. | read | crm.contact.list177 connectors |
servicetitan.customers.listGets a list of Customers | Gets a list of Customers. | read | crm.company.list162 connectors |
servicetitan.technicians.listGets a list of technicians | Gets a list of technicians. | read | identity.user.list474 connectors |
servicetitan.locations.listGets a list of locations | Gets a list of locations. | read | crm.location.list48 connectors |
servicetitan.invoices.createcreate adjustment invoice | create adjustment invoice. | write | finance.invoice.create74 connectors |
servicetitan.estimates.createEstimates Create | Estimates Create. | write | finance.quote.create52 connectors |
servicetitan.purchase_orders.createCreate a new purchase order | Create a new purchase order. | write | finance.purchase_order.create43 connectors |
servicetitan.contacts.deleteDeletes a contact | Deletes a contact. | destructive | crm.contact.delete147 connectors |
Try it
Prompts to paste into Claude.
Each one names the ServiceTitan actions it will call, so you know what it reads and what it changes before you send it.
- Readread
Which ServiceTitan invoices are more than 30 days overdue? Group them by customer with the total owed.
calls
servicetitan.invoices.list - Writewrite
create adjustment invoice in ServiceTitan. Show me exactly what you will send before you save it.
calls
servicetitan.invoices.create - Across systemsread
For each customer, how many invoices are in ServiceTitan and how many tickets in ConnectWise PSA?
calls
servicetitan.invoices.listconnectwise_manage.tickets.list
Across your systems
ServiceTitan, joined to the rest of your business.
One ask fetches from ServiceTitan and another system, joins the rows on the same customer on our side, and hands your agent the answer, not every row.
For each customer, how many invoices are in ServiceTitan and how many tickets in ConnectWise PSA?
servicetitan.invoices.list+connectwise_manage.tickets.list, oncrm.company· ConnectWise PSAFor each customer, how many invoices are in ServiceTitan and how many tickets in HubSpot CRM?
servicetitan.invoices.list+hubspot_crm.tickets.list, oncrm.company· HubSpot CRM
identity.user 517crm.company 227crm.contact 192work.project 116work.task 105finance.invoice 91hr.employee 63service.ticket 62ask { intent: "for each customer, how many invoices are in ServiceTitan and how many tickets in ConnectWise PSA", steps: [ { action: "servicetitan.invoices.list", as: "inv", input: {}, limit: 100, max_pages: 5 }, { action: "connectwise_manage.tickets.list", as: "tix", input: {}, limit: 100, max_pages: 5 }, { join: { left: "inv", right: "tix", on: "crm.company", group_by: "inv.company_name", select: ["inv.company_name", "count(inv.id) as invoices", "count(tix.id) as tickets"] } } ]}Governance for ServiceTitan
Destructive actions wait for a yes.
42 ServiceTitan actions are destructive. The first 10:
- Deletes a contact
servicetitan.contacts.delete - Deletes journal entry, supports only for external journal entry records.
servicetitan.journal_entries.delete - Deletes appointment with specified id.
servicetitan.appointments.delete - Deletes the specified activity
servicetitan.activities.delete - Remove multiple tags to more than 1 customer
servicetitan.tags.delete - Delete team
servicetitan.teams.delete - Deletes a zone
servicetitan.zones.delete - Deletes a service from your pricebook
servicetitan.services.delete - Deletes equipment from your pricebook
servicetitan.equipment.delete - Deletes a material from your pricebook
servicetitan.materials.delete
A destructive action runs only with confirm: true. Under the human policy the agent cannot confirm for itself: the run stops until a named person approves, in the console or from a signed link in an email. The cap on a key is refused before the call is sent, never after.
Deletes a contact?
intent: the user asked me to deletes a contact
account { op: "keys.create", name: "servicetitan-agent", allowed_actions: ["servicetitan.*"], cap_calls: 2000, confirm_policy: "human_for_writes", approval_rules: [ { match: "servicetitan.contacts.delete", approver: "[email protected]" }, { match: "servicetitan.journal_entries.delete", approver: "[email protected]" }, { match: "servicetitan.appointments.delete", approver: "[email protected]" } ]}Cost
What ServiceTitan costs on actionlake.
Every ServiceTitan action is one upstream call, the only thing actionlake bills. Searching, check, cost, account and any call ServiceTitan refused with 401, 403, 429 or a 5xx are free. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.
- 1upstream call per actionall 591 ServiceTitan actions
- 591actions pageeach page of a long list is one call
- 331reads can be cacheda cache hit costs nothing
- 100,000calls a month, freepaid plans from US$49 a month for 250,000
Action index
Every ServiceTitan action.
591 actions by area: the id your agent calls, what it does, and its effect.
CRM86
servicetitan.contacts.listGets a list of contactsreadservicetitan.customers.listGets a list of Customersreadservicetitan.leads.listGets a list of leadsreadservicetitan.locations.listGets a list of locationsreadservicetitan.booking_provider_bookings.createCreates a booking for a booking providerwriteservicetitan.booking_provider_bookings.dismissBookings DismissBookingwrite- and 80 more in this area
Accounting76
servicetitan.invoices.createcreate adjustment invoicewriteservicetitan.invoices.listRetrieves a list of invoices. By default, all invoices will be returned regardless of status.readservicetitan.invoices.updateupdate invoicewriteservicetitan.payments.listGets a paginated list of paymentsreadservicetitan.ap_bills.getReturns a single AP bill by its unique identifier with complete details including items, expense items, and associated metadatareadservicetitan.ap_bills.listReturns a paginated list of AP bills with detailed item information, filtering capabilities, and associated metadataread- and 70 more in this area
JPM75
servicetitan.appointments.listGets a list of appointmentsreadservicetitan.jobs.listGets a list of jobsreadservicetitan.projects.createCreates a New Projectwriteservicetitan.projects.listGets a list of projectsreadservicetitan.appointments.createAdds a new appointment to an existing jobwriteservicetitan.appointments.deleteDeletes appointment with specified id.destructive- and 69 more in this area
Inventory53
servicetitan.purchase_orders.createCreate a new purchase orderwriteservicetitan.purchase_orders.getGet purchase order by Idreadservicetitan.purchase_orders.listGet a list of purchase ordersreadservicetitan.vendors.listGet a list of vendorsreadservicetitan.adjustments.createCreate a new adjustmentwriteservicetitan.adjustments.listGet a list of inventory adjustmentsread- and 47 more in this area
Dispatch41
servicetitan.appointment_assignments.assign_techniciansAssigns the list of technicians to the appointmentwriteservicetitan.appointment_assignments.listGets a list of appointment assignmentsreadservicetitan.appointment_assignments.unassign_techniciansUnassigns the list of technicians from the appointmentwriteservicetitan.arrival_windows.createArrivalWindows Createwriteservicetitan.arrival_windows.activatedArrivalWindows Activatedwriteservicetitan.arrival_windows.getArrivalWindows Getread- and 35 more in this area
Payroll38
servicetitan.activity_codes.listGets a list of payroll activity codesreadservicetitan.employees_payrolls.listGets a list of employee payrollsreadservicetitan.export_activity_codes.listProvides export feed for activity codesreadservicetitan.export_gross_pay_items.listProvides export feed for gross pay itemsreadservicetitan.activity_codes.getGets payroll activity code specified by IDreadservicetitan.employees_payroll_settings.getGets the employee payroll settingsread- and 32 more in this area
Pricebook38
servicetitan.clientspecificpricing.listClientSpecificPricing GetAllRateSheetsreadservicetitan.discounts_and_fees.createPost to add a new discount or fee to your pricebookwriteservicetitan.discounts_and_fees.listGet data on all of the discounts or fees in the pricebook. Supports optional search filtering.readservicetitan.equipment.createPost to add new equipment to your pricebookwriteservicetitan.clientspecificpricing.updateClientSpecificPricing UpdateRateSheetwriteservicetitan.discounts_and_fees.deleteDeletes a discount or fee from your pricebookdestructive- and 32 more in this area
Memberships30
servicetitan.export_invoice_templates.listProvides export feed for invoice templatesreadservicetitan.export_membership_status_changes.listProvides export feed for customer membership status changesreadservicetitan.export_membership_types.listProvides export feed for membership typesreadservicetitan.export_memberships.listProvides export feed for customer membershipsreadservicetitan.export_recurring_service_events.listProvides export feed for recurring service eventsreadservicetitan.export_recurring_service_types.listProvides export feed for recurring service typesread- and 24 more in this area
Sales25
servicetitan.estimates.createEstimates Createwriteservicetitan.estimates.getEstimates Getreadservicetitan.estimates.listEstimates GetListreadservicetitan.estimates.updateEstimates Updatewriteservicetitan.contracts.listGets contracts owned by a job with their current statuses.readservicetitan.estimate_templates.createCreates a new estimate template.write- and 19 more in this area
Settings22
servicetitan.employees.listGets a list of employeesreadservicetitan.technicians.createCreates new technicianwriteservicetitan.technicians.getGets a technician by IDreadservicetitan.technicians.listGets a list of techniciansreadservicetitan.business_units.getGets a business unit by IDreadservicetitan.business_units.listGets a list of business unitsread- and 16 more in this area
Equipment systems19
servicetitan.installed_equipment.createInstalledEquipment Createwriteservicetitan.installed_equipment.getInstalledEquipment Getreadservicetitan.installed_equipment.listInstalledEquipment GetListreadservicetitan.installed_equipment.updateInstalledEquipment Updatewriteservicetitan.equipment_systems.createCreates a new equipment systemwriteservicetitan.equipment_systems.deleteDeletes an equipment system specified by IDdestructive- and 13 more in this area
Marketing16
servicetitan.campaigns.createCreates new campaignwriteservicetitan.campaigns.listGets a paginated list of campaignsreadservicetitan.campaigns_costs.listGets a paginated list of campaign costsreadservicetitan.costs.createCreates new campaign costwriteservicetitan.costs.listGets a paginated list of campaign costsreadservicetitan.campaign_cost_summary.getCampaignCostSummary Getread- and 10 more in this area
Timesheets12
servicetitan.activities.createCreates new activitywriteservicetitan.activities.getGets activity specified by IDreadservicetitan.activities.listGets a list of activitiesreadservicetitan.activities.updateUpdates the specified activitywriteservicetitan.activities.deleteDeletes the specified activitydestructiveservicetitan.activity_categories.getGets activity category specified by IDread- and 6 more in this area
Findings10
servicetitan.location_findings.createCreates a new finding to document an issue or observation at a customer locationwriteservicetitan.location_findings.listGets a list of findingsreadservicetitan.location_findings_attachments.createCreates a new attachment for a findingwriteservicetitan.location_findings_attachments.listGets a paginated list of attachments for a findingreadservicetitan.finding_assets.getDownloads an asset by path. Redirects to a temporary download URLreadservicetitan.location_findings.getGets finding specified by IDread- and 4 more in this area
Reporting8
servicetitan.report_categories.listList categories for existing reportsreadservicetitan.report_category_reports.get_dataGet report data. The result is based on current report description which isn't constant in general. Beware that report columns may be changed. Result field nam…readservicetitan.report_category_reports.listList reports within given categoryreadservicetitan.report_category_reports_data.start_queryStart a long-running report data query. Returns 200 with the report payload streamed straight from the result blob if the query completes within the inline tim…readservicetitan.data_queries.deleteCancel a long-running report data query. The associated background task (if any) is signalled to stop and the token is released, freeing the per-tenant slot. A…destructiveservicetitan.data_queries.getPoll the result of a long-running report data query. On Success, the gzipped JSON blob is streamed directly to the client (gzip pass-through when the client ac…read- and 2 more in this area
Telecom8
servicetitan.calls.getGet call's details.readservicetitan.calls.listProvides a feed for telecom callsreadservicetitan.calls.list_v2Get filtered calls.readservicetitan.calls.updateUpdate existing call.writeservicetitan.export_calls.listProvides export feed for telecom callsreadservicetitan.optinouts_optouts.createAdds opt-outs for the specified phone numberswrite- and 2 more in this area
Marketing ads7
servicetitan.attributed_leads.listReturns attributed leads data.readservicetitan.capacity_warnings.listReturns all capacity awareness warnings.readservicetitan.external_call_attributions.createAttributes an external call (possibly coming from Call Tracking Software) to a web session.writeservicetitan.job_attributions.createAttributes a job to a web session.writeservicetitan.performance.listReturns performance data.readservicetitan.web_booking_attributions.createAttributes a web booking to a web session.write- and 1 more in this area
Scheduling pro5
servicetitan.routers_performance.getProvides performance data for routerreadservicetitan.routers_sessions.listGets a paginated list of sessions for routerreadservicetitan.schedulers.listGets a list of schedulersreadservicetitan.schedulers_sessions.listGets a paginated list of sessions for schedulerreadservicetitan.schedulers_performance.getProvides performance data for schedulerread
Task management5
servicetitan.tasks.createTasks Createwriteservicetitan.tasks.getGet a Task by Idreadservicetitan.tasks.listGet a list of tasksreadservicetitan.tasks.subtasksTasks CreateSubtaskwriteservicetitan.task_management_data.getClientSideData Getread
Customer interactions4
servicetitan.export_technician_ratings.listProvides export feed for technician ratingsreadservicetitan.technician_rating_technician_job.updateAdd a rating for the specified technician, tied to the specific job. If the rating already exists for that technician/ job combination, update it with the new…writeservicetitan.technician_ratings.createAdd a rating for the specified technician, tied to the specific job. If the rating already exists for that technician/ job combination, update it with the new…writeservicetitan.technician_ratings.listGets a list of technician ratingsread
Forms4
servicetitan.forms.listRetrieve Form datareadservicetitan.jobs_attachments.deleteDeletes a specified job attachment.destructiveservicetitan.jobs_attachments.getGets Attachments on the specified Jobreadservicetitan.submissions.listRetrieve Form Submission Dataread
Service agreements4
servicetitan.export_service_agreements.listProvides export feed for service agreementsreadservicetitan.service_agreements.getGets service agreement specified by IDreadservicetitan.service_agreements.listGets a list of service agreementsreadservicetitan.service_agreements_custom_fields.listGets a list of custom field types for service agreementsread
Fleet pro3
servicetitan.fleet_pro_events.queryRetrieves paginated Event data specifically for historical records older than 7 days.readservicetitan.fleet_pro_gps.queryRetrieves paginated GPS data specifically for historical records older than 7 days.readservicetitan.vehicles.listRetrieves a list of all FleetPro vehicles for the current tenant.read
Job booking1
servicetitan.call_reasons.listGets a list of call reasonsread
Marketing reputation1
servicetitan.reviews.listreviewsread
This index shows a sample of each area. All 591 actions, with their inputs and prices, are in the catalogue, which a free sandbox key can search.
Questions
The ServiceTitan MCP server, answered.
Is there a ServiceTitan MCP server for Claude?
Yes. actionlake is an MCP gateway: a remote MCP server that gives Claude, or another MCP client, 591 ServiceTitan actions across CRM, accounting, JPM and inventory, through the same eight tools it uses for every other connector. actionlake is independent; it is not made or endorsed by ServiceTitan.
What do I need to connect ServiceTitan?
ServiceTitan client ID: in ServiceTitan go to Settings > Integrations > API Application Access, connect your… and ServiceTitan client secret (shown once when generated for the tenant). Plus your app key and your tenant id. The free call account { op: "connections.requirements", service: "servicetitan" } lists exactly what to paste.
Can an AI agent delete or change things in ServiceTitan?
Only if its key allows it, and only with an explicit confirmation. 42 ServiceTitan actions are destructive, including deletes a contact, deletes journal entry, supports only for external journal entry records. and deletes appointment with specified id.. Each runs only with confirm: true. Under the human confirm policy, or an approval rule on the key, the run waits until a named person approves it.
Will an AI agent use up my ServiceTitan API limit?
actionlake paces every call to the limits in the ServiceTitan service file: 60 calls a second per connection. Repeated reads are answered from cache (331 ServiceTitan actions can be), which never reaches ServiceTitan.
What does a ServiceTitan action cost?
One upstream call, the only unit actionlake bills. A list that pages bills one call per page (591 ServiceTitan actions page). Cache hits, searches, dry runs and calls ServiceTitan refused with 401, 403, 429 or a 5xx are free. The Free plan includes 100,000 calls a month with no card. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.
Which ServiceTitan API does it cover?
The ServiceTitan (field service management: CRM, jobs, dispatch, pricebook, accounting, payroll) API ServiceTitan v2 tenant APIs (25 module OpenAPI 3.1 documents, 602 operations) at api.servicetitan.io. It is built from ServiceTitan's documentation as read on 22 October 2026. 591 actions in 25 areas, each one in the signed service file (version 1.0.0).
Can I combine ServiceTitan with my other systems?
Yes. ask joins ServiceTitan to ConnectWise PSA or HubSpot CRM on the same customer and returns the answer rather than every row. ServiceTitan maps crm.company, which 227 other connectors also map.
Does actionlake keep my ServiceTitan data, and where?
actionlake processes and stores data in Sydney, Australia; there is no US region yet. Reads may be cached for up to 5 minutes, and a write clears the reads it affects. Each run's request and response is kept, sealed, for your plan's trace window: 1 day on Free, 3 days on Starter, 7 days on Pro, 14 days on Team, 30 days on Business and 30 days on Enterprise. Your ServiceTitan credential is sealed under your tenant's key, never logged and never returned. Your traffic is not used to train models.
Which AI clients can use it?
Claude Code, tested by us end to end, and the Claude app as a custom connector, tested by us with an existing key. Other MCP clients that support remote servers over Streamable HTTP (MCP revisions 2025-06-18 and 2025-11-25) and OAuth dynamic client registration, or a bearer header, should connect the same way; we have not tested them. Or plain REST, under the same action names.
Give your agent ServiceTitan today.
Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.