Skip to main content
Glama

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 techs

  • search_jobs — flexible search with filters (status, customer, date range, etc.)

  • get_job_details — full job record with expanded relations

  • get_customer_jobs — all jobs for a given customer

  • search_customers — by name, phone, email, or address

  • get_equipment — customer equipment with custom fields

  • get_open_invoices — outstanding invoices

  • get_techs — technician list

  • get_job_statuses, get_job_categories, get_sources — reference data

  • get_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_SECRET

Claude 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_secret

Setup (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

SF_CLIENT_ID

Yes

Service Fusion OAuth client ID

SF_CLIENT_SECRET

Yes

Service Fusion OAuth client secret

TRANSPORT

Yes (for HTTP)

Set to http to enable HTTP transport

PORT

No

HTTP port (default: 3000)

BASE_URL

Yes (for HTTP)

Public URL of your server, e.g. https://mcp.example.com — required for OAuth discovery

MCP_OAUTH_PIN

Recommended

PIN for browser-based OAuth approval (required by Claude.ai web)

MCP_AUTH_TOKEN

Optional

Static Bearer token for non-OAuth clients (e.g., Claude Code CLI)

SF_API_BASE_URL

No

Defaults to https://api.servicefusion.com/v1

SF_TOKEN_URL

No

Defaults to https://api.servicefusion.com/oauth/access_token

Deploying to Railway

  1. Fork or import this repo on Railway

  2. Set the environment variables listed above

  3. Railway auto-builds via railway.toml and exposes a public URL

  4. Use 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.mjs

Known 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/sdk for MCP protocol

  • Express 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 tools
create_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 DocumentationA
Read-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 JobsA
Read-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 EquipmentA
Read-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 CategoriesA
Read-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 DetailsA
Read-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 StatusesA
Read-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 UserA
Read-onlyIdempotent

Get current authenticated user info. Useful for verifying API connectivity and credentials.

Inputs: no named parameters.

get_open_invoicesGet Open InvoicesB
Read-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 SourcesA
Read-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 TechniciansA
Read-onlyIdempotent

List all technicians. Returns tech names and details. Results are cached for 30 minutes.

Inputs: no named parameters.

get_todays_jobsGet Today's JobsA
Read-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 CustomersA
Read-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 JobsA
Read-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

    A4/5.0

    Scored across 16 tools

    Disambiguation5/5

    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.

    Naming Consistency5/5

    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.

    Tool Count5/5

    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.

    Completeness3/5

    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

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • -
      license
      Not graded
      quality
      Not graded
      maintenance
      Enables 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.
      -
    • A
      license
      Not graded
      quality
      D
      maintenance
      Provides 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