Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

com.crisphive/mcp

NPM · @CRISPHIVE/MCP · 2 COMPONENTS · SCANNED SEP 20

Field operations on a deterministic solver — run jobs, crews & fleet from Claude or ChatGPT.

0 this week 81 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 31 of 95 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
Schema Quality & AI Usability65
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 12228 tokens (~230/item across 53 items; 53 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management90
  • Stability observed for 27 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 7 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 53 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the com.crisphive/mcp server?

com.crisphive/mcp runs locally as an npm package, launched with npx -y @crisphive/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · @crisphive/mcp

# add to Claude Code
claude mcp add com-crisphive-mcp -- npx -y @crisphive/mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "com-crisphive-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@crisphive/mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "com-crisphive-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@crisphive/mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add com-crisphive-mcp -- npx -y @crisphive/mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-crisphive-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@crisphive/mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add com-crisphive-mcp --command npx --arg -y --arg @crisphive/mcp
# ~/.hermes/config.yaml
mcp_servers:
  com-crisphive-mcp:
    command: "npx"
    args: ["-y", "@crisphive/mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "com-crisphive-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@crisphive/mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add com-crisphive-mcp -t stdio -c npx -a -y @crisphive/mcp
// mcp.json
{
  "mcpServers": {
    "com-crisphive-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@crisphive/mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 20 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.

  • 18 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.

  • 17 Sept 26 −3
    • Stability: pass → 0.80 functional
  • 16 Sept 26 0
    • Stability: 0.97 → pass security
  • 15 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

  • 13 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.

  • 11 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.

  • 10 Sept 26 −3
    • Stability: pass → 0.80 functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 20 Sept 2026 · Analysed npm/@crisphive/mcp@2.1.0

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem npm

Background: How many MCP packages publish verified provenance →

Dependencies 95 packages
Packages resolved 95
Stale 31
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 53 exposed · ~12,228 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
commitEmergencyReschedule ~538

Commit emergency insert + cascade reschedule Applies the cascade previewed by /emergency/preview: assigns the emergency job to the technician and pushes the displaced jobs back (or, with `displacement_mode=reassign`, re-staffs them onto their previewed alternates first), atomically. Supports Idempotency-Key. The server recomputes the plan under a lock and fences each job on its status_version — if anything changed since the preview it returns 409 EMERGENCY_RESCHEDULE_PLAN_DRIFTED (re-preview). Same body as preview + optional `emergency_expected_version`. Isolated feature (see EMERGENCY_RESCHEDULE_DESIGN.md). 409 NEXT STEPS: EMERGENCY_RESCHEDULE_PLAN_DRIFTED — the schedule changed between your preview and this commit (another booking/move won a lane): call /preview again, show the fresh plan, then commit. EMERGENCY_RESCHEDULE_SLOT_OCCUPIED — landing window blocked by an immovable anchor (P0/crew/multi-day): another tech or time. Other codes — same remedies as /candidates.

NameTypeReqDescription
displacement_modestringFate of displaced jobs: reschedule (default) or reassign — must match the preview.
emergency_expected_versionintegerOptimistic-lock fence from the previewed job (0 = fence on the server-read version).
emergency_job_idstringyesID of the P0 job to insert.
expected_move_idsarrayExpectedMoveIDs — the displaced job IDs the preview returned (echo BOTH data.days[].moves[].job_id AND data.reassignments[].job_id). RECOMMENDED: if the recomputed cascade would touch a different set…
idempotency_keystringUnique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different bo…
modestringyesCascade mode: overtime | next_day (must match the preview).
start_atstringyesDesired start — business-local naive datetime, no offset. Must be in the future and match the preview.
technician_idstringyesTarget technician (must belong to the business).

No output schema declared.

No examples provided.

commitJobRequestMove ~514

Commit a schedule-board job move Applies the move previewed by /move/preview: places the job on the technician at the new time and pushes the displaced jobs back, atomically (per-tech advisory lock; the server recomputes the plan and fences each job on its status_version — drift since the preview returns 409 SCHEDULE_MOVE_PLAN_DRIFTED, re-preview). Same body as preview + optional `expected_version`. See SCHEDULE_BOARD_DESIGN.md. 409 NEXT STEPS: SCHEDULE_MOVE_PLAN_DRIFTED — the schedule changed since your preview (or expected_move_ids no longer match): re-preview, show the fresh plan, commit again. All other codes — same remedies as /move/preview.

NameTypeReqDescription
expected_member_idsarrayExpectedMemberIDs — crew moves only: the FULL member set the preview staffed (echo data.members[].technician_id). If the commit's re-plan would staff a DIFFERENT set (a previewed replacement got book…
expected_move_idsarrayExpectedMoveIDs — the displaced job IDs the preview returned (echo data.days[].moves[].job_id). Optional but RECOMMENDED: if the schedule changed so the commit would push a different set (e.g. a job…
expected_versionintegerExpectedVersion — the moved job's status_version from the preview (0 = fence on the fresh plan-read value; negatives rejected).
idstringyesJob request ID (UUID or short_code)
idempotency_keystringUnique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different bo…
modestringyesCascade mode: overtime | next_day (must match the preview).
start_atstringyesNew start — business-local naive datetime, no offset. Must match the preview and be in the future.
technician_idstringyesTarget technician (must match the preview).

No output schema declared.

No examples provided.

confirmJobRequest ~851

Confirm a booking on behalf of the customer Fires the customer-actor `confirm_booking` action from the BUSINESS surface (audited as business_on_behalf). Two uses: (1) LIVE — staff confirm a slot for a customer who booked by phone; (2) SANDBOX — the customer magic-token surface is live-only (a sandbox job's link can never reach a real customer), so this is the ONLY way to drive a sandbox test job past booking (book → quote → confirm → assign → complete). Body carries the customer-chosen scheduled_at (business-local naive datetime). DECISION TABLE — every 409 this endpoint returns, and the correct NEXT STEP (branch on error_code, never on the HTTP status): • JOB_REQUEST_STAGE_CONFLICT — the job changed since you read it (NOTE: every FAILED confirm attempt also bumps status_version by design). Next: re-GET the job, retry with the fresh status_version. • JOB_REQUEST_ACTION_NOT_PENDING — the job is no longer at the confirm step (usually: already confirmed). Next: re-GET and show current status; do not retry. • JOB_REQUEST_NO_TECHNICIAN_AVAILABLE — the TIME is infeasible for everyone (outside working hours / the customer window, or nobody qualifies). Next: pick another time via booking-windows / time-segments. NOT an emergency case — displacement cannot conjure capacity. • JOB_REQUEST_TECH_INFEASIBLE — the FORCED technician can never take the job then; `data.reason` says why: cannot_arrive_in_time (commute/shift-start — `data.earliest_feasible_at` (RFC3339 UTC) is the first same-day time they CAN be on site → offer it) | missing_required_skills | not_available_today | not_lead_tier. Next: keep the tech and reschedule to earliest_feasible_at+, OR keep the time and drop technician_id (auto-pick) / choose another tech from time-segments. NOT an emergency case. • JOB_REQUEST_P0_REQUIRES_DISPLACEMENT — the ONLY code that routes to the EMERGENCY flow: the job is P0, the tech qualifies, but the lane is genuinely occupied. Next: POST emergency/candidates → preview → commit (the…

NameTypeReqDescription
arrival_window_minutesintegerArrivalWindowMinutes = width (phút) của arrival-window ô khách bấm ở slot-picker (chính là time_slot_step_minutes, mặc định 30). Persist để post-confirm detail render lại đúng window. Optional; bound…
idstringyesJob request ID
idempotency_keystringUnique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different bo…
scheduled_atstringChosen start time — business-local naive datetime, no offset (the business_time.datetime value from the time-segments picker). The server converts to UTC using the job's business timezone.
status_versionintegerOptimistic-lock fence: the status_version from your last read. Omitted/0 = fence on the row's current version (no race protection).
technician_idstringTechnicianID (BUSINESS confirm only — ignored on the customer surface): force-assign the job to this technician instead of the ranked auto-pick. Ranking is bypassed; feasibility (hours/time-off/geo/s…

No output schema declared.

No examples provided.

createCustomer ~463

Create a customer Creates a customer record — the client/account profile a job request (work order) is booked against; use it to import or sync customers from your own CRM, website lead form or intake flow. Address (street, city, postal_code, ...) and coordinates (latitude/longitude) live under the nested `address` object. service_area_id must be a valid service area UUID belonging to this business.

NameTypeReqDescription
addressPostal address and coordinates.
emailstringEmail address. Optional, but at least one of phone/email is required.
full_namestringyesCustomer's full name. Required; max 255 chars.
idempotency_keystringUnique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different bo…
phonestringPhone number in E.164 international format: a leading `+` and the country code, e.g. `+16135550188`. A bare national number (`6135550188`) is REJECTED with PHONE_INVALID — there is no default region…
preferred_technician_idstringUUID of the technician this customer prefers. Must belong to this business.
service_area_idstringUUID of the service area for this customer. Must belong to this business.
sms_opt_inbooleanSMS consent: set true ONLY when the customer explicitly agreed to receive SMS (e.g. ticked a non-pre-checked consent box, or gave verbal/written consent you keep a record of). SMS notifications are s…
tierstringLoyalty tier. Defaults to "regular" if omitted.
uidstringYour external reference for this customer (your own system's ID). Optional; max 32 chars.

No output schema declared.

No examples provided.

createJobRequest ~447

Create a job request Books a field-operations job — the work order that enters the dispatch & scheduling pipeline. Send the customer's UUID plus requested `job_dates` (date + morning/afternoon/evening periods, ideally offered from GET /job-requests/booking-windows), optional `job_type_id` (service catalog), `skill_ids` (required technician qualifications) and a free-text description. Quoting, technician/crew assignment and completion then advance the work order through the business's workflow.

NameTypeReqDescription
customer_idstringyesUUID of an existing customer of this business to book the job for. Required.
descriptionstringFree-text description of the work requested. Optional; max 2000 chars.
idempotency_keystringUnique key making retries safe: a repeat send with the same key returns the original booking instead of creating a duplicate (sent as the Idempotency-Key header)
job_datesarrayyesRequested date(s) + period(s) the customer wants the job. At least one, up to 12.
job_type_idstringUUID of the job type to classify this job. Optional; null leaves the job unclassified.
prioritystringScheduling priority. Optional; omitted bookings receive the business's default_priority setting (assignment settings, default p2). p0=emergency (interrupt-driven insert), p1=top (displaced only by p0…
skill_idsarrayUUIDs of the skills the customer desires for this job. Optional; up to 20.
sla_deadlinestringSLA deadline (business-local naive datetime, e.g. "2030-06-14T17:00:00"). Optional; ONLY valid together with priority=p1 — arms the auto-escalation clock (the job escalates to p0 as breach risk cross…
x_timezonestringCustomer IANA timezone (sent as the X-Timezone header)

No output schema declared.

No examples provided.

createJobType ~165

Create a job type Adds a new job type to the business catalog

NameTypeReqDescription
idempotency_keystringUnique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different bo…
namestringyesJob-type name (required) — what the booking form shows as the kind of work. Stored as the canonical English value; per-locale names are a dashboard authoring feature.
statusstringLifecycle status. Defaults to active; inactive types cannot be selected for new job requests.

No output schema declared.

No examples provided.

createServiceArea ~192

Create a new service area Creates a service area with optional polygon boundary for the business

NameTypeReqDescription
boundaryobjectGeoJSON polygon boundary (optional)
citystringCity name
countrystringCountry name
countystringCounty name
descriptionstringOptional description
districtstringDistrict name
idempotency_keystringUnique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different bo…
namestringyesArea name (required)
postal_codestringPostal code
state_provincestringState / province name

No output schema declared.

No examples provided.

createSkill ~162

Create a skill Creates a skill under the given category. New skills are active by default. Skill names must be unique within their category.

NameTypeReqDescription
descriptionstringWhat the skill covers. Optional.
idstringyesSkill category ID (UUID)
idempotency_keystringUnique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different bo…
namestringyesSkill name (required). The matching engine hard-filters technicians on skills when a booking carries skill_ids.

No output schema declared.

No examples provided.

createSkillCategory ~158

Create a skill category Creates a skill category for the current business. Categories group skills (e.g. "Plumbing", "Electrical"). Names must be unique within a business.

NameTypeReqDescription
iconstringIcon slug for the dashboard's catalog tree. Optional.
idempotency_keystringUnique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different bo…
namestringyesCategory name (required), e.g. a trade: Plumbing, Electrical, HVAC.

No output schema declared.

No examples provided.

createTechnician ~894

Add a technician Creates a technician membership under the current business. If the phone/email matches an existing user, their account is linked. Otherwise a new user identity is created. Either way the membership starts active. The new member is notified (live mode only, best-effort): an email when `email` is supplied, an SMS when `phone` is supplied, both when both — informational only, no activation step (login stays passwordless: magic link / OTP). Re-adding someone: if the person is currently SUSPENDED on this business (a dashboard action — not reachable via this API), the create REACTIVATES that existing membership (same technician id, their existing group; also notified). A technician REMOVED with deleteTechnician is a closed membership: re-adding the same email/phone links the SAME underlying person (no duplicate identity) but creates a FRESH membership with a NEW id — history stays under the old one. Owner/Administrator groups cannot be assigned via API key, and not at all in sandbox mode. Optional relations (all validated; any missing id → 404 TECHNICIAN_NOT_FOUND with `missing_ids`): `buddy_ids` sets this technician's buddy list (use when creating a lead); `lead_ids` adds this technician as a buddy of each named lead (use when creating a buddy — the buddy-side way to attach the same lead↔buddy relation); `service_area_ids` assigns the technician to those service areas. `start_location_type=office` snapshots the business address + coordinates into the technician at create time; `address`, `start_location_lat`, `start_location_long` in the body are ignored. Requires the business to have coordinates set (else 400 BUSINESS_LOCATION_MISSING). `start_location_type=home` (or empty) uses the address + coordinates from the body.

NameTypeReqDescription
addressHome address (the day-start point when start_location_type=home).
assignment_tierstringCrew tier the matching engine assigns by: lead (can head a job), buddy (crew helper), float (excluded from auto crew-assign).
buddy_idsarrayBuddies of this technician (set when creating a lead). Optional; max 50 technician ids.
business_group_idstringyesRole group for the new member. Discover IDs via GET /permission/groups (Owner/Administrator groups are rejected in sandbox mode).
emailstringEmail address. At least one of phone/email is required (identity resolution key).
full_namestringyesThe person's full display name. Required; max 255 chars.
idempotency_keystringUnique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different bo…
job_titlestringDisplay title (e.g. "Senior HVAC Technician").
join_datestringFirst working day (YYYY-MM-DD).
lead_idsarrayLeads this technician is a buddy of (set when creating a buddy; the technician is appended to each lead's buddy list). Optional; max 50 technician ids.
phonestringPhone number in E.164 international format: a leading `+` and the country code, e.g. `+16135550188`. A bare national number (`6135550188`) is REJECTED with PHONE_INVALID — there is no default region…
service_area_idsarrayService areas to assign the technician to. Optional; max 50. Discover via GET /service-areas.
start_location_latnumberExplicit day-start latitude in decimal degrees (-90..90); when set it wins over the address geocode.
start_location_longnumberExplicit day-start longitude in decimal degrees (-180..180); when set it wins over the address geocode.
start_location_typestringWhere the technician starts their day: home (their address) or office (the business location). Drives the engine's travel estimates.

No output schema declared.

No examples provided.

createVehicle ~278

Create a new vehicle Creates a vehicle for the business fleet

NameTypeReqDescription
brandstringManufacturer / make. Optional.
current_mileageintegerOdometer reading. Optional; must be >= 0 when sent.
idempotency_keystringUnique key making retries safe: a repeat send with the same key replays the original response (header Idempotent-Replayed: true) instead of re-running the operation. Reusing a key with a different bo…
modelstringModel name. Optional.
namestringyesVehicle display name (required). The only mandatory field — a fleet import needs nothing but names to get vehicles into the system.
owner_idstringUUID of the technician who owns (has claimed) this vehicle. Optional. The owner must be a lead technician or a management role — a buddy- or float-tier profile is refused with VEHICLE_OWNER_TIER_NOT_…
plate_numberstringLicense plate. Optional.
vehicle_typestring
yearintegerModel year. Optional.

No output schema declared.

No examples provided.

deleteCustomer ~43

Delete a customer Soft-deletes a customer record, removing it from the active customer directory; existing bookings keep their customer snapshot.

NameTypeReqDescription
idstringyesCustomer ID

No output schema declared.

No examples provided.

deleteJobType ~37

Delete a job type Soft-deletes a job type. System rows cannot be deleted.

NameTypeReqDescription
idstringyesJob Type ID

No output schema declared.

No examples provided.

deleteServiceArea ~30

Delete a service area Soft deletes a service area

NameTypeReqDescription
idstringyesService Area ID

No output schema declared.

No examples provided.

deleteSkill ~53

Delete a skill Permanently deletes a skill. Returns SKILL_HAS_MEMBERS (409) if any active technicians are still assigned — unassign all technicians first.

NameTypeReqDescription
idstringyesSkill ID (UUID)

No output schema declared.

No examples provided.

deleteSkillCategory ~59

Delete a skill category Permanently deletes a skill category. Returns SKILL_CATEGORY_NOT_EMPTY (409) if any skills still belong to the category — remove or move all skills first.

NameTypeReqDescription
idstringyesSkill category ID (UUID)

No output schema declared.

No examples provided.

deleteTechnician ~37

Remove a technician Soft-removes a technician from the business by setting status to deactive

NameTypeReqDescription
idstringyesTechnician ID

No output schema declared.

No examples provided.

deleteVehicle ~26

Delete a vehicle Soft deletes a vehicle

NameTypeReqDescription
idstringyesVehicle ID

No output schema declared.

No examples provided.

getCustomer ~90

Get a customer Returns the full customer record: profile, contact details, tier and lifetime spending summary — a 360° client view for support, upsell or CRM enrichment. contact.preferred_technician includes {id, name}. contact.service_area includes {id, name}. contact.address.latitude / contact.address.longitude are null if no coordinates saved.

NameTypeReqDescription
idstringyesCustomer ID (UUID)

No output schema declared.

No examples provided.

getJobRequest ~71

Get a job request Returns the full work order: current workflow status, quoted duration, confirmed schedule, customer contact snapshot and the assigned technician / crew — everything a dispatcher or an external field-operations system needs to track one job.

NameTypeReqDescription
idstringyesJob request ID (UUID or short_code)

No output schema declared.

No examples provided.

getJobRequestTimeline ~112

Job timeline Per-status progress of a job's lifecycle (e.g. booked → confirmed → on the way → arrived → completed, following the business's configured workflow) — render it as a job-tracking timeline. Each status carries its state (completed | current | upcoming), when the job entered it, and the actions fired within it. entered_at may be null for upcoming steps and for older jobs predating the backfill.

NameTypeReqDescription
idstringyesJob request ID (UUID or short_code)

No output schema declared.

No examples provided.

getJobType ~60

Get a job type Returns one entry of the business's service catalog (job/work-order type) with its localized display name — e.g. an HVAC tune-up, drain cleaning or electrical inspection offering.

NameTypeReqDescription
idstringyesJob Type ID

No output schema declared.

No examples provided.

getServiceArea ~66

Get a service area Returns one service area — a geographic coverage zone (service territory) the business operates in, with its name and geometry metadata. Reference its UUID as `service_area_id` on customer records for territory-aware dispatch.

NameTypeReqDescription
idstringyesService Area ID

No output schema declared.

No examples provided.

getTechnician ~61

Get a technician Returns one technician's full profile: contact info, employment status, assignment tier, skills/qualifications, buddy (crew) relations and assigned vehicles — the dispatch-ready view of a field worker.

NameTypeReqDescription
idstringyesTechnician ID

No output schema declared.

No examples provided.

getTechnicianSchedule ~157

One technician's real schedule (sessions + time off) The technician's ACTUAL occupancy over a date range: every job session on their lane (solo/lead and crew) plus approved time-off blocks. Weekly recurring working hours come from the technician-availability endpoints — combine both for the full availability picture ("get crew availability"). from/to are business-local dates (YYYY-MM-DD, inclusive); omitted = today .. +7 days; range max 31 days.

NameTypeReqDescription
fromstringStart date (YYYY-MM-DD, business-local; default today)
idstringyesTechnician ID
tostringEnd date (YYYY-MM-DD, inclusive; default from+7d; max range 31 days)

No output schema declared.

No examples provided.

getVehicle ~60

Get a vehicle Returns one fleet vehicle (service van/truck): identity, plate, operational status (idle, on job, maintenance) and which technicians use it — the fleet-management view of a single asset.

NameTypeReqDescription
idstringyesVehicle ID

No output schema declared.

No examples provided.

listCrewCandidates ~353

Matching crew candidates for a job RE-STAFFING candidates for a CONFIRMED, SCHEDULED job (not yet completed/archived) — any earlier or later stage returns 409 JOB_REQUEST_INVALID_TRANSITION. This is the pool of technicians who could REPLACE the current crew: the currently assigned lead and buddies are deliberately excluded (they are the status quo, not an option), so on a small roster an empty `leads` list is a normal answer, not an error. For pre-booking discovery ("who could take this job before it is confirmed?") use listJobRequestBookingWindows / listMatchingSlots / the time-segments grid instead. Candidates are matched and ranked by the smart-assignment engine — skills per crew slot, weekly availability, existing schedule, time off and travel are all checked; each carries a score breakdown (distance, travel, matched skills) plus the exact on-site session plan they would work. NOT a raw roster list (use GET /technicians for that). Returns the ranked feasible LEAD pool by default; pass include_buddies=true to also return per-slot buddy pools, include_vehicle=true to include the available-vehicle list. force_lead_id checks one specific technician: returns only that lead (with their crew combo) if feasible, else 409 JOB_REQUEST_NO_TECHNICIAN_AVAILABLE.

NameTypeReqDescription
force_lead_idstringCheck a specific technician as lead — returns only that lead if feasible, else 409
idstringyesJob request ID or short_code
include_buddiesbooleanAlso return buddy candidate pools
include_vehiclebooleanAlso return the available-vehicle list

No output schema declared.

No examples provided.

listCustomers ~216

List customers Returns a paginated, searchable directory of the business's customer records — the customer database (CRM) behind every booking and work order. Supports the `since`/`next_since` cursor for incremental sync into an external CRM, ERP or marketing tool.

NameTypeReqDescription
limitintegerPage size (default 15, max 1000)
pageintegerPage number (default 1)
preferred_technician_idstringFilter by preferred technician UUID
qstringSearch name, UID, phone, email
sincestringRFC3339 cursor for short-polling; echo back next_since from prior response
sortstringSort: created_at_desc|created_at_asc|name_asc|name_desc|uid_asc|uid_desc (default: created_at_desc)
statusstringFilter by status: active|inactive
tierarrayFilter by tier: regular|vip (repeatable)

No output schema declared.

No examples provided.

listEmergencyCandidates ~449

Rank technicians for a P0 emergency insert Returns the technicians who could take the emergency job at the requested start, ranked FASTEST-ARRIVAL first (arrival beats route efficiency for a P0). The response also carries a historical `crew_recommendation` (median crew size on comparable completed jobs + mandatory disclaimer — AC-2). Booked technicians are still candidates — each entry carries the displacement preview (which lower-priority jobs would be pushed, per day) that committing to them would cause; total_moves=0 means a free slot. P0 jobs are never displaced; P1 only by a P0. ETA is estimated from the technician's start location (no live GPS). Feed the chosen technician_id into emergency/preview + emergency/commit. 409 NEXT STEPS: EMERGENCY_RESCHEDULE_NOT_ELIGIBLE — the job cannot be emergency-inserted (not P0, already started/completed/archived, or not quoted): fix the job state or use a normal confirm. EMERGENCY_RESCHEDULE_CREW_UNSUPPORTED — crew jobs cannot use the emergency flow (v1): staff via confirm/reassign instead. EMERGENCY_RESCHEDULE_MULTIDAY_UNSUPPORTED — a confirmed multi-day job cannot be re-inserted (v1): use the normal reassign flow. EMERGENCY_RESCHEDULE_NO_WORKING_DAY — the chosen date has no working hours: pick a working day. EMERGENCY_RESCHEDULE_IN_PAST — start time already passed: pick a future time.

NameTypeReqDescription
emergency_job_idstringyesID of the P0 job to place.
idempotency_keystringOptional idempotency key (forwarded as the Idempotency-Key header). Reuse the same value when retrying so the operation runs at most once.
limitintegerMax candidates to return (default 5, max 10).
modestringyesCascade mode each candidate's displacement preview assumes: overtime = displaced jobs stay same-day; next_day = overflow rolls to the next working day.
start_atstringyesDesired start — business-local naive datetime, no offset. Must be in the future.

No output schema declared.

No examples provided.

listJobRequestBookingWindows ~111

Booking availability Real-time appointment availability from the scheduling engine: returns the bookable date + time-period windows given technician capacity, working hours and service-territory coverage. Call this before creating a job request and offer the customer ONLY the returned windows — it prevents unschedulable bookings.

NameTypeReqDescription
fromstringStart YYYY-MM-DD
tostringEnd YYYY-MM-DD
x_timezonestringyesCustomer IANA timezone (sent as the X-Timezone header)

No output schema declared.

No examples provided.

listJobRequestChanges ~488

Poll for new & changed job requests (sync feed) Keep an external system (your CRM, ERP or field-operations tool) in sync with bookings WITHOUT re-listing everything: returns the job requests (work orders) whose state changed (created, status transition, reschedule, soft-delete/archive) at or after the `since` cursor, ordered oldest-change-first (updated_at ASC). How to use it: (1) On your first poll OMIT `since` — the server primes the cursor at "now", returns no items and a `next_since`. (2) Store `next_since` and pass it as `since` on the next poll. (3) Apply each returned item to your store by UPSERTING on `id` (the server re-scans a ~5s safety window, so the same job may appear again — never blindly append). (4) If `has_more` is true the page filled to `limit` and more changes are already waiting — poll again immediately; otherwise wait your normal interval (e.g. 5–15s). This is NOT pagination — it is a time-keyed change feed. Use the paginated GET /job-requests for the initial bulk load, then this endpoint to stay live. Filters (status_keys, customer_id, …) narrow the feed to the slice you care about.

NameTypeReqDescription
customer_idstringOnly changes to this customer's jobs (UUID)
limitintegerMax changes per poll (default 15, max 1000). If the page fills, has_more=true.
prioritystringPriority filter (p0|p1|p2|p3)
scheduled_fromstringFilter from (YYYY-MM-DD = start of that day in the business timezone, or RFC3339); range is [from, to)
scheduled_tostringFilter to (YYYY-MM-DD = end of that day in the business timezone, or RFC3339), exclusive
sincestringRFC3339 cursor from the prior response's next_since. OMIT on the first poll to prime the cursor at server-now.
status_keysstringComma-separated status slugs — only surface changes to jobs in these statuses
technician_idstringOnly changes to jobs assigned to this technician (UUID)

No output schema declared.

No examples provided.

listJobRequests ~416

List job requests Paginated list of the business's bookings (work orders) with dispatch-oriented filters: workflow status, customer, assigned technician, scheduled date range and free-text search over code/description. This is also the SCHEDULE query: combine technician_id + scheduled_from/scheduled_to to read one technician's agenda for a day or week (e.g. "what is Alex doing tomorrow"), or just the date range for the whole team's calendar.

NameTypeReqDescription
completed_fromstringFilter by completion time from (YYYY-MM-DD = start of that day in the business timezone, or RFC3339); range is [from, to). Counts jobs by when they were completed regardless of reschedules.
completed_tostringFilter by completion time to (YYYY-MM-DD = end of that day in the business timezone, or RFC3339), exclusive
customer_idstringCustomer UUID
limitintegerPage size
pageintegerPage number
prioritystringPriority filter (p0|p1|p2|p3)
qstringSearch short_code or description (case-insensitive, partial match)
scheduled_fromstringFilter from (YYYY-MM-DD = start of that day in the business timezone, or RFC3339); range is [from, to)
scheduled_tostringFilter to (YYYY-MM-DD = end of that day in the business timezone, or RFC3339), exclusive
service_area_idstringService-area UUID (board zone filter)
sortstringSort key: created_at:desc (default) | created_at:asc | scheduled_at:asc | scheduled_at:desc | priority:asc (P0 first) | priority:desc
statusstringactive (default) | archived | all
status_keysstringComma-separated status slugs
technician_idstringTechnician UUID

No output schema declared.

No examples provided.

listJobTypes ~91

List job types Returns the business's service catalog — the job/work-order types it offers (e.g. installation, repair, maintenance, inspection for trades like HVAC, plumbing, electrical, cleaning). Use it to discover the `job_type_id` accepted when booking a job request, or to render a services menu on your own site.

NameTypeReqDescription
statusstringFilter by status (active|inactive)

No output schema declared.

No examples provided.

listMatchingSlots ~189

Matching time slots for a quoted job Bookable arrival-window slots for a quoted job, computed by the smart-assignment matching engine: each slot lists the technicians actually available to start then (skills, weekly availability, existing schedule, time off and travel all checked), with a per-technician match score. Use it to find and offer appointment times an agent or integration can then confirm (POST /job-requests/{id}/confirm with the slot's business_time.datetime). Same grid the end-customer's slot picker shows; slot width defaults to the business's arrival window — override via ?step_minutes (5–240). The job must be quoted first (the quote sets the visit duration the matcher schedules).

NameTypeReqDescription
idstringyesJob request ID (UUID or short_code)
step_minutesintegerSlot step in minutes (default: business arrival window, 5–240)

No output schema declared.

No examples provided.

listNearbyTechnicians ~214

Find nearby feasible technicians (job-less location query) Ranks who could serve a hypothetical visit at (lat,lng) starting `at` for `duration_minutes` — the engine applies the REAL hard filters (weekly hours, existing schedule, approved time-off, geographic service areas, optional skill floor) and returns candidates nearest-arrival first. ETA origin is each technician's start location (no live GPS). Use before creating a booking to propose realistic arrivals.

NameTypeReqDescription
atstringVisit start (RFC3339, e.g. 2026-07-20T14:00:00Z; default now)
duration_minutesintegerVisit length in minutes (default 60; 15–480)
latnumberyesLatitude of the service location
limitintegerMax candidates (default 10, max 20)
lngnumberyesLongitude of the service location
skill_idsstringComma-separated skill UUIDs to require/match

No output schema declared.

No examples provided.

listServiceAreas ~87

List service areas Returns the business's geographic coverage: paginated service areas (service territories / coverage zones) used for routing jobs to the right teams. Discover the `service_area_id` values accepted on customer create/update here.

NameTypeReqDescription
limitintegerItems per page (default 15, max 1000)
pageintegerPage number (default 1)

No output schema declared.

No examples provided.

listSkillCategories ~78

List skill categories Returns paginated skill categories — how the business groups technician qualifications by trade or specialty (e.g. HVAC, plumbing, electrical) — ordered alphabetically.

NameTypeReqDescription
limitintegerPage size (default: 15, max: 1000)
pageintegerPage number (default: 1)

No output schema declared.

No examples provided.

listSkills ~89

List all skills Returns the flat list of all active technician skills / qualifications for the current business — the vocabulary the dispatch engine uses for skill-based matching when assigning technicians and crews. Use it to discover the skill UUIDs accepted in `skill_ids` when creating a job request. (For a category-grouped view, use GET /skill-categories and GET /skill-categories/{id}/skills.)

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

listSkillsByCategory ~113

List skills in a category Returns paginated skills (technician qualifications/certifications) belonging to the given trade/specialty category, ordered alphabetically. The `members` field on each skill is the count of active technicians currently holding it — a quick capacity check per capability.

NameTypeReqDescription
idstringyesSkill category ID (UUID)
limitintegerPage size (default: 15, max: 1000)
pageintegerPage number (default: 1)

No output schema declared.

No examples provided.

listTechnicians ~219

List technicians Returns the field workforce roster: paginated technicians (field workers / engineers) with status, assignment tier (lead, buddy, float), skills and crew relations — the people the dispatch engine schedules onto jobs. Discover the `preferred_technician_id` accepted on customer records here. Supports the `since` cursor for incremental workforce sync.

NameTypeReqDescription
assignment_tierstringFilter by assignment tier (lead, buddy, float)
keywordstringSearch by full name, email, phone, or address
limitintegerItems per page (default 15, max 1000)
pageintegerPage number (default 1)
sincestringRFC3339 cursor for short-polling; echo back next_since from prior response
sortstringSort: created_at_desc|created_at_asc|name_asc|name_desc (default: created_at_desc)
statusstringFilter by status (active, onboarding, deactive)

No output schema declared.

No examples provided.

listTechnicianSkills ~127

List skills for a technician Returns paginated skills assigned to the technician. By default (`eligible_only` omitted or `true`) only active skills are returned — pass `eligible_only=false` to include inactive skills.

NameTypeReqDescription
eligible_onlybooleantrue (default) = active skills only; false = all assigned skills including inactive
idstringyesTechnician ID — business_user_profiles.id (UUID)
limitintegerPage size (default: 15, max: 1000)
pageintegerPage number (default: 1)

No output schema declared.

No examples provided.

listVehicles ~156

List vehicles Returns the business's fleet: paginated service vehicles (vans/trucks) with operational status (idle, on job, maintenance) — the fleet inventory behind crew carpooling and job mobilization. Supports the `since` cursor for incremental fleet sync.

NameTypeReqDescription
keywordstringSearch by name, brand, model, or plate number
limitintegerItems per page (default 15, max 1000)
pageintegerPage number (default 1)
sincestringRFC3339 cursor for short-polling; echo back next_since from prior response
statusstringFilter by status (inactive, idle, on_job, maintenance)

No output schema declared.

No examples provided.

previewEmergencyReschedule ~434

Preview emergency insert + cascade reschedule Computes (WITHOUT writing) the cascade of inserting an emergency job onto a technician at a chosen time: where the emergency lands + every job pushed back, grouped per business-local day. `displacement_mode=reassign` instead hands each displaced job to another feasible technician at its ORIGINAL window (same-day promise) — jobs with no alternate capacity fall back to reschedule and stay in `days`. `mode=overtime` keeps everyone same-day (tech works late); `mode=next_day` rolls overflow to the next working day(s). Read-only — safe to call repeatedly; commit is a separate endpoint. Isolated feature (see EMERGENCY_RESCHEDULE_DESIGN.md). 409 NEXT STEPS: EMERGENCY_RESCHEDULE_SLOT_OCCUPIED — the landing window is blocked by a job the cascade may NOT move (another P0, a crew or multi-day job): choose another technician (walk the /candidates ranking) or another time; displacement never touches P0/crew/multi-day anchors. EMERGENCY_RESCHEDULE_NOT_ELIGIBLE / CREW_UNSUPPORTED / MULTIDAY_UNSUPPORTED / NO_WORKING_DAY / IN_PAST — same remedies as /candidates.

NameTypeReqDescription
displacement_modestringFate of displaced jobs: reschedule (default — pushed to later windows) or reassign (handed to another feasible technician at their ORIGINAL time; no-capacity jobs fall back to reschedule).
emergency_job_idstringyesID of the P0 job to insert.
idempotency_keystringOptional idempotency key (forwarded as the Idempotency-Key header). Reuse the same value when retrying so the operation runs at most once.
modestringyesCascade mode: overtime = displaced jobs stay same-day (tech works late); next_day = overflow rolls to the next working day.
start_atstringyesDesired start — business-local naive datetime, no offset. Must be in the future.
technician_idstringyesTarget technician (must belong to the business).

No output schema declared.

No examples provided.

previewJobRequestMove ~678

Preview a schedule-board job move Computes (WITHOUT writing) the outcome of moving a confirmed job to a new time and/or technician: where it lands, every later job pushed back per `mode`, and the warnings the coordinator would accept (displaced jobs leaving their confirmed windows, overtime). Same technician = pure time move; different technician = manual reassign. Read-only — safe to call repeatedly while dragging; commit is a separate endpoint. See SCHEDULE_BOARD_DESIGN.md. Warning detail: a TECH_NOT_FEASIBLE warning carries `reason` = `cannot_arrive_in_time` (commute from the tech day-start location / shift start; `earliest_feasible_at` (RFC3339 UTC) is the first same-day time they CAN be on site — suggest it as the drop slot) | `missing_required_skills` | `not_available_today` (no working hours, approved time off, or outside the service area) | `not_lead_tier`. For a P0 move this warning is advisory (coordinator may commit anyway); for p1/p2/p3 the same condition is the hard 409 SCHEDULE_MOVE_TECH_INFEASIBLE. 409 NEXT STEPS: SCHEDULE_MOVE_NOT_ELIGIBLE (job unconfirmed/unquoted/archived/completed — not movable) · SCHEDULE_MOVE_IN_PROGRESS (tech already executing — do not move) · SCHEDULE_MOVE_IN_PAST (pick a future time) · SCHEDULE_MOVE_SLOT_OCCUPIED (landing window blocked by an immovable anchor — another tech/time) · SCHEDULE_MOVE_TECH_INFEASIBLE (non-P0 hard block: target tech not qualified/available — its `data` carries `technician_id`, `reason` (same catalog as the TECH_NOT_FEASIBLE warning) and, for `cannot_arrive_in_time`, `earliest_feasible_at` (RFC3339 UTC) to suggest as the drop slot; change tech or time) · SCHEDULE_MOVE_MULTIDAY_UNSUPPORTED (multi-day jobs not movable v1) · SCHEDULE_MOVE_NO_WORKING_DAY (pick a working day) · SCHEDULE_MOVE_REQUIRES_FREE_SLOT (non-P0 moves may not displace — free capacity only, unless the owner enables allow_non_p0_displacement) · SCHEDULE_MOVE_CREW_UNSTAFFABLE (a crew slot has no feasible replacement at the new time —…

NameTypeReqDescription
idstringyesJob request ID (UUID or short_code)
idempotency_keystringOptional idempotency key (forwarded as the Idempotency-Key header). Reuse the same value when retrying so the operation runs at most once.
modestringyesCascade mode for displaced jobs: overtime = stay same-day (tech works late); next_day = overflow rolls to the next working day.
start_atstringyesNew start — business-local naive datetime, no offset. Must be in the future.
technician_idstringyesTarget technician — may equal the current tech (pure time move) or differ (manual reassign).

No output schema declared.

No examples provided.

quoteJobRequest ~277

Fire quote (FIXED action — business) Sends the quote: sets quoted_at + duration cols, advances pending_action to confirm_booking. Status stays `booking`.

NameTypeReqDescription
crewarrayCrew — multi-person plan (tech lead + buddies). Omit / empty = single person (lead 100%). When present must have exactly one is_lead and wrench_percent summing to 100. See MULTIPERSON_CREW_DESIGN.md.
demobilization_minutesintegerDemobilization (teardown) minutes added after the work. Optional, min 0.
idstringyesJob request ID
idempotency_keystringOptional idempotency key (forwarded as the Idempotency-Key header). Reuse the same value when retrying so the operation runs at most once.
job_duration_minutesintegeryesHands-on work duration in minutes (man-minutes for a crew job). Required, min 1.
mobilization_minutesintegerMobilization (setup/travel-prep) minutes added before the work. Optional, min 0.
status_versionintegerOptimistic-lock fence: the status_version from your last read. Omitted/0 = fence on the row's current version (no race protection).

No output schema declared.

No examples provided.

replaceTechnicianBuddies ~97

Replace a technician's buddies Overwrites the technician's buddy list with the provided set of technician IDs. Sending an empty list clears all buddies. Each buddy ID must be an active technician of the same business; a technician cannot be their own buddy.

NameTypeReqDescription
buddy_idsarrayTechnician ids to set as this lead's buddies (max 50; self-buddy rejected).
idstringyesTechnician ID

No output schema declared.

No examples provided.

replaceTechnicianLeads ~87

Replace a buddy's leaders (buddy side) Sets the full set of leads this buddy belongs to (many-to-many favorites). Replace-semantics — lead_ids is the complete new list; [] clears every leader. Managed by business staff.

NameTypeReqDescription
idstringyesBuddy technician ID
lead_idsarrayLead technician ids this buddy assists (max 50).

No output schema declared.

No examples provided.

replaceTechnicianServiceAreas ~139

Replace a technician's service areas Overwrites the technician's service-area assignments with the provided set of service area IDs. Sending an empty list clears all. Each service area ID must belong to the same business — any missing id → 404 SERVICE_AREA_NOT_FOUND with `missing_ids` and no writes. The resolved set is returned and also embedded as `service_areas` in the technician GET/list response. Managed by business staff (Booking Coordinator), not tech self-service.

NameTypeReqDescription
idstringyesTechnician ID
service_area_idsarrayService-area ids (max 50). Discover via GET /service-areas.

No output schema declared.

No examples provided.

replaceTechnicianSkills ~145

Replace a technician's skills Sets the technician's full skill set in one call (replace semantics): skills not in the list are removed, new ones added. Pass an empty list to clear all. All skills must be active and belong to the business — on SKILL_NOT_FOUND (404) the `data` field contains `{"missing_ids": ["uuid", ...]}`; on SKILL_INACTIVE (409) it contains `{"inactive_ids": ["uuid", ...]}`.

NameTypeReqDescription
idstringyesTechnician ID — business_user_profiles.id (UUID)
skill_idsarraySkill ids (max 100). Discover via GET /skills.

No output schema declared.

No examples provided.

replaceTechnicianVehicles ~100

Replace a technician's vehicles Overwrites the technician's vehicle list with the provided set of vehicle IDs (the vehicles this technician uses). Sending an empty list clears all. Each vehicle ID must belong to the same business. The list is also embedded as `vehicle_ids` in the technician GET/list response.

NameTypeReqDescription
idstringyesTechnician ID
vehicle_idsarrayVehicle ids (max 50). Discover via GET /vehicles.

No output schema declared.

No examples provided.

Common questions

What is the com.crisphive/mcp server?

com.crisphive/mcp is listed in the public MCP registry as com.crisphive/mcp. Field operations on a deterministic solver, run jobs, crews & fleet from Claude or ChatGPT. This page covers its npm package (@crisphive/mcp).

Is the com.crisphive/mcp server safe to use?

com.crisphive/mcp scores 81 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the com.crisphive/mcp server expose?

com.crisphive/mcp exposes 53 tools: commitEmergencyReschedule, commitJobRequestMove, confirmJobRequest, createCustomer, createJobRequest, and 48 more. Their descriptions and schemas cost roughly 12,228 tokens of context every time the server is loaded.

Is the com.crisphive/mcp server still maintained?

com.crisphive/mcp is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the com.crisphive/mcp server under?

com.crisphive/mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.