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 MCP Server (Enterprise)Show me a summary of revenue intelligence for this month"
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 Server
The only MCP server for the ServiceTitan API — 505 tools across 15 domains, plus 10 intelligence tools that turn raw API data into business decisions.
Why
ServiceTitan has no official MCP server or developer tooling beyond REST docs
Raw API access is friction-heavy — OAuth token management, module-prefix routing, pagination, and response parsing all fall on you
This server handles all of that and adds 10 intelligence tools that aggregate multiple endpoints into operational insights
Revenue accuracy within 0.001% of ServiceTitan's own dashboard (verified on production data using Report 175 — the same source ST's internal engine uses)
Features
505 tools across 15 domains — CRM, dispatch, accounting, payroll, inventory, marketing, and more
10 intelligence tools — composite analytics that aggregate multiple API calls into revenue summaries, ops snapshots, technician scorecards, and more
Dashboard-accurate revenue —
intel_revenue_summaryuses Report 175 to match ST's dashboard within 0.001%Read-only by default —
ST_READONLY=trueout of the box; write tools only activate when you're readySafety layer — confirmation workflow for writes/deletes, audit logging with sensitive field redaction
Domain filtering — expose only the tool groups you need via
ST_DOMAINSName-based filtering — pass
businessUnitNameortechnicianNameinstead of numeric IDs; resolved via 30-minute cacheLLM-optimized responses — response shaping trims API noise and structures data for AI consumption
SSE remote deployment — deploy to Fly.io (or anywhere) and connect via
mcp-remoteBuilt-in health check —
st_health_checkvalidates auth, tenant access, and registration summary
Quick Start
Prerequisites
Node.js 22 or newer
ServiceTitan API credentials: Client ID, Client Secret, App Key, Tenant ID
Install & Build
npm install
npm run buildClaude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"servicetitan": {
"command": "node",
"args": ["/absolute/path/to/servicetitan-mcp-server/build/index.js"],
"env": {
"ST_CLIENT_ID": "your-client-id",
"ST_CLIENT_SECRET": "your-client-secret",
"ST_APP_KEY": "your-app-key",
"ST_TENANT_ID": "your-tenant-id",
"ST_TIMEZONE": "America/New_York"
}
}
}
}Works the same way in Cursor, Windsurf, and any other MCP-compatible host.
Generic stdio
ST_CLIENT_ID=your-client-id \
ST_CLIENT_SECRET=your-client-secret \
ST_APP_KEY=your-app-key \
ST_TENANT_ID=your-tenant-id \
ST_TIMEZONE=America/New_York \
node /absolute/path/to/servicetitan-mcp-server/build/index.jsRemote Deployment (SSE)
Deploy to Fly.io or any server, then connect via mcp-remote:
# On the server
ST_MCP_API_KEY=your-secret node build/sse.js{
"mcpServers": {
"servicetitan": {
"command": "npx",
"args": [
"mcp-remote",
"https://your-instance.fly.dev/sse",
"--header",
"x-api-key: YOUR_MCP_API_KEY"
]
}
}
}Tool Catalog
505 tools registered across 15 domains:
Domain | Tools | Example Tools |
| 87 |
|
| 74 |
|
| 38 |
|
| 37 |
|
| 33 |
|
| 33 |
|
| 27 |
|
| 22 |
|
| 21 |
|
| 14 |
|
| 23 |
|
| 23 |
|
| 5 |
|
| 1 |
|
| 10 |
|
Total | 448 |
The full 505 count includes all read, write, and delete tools. With
ST_READONLY=true(default), write and delete tools are skipped at registration time.
Intelligence Tools
The real differentiator. These 10 tools aggregate multiple API calls and report endpoints into operational insights — the kind of answers that would otherwise require custom BI tooling.
Tool | What It Returns |
| Dashboard-accurate revenue by business unit using Report 175 — matches ServiceTitan within 0.001%. Includes completed revenue, non-job revenue, adjustments, collections, and BU productivity rollups. |
| 6-metric same-day ops briefing: revenue-to-date, jobs in progress, call outcomes, bookings, open estimates, and upcoming next-day jobs. |
| Per-tech jobs, revenue, avg ticket, productivity, lead gen, membership close rate, and sales from both tech and marketing leads — with team averages. |
| Active memberships, signups, cancellations, renewals, retention rate, invoiced revenue, and conversion by business unit. |
| Open/sold/dismissed funnel, conversion rate, days-to-close, age buckets, stale opportunities, and tech sales funnel metrics. |
| Campaign calls, bookings, conversion rate, total revenue context, and BU lead-gen metrics from Report 176. |
| CSR booking performance: jobs booked, revenue, avg ticket, top campaigns, job type mix, conversion metrics, and team averages. |
| Labor cost summary from the Master Pay File: employee hours, gross pay, hourly rates, activity mix, and BU breakdowns. |
| Invoice email tracking: sent vs not-sent counts, send rate, dollar impact, and unsent breakdowns by business unit and technician. |
| Cached reference data — technicians, business units, payment types, membership types with IDs and names. 30-minute TTL. |
These tools are why this server exists. Raw CRUD tools are table stakes. Intelligence tools turn API data into business decisions.
Revenue Accuracy
intel_revenue_summary uses ServiceTitan's Reporting API (Report 175: "Revenue") to calculate totals. This is the same source ST's own dashboard uses — which means it includes:
Completed Revenue — revenue from completed jobs
Non-Job Revenue — membership fees, add-ons, and other income not tied to a specific job
Adjustment Revenue — credits, adjustments, and corrections
Raw invoice or job endpoint sums will not match the dashboard. Both miss non-job revenue. For dashboard-matching figures, use intel_revenue_summary. For invoice-level detail, use accounting_invoices_list.
Name-Based Filtering
Most intelligence tools accept businessUnitName and technicianName as alternatives to numeric IDs:
# Instead of:
intel_revenue_summary(startDate="2026-01-01", endDate="2026-04-01", businessUnitId=12345)
# Use:
intel_revenue_summary(startDate="2026-01-01", endDate="2026-04-01", businessUnitName="HVAC")Name matching uses exact → prefix → contains fallback. If no match is found, the tool returns all data with a warning.
Configuration
Copy .env.example to .env and fill in your credentials.
Required
Variable | Description |
| ServiceTitan OAuth client ID |
| ServiceTitan OAuth client secret |
| ServiceTitan app key ( |
| ServiceTitan tenant identifier |
| API key for remote MCP clients (required for SSE deployment only) |
Optional
Variable | Default | Description |
|
| ServiceTitan environment: |
|
| Skip write and delete tools at registration time |
|
| Require |
|
| Cap tool response size |
| (all) | Comma-separated domain allowlist (e.g. |
|
| Log level: |
|
| IANA timezone for the tenant (e.g. |
|
| Set to |
|
| Allowed CORS origin for the SSE server |
Set
ST_TIMEZONEto your tenant's local timezone. Without it, date-only queries (e.g.startDate: "2026-02-01") are interpreted as UTC midnight — which can miss or include invoices and jobs near day boundaries for non-UTC tenants.
Boolean env vars accept: true, false, 1, 0 (case-insensitive).
Architecture
The server is built as a layered system: Config → OAuth Client → Domain Registry → MCP Server.
Domain module pattern — each domain lives in
src/domains/<domain>/and exports a loader that registers its toolsDynamic discovery —
src/index.tsscanssrc/domains/*and imports each domain at runtimeCentral registry —
ToolRegistryhandles domain filtering, read-only enforcement, confirmation wrapping, and audit loggingOAuth client —
ServiceTitanClientmanages client-credentials auth, token refresh, retry-on-401/429, and{tenant}path injectionResponse shaping — transformer layer strips API noise and structures responses for LLM consumption
Intelligence layer — composite tools fan out to multiple endpoints and report IDs, then aggregate results
See ARCHITECTURE.md for the full deep-dive: route table, response shaping pipeline, intelligence layer design, and safety system.
CLI Companion
If you prefer working from the terminal directly, servicetitan-cli is a companion st binary built from the same auth and intelligence layer:
# Install
npm install -g @rowvyn/servicetitan-cli
# Same intelligence — no MCP required
st revenue --period ytd --compact
st snapshot --compact
# Pipe into your agent
st customers list --all --json | your-agent processThe CLI and this MCP server share the same design philosophy: push the business question into the tool name, minimize schema overhead, and shape responses for AI consumption.
Comparison
Feature | This Server | Community MCP Servers |
Revenue accuracy | ✅ 0.001% of dashboard | ❌ $17–21K off per period |
Intelligence tools | ✅ 10 tools | ❌ None |
Domain coverage | ✅ 505 tools, 15 domains | ⚠️ 10–50 tools |
Safety layer | ✅ Read-only default, audit log | ❌ None |
Response shaping | ✅ LLM-optimized | ❌ Raw API responses |
Name-based filtering | ✅ Resolve names to IDs automatically | ❌ Numeric IDs required |
Remote deployment | ✅ SSE + | ⚠️ Varies |
Development
npm run dev # tsc --watch
npm run test # vitest run
npm run lint # eslint src/
npm run typecheck # tsc --noEmit
npm run build # compile to build/
npm run start # run compiled serverSafety
Read-only mode (
ST_READONLY=trueby default) — write and delete tools are skipped at registrationConfirmation workflow — delete tools always require
confirm=true; write tools optionally require it viaST_CONFIRM_WRITES=true; missing confirmation returns a preview payload instead of executingAudit logging — all write/delete executions emit
[AUDIT]log records with timestamp, tool, operation, resource, and sanitized params (secrets/tokens redacted)
Contributing
See CONTRIBUTING.md.
Security
See SECURITY.md for the vulnerability disclosure policy.
License
MIT
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.