Read Tick clients, projects, tasks, users and time entries; log and edit time entries.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
WRITE: create a new client (POST /clients.json). Tick administrators only (403 otherwise). Creates a new client every call.
Client name.
Create the client archived (default false).
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
WRITE: create a new client (POST /clients.json). Tick administrators only (403 otherwise). Creates a new client every call.
| Argument | Type | Description |
|---|---|---|
| name* | string | Client name. |
| archive | boolean | Create the client archived (default false). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Client name."
},
"archive": {
"type": "boolean",
"description": "Create the client archived (default false)."
}
}
}WRITE: log a new time entry on a task (POST /entries.json). Needs the task id (see tick_list_tasks). hours is a decimal (1.5 = 1h30m). user_id is only honored for administrators (otherwise the entry is yours). Creates a new entry every call; nothing is sent to anyone.
| Argument | Type | Description |
|---|---|---|
| date* | string | Day the work was done, yyyy-mm-dd. |
| hours* | number | Hours worked, decimal (1.5 = one and a half hours). |
| notes | string | What was done. |
| task_id* | integer | Task to log the time on. |
| user_id | integer | Administrators only: log the time for this user. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"task_id",
"date",
"hours"
],
"properties": {
"date": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "Day the work was done, yyyy-mm-dd."
},
"hours": {
"type": "number",
"maximum": 24,
"minimum": 0,
"description": "Hours worked, decimal (1.5 = one and a half hours)."
},
"notes": {
"type": "string",
"maxLength": 5000,
"description": "What was done."
},
"task_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Task to log the time on.",
"exclusiveMinimum": 0
},
"user_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Administrators only: log the time for this user.",
"exclusiveMinimum": 0
}
}
}WRITE: create a new project (POST /projects.json). Tick administrators only. The project has no tasks: create at least one with tick_create_task before time can be logged. Creates a new project every call.
| Argument | Type | Description |
|---|---|---|
| name* | string | Project name. |
| budget | number | Project budget (hours, or money for a money-based subscription). |
| billable | boolean | Whether the project is billable. |
| owner_id | integer | User id of the project owner. |
| client_id* | integer | Client the project belongs to (see tick_list_clients). |
| recurring | boolean | Recurring budget. |
| notifications | boolean | Send budget notifications. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name",
"client_id"
],
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Project name."
},
"budget": {
"type": "number",
"maximum": 1000000000,
"minimum": 0,
"description": "Project budget (hours, or money for a money-based subscription)."
},
"billable": {
"type": "boolean",
"description": "Whether the project is billable."
},
"owner_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "User id of the project owner.",
"exclusiveMinimum": 0
},
"client_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Client the project belongs to (see tick_list_clients).",
"exclusiveMinimum": 0
},
"recurring": {
"type": "boolean",
"description": "Recurring budget."
},
"notifications": {
"type": "boolean",
"description": "Send budget notifications."
}
}
}WRITE: create a new task on a project (POST /tasks.json). Tick administrators only. Creates a new task every call.
| Argument | Type | Description |
|---|---|---|
| name* | string | Task name. |
| budget | number | Task budget (hours). |
| billable | boolean | Whether the task is billable. |
| project_id* | integer | Project the task belongs to. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_id",
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Task name."
},
"budget": {
"type": "number",
"maximum": 1000000000,
"minimum": 0,
"description": "Task budget (hours)."
},
"billable": {
"type": "boolean",
"description": "Whether the task is billable."
},
"project_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Project the task belongs to.",
"exclusiveMinimum": 0
}
}
}One client by id, with a summary of its projects (count and URL). GET /clients/{id}.json.
| Argument | Type | Description |
|---|---|---|
| client_id* | integer | Tick client id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"client_id"
],
"properties": {
"client_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Tick client id.",
"exclusiveMinimum": 0
}
}
}One time entry by id, with its task. GET /entries/{id}.json.
| Argument | Type | Description |
|---|---|---|
| entry_id* | integer | Tick entry id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"entry_id"
],
"properties": {
"entry_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Tick entry id.",
"exclusiveMinimum": 0
}
}
}One project by id, with total_hours entered, a summary of its tasks (count and URL) and its client. GET /projects/{id}.json.
| Argument | Type | Description |
|---|---|---|
| project_id* | integer | Tick project id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Tick project id.",
"exclusiveMinimum": 0
}
}
}One task by id, with total_hours entered, a summary of its entries (count and URL) and its project. GET /tasks/{id}.json.
| Argument | Type | Description |
|---|---|---|
| task_id* | integer | Tick task id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"task_id"
],
"properties": {
"task_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Tick task id.",
"exclusiveMinimum": 0
}
}
}List Tick clients. By default only clients that have open projects; set include_all=true for every client (also archived or without projects). 100 per page. GET /clients.json or /clients/all.json.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, from 1 (default 1; 100 records per page). Pass the previous reply's next_page. |
| include_all | boolean | true = all clients, false/omitted = only clients with open projects. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 100000,
"description": "Page number, from 1 (default 1; 100 records per page). Pass the previous reply's next_page.",
"exclusiveMinimum": 0
},
"include_all": {
"type": "boolean",
"description": "true = all clients, false/omitted = only clients with open projects."
}
}
}List time entries. Tick requires EITHER start_date AND end_date (entries dated in that range) OR updated_at (entries created or changed after that time). Optional filters: project_id, task_id, user_id, billable, billed. Each entry has date, hours, notes, task_id, user_id. 100 per page. GET /entries.json.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, from 1 (default 1; 100 records per page). Pass the previous reply's next_page. |
| billed | boolean | Only billed (true) or not yet billed (false) entries. |
| task_id | integer | Only entries of this task. |
| user_id | integer | Only entries of this user. |
| billable | boolean | Only billable (true) or non-billable (false) entries. |
| end_date | string | Last day of the range (with start_date). |
| project_id | integer | Only entries of this project. |
| start_date | string | First day of the range (with end_date). |
List Tick projects with budget (hours or money), billable flag, client_id and owner_id. Open projects by default; status=closed for closed ones. 100 per page. GET /projects.json or /projects/closed.json.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, from 1 (default 1; 100 records per page). Pass the previous reply's next_page. |
| status | string | open (default) or closed. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 100000,
"description": "Page number, from 1 (default 1; 100 records per page). Pass the previous reply's next_page.",
"exclusiveMinimum": 0
},
"status": {
"enum": [
"open",
"closed"
],
"type": "string",
"description": "open (default) or closed."
}
}
}List Tick tasks (the budget lines that time entries are logged against). Across all projects, or for one project when project_id is given. Open tasks by default; status=closed for closed ones. You need a task id to log time. 100 per page. GET /tasks.json, /tasks/closed.json, /projects/{id}/tasks.json or /projects/{id}/tasks/closed.json.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, from 1 (default 1; 100 records per page). Pass the previous reply's next_page. |
| status | string | open (default) or closed. |
| project_id | integer | Only the tasks of this project. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 100000,
"description": "Page number, from 1 (default 1; 100 records per page). Pass the previous reply's next_page.",
"exclusiveMinimum": 0
},
"status": {
"enum": [
"open",
"closed"
],
"type": "string",
"description": "open (default) or closed."
},
"project_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only the tasks of this project.",
"exclusiveMinimum": 0
}
}
}List the users of the Tick subscription (id, name, e-mail, timezone). A non-administrator sees only themself. Use deleted=true for removed users who still have time entries (administrators only). GET /users.json or /users/deleted.json.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, from 1 (default 1; 100 records per page). Pass the previous reply's next_page. |
| deleted | boolean | true = deleted users that have time entries. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 100000,
"description": "Page number, from 1 (default 1; 100 records per page). Pass the previous reply's next_page.",
"exclusiveMinimum": 0
},
"deleted": {
"type": "boolean",
"description": "true = deleted users that have time entries."
}
}
}WRITE: change an existing time entry (PUT /entries/{id}.json): hours, notes, date, task, or mark it billed. Only the fields you pass change; the previous values are overwritten.
| Argument | Type | Description |
|---|---|---|
| date | string | New date, yyyy-mm-dd. |
| hours | number | New hours (decimal). |
| notes | string | New notes (replaces the old notes). |
| billed | boolean | Mark the entry as billed / not billed. |
| task_id | integer | Move the entry to this task. |
| entry_id* | integer | Entry to change. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"entry_id"
],
"properties": {
"date": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "New date, yyyy-mm-dd."
},
"hours": {
"type": "number",
"maximum": 24,
"minimum": 0,
"description": "New hours (decimal)."
},
"notes": {
"type": "string",
"maxLength": 5000,
"description": "New notes (replaces the old notes)."
},
"billed": {
"type": "boolean",
"description": "Mark the entry as billed / not billed."
},
"task_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Move the entry to this task.",
"exclusiveMinimum": 0
},
"entry_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Entry to change.",
"exclusiveMinimum": 0
}
}
}| updated_at |
| string |
| Only entries created or modified after this time (instead of a date range). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 100000,
"description": "Page number, from 1 (default 1; 100 records per page). Pass the previous reply's next_page.",
"exclusiveMinimum": 0
},
"billed": {
"type": "boolean",
"description": "Only billed (true) or not yet billed (false) entries."
},
"task_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only entries of this task.",
"exclusiveMinimum": 0
},
"user_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only entries of this user.",
"exclusiveMinimum": 0
},
"billable": {
"type": "boolean",
"description": "Only billable (true) or non-billable (false) entries."
},
"end_date": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "Last day of the range (with start_date)."
},
"project_id": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Only entries of this project.",
"exclusiveMinimum": 0
},
"start_date": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "First day of the range (with end_date)."
},
"updated_at": {
"type": "string",
"description": "Only entries created or modified after this time (instead of a date range)."
}
}
}