TimeTac MCP by usefulapi
Read hours, absences and projects; start timers, add entries, approve leave in TimeTac.
我该使用它吗
质量与安全性
基于对工具定义和协议合规性的自动分析。
上下文开销
这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。
安装
一键安装
将以下内容添加到你的 `claude_desktop_config.json` 文件中:
{
"mcpServers": {
"timetac": {
"url": "https://timetac.usefulapi.io/mcp"
}
}
}远程端点
https://timetac.usefulapi.io/mcpstreamable-http它能做什么
工具清单
工具(16)
🟢timetac_list_users(active, department_id, limit, offset, since)
List employees (users) of the TimeTac account: id, name, department, active flag, entry/exit dates. Only work-related fields are returned (no credentials, payroll, address or birth data). TimeTac API: GET users/read.
输入模式
{
"type": "object",
"properties": {
"active": {
"description": "Only active (true) or inactive (false) users.",
"type": "boolean"
},
"department_id": {
"description": "Only users of this department id.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"limit": {
"description": "Maximum rows to return (API default 100).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 500
},
"offset": {
"description": "Skip this many rows (paging).",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"since": {
"description": "Only rows modified since this date-time, for example 2026-10-01 00:00:00. Dates older than 3 months return everything.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢timetac_get_user(user_id)
Get one employee by user id. Only work-related fields are returned (no credentials, payroll, address or birth data). TimeTac API: GET users/read?id=.
输入模式
{
"type": "object",
"properties": {
"user_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The TimeTac user id."
}
},
"required": [
"user_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢timetac_list_time_trackings(user_id, task_id, approved_by_admin, start_date, end_date, ...)
List time entries (start, end, duration, task, notes, approval), newest first. Filter by user, task or approval. start_date/end_date filter the returned page only; page with offset. TimeTac API: GET timeTrackings/read.
输入模式
{
"type": "object",
"properties": {
"user_id": {
"description": "Only entries of this user id.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"task_id": {
"description": "Only entries booked on this task id.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"approved_by_admin": {
"description": "Only approved (true) or not approved (false) entries.",
"type": "boolean"
},
"start_date": {
"description": "Keep entries that start on or after this date.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"end_date": {
"description": "Keep entries that start on or before this date.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"limit": {
"description": "Maximum rows to return (API default 100).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 500
},
"offset": {
"description": "Skip this many rows (paging).",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"since": {
"description": "Only rows modified since this date-time, for example 2026-10-01 00:00:00. Dates older than 3 months return everything.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢timetac_current_time_trackings(user_id)
List the timers that run right now (who is clocked in, on which task). TimeTac API: GET timeTrackings/current.
输入模式
{
"type": "object",
"properties": {
"user_id": {
"description": "Only the running timer of this user id.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢timetac_list_absences(user_id, type_id, subtype_id, status, from_date, ...)
List absence and leave requests (holiday, sick leave and others) with dates, duration and approval status. from_date/to_date keep requests that overlap the range, on the returned page only. TimeTac API: GET absences/read.
输入模式
{
"type": "object",
"properties": {
"user_id": {
"description": "Only requests of this user id.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"type_id": {
"description": "Only this absence category: 1 = holiday, 2 = overtime reduction, 3 = other paid leave.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"subtype_id": {
"description": "Only this leave type inside the category (see timetac_list_absence_types).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"status": {
"description": "Only this status code (0 = open; see the TimeTac docs for the others).",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"from_date": {
"description": "Keep requests that end on or after this date.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"to_date": {
"description": "Keep requests that start on or before this date.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"limit": {
"description": "Maximum rows to return (API default 100).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 500
},
"offset": {
"description": "Skip this many rows (paging).",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"since": {
"description": "Only rows modified since this date-time, for example 2026-10-01 00:00:00. Dates older than 3 months return everything.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢timetac_list_absence_types(limit, offset)
List the absence types of the account (holiday, sick leave, special leave) with their ids. TimeTac API: GET absenceTypes/read.
输入模式
{
"type": "object",
"properties": {
"limit": {
"description": "Maximum rows to return (API default 100).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 500
},
"offset": {
"description": "Skip this many rows (paging).",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢timetac_list_projects(is_done, limit, offset, since)
List projects (task tree nodes that group tasks) with ids, deadlines and status. TimeTac API: GET projects/read.
输入模式
{
"type": "object",
"properties": {
"is_done": {
"description": "Only finished (true) or open (false) projects.",
"type": "boolean"
},
"limit": {
"description": "Maximum rows to return (API default 100).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 500
},
"offset": {
"description": "Skip this many rows (paging).",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"since": {
"description": "Only rows modified since this date-time, for example 2026-10-01 00:00:00. Dates older than 3 months return everything.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢timetac_list_tasks(mother_id, is_done, limit, offset, since)
List tasks that time can be booked on, with their project (mother_id) and status. TimeTac API: GET tasks/read.
输入模式
{
"type": "object",
"properties": {
"mother_id": {
"description": "Only tasks of this project id.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"is_done": {
"description": "Only finished (true) or open (false) tasks.",
"type": "boolean"
},
"limit": {
"description": "Maximum rows to return (API default 100).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 500
},
"offset": {
"description": "Skip this many rows (paging).",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"since": {
"description": "Only rows modified since this date-time, for example 2026-10-01 00:00:00. Dates older than 3 months return everything.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢timetac_list_departments(limit, offset)
List departments with ids and parent departments. TimeTac API: GET departments/read.
输入模式
{
"type": "object",
"properties": {
"limit": {
"description": "Maximum rows to return (API default 100).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 500
},
"offset": {
"description": "Skip this many rows (paging).",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢timetac_list_teams(limit, offset)
List teams with ids and names. TimeTac API: GET teams/read.
输入模式
{
"type": "object",
"properties": {
"limit": {
"description": "Maximum rows to return (API default 100).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 500
},
"offset": {
"description": "Skip this many rows (paging).",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴timetac_start_time_tracking(user_id, task_id, notes, start_time, start_time_timezone)
WRITE: start a timer for a user, now or at a given time. Each call can create a new running entry, so do not repeat it. TimeTac API: POST timeTrackings/start.
输入模式
{
"type": "object",
"properties": {
"user_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The user the timer belongs to."
},
"task_id": {
"description": "The task to book the time on.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"notes": {
"type": "string",
"maxLength": 2000
},
"start_time": {
"description": "Start date-time. Leave empty to start now.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}[ T]\\d{2}:\\d{2}(:\\d{2})?$"
},
"start_time_timezone": {
"description": "IANA time zone of start_time. Needed when start_time is set.",
"type": "string",
"minLength": 3,
"maxLength": 64
}
},
"required": [
"user_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡timetac_stop_time_tracking(user_id, end_time_timezone, end_time, notes)
WRITE: stop the running timer of a user, now or at a given time. TimeTac API: PUT timeTrackings/stop.
输入模式
{
"type": "object",
"properties": {
"user_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The user whose running timer stops."
},
"end_time_timezone": {
"type": "string",
"minLength": 3,
"maxLength": 64,
"description": "IANA time zone, for example Europe/Vienna."
},
"end_time": {
"description": "End date-time. Leave empty to stop now.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}[ T]\\d{2}:\\d{2}(:\\d{2})?$"
},
"notes": {
"type": "string",
"maxLength": 2000
}
},
"required": [
"user_id",
"end_time_timezone"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴timetac_create_time_tracking(user_id, task_id, start_time, end_time, start_time_timezone, ...)
WRITE: add a finished time entry for a user. Each call creates a new entry, so do not repeat it. TimeTac API: POST timeTrackings/create.
输入模式
{
"type": "object",
"properties": {
"user_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"task_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The task to book the time on."
},
"start_time": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}[ T]\\d{2}:\\d{2}(:\\d{2})?$"
},
"end_time": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}[ T]\\d{2}:\\d{2}(:\\d{2})?$"
},
"start_time_timezone": {
"type": "string",
"minLength": 3,
"maxLength": 64,
"description": "IANA time zone, for example Europe/Vienna."
},
"end_time_timezone": {
"type": "string",
"minLength": 3,
"maxLength": 64,
"description": "IANA time zone, for example Europe/Vienna."
},
"notes": {
"type": "string",
"maxLength": 2000
}
},
"required": [
"user_id",
"task_id",
"start_time",
"end_time",
"start_time_timezone",
"end_time_timezone"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴timetac_create_absence(user_id, type_id, subtype_id, from_date, to_date, ...)
WRITE: create an absence or leave request for a user. Each call creates a new request, so do not repeat it. type_id is the category (1 holiday, 2 overtime reduction, 3 other paid leave); subtype_id picks the leave type from timetac_list_absence_types. TimeTac API: POST absences/create.
输入模式
{
"type": "object",
"properties": {
"user_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"type_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Absence category: 1 = holiday, 2 = overtime reduction, 3 = other paid leave."
},
"subtype_id": {
"description": "Specific leave type inside the category (for example which other paid leave). See timetac_list_absence_types.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"from_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"to_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"request_comment": {
"type": "string",
"maxLength": 2000
},
"duration": {
"description": "Requested duration, in the unit of duration_unit.",
"type": "number",
"exclusiveMinimum": 0
},
"duration_unit": {
"description": "d = days, hs = hours.",
"type": "string",
"enum": [
"d",
"hs"
]
}
},
"required": [
"user_id",
"type_id",
"from_date",
"to_date"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴timetac_approve_absence(absence_id, comment)
WRITE: approve an open absence request. The employee is notified by TimeTac. TimeTac API: PUT absences/approve.
输入模式
{
"type": "object",
"properties": {
"absence_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The absence request id (from timetac_list_absences)."
},
"comment": {
"description": "Optional comment shown to the employee.",
"type": "string",
"maxLength": 2000
}
},
"required": [
"absence_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴timetac_reject_absence(absence_id, comment)
WRITE: reject an open absence request. The employee is notified by TimeTac. TimeTac API: PUT absences/reject.
输入模式
{
"type": "object",
"properties": {
"absence_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The absence request id (from timetac_list_absences)."
},
"comment": {
"description": "Optional comment shown to the employee.",
"type": "string",
"maxLength": 2000
}
},
"required": [
"absence_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}社区
证据