servicetitan-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@servicetitan-mcpFind customer by phone 555-1234 and show their recent jobs"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
servicetitan-mcp
A read-only MCP server over the ServiceTitan API: six task-shaped tools (find a customer, look at their jobs, their money, resolve an external id) instead of a thin wrapper over ServiceTitan's own endpoints. ReadOnlyClient defines only get and get_page — no write path exists.
See docs/DESIGN.md for the reasoning behind these choices.
The credentials rule
The MCP client config carries exactly one setting: ST_ENV_FILE, a path — never a secret directly. Everything else (client id, secret, app key, tenant id) lives in the file it points at, chmod 600, outside the repo and outside any MCP config: MCP configs get pasted into chats, and some (.mcp.json) are designed to be committed.
permission_warning checks the file's mode at startup and warns — doesn't refuse to start — if it's looser than 600. Full reasoning in docs/DESIGN.md.
{
"mcpServers": {
"servicetitan": {
"command": "/absolute/path/to/servicetitan-mcp/.venv/bin/servicetitan-mcp",
"env": { "ST_ENV_FILE": "/home/you/.config/servicetitan-mcp/env" }
}
}
}command must be an absolute path into this project's .venv — an MCP client launches from an arbitrary directory, so a bare python may resolve to an interpreter without mcp/httpx/st_mcp installed.
Related MCP server: ServiceTitan MCP Server (Enterprise)
The six tools
Tool | Answers | Reach for it when |
| Who is this, by name/phone/external id? | You have a human identifier, not a ServiceTitan id. One match returns the full card; several return a short list to disambiguate. |
| Full card for one customer: contacts, locations, 5 recent jobs, external ids. | You already have the numeric customer id — from |
| Which jobs match these filters, and when's the next visit? | You want a list of jobs by customer, date range, or status. Not for finding a customer — that's |
| Everything about one job: appointments, technicians. | You have a job id and need its full appointment history. |
| Balance, estimates, invoices, payments — for one customer, one call. | Any "what do they owe" or billing-history question. |
| Which ServiceTitan customer has this id in another system? | You're crossing over from a CRM synced into ServiceTitan via |
Job types, business units, and payment types are also exposed as MCP resources (cached client-side) rather than tools, and back the id→name substitution above.
Token savings, measured against a live tenant
chars / 4, on the same four ServiceTitan reads:
tokens | |
| 1516 |
| 1001 |
| 69 |
| 43 |
| 28 |
| 318 |
22x against pretty-printed JSON, 15x against minified, per call — and customer_overview is one model round trip for four ServiceTitan reads, where an endpoint-shaped tool surface would spend four.
ServiceTitan findings
totalCountisnullunless the request sendsincludeTotal=true.jpm/appointmentshas no batch filter —jobIds,jobId=<csv>, repeatedjobIdare all ignored or wrong; onlyjobId=<single>works.sales/estimatesignorescustomerId; reachable only viajobIdorlocationId.A 404 on an appointment's assigned-technicians means "nobody assigned yet", not "not found" — the API's own "could not" that actually means "none".
Setup
Requires Python 3.11+.
python -m venv .venv
.venv/bin/pip install -e ".[dev]"Create the env file ST_ENV_FILE will point at (e.g. ~/.config/servicetitan-mcp/env), chmod 600 it, and fill in:
ST_CLIENT_ID=...
ST_CLIENT_SECRET=...
ST_APP_KEY=...
ST_TENANT_ID=...
# Optional:
ST_AUTH_HOST=auth.servicetitan.io
ST_API_HOST=api.servicetitan.io
ST_APP_GUID=... # required only for find_by_external_id
ST_EXTERNAL_ID_KEY=... # the externalData key find_customer treats as an idST_AUTH_HOST/ST_API_HOST default to production; ServiceTitan's sandbox uses different hosts (*-integration.*) and both must match the credentials' environment, or the token request 400s with invalid_client.
Registering it with a client
Both routes need an absolute path to the servicetitan-mcp console script in this project's .venv, and ST_ENV_FILE. Neither carries a secret.
Claude Code:
claude mcp add servicetitan -s user \
-e ST_ENV_FILE=/home/you/.config/servicetitan-mcp/env \
-- /home/you/servicetitan-mcp/.venv/bin/servicetitan-mcp-s user registers it for every project on the machine — prefer it over -s project, which writes a committable .mcp.json. Verify with claude mcp list (✔ Connected).
Claude Desktop: copy claude_desktop_config_example.json, fix the two paths, and merge it into the client's own config.
Run the tests with .venv/bin/pytest. Nothing in the suite makes a live ServiceTitan call — every test uses the fake clients in tests/conftest.py.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseDqualityDmaintenanceAn MCP server that allows AI assistants to interact with the ServiceTitan API, requiring client credentials for authentication.4
- AlicenseDqualityAmaintenanceAn enterprise-grade MCP server for the ServiceTitan API featuring robust safety safeguards and domain-level control for production environments. It enables comprehensive interaction with ServiceTitan modules including CRM, dispatch, and accounting, alongside specialized tools for operational and revenue intelligence.100351MIT
- AlicenseAqualityBmaintenanceCustomer-hosted, read-only MCP server for Jobber operations workflows. It helps owners query Jobber for action lists, overdue invoices, stale requests, estimate/job follow-up, and safe read-only GraphQL validation.6321MIT
- Alicense-qualityCmaintenanceA remote MCP server that exposes the ServiceTitan API as tools, enabling Claude and other clients to manage customers, jobs, pricebook, invoicing, and more with write safety and built-in observability.MIT
Related MCP Connectors
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
Read-only MCP server for Muovi, Argentina's trust-first local services marketplace (6 tools).
Provide seamless access to Appfolio Property Manager Reporting API through a standardized MCP serv…
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/McDonnies/servicetitan-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server