Workyard MCP by usefulapi

Read Workyard employees, projects, time cards and geofences; approve time cards and add notes.

我該用這個嗎

品質與安全性

A
說明品質
96%
結構描述完整度
85%
命名品質
77%
汙染風險
100%
權限相符程度
100%
協定合規性
100%

發現項目(3)

  • LOWTool 'workyard_list_time_card_activity_segments' description lacks action verb在 workyard_list_time_card_activity_segments 中
  • LOWTool 'workyard_list_time_card_activity_segments' name length outside 3-30 range在 workyard_list_time_card_activity_segments 中
  • LOWTool 'workyard_list_geofence_projects' name length outside 3-30 range在 workyard_list_geofence_projects 中

根據工具定義與協定合規性的自動化分析。

上下文成本

~2,579Token(工具定義)
~1.5 KB典型回應大小
顯著的注意力影響(128k 上下文的 2.01%)

這是每次將伺服器的工具載入模型上下文時所消耗的約略 token 數量。數量越高,可用於其他工作的注意力就越少。

安裝

一鍵安裝

將以下內容加入你的 `claude_desktop_config.json` 檔案:

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

遠端端點

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

它能做什麼

工具清單

工具(12)

🟢 唯讀🟡 寫入🔴 刪除⚪ 未知
🟢workyard_get_organization

The organization this connection uses (id, name, settings such as timezone) from GET /orgs/{org_id}.

輸入結構描述

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢workyard_list_employees(status, search, email, role_name, employee_id, ...)

List employees of the organization (employee_id, profile_id, name, title, role, status, contact data). Filter by status (active, removed, saas_disabled, expired; comma list), email, role name or free-text search. Paged: use next_page.

輸入結構描述

