ExakTime / Arcoro MCP by usefulapi
MCP server for Arcoro and ExakTime — workforce data, jobs, cost codes and locations.
我该使用它吗
质量与安全性
发现(7)
- HIGH
- MEDIUM在 exaktime_query_odata 中
- LOW在 exaktime_list_time_off_requests 中
- LOW在 exaktime_list_time_off_balances 中
- LOW在 exaktime_list_timecard_approvals 中
- LOW在 exaktime_list_pay_period_approvals 中
- LOW在 exaktime_list_meal_break_violations 中
基于对工具定义和协议合规性的自动分析。
上下文开销
这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。
安装
一键安装
将以下内容添加到你的 `claude_desktop_config.json` 文件中:
{
"mcpServers": {
"exaktime": {
"url": "https://exaktime.usefulapi.io/mcp"
}
}
}远程端点
https://exaktime.usefulapi.io/mcpstreamable-http它能做什么
工具清单
工具(32)
🟢exaktime_list_employees(page, page_size)
List employees (Person records of type Employee) with name, job title, department, employee id, active/inactive status and which Arcoro modules they use. Use personId with exaktime_get_employee. GET /v1/Common/Persons/Employees.
输入模式
{
"type": "object",
"properties": {
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"page_size": {
"description": "Results per page, 1-100 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_list_persons(first_name, last_name, employee_identifier, work_email, page, ...)
List or search Person records (employees and API users) by first name, last name, employee identifier or work email. Returns personId, names, work email, employee id, username and whether the person is a contractor or deleted. GET /v1/Common/Persons.
输入模式
{
"type": "object",
"properties": {
"first_name": {
"description": "First name filter.",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"last_name": {
"description": "Last name filter.",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"employee_identifier": {
"description": "Your employee id / number.",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"work_email": {
"description": "Work email address.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"page_size": {
"description": "Results per page, 1-100 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_get_person(person_id)
One Person record: names, contact details, address, login username and security groups. Government identifiers are not available through this server. GET /v1/Common/Persons/{personId}.
输入模式
{
"type": "object",
"properties": {
"person_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Arcoro personId."
}
},
"required": [
"person_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_get_employee(person_id)
Employment details for a person: hire/termination date, status, employment and pay type, pay rates, job code, manager, location, department, pay schedule and union. GET /v1/Common/Persons/{personId}/Employees.
输入模式
{
"type": "object",
"properties": {
"person_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Arcoro personId."
}
},
"required": [
"person_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_list_locations(page, page_size)
List locations (job sites and offices) with address, coordinates, active flag and whether they are used for time and attendance. GET /v1/Common/Locations.
输入模式
{
"type": "object",
"properties": {
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"page_size": {
"description": "Results per page, 1-100 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_get_location(location_id)
One location by id. GET /v1/Common/Locations/{id}.
输入模式
{
"type": "object",
"properties": {
"location_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Arcoro locationId."
}
},
"required": [
"location_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_list_jobs(page, page_size)
List jobs (projects) with identifier, name, active flag, dates, department, parent job and assigned locations. GET /v1/Time/Jobs.
输入模式
{
"type": "object",
"properties": {
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"page_size": {
"description": "Results per page, 1-100 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_get_job(job_id)
One job by id. GET /v1/Time/Jobs/{id}.
输入模式
{
"type": "object",
"properties": {
"job_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Arcoro jobId."
}
},
"required": [
"job_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_list_cost_codes(page, page_size)
List cost codes (phases and work activities that time is booked against) with identifier, name, active flag and cost type. GET /v1/Time/CostCodes.
输入模式
{
"type": "object",
"properties": {
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"page_size": {
"description": "Results per page, 1-100 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_get_cost_code(cost_code_id)
One cost code by id. GET /v1/Time/CostCodes/{id}.
输入模式
{
"type": "object",
"properties": {
"cost_code_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Arcoro cost code id."
}
},
"required": [
"cost_code_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_list_cost_types(page, page_size)
List cost types (groupings of cost codes, e.g. labor, equipment) with identifier, name and active flag. GET /v1/Time/CostTypes.
输入模式
{
"type": "object",
"properties": {
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"page_size": {
"description": "Results per page, 1-100 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_list_departments(page, page_size)
List departments with identifier, name and active flag. GET /v1/Common/Departments.
输入模式
{
"type": "object",
"properties": {
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"page_size": {
"description": "Results per page, 1-100 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_list_job_codes(page, page_size)
List job codes (positions / trades) with name, description and active flag. GET /v1/Common/JobCodes.
输入模式
{
"type": "object",
"properties": {
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"page_size": {
"description": "Results per page, 1-100 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_list_pay_schedules(page, page_size)
List pay schedules with frequency, first pay date, pay periods per year and the default flag. GET /v1/Payroll/PaySchedules.
输入模式
{
"type": "object",
"properties": {
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"page_size": {
"description": "Results per page, 1-100 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_list_labor_classes(page, page_size)
List labor classes with identifier, name and active flag. GET /v1/Payroll/LaborClasses.
输入模式
{
"type": "object",
"properties": {
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"page_size": {
"description": "Results per page, 1-100 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_list_rate_codes(page, page_size)
List payroll rate codes with identifier, name, description and whether it is the base rate. GET /v1/Payroll/RateCodes.
输入模式
{
"type": "object",
"properties": {
"page": {
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"page_size": {
"description": "Results per page, 1-100 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_list_time_records(from_date, to_date, person_id, location_id, cost_code_identifier, ...)
List time records (timecard entries: who worked, when, on which cost code and location, regular/overtime hours). Filter by work date range, person, location or cost code identifier; newest first. Source: the read-only OData data warehouse, refreshed nightly, so today's entries may not show until tomorrow. Page with skip/next_skip. GET /odata/DwTimeRecords.
输入模式
{
"type": "object",
"properties": {
"from_date": {
"description": "First work date to include (yyyy-mm-dd).",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"to_date": {
"description": "Last work date to include (yyyy-mm-dd).",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"person_id": {
"description": "Only this employee (personId).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"location_id": {
"description": "Only this location (locationId).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"cost_code_identifier": {
"description": "Only this cost code identifier.",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"active_only": {
"description": "true: skip deleted/inactive records.",
"type": "boolean"
},
"all_fields": {
"description": "true: return every warehouse column (GPS, punch ids, modified-by...). Default: the main columns.",
"type": "boolean"
},
"top": {
"description": "Rows to return, 1-1000 (default 100).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 1000
},
"skip": {
"description": "Rows to skip (default 0). Pass the previous reply's next_skip.",
"type": "integer",
"minimum": 0,
"maximum": 10000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_list_time_punches(from_date, to_date, person_id, location_id, top, ...)
List raw clock punches (punch time, device type, location, network time difference). Filter by date range (UTC days), person or location; newest first. Source: the read-only OData data warehouse, refreshed nightly, so today's entries may not show until tomorrow. Page with skip/next_skip. GET /odata/DwTimePunches.
输入模式
{
"type": "object",
"properties": {
"from_date": {
"description": "First day to include (yyyy-mm-dd, UTC).",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"to_date": {
"description": "Last day to include (yyyy-mm-dd, UTC).",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"person_id": {
"description": "Only this employee (personId).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"location_id": {
"description": "Only this location (locationId).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"top": {
"description": "Rows to return, 1-1000 (default 100).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 1000
},
"skip": {
"description": "Rows to skip (default 0). Pass the previous reply's next_skip.",
"type": "integer",
"minimum": 0,
"maximum": 10000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_list_shifts(from_date, to_date, person_id, location_id, top, ...)
List scheduled shifts (employee, start/end, title, cost code, location, notes). Filter by start date range (UTC days), person or location; newest first. Source: the read-only OData data warehouse, refreshed nightly, so today's entries may not show until tomorrow. Page with skip/next_skip. GET /odata/DwShifts.
输入模式
{
"type": "object",
"properties": {
"from_date": {
"description": "First start day to include (yyyy-mm-dd, UTC).",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"to_date": {
"description": "Last start day to include (yyyy-mm-dd, UTC).",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"person_id": {
"description": "Only this employee (personId).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"location_id": {
"description": "Only this location (locationId).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"top": {
"description": "Rows to return, 1-1000 (default 100).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 1000
},
"skip": {
"description": "Rows to skip (default 0). Pass the previous reply's next_skip.",
"type": "integer",
"minimum": 0,
"maximum": 10000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_list_pay_periods(from_date, to_date, is_closed, top, skip)
List pay periods (id, start and end date, closed or open, type), newest first. Use the id to find approvals. Source: the read-only OData data warehouse, refreshed nightly, so today's entries may not show until tomorrow. Page with skip/next_skip. GET /odata/DwPayPeriods.
输入模式
{
"type": "object",
"properties": {
"from_date": {
"description": "Pay periods starting on or after this date.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"to_date": {
"description": "Pay periods starting on or before this date.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"is_closed": {
"description": "true: only closed periods; false: only open ones.",
"type": "boolean"
},
"top": {
"description": "Rows to return, 1-1000 (default 100).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 1000
},
"skip": {
"description": "Rows to skip (default 0). Pass the previous reply's next_skip.",
"type": "integer",
"minimum": 0,
"maximum": 10000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_list_time_off_requests(status, person_id, from_date, to_date, top, ...)
List time off requests (employee, plan, start/end date, hours, status, comments, manager). Filter by status, person or start-date range. Source: the read-only OData data warehouse, refreshed nightly, so today's entries may not show until tomorrow. Page with skip/next_skip. GET /odata/DwTimeOffRequests.
输入模式
{
"type": "object",
"properties": {
"status": {
"description": "Request status exactly as Arcoro shows it, e.g. Pending, Approved, Denied.",
"type": "string",
"minLength": 1,
"maxLength": 50
},
"person_id": {
"description": "Only this employee (personId).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"from_date": {
"description": "Requests starting on or after this date.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"to_date": {
"description": "Requests starting on or before this date.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"top": {
"description": "Rows to return, 1-1000 (default 100).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 1000
},
"skip": {
"description": "Rows to skip (default 0). Pass the previous reply's next_skip.",
"type": "integer",
"minimum": 0,
"maximum": 10000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_list_time_off_balances(person_id, plan_name, top, skip)
List time off balances per employee and plan (balance hours, maximum balance, manager). Source: the read-only OData data warehouse, refreshed nightly, so today's entries may not show until tomorrow. Page with skip/next_skip. GET /odata/DwTimeOffBalances.
输入模式
{
"type": "object",
"properties": {
"person_id": {
"description": "Only this employee (personId).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"plan_name": {
"description": "Only this time off plan, exact name.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"top": {
"description": "Rows to return, 1-1000 (default 100).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 1000
},
"skip": {
"description": "Rows to skip (default 0). Pass the previous reply's next_skip.",
"type": "integer",
"minimum": 0,
"maximum": 10000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_list_timecard_approvals(from_date, to_date, person_id, top, skip)
List daily timecard approvals (work date, approval type, who approved and when, the employee). Filter by work date range or employee. Source: the read-only OData data warehouse, refreshed nightly, so today's entries may not show until tomorrow. Page with skip/next_skip. GET /odata/DwWorkDateTimeApprovals.
输入模式
{
"type": "object",
"properties": {
"from_date": {
"description": "First work date to include.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"to_date": {
"description": "Last work date to include.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"person_id": {
"description": "Only this employee's timecards (personId).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"top": {
"description": "Rows to return, 1-1000 (default 100).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 1000
},
"skip": {
"description": "Rows to skip (default 0). Pass the previous reply's next_skip.",
"type": "integer",
"minimum": 0,
"maximum": 10000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_list_pay_period_approvals(pay_period_id, person_id, top, skip)
List pay period (timesheet) approvals and sign-offs: pay period, approval type, approver, time, employee, comment. Use it to see who has not yet signed off. Source: the read-only OData data warehouse, refreshed nightly, so today's entries may not show until tomorrow. Page with skip/next_skip. GET /odata/DwPayPeriodApprovals.
输入模式
{
"type": "object",
"properties": {
"pay_period_id": {
"description": "Only this pay period (from exaktime_list_pay_periods).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"person_id": {
"description": "Only this employee's timesheets (personId).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"top": {
"description": "Rows to return, 1-1000 (default 100).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 1000
},
"skip": {
"description": "Rows to skip (default 0). Pass the previous reply's next_skip.",
"type": "integer",
"minimum": 0,
"maximum": 10000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_list_meal_break_violations(from_date, to_date, time_record_id, top, skip)
List meal break compliance violations (type, date, expected vs actual value) linked to a time record id. Source: the read-only OData data warehouse, refreshed nightly, so today's entries may not show until tomorrow. Page with skip/next_skip. GET /odata/DwMealBreakViolations.
输入模式
{
"type": "object",
"properties": {
"from_date": {
"description": "First violation date to include.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"to_date": {
"description": "Last violation date to include.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"time_record_id": {
"description": "Only violations of this time record.",
"type": "string",
"pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"
},
"top": {
"description": "Rows to return, 1-1000 (default 100).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 1000
},
"skip": {
"description": "Rows to skip (default 0). Pass the previous reply's next_skip.",
"type": "integer",
"minimum": 0,
"maximum": 10000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢exaktime_query_odata(entity_set, select, filter, orderby, top, ...)
Read-only OData query over any Arcoro data warehouse entity set, for questions the other tools do not cover (equipment, expenses, users, time records by hour group, learning, performance, recruiting, benefits...). Entity sets start with Dw, e.g. DwUsers, DwEquipments, DwExpenses, DwCostCodes, DwLocations, DwTimeRecordByHourGroups, DwEmploymentStatusHistories. Full list: https://my.arcoro.com/api/odata ; schema: https://api.arcoro.com/odata/$metadata. $filter uses OData v4 syntax, e.g. startswith(LastName,'Sm') and IsActive eq true. Source: the read-only OData data warehouse, refreshed nightly, so today's entries may not show until tomorrow. Page with skip/next_skip. GET /odata/{EntitySet}.
输入模式
{
"type": "object",
"properties": {
"entity_set": {
"type": "string",
"pattern": "^Dw[A-Za-z0-9]{1,80}$",
"description": "Entity set name, e.g. DwUsers."
},
"select": {
"description": "Comma-separated property names ($select).",
"type": "string",
"maxLength": 1000
},
"filter": {
"description": "OData $filter expression.",
"type": "string",
"maxLength": 2000
},
"orderby": {
"description": "OData $orderby, e.g. LastName,FirstName desc.",
"type": "string",
"maxLength": 500
},
"top": {
"description": "Rows to return, 1-1000 (default 100).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 1000
},
"skip": {
"description": "Rows to skip (default 0). Pass the previous reply's next_skip.",
"type": "integer",
"minimum": 0,
"maximum": 10000000
}
},
"required": [
"entity_set"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡exaktime_create_job(name, identifier, is_active, start_date, end_date, ...)
WRITE: create a job (project) that employees can book time to. Identifier must be unique. The job appears in Arcoro right away; it can be deactivated again with exaktime_update_job (there is no delete). POST /v1/Time/Jobs.
输入模式
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Job name."
},
"identifier": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Your unique job number/identifier."
},
"is_active": {
"type": "boolean",
"description": "Active jobs can be selected for time entry."
},
"start_date": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "Job start date."
},
"end_date": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "Job end date."
},
"is_certified": {
"type": "boolean",
"description": "Certified payroll job."
},
"department_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Department id (exaktime_list_departments)."
},
"parent_job_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Parent job id, to create a sub-job."
},
"location_ids": {
"maxItems": 500,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"description": "Location ids the job is limited to (exaktime_list_locations). Setting them turns off 'available at all locations'."
},
"all_locations": {
"type": "boolean",
"description": "true: the job is available at every location; false: only at location_ids."
}
},
"required": [
"name",
"identifier"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴exaktime_update_job(job_id, name, identifier, is_active, start_date, ...)
WRITE: change fields of an existing job (rename it, set dates, assign locations, or set is_active=false to close it). Only the fields you pass change (null clears a nullable field); the tool reads the job first and sends the full object, because Arcoro replaces the job on PUT. Two edits to the same job at the same moment can overwrite each other: run them one after the other. PUT /v1/Time/Jobs/{id}.
输入模式
{
"type": "object",
"properties": {
"job_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Arcoro jobId."
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Job name."
},
"identifier": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Your unique job number/identifier."
},
"is_active": {
"type": "boolean",
"description": "Active jobs can be selected for time entry."
},
"start_date": {
"description": "Job start date, or null to clear it.",
"anyOf": [
{
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "Job start date."
},
{
"type": "null"
}
]
},
"end_date": {
"description": "Job end date, or null to clear it.",
"anyOf": [
{
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "Job end date."
},
{
"type": "null"
}
]
},
"is_certified": {
"type": "boolean",
"description": "Certified payroll job."
},
"department_id": {
"description": "Department id, or null to clear it.",
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Department id (exaktime_list_departments)."
},
{
"type": "null"
}
]
},
"parent_job_id": {
"description": "Parent job id, or null to detach the job from its parent.",
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Parent job id, to create a sub-job."
},
{
"type": "null"
}
]
},
"location_ids": {
"maxItems": 500,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"description": "Location ids the job is limited to (exaktime_list_locations). Setting them turns off 'available at all locations'."
},
"all_locations": {
"type": "boolean",
"description": "true: the job is available at every location; false: only at location_ids."
}
},
"required": [
"job_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡exaktime_create_cost_code(identifier, name, is_active, display_option, cost_type_id)
WRITE: create a cost code (phase or work activity) that time can be booked against. The name must be unique. It can be deactivated again with exaktime_update_cost_code (there is no delete). POST /v1/Time/CostCodes.
输入模式
{
"type": "object",
"properties": {
"identifier": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Your unique cost code identifier."
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Cost code name (unique)."
},
"is_active": {
"description": "Default true.",
"type": "boolean"
},
"display_option": {
"type": "string",
"enum": [
"Default",
"System"
],
"description": "Default: selectable by users. System: system-defined, hidden from users."
},
"cost_type_id": {
"description": "Cost type id (exaktime_list_cost_types).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"identifier",
"name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴exaktime_update_cost_code(cost_code_id, identifier, name, is_active, display_option, ...)
WRITE: change fields of an existing cost code (rename it, change its cost type, or set is_active=false to retire it). Only the fields you pass change; the tool reads the cost code first and sends the full object. PUT /v1/Time/CostCodes/{id}.
输入模式
{
"type": "object",
"properties": {
"cost_code_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Arcoro cost code id."
},
"identifier": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"is_active": {
"type": "boolean"
},
"display_option": {
"type": "string",
"enum": [
"Default",
"System"
],
"description": "Default: selectable by users. System: system-defined, hidden from users."
},
"cost_type_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"cost_code_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡exaktime_create_location(name, identifier, is_active, is_time_and_attendance, is_office, ...)
WRITE: create a location (job site or office). Add the address and/or latitude and longitude so geofencing and maps work. It can be deactivated again with exaktime_update_location (there is no delete). POST /v1/Common/Locations.
输入模式
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Location name."
},
"identifier": {
"description": "Your location identifier.",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"is_active": {
"description": "Default true.",
"type": "boolean"
},
"is_time_and_attendance": {
"description": "Employees can clock in at this location.",
"type": "boolean"
},
"is_office": {
"type": "boolean"
},
"comments": {
"type": "string",
"maxLength": 2000
},
"onboarding_business_unit_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Onboarding business unit id; Arcoro requires it for an office when Onboarding business units are enabled."
},
"latitude": {
"type": "number",
"minimum": -90,
"maximum": 90
},
"longitude": {
"type": "number",
"minimum": -180,
"maximum": 180
},
"address": {
"type": "object",
"properties": {
"address_line1": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"address_line2": {
"type": "string",
"maxLength": 200
},
"city": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"country_code": {
"type": "string",
"minLength": 2,
"maxLength": 3,
"description": "ISO country code, e.g. US."
},
"state_code": {
"type": "string",
"minLength": 1,
"maxLength": 10,
"description": "State/province code, e.g. TX."
},
"postal_code": {
"type": "string",
"minLength": 1,
"maxLength": 20
}
},
"required": [
"address_line1",
"city",
"country_code",
"state_code",
"postal_code"
],
"description": "Street address; every field except address_line2 is required by Arcoro."
}
},
"required": [
"name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴exaktime_update_location(location_id, name, identifier, is_active, is_time_and_attendance, ...)
WRITE: change fields of an existing location (rename, move, new address, or set is_active=false to retire it). Only the fields you pass change; the tool reads the location first and sends the full object. PUT /v1/Common/Locations/{id}.
输入模式
{
"type": "object",
"properties": {
"location_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Arcoro locationId."
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"identifier": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"is_active": {
"type": "boolean"
},
"is_time_and_attendance": {
"type": "boolean"
},
"is_office": {
"type": "boolean"
},
"comments": {
"type": "string",
"maxLength": 2000
},
"onboarding_business_unit_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Onboarding business unit id; Arcoro requires it for an office when Onboarding business units are enabled."
},
"latitude": {
"type": "number",
"minimum": -90,
"maximum": 90
},
"longitude": {
"type": "number",
"minimum": -180,
"maximum": 180
},
"address": {
"type": "object",
"properties": {
"address_line1": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"address_line2": {
"type": "string",
"maxLength": 200
},
"city": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"country_code": {
"type": "string",
"minLength": 2,
"maxLength": 3,
"description": "ISO country code, e.g. US."
},
"state_code": {
"type": "string",
"minLength": 1,
"maxLength": 10,
"description": "State/province code, e.g. TX."
},
"postal_code": {
"type": "string",
"minLength": 1,
"maxLength": 20
}
},
"required": [
"address_line1",
"city",
"country_code",
"state_code",
"postal_code"
],
"description": "Street address; every field except address_line2 is required by Arcoro."
}
},
"required": [
"location_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}社区
证据