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
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
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-httpWhat it can do
Tool inventory
Tools (20)
🟢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
Evidence