Kickserv MCP by usefulapi

Look up Kickserv customers, jobs, notes and time entries, and create jobs, tasks and charges.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
95%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~6,430Tokens (tool definitions)
~3.0 KBTypical response size
Significant attention impact (5.02% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "kickserv": {
      "url": "https://kickserv.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://kickserv.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (20)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢kickserv_list_customers(page, name, customer_number, email_address, phone_number, ...)

List or search customers, 30 per page. Every filter is an exact match on that field. Use `only` to keep the response small. Kickserv: GET /{account}/customers.xml.

Input Schema

{
  "type": "object",
  "properties": {
    "page": {
      "description": "Page number (Kickserv returns 30 records per page). Omit for page 1.",
      "type": "integer",
      "minimum": 1,
      "maximum": 10000
    },
    "name": {
      "description": "Exact customer name.",
      "type": "string",
      "maxLength": 255
    },
    "customer_number": {
      "description": "Customer number.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "email_address": {
      "description": "Exact email address.",
      "type": "string",
      "maxLength": 255
    },
    "phone_number": {
      "description": "Exact phone number, e.g. 800-555-1212.",
      "type": "string",
      "maxLength": 64
    },
    "service_city": {
      "description": "Service city.",
      "type": "string",
      "maxLength": 128
    },
    "service_state": {
      "description": "Service state (2-letter abbreviation).",
      "type": "string",
      "maxLength": 64
    },
    "service_zip_code": {
      "description": "Service ZIP (full zip+4 if the record has one).",
      "type": "string",
      "maxLength": 32
    },
    "billing_city": {
      "description": "Billing city.",
      "type": "string",
      "maxLength": 128
    },
    "billing_state": {
      "description": "Billing state.",
      "type": "string",
      "maxLength": 64
    },
    "include": {
      "description": "Related data to embed: contacts, jobs, tasks, notes, tax_entity, custom_field_assignments.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "contacts",
          "jobs",
          "tasks",
          "notes",
          "tax_entity",
          "custom_field_assignments"
        ]
      }
    },
    "only": {
      "description": "Comma-separated list of columns to return, e.g. `customer_number,name`. Kickserv recommends this: it makes responses much smaller and faster.",
      "type": "string",
      "pattern": "^[a-z0-9_]+(,[a-z0-9_]+)*$"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kickserv_get_customer(customer_number, include)

Fetch one customer by customer number, optionally with related contacts, jobs, tasks and notes. The result's `id` is what job/task create calls need as `customer_id`. Kickserv: GET /{account}/customers/{customer_number}.xml.

Input Schema

{
  "type": "object",
  "properties": {
    "customer_number": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Customer number (as shown in Kickserv)."
    },
    "include": {
      "description": "Related data to embed: contacts, jobs, tasks, notes, tax_entity, custom_field_assignments.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "contacts",
          "jobs",
          "tasks",
          "notes",
          "tax_entity",
          "custom_field_assignments"
        ]
      }
    }
  },
  "required": [
    "customer_number"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kickserv_list_customer_jobs(customer_number, page, include, only)

List the jobs for one customer, 30 per page. Kickserv: GET /{account}/customers/{customer_number}/jobs.xml.

Input Schema

{
  "type": "object",
  "properties": {
    "customer_number": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Customer number."
    },
    "page": {
      "description": "Page number (Kickserv returns 30 records per page). Omit for page 1.",
      "type": "integer",
      "minimum": 1,
      "maximum": 10000
    },
    "include": {
      "description": "Related data to embed: customer, employees, job_charges, time_entries, notes, job_type, job_status, tax_entity, custom_field_assignments.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "customer",
          "employees",
          "job_charges",
          "time_entries",
          "notes",
          "job_type",
          "job_status",
          "tax_entity",
          "custom_field_assignments"
        ]
      }
    },
    "only": {
      "description": "Comma-separated list of columns to return, e.g. `customer_number,name`. Kickserv recommends this: it makes responses much smaller and faster.",
      "type": "string",
      "pattern": "^[a-z0-9_]+(,[a-z0-9_]+)*$"
    }
  },
  "required": [
    "customer_number"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kickserv_list_jobs(page, scheduled, status, employee_number, job_type_id, ...)

List jobs (work orders, estimates, invoices), 30 per page, filterable by schedule window, status, assigned employee, category (job type) or job status. Kickserv: GET /{account}/jobs.xml.

Input Schema

{
  "type": "object",
  "properties": {
    "page": {
      "description": "Page number (Kickserv returns 30 records per page). Omit for page 1.",
      "type": "integer",
      "minimum": 1,
      "maximum": 10000
    },
    "scheduled": {
      "description": "Scheduled-date window, e.g. today or this_week.",
      "type": "string",
      "enum": [
        "today",
        "tomorrow",
        "yesterday",
        "this_week",
        "next_week",
        "last_week",
        "this_month",
        "next_month",
        "last_month",
        "this_year",
        "last_year"
      ]
    },
    "status": {
      "description": "Job status.",
      "type": "string",
      "enum": [
        "unscheduled",
        "scheduled",
        "in_progress",
        "on_hold",
        "canceled",
        "complete"
      ]
    },
    "employee_number": {
      "description": "Only jobs assigned to this employee number.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "job_type_id": {
      "description": "Only jobs in this category (job type id).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "job_status_id": {
      "description": "Only jobs with this custom job status id.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "include": {
      "description": "Related data to embed: customer, employees, job_charges, time_entries, notes, job_type, job_status, tax_entity, custom_field_assignments.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "customer",
          "employees",
          "job_charges",
          "time_entries",
          "notes",
          "job_type",
          "job_status",
          "tax_entity",
          "custom_field_assignments"
        ]
      }
    },
    "only": {
      "description": "Comma-separated list of columns to return, e.g. `customer_number,name`. Kickserv recommends this: it makes responses much smaller and faster.",
      "type": "string",
      "pattern": "^[a-z0-9_]+(,[a-z0-9_]+)*$"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kickserv_get_job(job_number, include)

Fetch one job by job number, optionally with its customer, assigned employees, job charges (line items), time entries and notes. Kickserv: GET /{account}/jobs/{job_number}.xml.

Input Schema

{
  "type": "object",
  "properties": {
    "job_number": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Job number (as shown in Kickserv)."
    },
    "include": {
      "description": "Related data to embed: customer, employees, job_charges, time_entries, notes, job_type, job_status, tax_entity, custom_field_assignments.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "customer",
          "employees",
          "job_charges",
          "time_entries",
          "notes",
          "job_type",
          "job_status",
          "tax_entity",
          "custom_field_assignments"
        ]
      }
    }
  },
  "required": [
    "job_number"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kickserv_list_customer_notes(customer_number)

List the notes on one customer. Kickserv: GET /{account}/customers/{customer_number}/notes.xml.

Input Schema

{
  "type": "object",
  "properties": {
    "customer_number": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Customer number."
    }
  },
  "required": [
    "customer_number"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kickserv_list_job_notes(job_number)

List the notes on one job. Kickserv: GET /{account}/jobs/{job_number}/notes.xml.

Input Schema

{
  "type": "object",
  "properties": {
    "job_number": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Job number."
    }
  },
  "required": [
    "job_number"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kickserv_list_job_time_entries(job_number)

List the time entries (hours logged by technicians) on one job. Kickserv: GET /{account}/jobs/{job_number}/time_entries.xml.

Input Schema

{
  "type": "object",
  "properties": {
    "job_number": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Job number."
    }
  },
  "required": [
    "job_number"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kickserv_get_task(task_id)

Fetch one task (appointment / to-do attached to a job) by id. Kickserv: GET /{account}/tasks/{task_id}.xml.

Input Schema

{
  "type": "object",
  "properties": {
    "task_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Task id."
    }
  },
  "required": [
    "task_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kickserv_list_employees

List all employees (technicians and office staff), active and inactive. Use their `id` for job/task assignment and time entries, and `employee_number` to filter jobs. Kickserv: GET /{account}/employees.xml.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kickserv_list_items(page, name, which)

List products/services (the price list used for job charges), 30 per page. Active items only by default. Kickserv: GET /{account}/items.xml.

Input Schema

{
  "type": "object",
  "properties": {
    "page": {
      "description": "Page number (Kickserv returns 30 records per page). Omit for page 1.",
      "type": "integer",
      "minimum": 1,
      "maximum": 10000
    },
    "name": {
      "description": "Filter by item name.",
      "type": "string",
      "maxLength": 255
    },
    "which": {
      "description": "Which items to return: active (default), inactive, or all.",
      "type": "string",
      "enum": [
        "active",
        "inactive",
        "all"
      ]
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴kickserv_create_customer(name, company_name, first_name, last_name, contact, ...)

WRITE: create a new customer. Kickserv assigns the customer number. Kickserv: POST /{account}/customers.xml.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 255,
      "description": "Customer name (required)."
    },
    "company_name": {
      "description": "Company name.",
      "type": "string",
      "maxLength": 255
    },
    "first_name": {
      "description": "Contact first name.",
      "type": "string",
      "maxLength": 255
    },
    "last_name": {
      "description": "Contact last name.",
      "type": "string",
      "maxLength": 255
    },
    "contact": {
      "description": "Primary contact name.",
      "type": "string",
      "maxLength": 255
    },
    "email_address": {
      "description": "Email address.",
      "type": "string",
      "maxLength": 255,
      "format": "email",
      "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    },
    "phone_number": {
      "description": "Phone number.",
      "type": "string",
      "maxLength": 64
    },
    "mobile": {
      "description": "Mobile number.",
      "type": "string",
      "maxLength": 64
    },
    "alt_contact": {
      "description": "Alternate contact name.",
      "type": "string",
      "maxLength": 255
    },
    "alt_phone_number": {
      "description": "Alternate phone number.",
      "type": "string",
      "maxLength": 64
    },
    "fax": {
      "description": "Fax number.",
      "type": "string",
      "maxLength": 64
    },
    "account_number": {
      "description": "Your own account number for the customer.",
      "type": "string",
      "maxLength": 64
    },
    "service_address": {
      "description": "Service address (where the work happens), line 1.",
      "type": "string",
      "maxLength": 255
    },
    "service_address_2": {
      "description": "Service address line 2.",
      "type": "string",
      "maxLength": 255
    },
    "service_city": {
      "description": "Service city.",
      "type": "string",
      "maxLength": 128
    },
    "service_state": {
      "description": "Service state (2-letter abbreviation in the US).",
      "type": "string",
      "maxLength": 64
    },
    "service_zip_code": {
      "description": "Service ZIP/postal code.",
      "type": "string",
      "maxLength": 32
    },
    "service_country": {
      "description": "Service country (2-letter code).",
      "type": "string",
      "maxLength": 64
    },
    "billing_address": {
      "description": "Billing address (where invoices go), line 1.",
      "type": "string",
      "maxLength": 255
    },
    "billing_address_2": {
      "description": "Billing address line 2.",
      "type": "string",
      "maxLength": 255
    },
    "billing_city": {
      "description": "Billing city.",
      "type": "string",
      "maxLength": 128
    },
    "billing_state": {
      "description": "Billing state.",
      "type": "string",
      "maxLength": 64
    },
    "billing_zip_code": {
      "description": "Billing ZIP/postal code.",
      "type": "string",
      "maxLength": 32
    },
    "billing_country": {
      "description": "Billing country.",
      "type": "string",
      "maxLength": 64
    },
    "special_instructions": {
      "description": "Special instructions shown to technicians.",
      "type": "string",
      "maxLength": 5000
    },
    "company": {
      "description": "True if the customer is a company rather than a person.",
      "type": "boolean"
    },
    "is_active": {
      "description": "False to mark the customer inactive (reversible).",
      "type": "boolean"
    },
    "notify_via_email": {
      "description": "Send the customer email notifications.",
      "type": "boolean"
    },
    "notify_via_sms": {
      "description": "Send the customer SMS notifications.",
      "type": "boolean"
    },
    "customer_type_id": {
      "description": "Customer type id.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "customer_source_id": {
      "description": "Customer source (lead source) id.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "name"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴kickserv_update_customer(customer_number, name, company_name, first_name, last_name, ...)

WRITE: update fields on an existing customer. Only the fields you pass change. Balances, credit limit and custom fields are not settable here. Kickserv: PATCH /{account}/customers/{customer_number}.xml.

Input Schema

{
  "type": "object",
  "properties": {
    "customer_number": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Customer number to update."
    },
    "name": {
      "description": "New customer name.",
      "type": "string",
      "minLength": 1,
      "maxLength": 255
    },
    "company_name": {
      "description": "Company name.",
      "type": "string",
      "maxLength": 255
    },
    "first_name": {
      "description": "Contact first name.",
      "type": "string",
      "maxLength": 255
    },
    "last_name": {
      "description": "Contact last name.",
      "type": "string",
      "maxLength": 255
    },
    "contact": {
      "description": "Primary contact name.",
      "type": "string",
      "maxLength": 255
    },
    "email_address": {
      "description": "Email address.",
      "type": "string",
      "maxLength": 255,
      "format": "email",
      "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    },
    "phone_number": {
      "description": "Phone number.",
      "type": "string",
      "maxLength": 64
    },
    "mobile": {
      "description": "Mobile number.",
      "type": "string",
      "maxLength": 64
    },
    "alt_contact": {
      "description": "Alternate contact name.",
      "type": "string",
      "maxLength": 255
    },
    "alt_phone_number": {
      "description": "Alternate phone number.",
      "type": "string",
      "maxLength": 64
    },
    "fax": {
      "description": "Fax number.",
      "type": "string",
      "maxLength": 64
    },
    "account_number": {
      "description": "Your own account number for the customer.",
      "type": "string",
      "maxLength": 64
    },
    "service_address": {
      "description": "Service address (where the work happens), line 1.",
      "type": "string",
      "maxLength": 255
    },
    "service_address_2": {
      "description": "Service address line 2.",
      "type": "string",
      "maxLength": 255
    },
    "service_city": {
      "description": "Service city.",
      "type": "string",
      "maxLength": 128
    },
    "service_state": {
      "description": "Service state (2-letter abbreviation in the US).",
      "type": "string",
      "maxLength": 64
    },
    "service_zip_code": {
      "description": "Service ZIP/postal code.",
      "type": "string",
      "maxLength": 32
    },
    "service_country": {
      "description": "Service country (2-letter code).",
      "type": "string",
      "maxLength": 64
    },
    "billing_address": {
      "description": "Billing address (where invoices go), line 1.",
      "type": "string",
      "maxLength": 255
    },
    "billing_address_2": {
      "description": "Billing address line 2.",
      "type": "string",
      "maxLength": 255
    },
    "billing_city": {
      "description": "Billing city.",
      "type": "string",
      "maxLength": 128
    },
    "billing_state": {
      "description": "Billing state.",
      "type": "string",
      "maxLength": 64
    },
    "billing_zip_code": {
      "description": "Billing ZIP/postal code.",
      "type": "string",
      "maxLength": 32
    },
    "billing_country": {
      "description": "Billing country.",
      "type": "string",
      "maxLength": 64
    },
    "special_instructions": {
      "description": "Special instructions shown to technicians.",
      "type": "string",
      "maxLength": 5000
    },
    "company": {
      "description": "True if the customer is a company rather than a person.",
      "type": "boolean"
    },
    "is_active": {
      "description": "False to mark the customer inactive (reversible).",
      "type": "boolean"
    },
    "notify_via_email": {
      "description": "Send the customer email notifications.",
      "type": "boolean"
    },
    "notify_via_sms": {
      "description": "Send the customer SMS notifications.",
      "type": "boolean"
    },
    "customer_type_id": {
      "description": "Customer type id.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "customer_source_id": {
      "description": "Customer source (lead source) id.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "customer_number"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴kickserv_add_customer_note(customer_number, note, public)

WRITE: add a note to a customer. Set `public` to true to make it visible to the customer. Kickserv: POST /{account}/customers/{customer_number}/notes.xml.

Input Schema

{
  "type": "object",
  "properties": {
    "customer_number": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Customer number."
    },
    "note": {
      "type": "string",
      "minLength": 1,
      "maxLength": 20000,
      "description": "Note text."
    },
    "public": {
      "description": "True to make the note public (customer-visible).",
      "type": "boolean"
    }
  },
  "required": [
    "customer_number",
    "note"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴kickserv_create_job(customer_id, job_type_id, estimate, name, description, ...)

WRITE: create a job (work order) for a customer. `customer_id` is the customer's internal `id` (from kickserv_get_customer), not the customer number; `job_type_id` is the job category. Set `estimate` to create it as an estimate. Kickserv: POST /{account}/jobs.xml.

Input Schema

{
  "type": "object",
  "properties": {
    "customer_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "The customer's internal `id` (NOT the customer_number)."
    },
    "job_type_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Job category (job type) id."
    },
    "estimate": {
      "description": "True to create the job as an estimate.",
      "type": "boolean"
    },
    "name": {
      "description": "Job name/title.",
      "type": "string",
      "maxLength": 255
    },
    "description": {
      "description": "Job description / work to be done.",
      "type": "string",
      "maxLength": 10000
    },
    "scheduled_on": {
      "description": "When the job is scheduled. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`.",
      "type": "string",
      "minLength": 1,
      "maxLength": 64
    },
    "ends_at": {
      "description": "When the job ends. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`.",
      "type": "string",
      "minLength": 1,
      "maxLength": 64
    },
    "duration": {
      "description": "Job duration.",
      "type": "number",
      "minimum": 0,
      "maximum": 100000
    },
    "po_number": {
      "description": "Customer purchase-order number.",
      "type": "string",
      "maxLength": 64
    },
    "employee_ids": {
      "description": "Employee `id`s (from kickserv_list_employees) to assign. Replaces the current assignment.",
      "maxItems": 50,
      "type": "array",
      "items": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
      }
    }
  },
  "required": [
    "customer_id",
    "job_type_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴kickserv_update_job(job_number, job_type_id, job_status_id, name, description, ...)

WRITE: update an existing job — reschedule it, rename it, change its description, category or custom job status, or reassign employees (employee_ids replaces the assignment). Totals, tax and payment fields are not settable here. Kickserv: PATCH /{account}/jobs/{job_number}.xml.

Input Schema

{
  "type": "object",
  "properties": {
    "job_number": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Job number to update."
    },
    "job_type_id": {
      "description": "New job category (job type) id.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "job_status_id": {
      "description": "New custom job status id.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "name": {
      "description": "Job name/title.",
      "type": "string",
      "maxLength": 255
    },
    "description": {
      "description": "Job description / work to be done.",
      "type": "string",
      "maxLength": 10000
    },
    "scheduled_on": {
      "description": "When the job is scheduled. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`.",
      "type": "string",
      "minLength": 1,
      "maxLength": 64
    },
    "ends_at": {
      "description": "When the job ends. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`.",
      "type": "string",
      "minLength": 1,
      "maxLength": 64
    },
    "duration": {
      "description": "Job duration.",
      "type": "number",
      "minimum": 0,
      "maximum": 100000
    },
    "po_number": {
      "description": "Customer purchase-order number.",
      "type": "string",
      "maxLength": 64
    },
    "employee_ids": {
      "description": "Employee `id`s (from kickserv_list_employees) to assign. Replaces the current assignment.",
      "maxItems": 50,
      "type": "array",
      "items": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
      }
    }
  },
  "required": [
    "job_number"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴kickserv_add_job_note(job_number, note, public)

WRITE: add a note to a job. Set `public` to true to make it visible to the customer. Kickserv: POST /{account}/jobs/{job_number}/notes.xml.

Input Schema

{
  "type": "object",
  "properties": {
    "job_number": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Job number."
    },
    "note": {
      "type": "string",
      "minLength": 1,
      "maxLength": 20000,
      "description": "Note text."
    },
    "public": {
      "description": "True to make the note public (customer-visible).",
      "type": "boolean"
    }
  },
  "required": [
    "job_number",
    "note"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴kickserv_create_task(job_id, name, task_type_id, description, scheduled_at, ...)

WRITE: create a task (appointment / to-do) on a job and optionally assign employees. `job_id` is the job's internal `id` (from kickserv_get_job), not the job number. Kickserv: POST /{account}/tasks.xml.

Input Schema

{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "The job's internal `id` (NOT the job_number)."
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 255,
      "description": "Task name."
    },
    "task_type_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Task type id."
    },
    "description": {
      "description": "Task description.",
      "type": "string",
      "maxLength": 10000
    },
    "scheduled_at": {
      "description": "When the task is scheduled. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`.",
      "type": "string",
      "minLength": 1,
      "maxLength": 64
    },
    "ends_at": {
      "description": "When the task ends. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`.",
      "type": "string",
      "minLength": 1,
      "maxLength": 64
    },
    "duration": {
      "description": "Task duration.",
      "type": "integer",
      "minimum": 0,
      "maximum": 100000
    },
    "customer_id": {
      "description": "The customer's internal `id`.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "employee_ids": {
      "description": "Employee `id`s (from kickserv_list_employees) to assign. Replaces the current assignment.",
      "maxItems": 50,
      "type": "array",
      "items": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
      }
    }
  },
  "required": [
    "job_id",
    "name",
    "task_type_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴kickserv_log_time_entry(job_number, employee_id, started_on, number_of_hours, ended_on, ...)

WRITE: log hours worked by an employee on a job. `employee_id` is the employee's `id` from kickserv_list_employees. Kickserv: POST /{account}/jobs/{job_number}/time_entries.xml.

Input Schema

{
  "type": "object",
  "properties": {
    "job_number": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Job number."
    },
    "employee_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "The employee's `id`."
    },
    "started_on": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "When the work started, e.g. `2026-10-02 13:00` or `10/02/2026 01:00pm`."
    },
    "number_of_hours": {
      "type": "number",
      "exclusiveMinimum": 0,
      "maximum": 1000,
      "description": "Hours worked, e.g. 1.25."
    },
    "ended_on": {
      "description": "When the work ended. A date/time string Kickserv can parse, e.g. `2026-10-02 09:30` or `10/2/2026 09:30am`.",
      "type": "string",
      "minLength": 1,
      "maxLength": 64
    },
    "billable": {
      "description": "Whether the time is billable.",
      "type": "boolean"
    },
    "note": {
      "description": "Note about the work.",
      "type": "string",
      "maxLength": 5000
    },
    "mileage": {
      "description": "Mileage driven.",
      "type": "number",
      "minimum": 0,
      "maximum": 100000
    },
    "time_entry_type_id": {
      "description": "Time entry type id.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "job_number",
    "employee_id",
    "started_on",
    "number_of_hours"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴kickserv_add_job_charge(job_number, job_charge_type_id, item_id, description, details, ...)

WRITE: add a charge (line item — a product, service or part) to a job. This changes the job's estimate/invoice total; it does NOT charge the customer's card. Pick `item_id` from kickserv_list_items. Kickserv: POST /{account}/jobs/{job_number}/job_charges.xml.

Input Schema

{
  "type": "object",
  "properties": {
    "job_number": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Job number."
    },
    "job_charge_type_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Job charge type id."
    },
    "item_id": {
      "description": "Item `id` from kickserv_list_items.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "description": {
      "description": "Line-item description.",
      "type": "string",
      "maxLength": 1000
    },
    "details": {
      "description": "Line-item details.",
      "type": "string",
      "maxLength": 5000
    },
    "quantity": {
      "description": "Quantity.",
      "type": "number",
      "minimum": 0,
      "maximum": 1000000
    },
    "price_per_unit": {
      "description": "Unit price.",
      "type": "number",
      "minimum": 0,
      "maximum": 10000000
    },
    "discount": {
      "description": "Discount.",
      "type": "number",
      "minimum": 0,
      "maximum": 10000000
    }
  },
  "required": [
    "job_number",
    "job_charge_type_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded20 tools
verifiedversion not recorded20 tools