{
  "type": "object",
  "properties": {
    "status": {
      "description": "Employee status filter: active, removed, saas_disabled, expired (comma list; sent as eq:...).",
      "type": "string",
      "maxLength": 200,
      "pattern": "^(?:[a-z_]+:)?[A-Za-z_]+(,[A-Za-z_]+)*$"
    },
    "search": {
      "description": "Free-text search over name, email and identifier.",
      "type": "string",
      "maxLength": 200
    },
    "email": {
      "description": "Exact email filter (comma list allowed; sent as eq:...).",
      "type": "string",
      "maxLength": 500
    },
    "role_name": {
      "description": "Role filter: worker, manager, admin (comma list; sent as eq:...).",
      "type": "string",
      "maxLength": 100
    },
    "employee_id": {
      "description": "One or more employee ids, comma separated.",
      "type": "string",
      "maxLength": 300,
      "pattern": "^(?:[a-z_]+:)?[0-9]+(,[0-9]+)*$"
    },
    "page": {
      "description": "Page number, 1-based (default 1). Use next_page from the previous reply.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100000
    },
    "limit": {
      "description": "Results per page, 1-200 (Workyard default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 200
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢workyard_list_projects(name, is_archived, include_computed_totals, page, limit)

List projects (id, name, identifier, customer, locations). Optionally filter by name or archived state. Paged: use next_page.

輸入結構描述

{
  "type": "object",
  "properties": {
    "name": {
      "description": "Project name: a plain name matches names starting with it (like:name%); eq:... and like:... forms are passed through.",
      "type": "string",
      "maxLength": 200
    },
    "is_archived": {
      "description": "true = archived projects only, false = active only (default: Workyard's default).",
      "type": "boolean"
    },
    "include_computed_totals": {
      "description": "Include computed totals per project.",
      "type": "boolean"
    },
    "page": {
      "description": "Page number, 1-based (default 1). Use next_page from the previous reply.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100000
    },
    "limit": {
      "description": "Results per page, 1-200 (Workyard default 50).",
      "type": "integer",
      "minimum": 1,
      "maximum": 200
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢workyard_get_project(project_id)

One project by id (workyard_list_projects gives the ids).

輸入結構描述

{
  "type": "object",
  "properties": {
    "project_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "The project id (org_project_id)."
    }
  },
  "required": [
    "project_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢workyard_list_time_cards(status, employee_id, time_approver_id, start_from_unix, start_before_unix, ...)

List time cards (id, employee_id, start_dt_unix, end_dt_unix, status, approver, totals). Workyard returns only status=working when no status is given, so pass status (for example submitted,approved) for finished work. Filter by employee and by start time (unix seconds, interpreted in the organization timezone). Paged: use next_page; the reply also carries time_summary.

輸入結構描述

{
  "type": "object",
  "properties": {
    "status": {
      "description": "Status filter such as working, submitted, approved or submitted,approved (sent as eq:...). Omitted = working only.",
      "type": "string",
      "maxLength": 200,
      "pattern": "^(?:[a-z_]+:)?[A-Za-z_]+(,[A-Za-z_]+)*$"
    },
    "employee_id": {
      "description": "One or more employee ids, comma separated.",
      "type": "string",
      "maxLength": 300,
      "pattern": "^(?:[a-z_]+:)?[0-9]+(,[0-9]+)*$"
    },
    "time_approver_id": {
      "description": "Filter by approver employee id(s).",
      "type": "string",
      "maxLength": 300,
      "pattern": "^(?:[a-z_]+:)?[0-9]+(,[0-9]+)*$"
    },
    "start_from_unix": {
      "description": "Time card started at or after this unix time (seconds).",
      "type": "integer",
      "minimum": 0,
      "maximum": 4102444800
    },
    "start_before_unix": {
      "description": "Time card started before this unix time (seconds).",
      "type": "integer",
      "minimum": 0,
      "maximum": 4102444800
    },
    "include_last_location": {
      "description": "Include the employee's last known location (personal data).",
      "type": "boolean"
    },
    "sort_by": {
      "description": "Sort in Workyard syntax: asc: or desc: plus start_dt or updated_at, joined with +, e.g. desc:start_dt.",
      "type": "string",
      "maxLength": 80,
      "pattern": "^(?:asc|desc):[a-z_]+(?:\\+(?:asc|desc):[a-z_]+)*$"
    },
    "page": {
      "description": "Page number, 1-based (default 1). Use next_page from the previous reply.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100000
    },
    "limit": {
      "description": "Results per page, 1-200 (Workyard default 50).",
      "type": "integer",
      "minimum": 1,
      "maximum": 200
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢workyard_get_time_card(time_card_id)

One time card by id, with its details (workyard_list_time_cards gives the ids).

輸入結構描述

{
  "type": "object",
  "properties": {
    "time_card_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "The time card id."
    }
  },
  "required": [
    "time_card_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢workyard_list_time_card_activity_segments(time_card_id, include_archived_projects)

The activity segments of one time card (where and on which project the employee worked, segment by segment). Not paged.

輸入結構描述

{
  "type": "object",
  "properties": {
    "time_card_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "The time card id."
    },
    "include_archived_projects": {
      "description": "Include segments of archived projects.",
      "type": "boolean"
    }
  },
  "required": [
    "time_card_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢workyard_list_geofences(name, enabled, project_id, page, limit)

List geofences / work sites (id, name, place, enabled, radius). Filter by name, enabled state or project. Paged: use next_page.

輸入結構描述

{
  "type": "object",
  "properties": {
    "name": {
      "description": "Geofence name: a plain name matches names starting with it; eq:... and like:... forms are passed through.",
      "type": "string",
      "maxLength": 200
    },
    "enabled": {
      "description": "Only enabled (true) or disabled (false) geofences.",
      "type": "boolean"
    },
    "project_id": {
      "description": "Only geofences of this project id (comma list allowed).",
      "type": "string",
      "maxLength": 300,
      "pattern": "^(?:[a-z_]+:)?[0-9]+(,[0-9]+)*$"
    },
    "page": {
      "description": "Page number, 1-based (default 1). Use next_page from the previous reply.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100000
    },
    "limit": {
      "description": "Results per page, 1-1000 (Workyard default 1000).",
      "type": "integer",
      "minimum": 1,
      "maximum": 1000
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢workyard_list_active_geofences

All active geofences with limited data (Workyard: GET active_geofences). It does not say who is clocked in; use workyard_list_time_cards with status working for that.

輸入結構描述

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢workyard_list_geofence_projects(geofence_id, is_archived, page, limit)

The projects attached to one geofence (work site). Paged: use next_page.

輸入結構描述

{
  "type": "object",
  "properties": {
    "geofence_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "The geofence id (workyard_list_geofences gives the ids)."
    },
    "is_archived": {
      "description": "true = archived projects only.",
      "type": "boolean"
    },
    "page": {
      "description": "Page number, 1-based (default 1). Use next_page from the previous reply.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100000
    },
    "limit": {
      "description": "Results per page, 1-200 (Workyard default 50).",
      "type": "integer",
      "minimum": 1,
      "maximum": 200
    }
  },
  "required": [
    "geofence_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴workyard_approve_time_card(time_card_id)

WRITE: approve ONE time card (PATCH .../time_cards/{id}/approve). Approval feeds payroll in Workyard and may not be undoable through the API: only call it when the user asked to approve this exact time card.

輸入結構描述

{
  "type": "object",
  "properties": {
    "time_card_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "The time card id to approve."
    }
  },
  "required": [
    "time_card_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴workyard_add_time_card_note(time_card_id, description)

WRITE: add a text note to one time card (POST .../time_cards/{id}/notes). Adds a new note on every call; it does not edit or delete existing notes.

輸入結構描述

{
  "type": "object",
  "properties": {
    "time_card_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "The time card id."
    },
    "description": {
      "type": "string",
      "minLength": 1,
      "maxLength": 4000,
      "description": "The note text."
    }
  },
  "required": [
    "time_card_id",
    "description"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

社群

為此伺服器評分

證據

近期觀測

已驗證未記錄版本12 個工具