mcp-servicefusion
Click on "Deploy 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., "@mcp-servicefusion Show me today's scheduled 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.
mcp-servicefusion
A Model Context Protocol (MCP) server exposing the Service Fusion REST API to AI agents. Enables AI-assisted field service management: job lookup, customer management, dispatch, invoicing, equipment tracking, and more.
Disclaimer: This is an unofficial, community-built integration. Not affiliated with or endorsed by Service Fusion.
Features
Read tools:
get_todays_jobs— today's scheduled jobs with assigned techssearch_jobs— flexible search with filters (status, customer, date range, etc.)get_job_details— full job record with expanded relationsget_customer_jobs— all jobs for a given customersearch_customers— by name, phone, email, or addressget_equipment— customer equipment with custom fieldsget_open_invoices— outstanding invoicesget_techs— technician listget_job_statuses,get_job_categories,get_sources— reference dataget_me— current authenticated user
Create tools:
create_job,create_customer,create_estimate
API documentation:
get_api_docs— look up the Service Fusion API reference directly from the MCP connection. Sections:index,jobs,customers,estimates,invoices,techs,data-types,authentication,known-issues,full
Related MCP server: Fergus MCP Server
Prerequisites
Node.js ≥ 18
Service Fusion API credentials (My Office → Developer Settings → API Credentials)
Setup (local / stdio transport)
git clone https://github.com/commair-tools/mcp-servicefusion-public.git mcp-servicefusion
cd mcp-servicefusion
npm install
npm run build
cp .env.example .env
# Edit .env and add SF_CLIENT_ID and SF_CLIENT_SECRETClaude Desktop
Add to your claude_desktop_config.json (see claude_desktop_config.example.json):
{
"mcpServers": {
"service-fusion": {
"command": "node",
"args": ["/absolute/path/to/mcp-servicefusion/build/index.js"],
"env": {
"SF_CLIENT_ID": "your_client_id_here",
"SF_CLIENT_SECRET": "your_client_secret_here"
}
}
}
}Claude Code CLI
claude mcp add service-fusion node /absolute/path/to/mcp-servicefusion/build/index.js \
-e SF_CLIENT_ID=your_client_id -e SF_CLIENT_SECRET=your_client_secretSetup (remote / HTTP transport)
The server also supports Streamable HTTP transport for hosted deployments (Railway, Fly.io, Cloud Run, etc.) with OAuth 2.1 authentication.
Environment variables
Variable | Required | Description |
| Yes | Service Fusion OAuth client ID |
| Yes | Service Fusion OAuth client secret |
| Yes (for HTTP) | Set to |
| No | HTTP port (default: |
| Yes (for HTTP) | Public URL of your server, e.g. |
| Recommended | PIN for browser-based OAuth approval (required by Claude.ai web) |
| Optional | Static Bearer token for non-OAuth clients (e.g., Claude Code CLI) |
| No | Defaults to |
| No | Defaults to |
Deploying to Railway
Fork or import this repo on Railway
Set the environment variables listed above
Railway auto-builds via
railway.tomland exposes a public URLUse that URL as your
BASE_URL
Authentication
Claude.ai web (OAuth flow): add the server URL (without trailing slash, e.g., https://mcp.example.com/mcp) as a remote MCP connector in Settings. Leave OAuth client ID/secret fields blank — the server advertises discovery metadata so Claude.ai handles the full OAuth handshake automatically. On first connect, you'll be redirected to a browser page to enter your MCP_OAUTH_PIN. After that, tokens auto-refresh for 30 days.
Claude Code / CLI clients: use the static token via the Authorization: Bearer <MCP_AUTH_TOKEN> header.
No authentication: if neither MCP_OAUTH_PIN nor MCP_AUTH_TOKEN is set, the server runs unauthenticated (not recommended for public-facing deployments).
API Reference
The repo includes a complete Service Fusion API reference in service-fusion-api-reference.md, auto-generated from the official RAML spec at docs.servicefusion.com. Agents can access it through the get_api_docs tool at runtime.
To regenerate it after Service Fusion updates their spec:
node scripts/update-api-docs.mjsKnown Issues
/jobs endpoint hangs without sort parameter
As of 2026-04-09, Service Fusion's /jobs list endpoint hangs indefinitely when queried without a sort parameter. This server works around it by defaulting all /jobs list queries to sort=-start_date in src/client.ts. If you see hangs on other endpoints in the future, check whether they require a sort param too.
Equipment is a nested resource
There is no top-level /equipment endpoint. Equipment must be fetched via GET /customers/{customer-id}/equipment. The get_equipment tool handles this by resolving customer_name to customer_id internally.
API Limitations
Confirmed by Service Fusion support:
No PUT, PATCH, or DELETE on any endpoint (read and create only)
No native webhook/callback support
No sandbox/test environment
Rate limit: 60 requests/minute (server enforces backoff automatically)
Tech Stack
TypeScript + Node.js
@modelcontextprotocol/sdkfor MCP protocolExpress for HTTP transport
OAuth 2.1 with PKCE, Dynamic Client Registration, and resource indicators
License
Business Source License 1.1 — see LICENSE
TL;DR: Free to use, modify, and redistribute (including internally at HVAC businesses to manage your own operations). You may not resell it or offer it as a paid hosted service to third parties. On April 10, 2036 it automatically converts to the Apache License 2.0 (fully permissive).
Available Tools
16 toolscreate_customerCreate CustomerA
Create a new customer record in Service Fusion. Note: This endpoint may require elevated API permissions. If you get a 403 error, customer creation must be done through the Service Fusion web UI instead.
Inputs: customer_name (required), first_name, last_name, email, +10 more.
create_estimateCreate EstimateA
Create a new estimate in Service Fusion. Requires an exact customer name (use search_customers to find it) and a category. Returns the created estimate record with its assigned number.
Inputs: customer_name (required), category (required), description, start_date, +10 more.
create_jobCreate JobA
Create a new service job in Service Fusion. Requires an exact customer name (use search_customers to find it), a category (use get_job_categories or try 'Commercial Service', 'Residential Service', etc.), and a status (use get_job_statuses or try 'Scheduled', 'Confirmed', etc.). Returns the created job record with its assigned job number.
Inputs: customer_name (required), category (required), status (required), description, +15 more.
get_api_docsGet API DocumentationARead-onlyIdempotent
Look up Service Fusion REST API documentation. Call with section="index" to see all available sections, or pass a specific section like "jobs", "customers", "estimates", "data-types", "authentication", etc. Returns official endpoint docs including parameters, filters, field lists, request/response schemas, and examples.
Inputs: section (required).
get_customer_jobsGet Customer JobsARead-onlyIdempotent
Get all jobs for a customer by name. Returns the complete job history sorted by most recent first, including assigned technicians. Use search_customers first to find the exact customer name.
Inputs: customer_name (required), status.
get_equipmentGet EquipmentARead-onlyIdempotent
Get equipment records for a customer. Requires either customer_id or customer_name (resolved to ID automatically). Equipment includes type, make, model, serial number, location, warranty info, and custom fields (filter sizes, belt specs, etc.). Optionally fetch a single equipment record by equipment_id.
Inputs: customer_name, customer_id, equipment_id, page, +1 more.
get_job_categoriesGet Job CategoriesARead-onlyIdempotent
List all available job categories (e.g., 'Commercial Service', 'Residential Install'). Use these values when creating jobs or filtering by category. Results are cached for 30 minutes.
Inputs: no named parameters.
get_job_detailsGet Job DetailsARead-onlyIdempotent
Get complete details for a single job by its internal ID or display number. Returns the full job record with all related data: assigned technicians, tasks, notes, equipment, products, services, charges, payments, invoices, and visit history. Provide either job_id (internal) or job_number (display).
Inputs: job_id, job_number.
get_job_statusesGet Job StatusesARead-onlyIdempotent
List all available job statuses. Returns status names grouped by category (OPEN, OPEN_ACTIVE, CLOSED). Useful for knowing valid status values when filtering jobs. Results are cached for 30 minutes.
Inputs: no named parameters.
get_meGet Current UserARead-onlyIdempotent
Get current authenticated user info. Useful for verifying API connectivity and credentials.
Inputs: no named parameters.
get_open_invoicesGet Open InvoicesBRead-onlyIdempotent
Search invoices, optionally filtered by payment status or customer name. Use this to find outstanding balances, track payments, or review billing history.
Inputs: payment_status, customer_name, page, per_page.
get_sourcesGet Lead SourcesARead-onlyIdempotent
List all available lead sources. Use these values when creating jobs, estimates, or customers. Results are cached for 30 minutes.
Inputs: no named parameters.
get_techsGet TechniciansARead-onlyIdempotent
List all technicians. Returns tech names and details. Results are cached for 30 minutes.
Inputs: no named parameters.
get_todays_jobsGet Today's JobsARead-onlyIdempotent
Get all jobs scheduled for today. Returns jobs with start_date matching today's date, including assigned technicians. Use this for daily dispatch review, morning briefings, or checking the current day's workload.
Inputs: status.
search_customersSearch CustomersARead-onlyIdempotent
Search for customers by name, phone, email, or address. Returns matching customer records with contact details. Use this to look up customer information or find the exact customer name for use with get_customer_jobs.
Inputs: name, phone, email, address, +4 more.
search_jobsSearch JobsARead-onlyIdempotent
Search for jobs with flexible filters. Supports filtering by status, customer name, date range, address, phone, email, category, and more. Returns paginated results sorted by most recent first by default.
Inputs: status, sub_status, customer_name, start_date_gte, +14 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 16 tools
Each tool targets a distinct resource or action (customer, job, estimate, invoice, equipment, tech, etc.) with no overlap in functionality. The create, get, and search prefixes clearly separate intents.
All tools follow a consistent verb_noun pattern (e.g., create_customer, get_job_details, search_customers). Naming is uniform and predictable across the entire set.
16 tools is appropriate for a field service management API covering customer, job, estimate, invoice, equipment, and lookup functions. Each tool serves a necessary purpose without bloat.
The tool set covers creation and retrieval for core entities but lacks update and delete operations for customers, jobs, estimates, and invoices. This is a notable gap for full lifecycle management.
Maintenance
Related MCP Connectors
Job management for service companies: look up, book, tag, assign and note jobs from your AI.
Run a home-service business from your AI: jobs, customers, invoices, estimates, texts.
Read Service Fusion customers, jobs, estimates, invoices and schedule; create customers and jobs.
Service Fusion MCP server for ChatGPT, Claude and any AI agent: create job, list customers, create estimate, create invoice and update job status in your own Service Fusion account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to Service Fusion yourself; Cotlet does not store your password and you need no Service Fusion API key. About the official Service Fusion API: Service Fusion has an Open API, but only on the Pro plan, and it has no official MCP server (checked 11 Oct 2026). It lists and reads customers, jobs, estimates and invoices and creates customers, jobs and estimates. Setup and FAQ: https://cotlet.dev/integrations/service-fusion-api-mcp-server
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceEnables AI agents to interact with ServiceFusion's field service management platform through standardized MCP operations. Supports complete customer and job management including creating work orders, managing customer records, and accessing service data with OAuth 2.0 authentication.-
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to interact with Fergus job management platform through secure API integration. Supports managing jobs, customers, quotes, and sites with real-time data synchronization.1MIT
- AlicenseNot gradedqualityDmaintenanceProvides AI assistants with direct access to ServiceTitan's field service management platform for home services contractors. It enables users to manage customers, jobs, appointments, technician dispatching, and invoices through natural language.1MIT
- AlicenseNot gradedqualityDmaintenanceProvides comprehensive access to the FieldEdge field service management platform through over 87 tools and 16 React applications. It enables users to manage customers, jobs, scheduling, and invoicing through natural language or integrated UI components.MIT