{"id":"00594ae6-3322-4861-b847-ee1fbc9e33a9","entityType":"agent","slug":"clawhub-flowy-team-flowyteam-mcp","name":"Flowyteam Mcp","canonicalUrl":"https://www.xpersona.co/agent/clawhub-flowy-team-flowyteam-mcp","canonicalPath":"/agent/clawhub-flowy-team-flowyteam-mcp","generatedAt":"2026-10-11T14:14:55.663Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:23:01.078Z","emptyReason":null},"description":"Manage FlowyTeam projects, tasks, OKRs, KPIs, HR, CRM, finance, support tickets, attendance, and more via MCP — 34 tools for complete workspace management.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17fp5j70snzm5yz1p6wm2fg9585t8nb:flowyteam-mcp","sourceUrl":"https://clawhub.ai/flowy-team/flowyteam-mcp","homepage":"https://clawhub.ai/flowy-team/skills/flowyteam-mcp","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/flowy-team/flowyteam-mcp","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/flowy-team/skills/flowyteam-mcp","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Flowyteam Mcp technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:23:01.078Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:23:01.078Z","emptyReason":null},"stars":null,"forks":null,"downloads":1078,"packageName":null,"latestVersion":"1.1.8","tractionLabel":"1.1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:23:01.064Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T11:23:01.078Z","lastCrawledAt":"2026-10-11T11:23:01.064Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T11:23:01.064Z","lastVerifiedAt":null,"highlights":[{"version":"1.1.8","createdAt":"2026-05-05T00:39:54.978Z","changelog":"flowyteam-mcp 1.1.8 changelog - Updated safety guidelines: Now explicitly instructs to always require user confirmation before any write or delete action. - Clarified recommended token usage: Prefer Employee tokens for self-service; request Admin tokens only for admin operations. - Strengthened guidance to never act autonomously or infer write actions; only operate with direct user instruction. - No API or protocol changes; documentation update only.","fileCount":4,"zipByteSize":16996},{"version":"1.1.7","createdAt":"2026-05-05T00:24:16.591Z","changelog":"flowyteam-mcp 1.1.7 - Updated documentation in README.md for clarity and setup instructions. - Updated metadata in _meta.json. - No functional or breaking API changes.","fileCount":3,"zipByteSize":15759},{"version":"1.1.6","createdAt":"2026-05-04T04:46:38.812Z","changelog":"- Added a new Safety Guidelines section detailing important usage restrictions and best practices. - Instructs users to confirm before any create, update, or delete actions, especially on sensitive data. - Advises always using a limited-permission token and avoiding autonomous mutations. - No changes to endpoints or parameters; documentation improvements only.","fileCount":3,"zipByteSize":15183},{"version":"1.1.5","createdAt":"2026-05-04T04:39:50.259Z","changelog":"- Clarified that `auth_register` and `auth_verify_email` endpoints are for new account setup and do not require a Bearer token. - Updated protocol section to reflect that only account setup tools work without a `method` field; others require it. - No functional or API changes; this update fixes and clarifies endpoint authentication and usage instructions in the documentation.","fileCount":3,"zipByteSize":14822},{"version":"1.1.4","createdAt":"2026-05-04T04:24:01.401Z","changelog":"flowyteam-mcp 1.1.4 - Documentation updated: The \"password\" field for creating employees is now marked as optional in SKILL.md. - Example JSON for employee creation clarifies that new employees set their own password on first login. - No functional or API changes; documentation improvements only.","fileCount":3,"zipByteSize":15180},{"version":"1.1.3","createdAt":"2026-04-30T04:47:06.092Z","changelog":"Improved documentation clarity for auth tools and employee creation examples","fileCount":3,"zipByteSize":15225},{"version":"1.1.2","createdAt":"2026-04-28T01:06:34.222Z","changelog":"flowyteam-mcp v1.1.2 - Added support for 1 new tool (now 34 tools total) for workspace management. - Updated authentication endpoints: now includes `auth_verify_email` (no token required). - Revised setup instructions to recommend direct API token connection and clarified configuration for Desktop/Cursor usage. - Improved protocol and endpoint documentation for clarity.","fileCount":3,"zipByteSize":15073},{"version":"1.1.1","createdAt":"2026-04-23T01:47:09.057Z","changelog":"flowyteam-mcp 1.1.1 - Clarified that login and registration tools require explicit user action and credentials. - Updated documentation to reflect that the API token is now required in the environment for most operations. - Added homepage and source fields to metadata for easier reference. - Minor text and formatting tweaks for improved clarity and setup guidance.","fileCount":3,"zipByteSize":14546}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17fp5j70snzm5yz1p6wm2fg9585t8nb:flowyteam-mcp","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17fp5j70snzm5yz1p6wm2fg9585t8nb:flowyteam-mcp` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/flowy-team/flowyteam-mcp before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-flowy-team-flowyteam-mcp/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-flowy-team-flowyteam-mcp/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-flowy-team-flowyteam-mcp/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-flowy-team-flowyteam-mcp/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-flowy-team-flowyteam-mcp/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-flowy-team-flowyteam-mcp/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T14:14:55.659Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-flowy-team-flowyteam-mcp/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-flowy-team-flowyteam-mcp/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-flowy-team-flowyteam-mcp/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-flowy-team-flowyteam-mcp/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:23:01.078Z","emptyReason":null},"readme":"Skill: Flowyteam Mcp\n\nOwner: flowy-team\n\nSummary: Manage FlowyTeam projects, tasks, OKRs, KPIs, HR, CRM, finance, support tickets, attendance, and more via MCP — 34 tools for complete workspace management.\n\nTags: latest:1.1.8\n\nVersion history:\n\nv1.1.8 | 2026-05-05T00:39:54.978Z | auto\n\nflowyteam-mcp 1.1.8 changelog\n\n- Updated safety guidelines: Now explicitly instructs to always require user confirmation before any write or delete action.\n- Clarified recommended token usage: Prefer Employee tokens for self-service; request Admin tokens only for admin operations.\n- Strengthened guidance to never act autonomously or infer write actions; only operate with direct user instruction.\n- No API or protocol changes; documentation update only.\n\nv1.1.7 | 2026-05-05T00:24:16.591Z | auto\n\nflowyteam-mcp 1.1.7\n\n- Updated documentation in README.md for clarity and setup instructions.\n- Updated metadata in _meta.json.\n- No functional or breaking API changes.\n\nv1.1.6 | 2026-05-04T04:46:38.812Z | auto\n\n- Added a new Safety Guidelines section detailing important usage restrictions and best practices.\n- Instructs users to confirm before any create, update, or delete actions, especially on sensitive data.\n- Advises always using a limited-permission token and avoiding autonomous mutations.\n- No changes to endpoints or parameters; documentation improvements only.\n\nv1.1.5 | 2026-05-04T04:39:50.259Z | auto\n\n- Clarified that `auth_register` and `auth_verify_email` endpoints are for new account setup and do not require a Bearer token.\n- Updated protocol section to reflect that only account setup tools work without a `method` field; others require it.\n- No functional or API changes; this update fixes and clarifies endpoint authentication and usage instructions in the documentation.\n\nv1.1.4 | 2026-05-04T04:24:01.401Z | auto\n\nflowyteam-mcp 1.1.4\n\n- Documentation updated: The \"password\" field for creating employees is now marked as optional in SKILL.md.\n- Example JSON for employee creation clarifies that new employees set their own password on first login.\n- No functional or API changes; documentation improvements only.\n\nv1.1.3 | 2026-04-30T04:47:06.092Z | user\n\nImproved documentation clarity for auth tools and employee creation examples\n\nv1.1.2 | 2026-04-28T01:06:34.222Z | auto\n\nflowyteam-mcp v1.1.2\n\n- Added support for 1 new tool (now 34 tools total) for workspace management.\n- Updated authentication endpoints: now includes `auth_verify_email` (no token required).\n- Revised setup instructions to recommend direct API token connection and clarified configuration for Desktop/Cursor usage.\n- Improved protocol and endpoint documentation for clarity.\n\nv1.1.1 | 2026-04-23T01:47:09.057Z | auto\n\nflowyteam-mcp 1.1.1\n\n- Clarified that login and registration tools require explicit user action and credentials.\n- Updated documentation to reflect that the API token is now required in the environment for most operations.\n- Added homepage and source fields to metadata for easier reference.\n- Minor text and formatting tweaks for improved clarity and setup guidance.\n\nv1.0.3 | 2026-04-23T01:32:24.822Z | auto\n\n- Added two new public tools: `auth_register` (register new account) and `auth_login` (log in to existing account) — enabling zero-token bootstrap via gateway endpoint.\n- Updated setup instructions to support both direct token authentication and new tokenless registration/login flow.\n- Expanded toolset from 31 to 33 tools; full workspace coverage remains.\n- All authentication and metadata fields updated for better clarity and onboarding.\n- File structure simplified: metadata moved to root, redundant skill files removed.\n\nv1.0.2 | 2026-04-12T11:35:19.276Z | auto\n\nflowyteam-mcp v1.0.2\n\n- Added skill files in the skills/flowyteam-mcp directory.\n- Updated protocol base URL in documentation from app.flowyteam.com to flowyteam.com.\n- Updated sample configuration blocks and endpoints for consistency with the new base URL.\n- No changes to tool definitions or API structure.\n\nv1.0.1 | 2026-04-12T11:28:44.293Z | auto\n\nflowyteam-mcp 1.0.1 changelog\n\n- Initial public release connecting MCP-compatible agents to FlowyTeam workspace\n- Supports managing projects, tasks, OKRs, KPIs, HR, CRM, finance, support tickets, attendance, and more (31 integrated tools)\n- Provides complete setup instructions for different clients (CLI, Desktop, API)\n- Includes detailed documentation for each API method and tool parameter\n- Requires only a FlowyTeam API token for authentication\n\nv1.0.0 | 2026-04-12T11:26:34.498Z | auto\n\nFlowyTeam MCP 1.0.0 – Initial Release\n\n- Introduces MCP integration for FlowyTeam, covering projects, tasks, OKRs, KPIs, HR, CRM, finance, support tickets, attendance, and more (31 tools total).\n- Provides detailed setup instructions for connecting MCP-compatible agents to FlowyTeam.\n- Documents JSON-RPC 2.0 API protocol, endpoints, and authentication.\n- Includes full parameter reference and usage examples for main resources like tasks, projects, employees, objectives, and key results.\n\nArchive index:\n\nArchive v1.1.8: 4 files, 16996 bytes\n\nFiles: _meta.json (132b), README.md (13011b), skill-card.md (2321b), SKILL.md (46151b)\n\nFile v1.1.8:SKILL.md\n\n---\r\nname: flowyteam\r\nversion: \"1.1.8\"\r\ndescription: Manage FlowyTeam projects, tasks, OKRs, KPIs, HR, CRM, finance, support tickets, attendance, and more via MCP — 34 tools for complete workspace management.\r\nlicense: MIT\r\nauthor: flowyteam\r\nhomepage: https://flowyteam.com\r\nsource: https://github.com/flowy-team/clawhub/tree/master/skills/flowyteam-mcp\r\nmetadata:\r\n  clawhub:\r\n    requires:\r\n      env:\r\n        - name: FLOWYTEAM_API_TOKEN\r\n          description: \"API token from FlowyTeam Settings → MCP & AI Integration.\"\r\n          required: true\r\n---\r\n\r\n# FlowyTeam MCP\r\n\r\nConnect Claude Code (or any MCP-compatible AI agent) to your FlowyTeam workspace.\r\nManage projects, tasks, OKRs, KPIs, employees, leads, clients, tickets, attendance,\r\nleave, invoices, estimates, contracts, expenses, events, notices, time logs, and more\r\n— all via natural language.\r\n\r\n**Platform:** [flowyteam.com](https://flowyteam.com) — All-in-one SaaS for team\r\nproductivity and performance management. 7,000+ organizations, 140+ countries.\r\n\r\n---\r\n\r\n## Endpoints\r\n\r\n| Endpoint | Auth | Purpose |\r\n|---|---|---|\r\n| `POST /api/mcp/gateway` | None (per-call) | **Gateway** — `auth_register` & `auth_verify_email` run without token for new account setup; all other tools read Bearer from header |\r\n| `POST /api/v2/mcp/rpc` | Bearer token | **RPC** — authenticated-only endpoint for all 31 workspace tools |\r\n\r\n---\r\n\r\n## Setup\r\n\r\n### Recommended — Connect with API token\r\n\r\n```bash\r\nclaude mcp add flowyteam \\\r\n  --transport http \\\r\n  --url https://flowyteam.com/api/v2/mcp/rpc \\\r\n  --header \"Authorization: Bearer $FLOWYTEAM_API_TOKEN\"\r\n```\r\n\r\nGet your token: FlowyTeam → **Settings → MCP & AI Integration** → copy token.\r\n\r\n### Claude Desktop / Cursor (`mcp.json`)\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"flowyteam\": {\r\n      \"transport\": \"http\",\r\n      \"url\": \"https://flowyteam.com/api/v2/mcp/rpc\",\r\n      \"headers\": {\r\n        \"Authorization\": \"Bearer YOUR_API_TOKEN\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n---\r\n\r\n## Protocol\r\n\r\n- **Gateway:** `POST https://flowyteam.com/api/mcp/gateway`\r\n- **RPC:** `POST https://flowyteam.com/api/v2/mcp/rpc`\r\n- **Transport:** Streamable HTTP (JSON-RPC 2.0)\r\n- **Auth:** `Authorization: Bearer <api_token>` (not required for `auth_register` / `auth_verify_email`)\r\n- **Protocol Version:** `2024-11-05`\r\n\r\nAll workspace tools share a `method` parameter to select the HTTP verb:\r\n\r\n| `method` | Operation |\r\n|---|---|\r\n| `GET` | Read / list records |\r\n| `POST` | Create a new record |\r\n| `PUT` | Update an existing record |\r\n| `DELETE` | Delete a record |\r\n\r\nAccount setup tools (`auth_register`, `auth_verify_email`) only use `POST` and do not need a `method` field.\r\n\r\n---\r\n\r\n## Safety Guidelines\r\n\r\n> **Always require explicit user confirmation before any write or delete action.**\r\n\r\n- **Use a limited-permission token.** Connect with an Employee token for self-service tasks; request an Admin token only when admin operations are explicitly needed.\r\n- **Require explicit confirmation.** Never execute `POST` (create), `PUT` (update), or `DELETE` without a direct instruction from the user in the current turn — this applies to all records including employees, HR data, contracts, invoices, expenses, notices, and client data.\r\n- **Never act autonomously.** Do not infer or anticipate write actions. Only act on what the user has explicitly asked for.\r\n- **Prefer read-first.** When intent is ambiguous, default to `GET` to show the user what exists before offering to change it.\r\n\r\n---\r\n\r\n## Tools (34)\r\n\r\n> All tools require a valid `FLOWYTEAM_API_TOKEN` Bearer token. See [Setup](#setup) above.\r\n\r\n---\r\n\r\n### 1. `tasks` *(requires Bearer token)*\r\n\r\n**Manage tasks and assignments**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Task ID — required for PUT / DELETE |\r\n| `project_id` | integer \\| string | Filter by project (GET) or assign to project (POST) |\r\n| `heading` | string | Task title — required for POST |\r\n| `description` | string | Task description |\r\n| `status` | string | Task status (e.g. `incomplete`, `complete`) |\r\n| `priority` | string | `low` / `medium` / `high` / `urgent` |\r\n| `assigned_to` | integer \\| string | Employee user ID to assign |\r\n| `user_id` | integer \\| string | Alternative employee ID field |\r\n| `due_date` | string | Due date `YYYY-MM-DD` |\r\n| `task_category_id` | integer \\| string | Task category ID |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list incomplete tasks in project 12\r\n{ \"method\": \"GET\", \"project_id\": 12, \"status\": \"incomplete\" }\r\n\r\n// POST — create task\r\n{ \"method\": \"POST\", \"heading\": \"Write API docs\", \"project_id\": 12,\r\n  \"due_date\": \"2026-05-10\", \"priority\": \"medium\", \"assigned_to\": 7 }\r\n\r\n// PUT — mark complete\r\n{ \"method\": \"PUT\", \"id\": 101, \"status\": \"complete\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 101 }\r\n```\r\n\r\n---\r\n\r\n### 2. `projects`\r\n\r\n**Manage projects and project workflow**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Project ID — required for PUT / DELETE |\r\n| `project_name` | string | Project name — required for POST |\r\n| `status` | string | `not started` / `in progress` / `on hold` / `finished` |\r\n| `start_date` | string | Start date `YYYY-MM-DD` |\r\n| `deadline` | string | Deadline `YYYY-MM-DD` |\r\n| `client_id` | integer \\| string | Client ID |\r\n| `category_id` | integer \\| string | Project category ID |\r\n| `project_summary` | string | Short description |\r\n| `notes` | string | Additional notes |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list in-progress projects\r\n{ \"method\": \"GET\", \"status\": \"in progress\" }\r\n\r\n// POST — create project\r\n{ \"method\": \"POST\", \"project_name\": \"Mobile App v2\",\r\n  \"start_date\": \"2026-06-01\", \"deadline\": \"2026-09-30\", \"client_id\": 3 }\r\n\r\n// PUT — update status\r\n{ \"method\": \"PUT\", \"id\": 12, \"status\": \"on hold\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 12 }\r\n```\r\n\r\n---\r\n\r\n### 3. `employees`\r\n\r\n**Manage employees and team members**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Employee ID — required for PUT / DELETE |\r\n| `name` | string | Full name — required for POST |\r\n| `email` | string | Email — required for POST |\r\n| `password` | string | Optional — new employee sets their own on first login |\r\n| `department_id` | integer \\| string | Department ID |\r\n| `designation_id` | integer \\| string | Job designation ID |\r\n| `employee_id` | string | Custom employee ID/code |\r\n| `joining_date` | string | Joining date `YYYY-MM-DD` |\r\n| `status` | string | `active` / `inactive` |\r\n| `search` | string | Search by name or email |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list active employees in department 4\r\n{ \"method\": \"GET\", \"department_id\": 4, \"status\": \"active\" }\r\n\r\n// POST — create employee (password is set by the new employee on first login)\r\n{ \"method\": \"POST\", \"name\": \"John Doe\", \"email\": \"john@company.com\",\r\n  \"department_id\": 4, \"designation_id\": 2,\r\n  \"joining_date\": \"2026-06-01\" }\r\n\r\n// PUT — deactivate\r\n{ \"method\": \"PUT\", \"id\": 7, \"status\": \"inactive\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 7 }\r\n```\r\n\r\n---\r\n\r\n### 4. `objectives`\r\n\r\n**Manage OKR objectives**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Objective ID — required for PUT / DELETE |\r\n| `heading` | string | Objective title — required for POST |\r\n| `description` | string | Objective description |\r\n| `level` | string | `company` / `department` / `individual` |\r\n| `type` | string | `qualitative` / `quantitative` |\r\n| `status` | string | `on track` / `at risk` / `behind` / `achieved` |\r\n| `cycle_id` | integer \\| string | Performance cycle ID |\r\n| `department_id` | integer \\| string | Filter by department |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — company-level objectives in cycle 3\r\n{ \"method\": \"GET\", \"cycle_id\": 3, \"level\": \"company\" }\r\n\r\n// POST — create objective\r\n{ \"method\": \"POST\", \"heading\": \"Improve NPS Score\",\r\n  \"level\": \"company\", \"cycle_id\": 3, \"type\": \"qualitative\" }\r\n\r\n// PUT — update status\r\n{ \"method\": \"PUT\", \"id\": 20, \"status\": \"at risk\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 20 }\r\n```\r\n\r\n---\r\n\r\n### 5. `key-result`\r\n\r\n**Manage OKR key results linked to objectives**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Key result ID — required for PUT / DELETE |\r\n| `objective_id` | integer \\| string | Filter by objective (GET) |\r\n| `krs_owner` | integer \\| string | Objective ID owning this KR — required for POST |\r\n| `krs_title` | string | Key result title |\r\n| `krs_description` | string | Description |\r\n| `krs_init` | number \\| string | Initial value |\r\n| `krs_tar` | number \\| string | Target value |\r\n| `krs_now` | number \\| string | Current value |\r\n| `krs_weight` | number \\| string | Weight (1–100) |\r\n| `krs_unit` | string | Unit (default `%`) |\r\n| `krs_leader` | integer \\| string | Employee details ID for KR owner |\r\n| `krs_conf` | string | Confidence level |\r\n| `krs_remarks` | string | Remarks |\r\n| `associate_kpis` | array | Array of indicator IDs to link |\r\n| `per_page` | integer | Page size |\r\n| `page` | integer | Page number |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — key results for objective 20\r\n{ \"method\": \"GET\", \"objective_id\": 20 }\r\n\r\n// POST — create key result\r\n{ \"method\": \"POST\", \"krs_owner\": 20, \"krs_title\": \"Reduce churn to < 5%\",\r\n  \"krs_init\": 8, \"krs_tar\": 5, \"krs_now\": 8, \"krs_weight\": 100, \"krs_unit\": \"%\" }\r\n\r\n// PUT — update current value\r\n{ \"method\": \"PUT\", \"id\": 30, \"krs_now\": 4.2 }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 30 }\r\n```\r\n\r\n---\r\n\r\n### 6. `indicators`\r\n\r\n**Manage KPIs and performance indicators**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | KPI ID — required for PUT / DELETE |\r\n| `name` | string | KPI name — required for POST |\r\n| `target` | number \\| string | Target value |\r\n| `unit` | string | Unit (e.g. `%`, `USD`, `count`) |\r\n| `frequency` | string | `daily` / `weekly` / `monthly` / `quarterly` / `yearly` |\r\n| `category_id` | integer \\| string | Indicator category ID |\r\n| `employee_id` | integer \\| string | Assign to employee |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — monthly KPIs for employee 7\r\n{ \"method\": \"GET\", \"employee_id\": 7, \"frequency\": \"monthly\" }\r\n\r\n// POST — create KPI\r\n{ \"method\": \"POST\", \"name\": \"Customer Satisfaction Score\",\r\n  \"target\": 90, \"unit\": \"%\", \"frequency\": \"monthly\",\r\n  \"employee_id\": 7, \"category_id\": 2 }\r\n\r\n// PUT — update target\r\n{ \"method\": \"PUT\", \"id\": 40, \"target\": 95 }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 40 }\r\n```\r\n\r\n---\r\n\r\n### 7. `indicator-record`\r\n\r\n**Manage KPI actual values per period**\r\n\r\nMethods: `GET` `POST` `DELETE`\r\n\r\n> **POST** maps to `indicator-record/update-record` (upsert by period).\r\n> **GET with `id`** returns a single record; **GET without `id`** returns a list.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `DELETE` |\r\n| `id` | integer \\| string | Record ID — GET single / DELETE |\r\n| `indicator_id` | integer \\| string | KPI indicator ID — required for GET list and POST |\r\n| `period_key` | string | Period date `dd-m-YYYY` e.g. `01-6-2026` — required for POST |\r\n| `current_value` | number \\| string | Actual value for the period |\r\n| `target_value` | number \\| string | Target value for the period |\r\n| `remark` | string | Notes |\r\n| `score` | number \\| string | Computed score |\r\n| `month` | integer \\| string | Filter by month number (GET list) |\r\n| `year` | integer \\| string | Filter by year (GET list) |\r\n| `start_date` | string | Filter from date (GET list) |\r\n| `end_date` | string | Filter to date (GET list) |\r\n| `all` | boolean \\| string | Return all records without pagination |\r\n| `per_page` | integer | Page size |\r\n| `page` | integer | Page number |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — records for KPI 40 in May 2026\r\n{ \"method\": \"GET\", \"indicator_id\": 40, \"month\": 5, \"year\": 2026 }\r\n\r\n// POST — submit/update actual value for a period\r\n{ \"method\": \"POST\", \"indicator_id\": 40, \"period_key\": \"01-6-2026\",\r\n  \"current_value\": 112000, \"target_value\": 100000, \"remark\": \"Exceeded target\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 200 }\r\n```\r\n\r\n---\r\n\r\n### 8. `leads`\r\n\r\n**Manage sales leads and prospects**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Lead ID — required for PUT / DELETE |\r\n| `client_name` | string | Lead contact name — required for POST |\r\n| `company_name` | string | Company name |\r\n| `email` | string | Contact email |\r\n| `mobile` | string | Contact mobile |\r\n| `website` | string | Company website |\r\n| `address` | string | Address |\r\n| `note` | string | Notes |\r\n| `agent_id` | integer \\| string | Assign to sales agent |\r\n| `source_id` | integer \\| string | Lead source ID (POST) |\r\n| `status_id` | integer \\| string | Lead status ID (POST) |\r\n| `status` | integer \\| string | Lead status ID (PUT) |\r\n| `source` | integer \\| string | Lead source ID (PUT) |\r\n| `meeting_date` | string | Scheduled meeting date |\r\n| `next_follow_up` | string | `yes` or `no` |\r\n| `client` | string | `lead` or `client` filter (GET) |\r\n| `followUp` | string | Filter follow-up required (GET) |\r\n| `startDate` | string | Filter from date (GET) |\r\n| `endDate` | string | Filter to date (GET) |\r\n| `sort_field` | string | Sort column |\r\n| `sort_direction` | string | `asc` / `desc` |\r\n| `per_page` | integer | Page size |\r\n| `page` | integer | Page number |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list leads with pagination\r\n{ \"method\": \"GET\", \"client\": \"lead\", \"per_page\": 20, \"page\": 1 }\r\n\r\n// POST — create lead\r\n{ \"method\": \"POST\", \"client_name\": \"PT Maju Jaya\",\r\n  \"email\": \"info@majujaya.com\", \"mobile\": \"+6281234567890\",\r\n  \"status_id\": 1, \"agent_id\": 7 }\r\n\r\n// PUT — update status and add note\r\n{ \"method\": \"PUT\", \"id\": 55, \"status\": 3, \"note\": \"Proposal sent\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 55 }\r\n```\r\n\r\n---\r\n\r\n### 9. `clients`\r\n\r\n**Manage clients and customer relationships**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Client ID — required for PUT / DELETE |\r\n| `name` | string | Contact name — required for POST |\r\n| `email` | string | Email — required for POST |\r\n| `company_name` | string | Company name |\r\n| `website` | string | Company website |\r\n| `address` | string | Address |\r\n| `mobile` | string | Phone number |\r\n| `send_email` | string | `yes` / `no` — send welcome email |\r\n| `skype` | string \\| null | Skype handle |\r\n| `linkedin` | string \\| null | LinkedIn URL |\r\n| `twitter` | string \\| null | Twitter handle |\r\n| `facebook` | string \\| null | Facebook URL |\r\n| `gst_number` | string \\| null | Tax/GST number |\r\n| `note` | string \\| null | Notes |\r\n| `search` | string | Search by name or company |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — search clients\r\n{ \"method\": \"GET\", \"search\": \"acme\" }\r\n\r\n// POST — create client\r\n{ \"method\": \"POST\", \"name\": \"Alice Johnson\",\r\n  \"email\": \"alice@newclient.com\", \"company_name\": \"New Client Ltd\",\r\n  \"mobile\": \"+0987654321\", \"send_email\": \"yes\" }\r\n\r\n// PUT — update website\r\n{ \"method\": \"PUT\", \"id\": 3, \"website\": \"https://acme-new.com\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 3 }\r\n```\r\n\r\n---\r\n\r\n### 10. `tickets`\r\n\r\n**Manage support tickets and issues**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Ticket ID — required for PUT / DELETE |\r\n| `subject` | string | Ticket subject — required for POST |\r\n| `description` | string | Ticket description |\r\n| `status` | string | `open` / `pending` / `resolved` / `closed` |\r\n| `priority` | string | `low` / `medium` / `high` / `urgent` |\r\n| `type_id` | integer \\| string | Ticket type ID |\r\n| `channel_id` | integer \\| string | Ticket channel ID |\r\n| `agent_id` | integer \\| string | Assign to agent |\r\n| `user_id` | integer \\| string | Reporter user ID |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — high-priority open tickets\r\n{ \"method\": \"GET\", \"status\": \"open\", \"priority\": \"high\" }\r\n\r\n// POST — create ticket\r\n{ \"method\": \"POST\", \"subject\": \"Cannot export report\",\r\n  \"description\": \"Export button not responding\",\r\n  \"priority\": \"medium\", \"type_id\": 1, \"channel_id\": 2, \"user_id\": 7 }\r\n\r\n// PUT — resolve and reassign\r\n{ \"method\": \"PUT\", \"id\": 500, \"status\": \"resolved\", \"agent_id\": 8 }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 500 }\r\n```\r\n\r\n---\r\n\r\n### 11. `attendance`\r\n\r\n**Manage attendance records and time tracking**\r\n\r\nMethods: `GET` `POST` `PUT`\r\n\r\n> **POST** → clock in (`attendance/clock-in`)\r\n> **PUT** → clock out (`attendance/clock-out`)\r\n> **GET with `today: true`** → today's attendance summary\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` |\r\n| `id` | integer \\| string | Attendance record ID — required for PUT (clock-out) |\r\n| `employee_id` | integer \\| string | Employee ID |\r\n| `date` | string | Specific date `YYYY-MM-DD` |\r\n| `month` | string | Filter by month |\r\n| `year` | string | Filter by year |\r\n| `clock_in_time` | string | Clock-in time `HH:MM:SS` |\r\n| `clock_out_time` | string | Clock-out time `HH:MM:SS` |\r\n| `working_from` | string | `office` / `home` / `other` |\r\n| `late_reason` | string | Reason if arriving late |\r\n| `today` | boolean \\| string | Set `true` to get today's records (GET) |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — today's attendance\r\n{ \"method\": \"GET\", \"today\": true }\r\n\r\n// GET — by month/year\r\n{ \"method\": \"GET\", \"employee_id\": 7, \"month\": \"5\", \"year\": \"2026\" }\r\n\r\n// POST — clock in\r\n{ \"method\": \"POST\", \"employee_id\": 7, \"working_from\": \"office\" }\r\n\r\n// PUT — clock out\r\n{ \"method\": \"PUT\", \"id\": 300 }\r\n```\r\n\r\n---\r\n\r\n### 12. `leave`\r\n\r\n**Manage employee leave requests**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Leave ID — required for PUT / DELETE |\r\n| `user_id` | integer \\| string | Employee user ID — required for POST |\r\n| `leave_type_id` | integer \\| string | Leave type ID — required for POST / PUT |\r\n| `leave_date` | string | Leave start date `YYYY-MM-DD` — required for POST |\r\n| `duration` | string | `full day` / `half day` / `multiple` |\r\n| `reason` | string | Leave reason |\r\n| `status` | string | `pending` / `approved` / `rejected` (PUT for approval) |\r\n| `multi_date` | string | Comma-separated dates for `multiple` duration |\r\n| `userId` | integer \\| string | Filter by employee (GET) |\r\n| `startDate` | string | Filter from date (GET) |\r\n| `endDate` | string | Filter to date (GET) |\r\n| `search` | string | Search keyword |\r\n| `all` | boolean \\| string | Return all records without pagination |\r\n| `per_page` | integer | Page size |\r\n| `page` | integer | Page number |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — pending leaves for employee 7\r\n{ \"method\": \"GET\", \"userId\": 7, \"status\": \"pending\" }\r\n\r\n// POST — apply for leave\r\n{ \"method\": \"POST\", \"user_id\": 7, \"leave_type_id\": 1,\r\n  \"leave_date\": \"2026-05-15\", \"duration\": \"full day\", \"reason\": \"Family event\" }\r\n\r\n// PUT — approve leave\r\n{ \"method\": \"PUT\", \"id\": 88, \"status\": \"approved\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 88 }\r\n```\r\n\r\n---\r\n\r\n### 13. `department`\r\n\r\n**Manage departments and teams**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n> Supports lookup by `name` (string) in addition to `id` for PUT / DELETE.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Department ID |\r\n| `name` | string | Current department name — for lookup (PUT / DELETE) |\r\n| `team_name` | string | Department name — required for POST / PUT |\r\n| `description` | string | Department description |\r\n| `parent_id` | integer \\| string | Parent department ID |\r\n| `leader_id` | integer \\| string | Department leader employee ID |\r\n| `search` | string | Search by name |\r\n| `sort_field` | string | Sort column |\r\n| `sort_direction` | string | `asc` / `desc` |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — search departments\r\n{ \"method\": \"GET\", \"search\": \"marketing\" }\r\n\r\n// POST — create department\r\n{ \"method\": \"POST\", \"team_name\": \"Product Design\",\r\n  \"description\": \"UI/UX and product design team\" }\r\n\r\n// PUT — rename by ID\r\n{ \"method\": \"PUT\", \"id\": 4, \"team_name\": \"Digital Marketing & SEO\" }\r\n\r\n// PUT — rename by name (auto-resolves ID)\r\n{ \"method\": \"PUT\", \"name\": \"Digital Marketing\", \"team_name\": \"Digital Marketing & SEO\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 4 }\r\n```\r\n\r\n---\r\n\r\n### 14. `designation`\r\n\r\n**Manage job designations and roles**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Designation ID — required for PUT / DELETE |\r\n| `name` | string | Designation name — required for POST / PUT |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — search designations\r\n{ \"method\": \"GET\", \"search\": \"engineer\" }\r\n\r\n// POST — create designation\r\n{ \"method\": \"POST\", \"name\": \"DevOps Engineer\" }\r\n\r\n// PUT — rename\r\n{ \"method\": \"PUT\", \"id\": 2, \"name\": \"Principal Software Engineer\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 2 }\r\n```\r\n\r\n---\r\n\r\n### 15. `performance-cycle`\r\n\r\n**Manage performance / OKR cycles**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Cycle ID — required for PUT / DELETE |\r\n| `name` | string | Cycle name — required for POST / PUT |\r\n| `cycle_type` | string | Cycle type — required for POST / PUT (e.g. `quarterly`, `annual`) |\r\n| `started_at` | string | Start date `YYYY-MM-DD` — required for POST / PUT |\r\n| `finished_at` | string | End date `YYYY-MM-DD` — required for POST / PUT |\r\n| `sort_field` | string | Sort column |\r\n| `sort_direction` | string | `asc` / `desc` |\r\n| `per_page` | integer | Page size |\r\n| `page` | integer | Page number |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list cycles\r\n{ \"method\": \"GET\", \"per_page\": 10, \"page\": 1 }\r\n\r\n// POST — create quarterly cycle\r\n{ \"method\": \"POST\", \"name\": \"Q3 2026\", \"cycle_type\": \"quarterly\",\r\n  \"started_at\": \"2026-07-01\", \"finished_at\": \"2026-09-30\" }\r\n\r\n// PUT — rename cycle\r\n{ \"method\": \"PUT\", \"id\": 3, \"name\": \"Q2 2026 Revised\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 3 }\r\n```\r\n\r\n---\r\n\r\n### 16. `holiday`\r\n\r\n**Manage company holidays**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Holiday ID — required for PUT / DELETE |\r\n| `occasion` | string | Holiday name — required for POST / PUT |\r\n| `date` | string | Date in `dd/mm/yyyy` format — required for POST / PUT |\r\n| `year` | integer \\| string | Filter by year (GET) |\r\n| `status` | string | `upcoming` / `past` / `all` (GET) |\r\n| `search` | string | Search by keyword |\r\n| `all` | boolean \\| string | Return all records without pagination |\r\n| `sort_field` | string | Sort column |\r\n| `sort_direction` | string | `asc` / `desc` |\r\n| `per_page` | integer | Page size |\r\n| `page` | integer | Page number |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — upcoming holidays in 2026\r\n{ \"method\": \"GET\", \"year\": 2026, \"status\": \"upcoming\" }\r\n\r\n// POST — add holiday\r\n{ \"method\": \"POST\", \"occasion\": \"New Year's Day\", \"date\": \"01/01/2027\" }\r\n\r\n// PUT — rename holiday\r\n{ \"method\": \"PUT\", \"id\": 10, \"occasion\": \"National Independence Day\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 10 }\r\n```\r\n\r\n---\r\n\r\n### 17. `project-category`\r\n\r\n**Manage project categories and classifications**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Category ID — required for PUT / DELETE |\r\n| `category_name` | string | Category name — required for POST / PUT |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — search categories\r\n{ \"method\": \"GET\", \"search\": \"web\" }\r\n\r\n// POST\r\n{ \"method\": \"POST\", \"category_name\": \"Mobile Development\" }\r\n\r\n// PUT\r\n{ \"method\": \"PUT\", \"id\": 1, \"category_name\": \"Web & PWA Development\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 1 }\r\n```\r\n\r\n---\r\n\r\n### 18. `task-category`\r\n\r\n**Manage task categories and types**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Category ID — required for PUT / DELETE |\r\n| `category_name` | string | Category name — required for POST / PUT |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET\r\n{ \"method\": \"GET\", \"search\": \"bug\" }\r\n\r\n// POST\r\n{ \"method\": \"POST\", \"category_name\": \"Feature Request\" }\r\n\r\n// PUT\r\n{ \"method\": \"PUT\", \"id\": 1, \"category_name\": \"Critical Bug Fix\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 1 }\r\n```\r\n\r\n---\r\n\r\n### 19. `ticket-type`\r\n\r\n**Manage ticket types and classifications**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Ticket type ID — required for PUT / DELETE |\r\n| `type` | string | Ticket type name — required for POST / PUT |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET\r\n{ \"method\": \"GET\", \"search\": \"bug\" }\r\n\r\n// POST\r\n{ \"method\": \"POST\", \"type\": \"Feature Request\" }\r\n\r\n// PUT\r\n{ \"method\": \"PUT\", \"id\": 1, \"type\": \"Critical Bug\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 1 }\r\n```\r\n\r\n---\r\n\r\n### 20. `ticket-channel`\r\n\r\n**Manage ticket channels and submission methods**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Channel ID — required for PUT / DELETE |\r\n| `channel_name` | string | Channel name — required for POST / PUT |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list all channels\r\n{ \"method\": \"GET\" }\r\n\r\n// POST\r\n{ \"method\": \"POST\", \"channel_name\": \"WhatsApp\" }\r\n\r\n// PUT\r\n{ \"method\": \"PUT\", \"id\": 1, \"channel_name\": \"Email Support\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 1 }\r\n```\r\n\r\n---\r\n\r\n### 21. `ticket-agent`\r\n\r\n**List ticket agents and their groups**\r\n\r\nMethods: `GET`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` |\r\n\r\n**Example:**\r\n\r\n```json\r\n// GET — list all ticket agents\r\n{ \"method\": \"GET\" }\r\n```\r\n\r\n**Response:**\r\n\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"data\": [\r\n    { \"id\": 7, \"name\": \"Sarah Lee\", \"email\": \"sarah@company.com\", \"group\": \"Technical Support\" }\r\n  ]\r\n}\r\n```\r\n\r\n---\r\n\r\n### 22. `indicator-category`\r\n\r\n**Manage KPI / indicator categories**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Category ID — required for PUT / DELETE |\r\n| `indicator_type_name` | string | Category name — required for POST / PUT |\r\n| `status` | string | Filter by status; omit or `all` for no filter (GET) |\r\n| `search` | string | Search by keyword |\r\n| `all` | boolean \\| string | Return all records without pagination |\r\n| `sort_field` | string | Sort column |\r\n| `sort_direction` | string | `asc` / `desc` |\r\n| `per_page` | integer | Page size |\r\n| `page` | integer | Page number |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list all categories\r\n{ \"method\": \"GET\", \"all\": true }\r\n\r\n// POST\r\n{ \"method\": \"POST\", \"indicator_type_name\": \"Engineering\" }\r\n\r\n// PUT\r\n{ \"method\": \"PUT\", \"id\": 1, \"indicator_type_name\": \"Revenue & Sales\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 1 }\r\n```\r\n\r\n---\r\n\r\n### 23. `leave-type`\r\n\r\n**Manage leave types (Annual, Sick, etc.)**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n> Write operations (POST/PUT/DELETE) are admin-only.\r\n> Lookup by `id` or `type_name` (partial match) for PUT/DELETE.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | string | Leave type ID — or use `type_name` to look up |\r\n| `type_name` | string | Leave type name — required for POST |\r\n| `days` | number | Number of allowed days per year |\r\n| `color` | string | Color code e.g. `#FF0000` |\r\n| `is_paid` | boolean | Is this a paid leave type? Default: `true` |\r\n| `search` | string | Search by name |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list all leave types\r\n{ \"method\": \"GET\" }\r\n\r\n// POST\r\n{ \"method\": \"POST\", \"type_name\": \"Maternity Leave\", \"days\": 90, \"is_paid\": true }\r\n\r\n// PUT — update days allowed\r\n{ \"method\": \"PUT\", \"type_name\": \"Annual Leave\", \"days\": 14 }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": \"3\" }\r\n```\r\n\r\n---\r\n\r\n### 24. `invoices`\r\n\r\n**Manage client invoices**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n> Requires `invoices` module enabled. POST/PUT/DELETE are admin-only.\r\n> Lookup by `id` or `invoice_number` (e.g. `INV#0001`) for PUT/DELETE.\r\n> Employees see only invoices linked to projects they are members of.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | string | Invoice ID |\r\n| `invoice_number` | string | Display number e.g. `INV#0001` — used to look up for PUT/DELETE |\r\n| `client_id` | string | Client user ID |\r\n| `client_name` | string | Client company or contact name — auto-resolved to ID |\r\n| `project_id` | string | Link to project |\r\n| `issue_date` | string | Issue date `YYYY-MM-DD` (defaults to today) |\r\n| `due_date` | string | Due date `YYYY-MM-DD` |\r\n| `sub_total` | number | Subtotal amount |\r\n| `total` | number | Total amount — **required for POST** |\r\n| `currency_id` | string | Currency ID |\r\n| `note` | string | Invoice notes |\r\n| `search` | string | Search by invoice number or client name |\r\n| `startDate` | string | Filter from issue date |\r\n| `endDate` | string | Filter to issue date |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list invoices\r\n{ \"method\": \"GET\", \"client_name\": \"Acme Corp\" }\r\n\r\n// POST — create invoice\r\n{ \"method\": \"POST\", \"client_name\": \"Acme Corp\", \"total\": 5000,\r\n  \"issue_date\": \"2026-05-01\", \"due_date\": \"2026-05-31\" }\r\n\r\n// PUT — update due date\r\n{ \"method\": \"PUT\", \"invoice_number\": \"INV#0001\", \"due_date\": \"2026-06-15\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"invoice_number\": \"INV#0001\" }\r\n```\r\n\r\n---\r\n\r\n### 25. `estimates`\r\n\r\n**Manage client estimates and quotes**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n> Requires `estimates` module enabled. POST/PUT/DELETE are admin-only.\r\n> Lookup by `id` or `estimate_number` (e.g. `EST#0001`) for PUT/DELETE.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | string | Estimate ID |\r\n| `estimate_number` | string | Display number e.g. `EST#0001` — look up for PUT/DELETE |\r\n| `client_id` | string | Client user ID |\r\n| `client_name` | string | Client company or contact name — auto-resolved to ID |\r\n| `valid_till` | string | Expiry date `YYYY-MM-DD` |\r\n| `sub_total` | number | Subtotal |\r\n| `total` | number | Total amount — **required for POST** |\r\n| `discount` | number | Discount amount |\r\n| `discount_type` | string | `percent` or `fixed` |\r\n| `currency_id` | string | Currency ID |\r\n| `note` | string | Notes |\r\n| `status` | string | `draft` / `sent` / `declined` / `accepted` |\r\n| `search` | string | Search by number or client |\r\n| `startDate` | string | Filter from `valid_till` |\r\n| `endDate` | string | Filter to `valid_till` |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list accepted estimates\r\n{ \"method\": \"GET\", \"status\": \"accepted\" }\r\n\r\n// POST — create estimate\r\n{ \"method\": \"POST\", \"client_name\": \"Acme Corp\", \"total\": 12000,\r\n  \"valid_till\": \"2026-06-30\", \"status\": \"draft\" }\r\n\r\n// PUT — mark as sent\r\n{ \"method\": \"PUT\", \"estimate_number\": \"EST#0003\", \"status\": \"sent\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"estimate_number\": \"EST#0003\" }\r\n```\r\n\r\n---\r\n\r\n### 26. `contracts`\r\n\r\n**Manage client contracts**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n> Requires `contracts` module enabled. POST/PUT/DELETE are admin-only.\r\n> Lookup by `id` or `subject` (partial match) for PUT/DELETE.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | string | Contract ID |\r\n| `subject` | string | Contract title — **required for POST**; also used for lookup |\r\n| `client_id` | string | Client user ID |\r\n| `client_name` | string | Client company name — auto-resolved to ID |\r\n| `contract_type_id` | string | Contract type ID |\r\n| `start_date` | string | Start date `YYYY-MM-DD` |\r\n| `end_date` | string | End date `YYYY-MM-DD` |\r\n| `amount` | number | Contract value |\r\n| `currency_id` | string | Currency ID |\r\n| `description` | string | Contract notes |\r\n| `search` | string | Search by contract subject |\r\n| `startDate` | string | Filter by start_date from |\r\n| `endDate` | string | Filter by end_date to |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list contracts for a client\r\n{ \"method\": \"GET\", \"client_name\": \"Acme Corp\" }\r\n\r\n// POST — create contract\r\n{ \"method\": \"POST\", \"subject\": \"Annual Support Contract\",\r\n  \"client_name\": \"Acme Corp\", \"start_date\": \"2026-01-01\",\r\n  \"end_date\": \"2026-12-31\", \"amount\": 24000 }\r\n\r\n// PUT — update amount\r\n{ \"method\": \"PUT\", \"subject\": \"Annual Support Contract\", \"amount\": 30000 }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": \"7\" }\r\n```\r\n\r\n---\r\n\r\n### 27. `events`\r\n\r\n**Manage company calendar events**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n> Requires `events` module enabled. POST/PUT/DELETE are admin-only.\r\n> Lookup by `id` or `event_name` (partial match) for PUT/DELETE.\r\n> Distinct from `holiday` — use `events` for internal company events, meetings, etc.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | string | Event ID |\r\n| `event_name` | string | Event name — **required for POST**; also used for lookup |\r\n| `where` | string | Event location |\r\n| `description` | string | Event description |\r\n| `start_date_time` | string | Start date/time `YYYY-MM-DD HH:mm` — **required for POST** |\r\n| `end_date_time` | string | End date/time `YYYY-MM-DD HH:mm` — **required for POST** |\r\n| `repeat` | string | `yes` / `no` (default: `no`) |\r\n| `repeat_every` | integer | Repeat interval (e.g. every 2 weeks) |\r\n| `repeat_cycles` | integer | Number of repetitions |\r\n| `repeat_type` | string | `daily` / `weekly` / `monthly` / `yearly` |\r\n| `label_color` | string | Bootstrap class or hex color (default: `bg-info`) |\r\n| `month` | string | Filter by month number 1–12 |\r\n| `year` | string | Filter by year |\r\n| `startDate` | string | Filter events from date |\r\n| `endDate` | string | Filter events to date |\r\n| `search` | string | Search by event name |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — events in June 2026\r\n{ \"method\": \"GET\", \"month\": \"6\", \"year\": \"2026\" }\r\n\r\n// POST — create event\r\n{ \"method\": \"POST\", \"event_name\": \"Q2 All-Hands Meeting\",\r\n  \"start_date_time\": \"2026-06-15 09:00\",\r\n  \"end_date_time\": \"2026-06-15 11:00\", \"where\": \"Main Conference Room\" }\r\n\r\n// PUT — change location\r\n{ \"method\": \"PUT\", \"event_name\": \"Q2 All-Hands Meeting\", \"where\": \"Zoom\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": \"15\" }\r\n```\r\n\r\n---\r\n\r\n### 28. `expenses`\r\n\r\n**Manage expenses and claims**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n> Requires `expenses` module enabled. DELETE is admin-only.\r\n> Employees can create/update their own pending expenses.\r\n> Admin-created expenses default to `approved`; employee-submitted default to `pending`.\r\n> Lookup by `id` or `item_name` (partial match) for PUT/DELETE.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | string | Expense ID |\r\n| `item_name` | string | Expense item name — **required for POST**; also used for lookup |\r\n| `purchase_date` | string | Purchase date `YYYY-MM-DD` — **required for POST** |\r\n| `price` | number | Expense amount — **required for POST** |\r\n| `purchase_from` | string | Where it was purchased |\r\n| `currency_id` | string | Currency ID (defaults to company currency) |\r\n| `expense_category_id` | string | Expense category ID |\r\n| `user_id` | string | Employee user ID (admin only; defaults to self) |\r\n| `employee_name` | string | Employee name — auto-resolved to `user_id` |\r\n| `project_id` | string | Link to project |\r\n| `description` | string | Additional notes |\r\n| `status` | string | `pending` / `approved` / `rejected` — filter (GET) or update (PUT, admin only) |\r\n| `can_claim` | integer \\| boolean | `1` = reimbursement claim, `0` = regular expense |\r\n| `startDate` | string | Filter from purchase date |\r\n| `endDate` | string | Filter to purchase date |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — pending expenses\r\n{ \"method\": \"GET\", \"status\": \"pending\" }\r\n\r\n// POST — submit expense\r\n{ \"method\": \"POST\", \"item_name\": \"Team Lunch\", \"purchase_date\": \"2026-05-10\",\r\n  \"price\": 250, \"can_claim\": 1, \"description\": \"Client meeting lunch\" }\r\n\r\n// PUT — approve expense (admin)\r\n{ \"method\": \"PUT\", \"id\": \"99\", \"status\": \"approved\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": \"99\" }\r\n```\r\n\r\n---\r\n\r\n### 29. `expense-category`\r\n\r\n**Manage expense categories**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n> Requires `expenses` module enabled. Write operations are admin-only.\r\n> Lookup by `id` or `category_name` (partial match) for PUT/DELETE.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | string | Category ID |\r\n| `category_name` | string | Category name — **required for POST**; also used for lookup |\r\n| `search` | string | Search by category name |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET\r\n{ \"method\": \"GET\" }\r\n\r\n// POST\r\n{ \"method\": \"POST\", \"category_name\": \"Travel & Accommodation\" }\r\n\r\n// PUT\r\n{ \"method\": \"PUT\", \"category_name\": \"Travel\", \"category_name\": \"Travel & Accommodation\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": \"5\" }\r\n```\r\n\r\n---\r\n\r\n### 30. `notices`\r\n\r\n**Manage company notice board**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n> Requires `notices` module enabled. POST/PUT/DELETE are admin-only.\r\n> Employees see only notices addressed to `all` or `employee`.\r\n> Lookup by `id` or `heading` (partial match) for PUT/DELETE.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | string | Notice ID |\r\n| `heading` | string | Notice title — **required for POST**; also used for lookup |\r\n| `description` | string | Notice content body — **required for POST** |\r\n| `to` | string | Target audience: `all` / `employee` / `client` (default: `all`) |\r\n| `search` | string | Search by heading |\r\n| `startDate` | string | Filter from created date |\r\n| `endDate` | string | Filter to created date |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — notices for employees\r\n{ \"method\": \"GET\", \"to\": \"employee\" }\r\n\r\n// POST — create announcement\r\n{ \"method\": \"POST\", \"heading\": \"Office Closed on Friday\",\r\n  \"description\": \"The office will be closed this Friday for maintenance.\",\r\n  \"to\": \"all\" }\r\n\r\n// PUT — update content\r\n{ \"method\": \"PUT\", \"heading\": \"Office Closed on Friday\",\r\n  \"description\": \"Updated: Office closed Friday AND Monday.\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": \"12\" }\r\n```\r\n\r\n---\r\n\r\n### 31. `timelogs`\r\n\r\n**Manage project and task time logs**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n> Requires `timelogs` module enabled. DELETE is admin-only.\r\n> **POST** starts a timer (sets `end_time = null`).\r\n> **PUT** stops a running timer by providing `end_time`, or edits any field.\r\n> PUT without `id` finds the active (running) timer for the target user.\r\n> Employees see only their own time logs.\r\n> Supports lookup by name: `project_name` → `project_id`, `task_name` → `task_id`, `employee_name` → `user_id`.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | string | Time log ID — required for DELETE |\r\n| `project_id` | string | Project ID |\r\n| `project_name` | string | Project name — auto-resolved to `project_id` |\r\n| `task_id` | string | Task ID |\r\n| `task_name` | string | Task heading — auto-resolved to `task_id` |\r\n| `user_id` | string | Employee user ID (admin only; defaults to self) |\r\n| `employee_name` | string | Employee name — auto-resolved to `user_id` |\r\n| `start_time` | string | Start datetime `YYYY-MM-DD HH:mm` (defaults to now on POST) |\r\n| `end_time` | string | End datetime — provide on PUT to stop the timer |\r\n| `memo` | string | Optional note for the time log |\r\n| `date` | string | Filter by specific date (GET) |\r\n| `month` | string | Filter by month number 1–12 (GET) |\r\n| `year` | string | Filter by year (GET) |\r\n| `active_only` | boolean \\| string | `true` = return only running timers (GET) |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — my time logs this month\r\n{ \"method\": \"GET\", \"month\": \"5\", \"year\": \"2026\" }\r\n\r\n// GET — active running timers\r\n{ \"method\": \"GET\", \"active_only\": true }\r\n\r\n// POST — start timer for a project\r\n{ \"method\": \"POST\", \"project_name\": \"Mobile App v2\",\r\n  \"task_name\": \"Design landing page\", \"memo\": \"Working on hero section\" }\r\n\r\n// PUT — stop running timer\r\n{ \"method\": \"PUT\", \"end_time\": \"2026-05-10 17:30\" }\r\n\r\n// PUT — stop timer by ID\r\n{ \"method\": \"PUT\", \"id\": \"88\", \"end_time\": \"2026-05-10 17:30\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": \"88\" }\r\n```\r\n\r\n---\r\n\r\n## Account Setup (no API token yet?)\r\n\r\n**Existing account:** Go to FlowyTeam → **Settings → MCP & AI Integration** → copy your API token, then use the [Recommended setup](#recommended--connect-with-api-token) above.\r\n\r\n**New account:** Use `auth_register` + `auth_verify_email` below. Both tools are available via `https://flowyteam.com/api/mcp/gateway` without a token, and **must only be invoked when the user explicitly requests it** — never autonomously.\r\n\r\n### `auth_register`\r\n\r\n**Create a new FlowyTeam company account.**\r\nCall only when the user explicitly requests account creation. A verification email with a 6-digit code is sent immediately. No setup password needed — one is generated and delivered via the verification email.\r\n\r\n| Parameter | Type | Required | Description |\r\n|---|---|---|---|\r\n| `name` | string | ✓ | Full name of the admin user |\r\n| `email` | string | ✓ | Email address |\r\n| `company_name` | string | ✓ | Company / organisation name |\r\n| `phone` | string | — | Phone number |\r\n\r\n**Response:** Returns `status: pending_verification`. Ask the user to check their email for the 6-digit code, then call `auth_verify_email`.\r\n\r\n---\r\n\r\n### `auth_verify_email`\r\n\r\n**Activate account and retrieve API token.**\r\nCall after `auth_register` once the user shares the 6-digit code from their verification email.\r\n\r\n| Parameter | Type | Required | Description |\r\n|---|---|---|---|\r\n| `verification_code` | string | ✓ | 6-digit code from the verification email |\r\n\r\n**Response:** Returns `api_token` — use this as the Bearer token and reconfigure the MCP connection.\r\n\r\n---\r\n\r\n## Error Codes\r\n\r\n| Code | Meaning |\r\n|---|---|\r\n| `200` | Success |\r\n| `401` | Unauthenticated — missing or invalid Bearer token |\r\n| `403` | Forbidden — authenticated but lacks permission |\r\n| `404` | Resource not found |\r\n| `422` | Validation error — check the `errors` object in the response |\r\n| `429` | Too many requests — rate limit exceeded |\r\n| `500` | Server error |\r\n\r\n---\r\n\r\n## Natural Language Examples\r\n\r\nOnce connected, you can ask Claude:\r\n\r\n```\r\n\"Create a task 'Review Q2 Report' in the Marketing project,\r\n assign to Sarah, due April 30\"\r\n\r\n\"Show me all open high-priority tickets\"\r\n\r\n\"List company-level OKRs for Q2 2026\"\r\n\r\n\"Who is on leave this week?\"\r\n\r\n\"Add a new employee: John Doe, email john@company.com,\r\n Engineering department, joining June 1\"\r\n\r\n\"What are the KPI scores for the Sales team this month?\"\r\n\r\n\"Create a new lead: PT Maju Jaya, contact info@majujaya.com,\r\n assign to agent ID 7\"\r\n\r\n\"Clock in employee 7 from office\"\r\n\r\n\"List all upcoming holidays in 2026\"\r\n\r\n\"Show me all pending expense claims\"\r\n\r\n\"Create an invoice for Acme Corp, total $5,000, due May 31\"\r\n\r\n\"What events do we have in June?\"\r\n\r\n\"Post an announcement: office closed Friday\"\r\n\r\n\"Log 8 hours on the Mobile App project for today\"\r\n\r\n\"Show me all running timers right now\"\r\n```\r\n\r\n---\r\n\r\n## Links\r\n\r\n- **Website:** [flowyteam.com](https://flowyteam.com)\r\n- **MCP Docs:** [flowyteam.com/get/mcp-server](https://flowyteam.com/get/mcp-server)\r\n- **API Reference:** [flowyteam.com/get/mcp-docs](https://flowyteam.com/get/mcp-docs)\r\n- **Sign Up:** [app.flowyteam.com/register](https://flowyteam.com/register)\n\nFile v1.1.8:README.md\n\n# FlowyTeam MCP\r\n\r\n> Connect Claude Code (or any MCP-compatible AI agent) to your FlowyTeam workspace and manage your entire business via natural language.\r\n\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)\r\n[![MCP Protocol](https://img.shields.io/badge/MCP-2024--11--05-blue.svg)](https://modelcontextprotocol.io)\r\n[![Tools](https://img.shields.io/badge/Tools-34-orange.svg)](SKILL.md)\r\n[![Platform](https://img.shields.io/badge/Platform-FlowyTeam-teal.svg)](https://flowyteam.com)\r\n[![ClawhHub](https://img.shields.io/badge/ClawhHub-flowyteam--mcp-purple.svg)](https://clawhub.ai/agungksidik/flowyteam-mcp)\r\n\r\n---\r\n\r\n## What is FlowyTeam?\r\n\r\n[FlowyTeam](https://flowyteam.com) is an all-in-one SaaS platform for team productivity and performance management — OKRs, KPIs, projects, HR, CRM, finance, and more. Trusted by 7,000+ organizations across 140+ countries.\r\n\r\n---\r\n\r\n## What does this MCP do?\r\n\r\nThis skill connects Claude Code (or any MCP client) to your FlowyTeam workspace via a remote HTTP MCP server. Once connected, you can manage your entire workspace through natural language — no need to open the app.\r\n\r\n**34 tools. Read and write access to your workspace. No extra software required.**\r\n\r\n---\r\n\r\n## Endpoints\r\n\r\n| Endpoint | Auth | Purpose |\r\n|---|---|---|\r\n| `POST /api/mcp/gateway` | None required | **Gateway** — public endpoint; exposes `auth_register`, `auth_verify_email` & `auth_login` plus all authenticated tools (token passed per-call in header) |\r\n| `POST /api/v2/mcp/rpc` | Bearer token | **RPC** — authenticated endpoint; all 31 workspace tools |\r\n\r\nUse the **Gateway** if you want a single URL for everything (bootstrap + use).\r\nUse the **RPC** endpoint if you already have a token.\r\n\r\n---\r\n\r\n## Install via ClawhHub\r\n\r\nThe easiest way to add FlowyTeam MCP is directly from [ClawhHub](https://clawhub.ai/agungksidik/flowyteam-mcp):\r\n\r\n```bash\r\n# Install from ClawhHub registry\r\nclawhub install agungksidik/flowyteam-mcp\r\n```\r\n\r\nOr add manually using the steps below.\r\n\r\n---\r\n\r\n## Quick Start\r\n\r\n### Option A — You already have an account & token\r\n\r\n#### 1. Get your API Token\r\n\r\nLog in to FlowyTeam → **Settings → MCP & AI Integration** → Copy your token.\r\n\r\n#### 2. Connect with Claude Code (CLI)\r\n\r\n```bash\r\nclaude mcp add flowyteam \\\r\n  --transport http \\\r\n  --url https://flowyteam.com/api/v2/mcp/rpc \\\r\n  --header \"Authorization: Bearer YOUR_API_TOKEN\"\r\n```\r\n\r\n#### 3. Or use Claude Desktop / Cursor\r\n\r\nAdd this to your `mcp.json`:\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"flowyteam\": {\r\n      \"transport\": \"http\",\r\n      \"url\": \"https://flowyteam.com/api/v2/mcp/rpc\",\r\n      \"headers\": {\r\n        \"Authorization\": \"Bearer YOUR_API_TOKEN\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n---\r\n\r\n### Option B — Existing account, no token configured\r\n\r\n**Recommended:** Log in to FlowyTeam via the web → **Settings → MCP & AI Integration** → generate and copy your API token, then use Option A above.\r\n\r\nIf you prefer to retrieve a token via the MCP Gateway instead:\r\n\r\n#### 1. Connect to the Gateway without a token\r\n\r\n```bash\r\nclaude mcp add flowyteam \\\r\n  --transport http \\\r\n  --url https://flowyteam.com/api/mcp/gateway\r\n```\r\n\r\n#### 2. Ask Claude to call `auth_login`\r\n\r\n> ⚠️ **Security note:** Your password will be sent to the FlowyTeam API to obtain a token. Use this flow only on a private, trusted device. Avoid pasting credentials in shared chat sessions or CI environments.\r\n\r\n```\r\n\"Call auth_login with my FlowyTeam email and password to get an API token\"\r\n```\r\n\r\nClaude calls `auth_login` → returns `api_token`. Save it, then reconnect using Option A with that token and remove the gateway connection.\r\n\r\n---\r\n\r\n### Option C — New account via Gateway\r\n\r\nIf MCP registration is enabled on the platform, you can create an account directly from the CLI.\r\n\r\n#### 1. Connect to the Gateway and register\r\n\r\n> ⚠️ **Security note:** Your password will be sent to the FlowyTeam API during registration. Use a strong, unique password. Avoid running this in shared chat sessions or CI environments.\r\n\r\n```\r\n\"Register a new FlowyTeam account — company Acme Corp, name Alice Smith, email alice@acme.com — I'll provide my password when prompted\"\r\n```\r\n\r\nClaude calls `auth_register` → a verification email is sent to your address.\r\n\r\n#### 2. Verify your email (choose one path)\r\n\r\n**Path A — paste code to CLI (fastest):**\r\nOpen the verification email, copy the code from the link URL\r\n(e.g. for `.../email-verification/ABC123XYZ` the code is `ABC123XYZ`), then tell Claude:\r\n\r\n```\r\n\"Verify my email with code ABC123XYZ\"\r\n```\r\n\r\nClaude calls `auth_verify_email` → returns `api_token` immediately.\r\n\r\n**Path B — click link in browser:**\r\nClick the verification link in the email to activate via the web, then tell Claude:\r\n\r\n```\r\n\"Call auth_login with my FlowyTeam email and password to get an API token\"\r\n```\r\n\r\nClaude calls `auth_login` → returns `api_token`.\r\n\r\n#### 3. Reconnect with the token\r\n\r\n```bash\r\nclaude mcp add flowyteam \\\r\n  --transport http \\\r\n  --url https://flowyteam.com/api/v2/mcp/rpc \\\r\n  --header \"Authorization: Bearer YOUR_API_TOKEN\"\r\n```\r\n\r\n#### 4. Reconnect with token for full workspace access\r\n\r\n```\r\n\"Create a task 'Review Q2 Report' in Marketing project, assign to Sarah, due April 30\"\r\n\"Show me all open high-priority tickets\"\r\n\"Who is on leave this week?\"\r\n\"What are our company OKRs for Q2 2026?\"\r\n\"Log 8 hours on the Mobile App project for today\"\r\n\"Create an invoice for Acme Corp, total $5,000, due May 31\"\r\n```\r\n\r\n---\r\n\r\n## Tools (34)\r\n\r\n### Authentication Tools (public — no token required)\r\n\r\n| # | Tool | Description | Methods |\r\n|---|---|---|---|\r\n| 1 | `auth_register` | Register a new company + admin user account. Sends a verification email — account is inactive until verified. Only available when the platform admin has enabled MCP registration. | POST |\r\n| 2 | `auth_verify_email` | Activate a pending account using the code from the verification email link URL. Returns `api_token` on success. | POST |\r\n| 3 | `auth_login` | Login with email + password (for existing or newly web-verified accounts). Returns `api_token` for use as Bearer token. | POST |\r\n\r\n### Workspace Tools (require Bearer token)\r\n\r\n| # | Tool | Description | Methods |\r\n|---|---|---|---|\r\n| 4 | `tasks` | Manage tasks and assignments | GET POST PUT DELETE |\r\n| 5 | `projects` | Manage projects and workflow | GET POST PUT DELETE |\r\n| 6 | `employees` | Manage employees and team members | GET POST PUT DELETE |\r\n| 7 | `objectives` | Manage OKR objectives | GET POST PUT DELETE |\r\n| 8 | `key-result` | Manage OKR key results | GET POST PUT DELETE |\r\n| 9 | `indicators` | Manage KPIs and performance indicators | GET POST PUT DELETE |\r\n| 10 | `indicator-record` | Log KPI actual values per period | GET POST DELETE |\r\n| 11 | `leads` | Manage sales leads and prospects | GET POST PUT DELETE |\r\n| 12 | `clients` | Manage clients and relationships | GET POST PUT DELETE |\r\n| 13 | `tickets` | Manage support tickets | GET POST PUT DELETE |\r\n| 14 | `attendance` | Clock in / clock out / attendance history | GET POST PUT |\r\n| 15 | `leave` | Manage leave requests and approvals | GET POST PUT DELETE |\r\n| 16 | `department` | Manage departments and teams | GET POST PUT DELETE |\r\n| 17 | `designation` | Manage job designations | GET POST PUT DELETE |\r\n| 18 | `performance-cycle` | Manage performance / OKR cycles | GET POST PUT DELETE |\r\n| 19 | `holiday` | Manage company public holidays | GET POST PUT DELETE |\r\n| 20 | `project-category` | Manage project categories | GET POST PUT DELETE |\r\n| 21 | `task-category` | Manage task categories | GET POST PUT DELETE |\r\n| 22 | `ticket-type` | Manage ticket types | GET POST PUT DELETE |\r\n| 23 | `ticket-channel` | Manage ticket channels | GET POST PUT DELETE |\r\n| 24 | `ticket-agent` | List ticket agents and groups | GET |\r\n| 25 | `indicator-category` | Manage KPI categories | GET POST PUT DELETE |\r\n| 26 | `leave-type` | Manage leave types (Annual, Sick, etc.) | GET POST PUT DELETE |\r\n| 27 | `invoices` | Manage client invoices | GET POST PUT DELETE |\r\n| 28 | `estimates` | Manage client estimates and quotes | GET POST PUT DELETE |\r\n| 29 | `contracts` | Manage client contracts | GET POST PUT DELETE |\r\n| 30 | `events` | Manage company calendar events | GET POST PUT DELETE |\r\n| 31 | `expenses` | Manage expenses and claims | GET POST PUT DELETE |\r\n| 32 | `expense-category` | Manage expense categories | GET POST PUT DELETE |\r\n| 33 | `notices` | Manage company notice board | GET POST PUT DELETE |\r\n| 34 | `timelogs` | Start/stop timers, log project hours | GET POST PUT DELETE |\r\n\r\n---\r\n\r\n## How It Works\r\n\r\nThis MCP uses **Streamable HTTP transport (JSON-RPC 2.0)**. Every workspace tool accepts a `method` parameter to select the operation:\r\n\r\n| `method` | Operation |\r\n|---|---|\r\n| `GET` | Read / list records |\r\n| `POST` | Create a new record |\r\n| `PUT` | Update an existing record |\r\n| `DELETE` | Delete a record |\r\n\r\nAuth tools (`auth_register`, `auth_verify_email`, `auth_login`) only support `POST` and do not require a `method` field.\r\n\r\n### Gateway vs RPC\r\n\r\n```\r\nGateway  POST /api/mcp/gateway           ← single URL for everything\r\n  ├── initialize / tools/list            ← no auth needed\r\n  ├── auth_register                      ← no auth needed (creates account, sends verification email)\r\n  ├── auth_verify_email                  ← no auth needed (activates account, returns api_token)\r\n  ├── auth_login                         ← no auth needed (returns api_token)\r\n  └── all workspace tools                ← reads Bearer token from header\r\n\r\nRPC      POST /api/v2/mcp/rpc            ← authenticated only\r\n  └── all workspace tools                ← requires Bearer token (middleware)\r\n```\r\n\r\n**MCP Protocol Version:** `2024-11-05`\r\n\r\n---\r\n\r\n## Smart Features\r\n\r\nSeveral tools support **name-based resolution** — you don't need to look up IDs manually:\r\n\r\n- `department` — lookup by `name` string (auto-finds the ID for PUT/DELETE)\r\n- `invoices` — lookup by `invoice_number` (e.g. `INV#0001`)\r\n- `estimates` — lookup by `estimate_number` (e.g. `EST#0003`)\r\n- `contracts` — lookup by `subject` (partial match)\r\n- `events` — lookup by `event_name` (partial match)\r\n- `expenses` — lookup by `item_name` (partial match)\r\n- `timelogs` — resolve `project_name` → ID, `task_name` → ID, `employee_name` → ID\r\n- `timelogs` PUT — without `id`, finds the currently running timer automatically\r\n\r\n---\r\n\r\n## Permissions\r\n\r\n| Role | Capabilities |\r\n|---|---|\r\n| **Admin** | Full read/write access to all tools |\r\n| **Employee** | Read + self-service (own tasks, attendance, leave, expenses, time logs) |\r\n\r\nSome modules (`invoices`, `estimates`, `contracts`, `events`, `expenses`, `notices`, `timelogs`) require the corresponding module to be enabled in your FlowyTeam plan.\r\n\r\n---\r\n\r\n## Security Best Practices\r\n\r\n- **Use the lowest-privilege token for your use case.** If you only need to read tasks and log time, use an Employee token — not an Admin token.\r\n- **Never share your API token** in public repositories, shared documents, or chat logs. Treat it like a password.\r\n- **Prefer the API token flow (Option A)** over passing credentials through the agent (Options B/C). Tokens can be rotated; passwords cannot.\r\n- **Rotate your token** via FlowyTeam Settings if you suspect it has been exposed.\r\n- **Avoid using admin tokens in automated or CI/CD workflows** — create a dedicated service account with limited permissions instead.\r\n- **Review and confirm destructive operations** (DELETE) before authorizing the agent to proceed.\r\n\r\n---\r\n\r\n## Security (Gateway)\r\n\r\nThe Gateway endpoint applies the following protections:\r\n\r\n| Layer | Details |\r\n|---|---|\r\n| **Rate limiting** | 60 requests/minute per IP (throttle:60,1) |\r\n| **Suspicious input check** | Blocks bot-like names and company names |\r\n| **Duplicate email check** | Prevents duplicate account creation |\r\n| **Email verification** | New accounts start as inactive — must be verified via `auth_verify_email` or web link before use |\r\n| **SuperAdmin notification** | Every new MCP registration triggers an email to all SuperAdmins |\r\n| **Platform toggle** | `allow_mcp_registration` must be enabled by SuperAdmin (default: off) |\r\n\r\n---\r\n\r\n## Full Documentation\r\n\r\n- **ClawhHub listing:** [clawhub.ai/agungksidik/flowyteam-mcp](https://clawhub.ai/agungksidik/flowyteam-mcp)\r\n- **MCP Server page:** [flowyteam.com/get/mcp-server](https://flowyteam.com/get/mcp-server)\r\n- **API Reference:** [flowyteam.com/get/mcp-docs](https://flowyteam.com/get/mcp-docs)\r\n- **Tool parameters:** See [SKILL.md](SKILL.md)\r\n\r\n---\r\n\r\n## Sign Up\r\n\r\nDon't have a FlowyTeam account yet? [Sign up free](https://flowyteam.com/register) or use the MCP Gateway with `auth_register` + `auth_verify_email` if MCP registration is enabled by the platform admin.\r\n\r\n---\r\n\r\n## License\r\n\r\nMIT — free to use, modify, and distribute.\n\nFile v1.1.8:_meta.json\n\n{\n  \"ownerId\": \"kn76v4197dam2qja4at8xvm4s185vn8x\",\n  \"slug\": \"flowyteam-mcp\",\n  \"version\": \"1.1.8\",\n  \"publishedAt\": 1777941594978\n}\n\nFile v1.1.8:skill-card.md\n\n## Description:\n\nManage FlowyTeam projects, tasks, OKRs, KPIs, HR, CRM, finance, support tickets, attendance, and related workspace records through MCP.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[flowy-team](https://clawhub.ai/user/flowy-team)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and workspace operators use this skill to connect an MCP-compatible agent to FlowyTeam so the agent can read and manage projects, tasks, OKRs, KPIs, HR records, CRM records, finance records, support tickets, attendance, and other workspace data.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can operate on broad FlowyTeam workspace data according to the permissions attached to the user's token.\n\nMitigation: Use the lowest-privilege token possible and avoid admin tokens unless an admin-only action is explicitly required.\n\nRisk: Create, update, or delete actions can change tasks, HR data, CRM records, finance records, support tickets, and other business records.\n\nMitigation: Require explicit user confirmation in the current turn before any POST, PUT, or DELETE action.\n\nRisk: A leaked API token could expose the connected FlowyTeam workspace.\n\nMitigation: Keep tokens out of shared chats and repositories, and prefer the API-token flow over password-based login.\n\n## Reference(s):\n\n- [ClawHub Skill Page](https://clawhub.ai/flowy-team/skills/flowyteam-mcp)\n- [FlowyTeam Website](https://flowyteam.com)\n- [FlowyTeam MCP Docs](https://flowyteam.com/get/mcp-server)\n- [FlowyTeam API Reference](https://flowyteam.com/get/mcp-docs)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance, API calls]\n\n**Output Format:** [Markdown guidance with JSON configuration snippets, shell commands, and MCP API calls]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires a FlowyTeam API token for authenticated workspace tools.]\n\n## Skill Version(s):\n\n1.1.8 (source: server release metadata and skill frontmatter)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.1.7: 3 files, 15759 bytes\n\nFiles: _meta.json (132b), README.md (13011b), SKILL.md (46107b)\n\nFile v1.1.7:SKILL.md\n\n---\r\nname: flowyteam\r\nversion: \"1.1.5\"\r\ndescription: Manage FlowyTeam projects, tasks, OKRs, KPIs, HR, CRM, finance, support tickets, attendance, and more via MCP — 34 tools for complete workspace management.\r\nlicense: MIT\r\nauthor: flowyteam\r\nhomepage: https://flowyteam.com\r\nsource: https://github.com/flowy-team/clawhub/tree/master/skills/flowyteam-mcp\r\nmetadata:\r\n  clawhub:\r\n    requires:\r\n      env:\r\n        - name: FLOWYTEAM_API_TOKEN\r\n          description: \"API token from FlowyTeam Settings → MCP & AI Integration.\"\r\n          required: true\r\n---\r\n\r\n# FlowyTeam MCP\r\n\r\nConnect Claude Code (or any MCP-compatible AI agent) to your FlowyTeam workspace.\r\nManage projects, tasks, OKRs, KPIs, employees, leads, clients, tickets, attendance,\r\nleave, invoices, estimates, contracts, expenses, events, notices, time logs, and more\r\n— all via natural language.\r\n\r\n**Platform:** [flowyteam.com](https://flowyteam.com) — All-in-one SaaS for team\r\nproductivity and performance management. 7,000+ organizations, 140+ countries.\r\n\r\n---\r\n\r\n## Endpoints\r\n\r\n| Endpoint | Auth | Purpose |\r\n|---|---|---|\r\n| `POST /api/mcp/gateway` | None (per-call) | **Gateway** — `auth_register` & `auth_verify_email` run without token for new account setup; all other tools read Bearer from header |\r\n| `POST /api/v2/mcp/rpc` | Bearer token | **RPC** — authenticated-only endpoint for all 31 workspace tools |\r\n\r\n---\r\n\r\n## Setup\r\n\r\n### Recommended — Connect with API token\r\n\r\n```bash\r\nclaude mcp add flowyteam \\\r\n  --transport http \\\r\n  --url https://flowyteam.com/api/v2/mcp/rpc \\\r\n  --header \"Authorization: Bearer $FLOWYTEAM_API_TOKEN\"\r\n```\r\n\r\nGet your token: FlowyTeam → **Settings → MCP & AI Integration** → copy token.\r\n\r\n### Claude Desktop / Cursor (`mcp.json`)\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"flowyteam\": {\r\n      \"transport\": \"http\",\r\n      \"url\": \"https://flowyteam.com/api/v2/mcp/rpc\",\r\n      \"headers\": {\r\n        \"Authorization\": \"Bearer YOUR_API_TOKEN\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n---\r\n\r\n## Protocol\r\n\r\n- **Gateway:** `POST https://flowyteam.com/api/mcp/gateway`\r\n- **RPC:** `POST https://flowyteam.com/api/v2/mcp/rpc`\r\n- **Transport:** Streamable HTTP (JSON-RPC 2.0)\r\n- **Auth:** `Authorization: Bearer <api_token>` (not required for `auth_register` / `auth_verify_email`)\r\n- **Protocol Version:** `2024-11-05`\r\n\r\nAll workspace tools share a `method` parameter to select the HTTP verb:\r\n\r\n| `method` | Operation |\r\n|---|---|\r\n| `GET` | Read / list records |\r\n| `POST` | Create a new record |\r\n| `PUT` | Update an existing record |\r\n| `DELETE` | Delete a record |\r\n\r\nAccount setup tools (`auth_register`, `auth_verify_email`) only use `POST` and do not need a `method` field.\r\n\r\n---\r\n\r\n## Safety Guidelines\r\n\r\n> **Important:** This skill has broad read and write access to your FlowyTeam workspace.\r\n\r\n- **Use a limited-permission token.** Avoid connecting an admin account unless you specifically need admin operations.\r\n- **Confirm before mutating.** Always ask the user to confirm before executing any `POST` (create), `PUT` (update), or `DELETE` operation — especially on sensitive data: employees, HR records, contracts, invoices, expenses, notices, and client data.\r\n- **Never act autonomously.** Do not perform any create, update, or delete action unless the user has explicitly requested it in the current turn.\r\n- **Prefer read-first.** When intent is ambiguous, default to `GET` to show the user what exists before offering to change it.\r\n\r\n---\r\n\r\n## Tools (34)\r\n\r\n> All tools require a valid `FLOWYTEAM_API_TOKEN` Bearer token. See [Setup](#setup) above.\r\n\r\n---\r\n\r\n### 1. `tasks` *(requires Bearer token)*\r\n\r\n**Manage tasks and assignments**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Task ID — required for PUT / DELETE |\r\n| `project_id` | integer \\| string | Filter by project (GET) or assign to project (POST) |\r\n| `heading` | string | Task title — required for POST |\r\n| `description` | string | Task description |\r\n| `status` | string | Task status (e.g. `incomplete`, `complete`) |\r\n| `priority` | string | `low` / `medium` / `high` / `urgent` |\r\n| `assigned_to` | integer \\| string | Employee user ID to assign |\r\n| `user_id` | integer \\| string | Alternative employee ID field |\r\n| `due_date` | string | Due date `YYYY-MM-DD` |\r\n| `task_category_id` | integer \\| string | Task category ID |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list incomplete tasks in project 12\r\n{ \"method\": \"GET\", \"project_id\": 12, \"status\": \"incomplete\" }\r\n\r\n// POST — create task\r\n{ \"method\": \"POST\", \"heading\": \"Write API docs\", \"project_id\": 12,\r\n  \"due_date\": \"2026-05-10\", \"priority\": \"medium\", \"assigned_to\": 7 }\r\n\r\n// PUT — mark complete\r\n{ \"method\": \"PUT\", \"id\": 101, \"status\": \"complete\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 101 }\r\n```\r\n\r\n---\r\n\r\n### 2. `projects`\r\n\r\n**Manage projects and project workflow**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Project ID — required for PUT / DELETE |\r\n| `project_name` | string | Project name — required for POST |\r\n| `status` | string | `not started` / `in progress` / `on hold` / `finished` |\r\n| `start_date` | string | Start date `YYYY-MM-DD` |\r\n| `deadline` | string | Deadline `YYYY-MM-DD` |\r\n| `client_id` | integer \\| string | Client ID |\r\n| `category_id` | integer \\| string | Project category ID |\r\n| `project_summary` | string | Short description |\r\n| `notes` | string | Additional notes |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list in-progress projects\r\n{ \"method\": \"GET\", \"status\": \"in progress\" }\r\n\r\n// POST — create project\r\n{ \"method\": \"POST\", \"project_name\": \"Mobile App v2\",\r\n  \"start_date\": \"2026-06-01\", \"deadline\": \"2026-09-30\", \"client_id\": 3 }\r\n\r\n// PUT — update status\r\n{ \"method\": \"PUT\", \"id\": 12, \"status\": \"on hold\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 12 }\r\n```\r\n\r\n---\r\n\r\n### 3. `employees`\r\n\r\n**Manage employees and team members**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Employee ID — required for PUT / DELETE |\r\n| `name` | string | Full name — required for POST |\r\n| `email` | string | Email — required for POST |\r\n| `password` | string | Optional — new employee sets their own on first login |\r\n| `department_id` | integer \\| string | Department ID |\r\n| `designation_id` | integer \\| string | Job designation ID |\r\n| `employee_id` | string | Custom employee ID/code |\r\n| `joining_date` | string | Joining date `YYYY-MM-DD` |\r\n| `status` | string | `active` / `inactive` |\r\n| `search` | string | Search by name or email |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list active employees in department 4\r\n{ \"method\": \"GET\", \"department_id\": 4, \"status\": \"active\" }\r\n\r\n// POST — create employee (password is set by the new employee on first login)\r\n{ \"method\": \"POST\", \"name\": \"John Doe\", \"email\": \"john@company.com\",\r\n  \"department_id\": 4, \"designation_id\": 2,\r\n  \"joining_date\": \"2026-06-01\" }\r\n\r\n// PUT — deactivate\r\n{ \"method\": \"PUT\", \"id\": 7, \"status\": \"inactive\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 7 }\r\n```\r\n\r\n---\r\n\r\n### 4. `objectives`\r\n\r\n**Manage OKR objectives**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Objective ID — required for PUT / DELETE |\r\n| `heading` | string | Objective title — required for POST |\r\n| `description` | string | Objective description |\r\n| `level` | string | `company` / `department` / `individual` |\r\n| `type` | string | `qualitative` / `quantitative` |\r\n| `status` | string | `on track` / `at risk` / `behind` / `achieved` |\r\n| `cycle_id` | integer \\| string | Performance cycle ID |\r\n| `department_id` | integer \\| string | Filter by department |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — company-level objectives in cycle 3\r\n{ \"method\": \"GET\", \"cycle_id\": 3, \"level\": \"company\" }\r\n\r\n// POST — create objective\r\n{ \"method\": \"POST\", \"heading\": \"Improve NPS Score\",\r\n  \"level\": \"company\", \"cycle_id\": 3, \"type\": \"qualitative\" }\r\n\r\n// PUT — update status\r\n{ \"method\": \"PUT\", \"id\": 20, \"status\": \"at risk\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 20 }\r\n```\r\n\r\n---\r\n\r\n### 5. `key-result`\r\n\r\n**Manage OKR key results linked to objectives**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Key result ID — required for PUT / DELETE |\r\n| `objective_id` | integer \\| string | Filter by objective (GET) |\r\n| `krs_owner` | integer \\| string | Objective ID owning this KR — required for POST |\r\n| `krs_title` | string | Key result title |\r\n| `krs_description` | string | Description |\r\n| `krs_init` | number \\| string | Initial value |\r\n| `krs_tar` | number \\| string | Target value |\r\n| `krs_now` | number \\| string | Current value |\r\n| `krs_weight` | number \\| string | Weight (1–100) |\r\n| `krs_unit` | string | Unit (default `%`) |\r\n| `krs_leader` | integer \\| string | Employee details ID for KR owner |\r\n| `krs_conf` | string | Confidence level |\r\n| `krs_remarks` | string | Remarks |\r\n| `associate_kpis` | array | Array of indicator IDs to link |\r\n| `per_page` | integer | Page size |\r\n| `page` | integer | Page number |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — key results for objective 20\r\n{ \"method\": \"GET\", \"objective_id\": 20 }\r\n\r\n// POST — create key result\r\n{ \"method\": \"POST\", \"krs_owner\": 20, \"krs_title\": \"Reduce churn to < 5%\",\r\n  \"krs_init\": 8, \"krs_tar\": 5, \"krs_now\": 8, \"krs_weight\": 100, \"krs_unit\": \"%\" }\r\n\r\n// PUT — update current value\r\n{ \"method\": \"PUT\", \"id\": 30, \"krs_now\": 4.2 }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 30 }\r\n```\r\n\r\n---\r\n\r\n### 6. `indicators`\r\n\r\n**Manage KPIs and performance indicators**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | KPI ID — required for PUT / DELETE |\r\n| `name` | string | KPI name — required for POST |\r\n| `target` | number \\| string | Target value |\r\n| `unit` | string | Unit (e.g. `%`, `USD`, `count`) |\r\n| `frequency` | string | `daily` / `weekly` / `monthly` / `quarterly` / `yearly` |\r\n| `category_id` | integer \\| string | Indicator category ID |\r\n| `employee_id` | integer \\| string | Assign to employee |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — monthly KPIs for employee 7\r\n{ \"method\": \"GET\", \"employee_id\": 7, \"frequency\": \"monthly\" }\r\n\r\n// POST — create KPI\r\n{ \"method\": \"POST\", \"name\": \"Customer Satisfaction Score\",\r\n  \"target\": 90, \"unit\": \"%\", \"frequency\": \"monthly\",\r\n  \"employee_id\": 7, \"category_id\": 2 }\r\n\r\n// PUT — update target\r\n{ \"method\": \"PUT\", \"id\": 40, \"target\": 95 }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 40 }\r\n```\r\n\r\n---\r\n\r\n### 7. `indicator-record`\r\n\r\n**Manage KPI actual values per period**\r\n\r\nMethods: `GET` `POST` `DELETE`\r\n\r\n> **POST** maps to `indicator-record/update-record` (upsert by period).\r\n> **GET with `id`** returns a single record; **GET without `id`** returns a list.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `DELETE` |\r\n| `id` | integer \\| string | Record ID — GET single / DELETE |\r\n| `indicator_id` | integer \\| string | KPI indicator ID — required for GET list and POST |\r\n| `period_key` | string | Period date `dd-m-YYYY` e.g. `01-6-2026` — required for POST |\r\n| `current_value` | number \\| string | Actual value for the period |\r\n| `target_value` | number \\| string | Target value for the period |\r\n| `remark` | string | Notes |\r\n| `score` | number \\| string | Computed score |\r\n| `month` | integer \\| string | Filter by month number (GET list) |\r\n| `year` | integer \\| string | Filter by year (GET list) |\r\n| `start_date` | string | Filter from date (GET list) |\r\n| `end_date` | string | Filter to date (GET list) |\r\n| `all` | boolean \\| string | Return all records without pagination |\r\n| `per_page` | integer | Page size |\r\n| `page` | integer | Page number |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — records for KPI 40 in May 2026\r\n{ \"method\": \"GET\", \"indicator_id\": 40, \"month\": 5, \"year\": 2026 }\r\n\r\n// POST — submit/update actual value for a period\r\n{ \"method\": \"POST\", \"indicator_id\": 40, \"period_key\": \"01-6-2026\",\r\n  \"current_value\": 112000, \"target_value\": 100000, \"remark\": \"Exceeded target\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 200 }\r\n```\r\n\r\n---\r\n\r\n### 8. `leads`\r\n\r\n**Manage sales leads and prospects**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Lead ID — required for PUT / DELETE |\r\n| `client_name` | string | Lead contact name — required for POST |\r\n| `company_name` | string | Company name |\r\n| `email` | string | Contact email |\r\n| `mobile` | string | Contact mobile |\r\n| `website` | string | Company website |\r\n| `address` | string | Address |\r\n| `note` | string | Notes |\r\n| `agent_id` | integer \\| string | Assign to sales agent |\r\n| `source_id` | integer \\| string | Lead source ID (POST) |\r\n| `status_id` | integer \\| string | Lead status ID (POST) |\r\n| `status` | integer \\| string | Lead status ID (PUT) |\r\n| `source` | integer \\| string | Lead source ID (PUT) |\r\n| `meeting_date` | string | Scheduled meeting date |\r\n| `next_follow_up` | string | `yes` or `no` |\r\n| `client` | string | `lead` or `client` filter (GET) |\r\n| `followUp` | string | Filter follow-up required (GET) |\r\n| `startDate` | string | Filter from date (GET) |\r\n| `endDate` | string | Filter to date (GET) |\r\n| `sort_field` | string | Sort column |\r\n| `sort_direction` | string | `asc` / `desc` |\r\n| `per_page` | integer | Page size |\r\n| `page` | integer | Page number |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list leads with pagination\r\n{ \"method\": \"GET\", \"client\": \"lead\", \"per_page\": 20, \"page\": 1 }\r\n\r\n// POST — create lead\r\n{ \"method\": \"POST\", \"client_name\": \"PT Maju Jaya\",\r\n  \"email\": \"info@majujaya.com\", \"mobile\": \"+6281234567890\",\r\n  \"status_id\": 1, \"agent_id\": 7 }\r\n\r\n// PUT — update status and add note\r\n{ \"method\": \"PUT\", \"id\": 55, \"status\": 3, \"note\": \"Proposal sent\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 55 }\r\n```\r\n\r\n---\r\n\r\n### 9. `clients`\r\n\r\n**Manage clients and customer relationships**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Client ID — required for PUT / DELETE |\r\n| `name` | string | Contact name — required for POST |\r\n| `email` | string | Email — required for POST |\r\n| `company_name` | string | Company name |\r\n| `website` | string | Company website |\r\n| `address` | string | Address |\r\n| `mobile` | string | Phone number |\r\n| `send_email` | string | `yes` / `no` — send welcome email |\r\n| `skype` | string \\| null | Skype handle |\r\n| `linkedin` | string \\| null | LinkedIn URL |\r\n| `twitter` | string \\| null | Twitter handle |\r\n| `facebook` | string \\| null | Facebook URL |\r\n| `gst_number` | string \\| null | Tax/GST number |\r\n| `note` | string \\| null | Notes |\r\n| `search` | string | Search by name or company |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — search clients\r\n{ \"method\": \"GET\", \"search\": \"acme\" }\r\n\r\n// POST — create client\r\n{ \"method\": \"POST\", \"name\": \"Alice Johnson\",\r\n  \"email\": \"alice@newclient.com\", \"company_name\": \"New Client Ltd\",\r\n  \"mobile\": \"+0987654321\", \"send_email\": \"yes\" }\r\n\r\n// PUT — update website\r\n{ \"method\": \"PUT\", \"id\": 3, \"website\": \"https://acme-new.com\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 3 }\r\n```\r\n\r\n---\r\n\r\n### 10. `tickets`\r\n\r\n**Manage support tickets and issues**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Ticket ID — required for PUT / DELETE |\r\n| `subject` | string | Ticket subject — required for POST |\r\n| `description` | string | Ticket description |\r\n| `status` | string | `open` / `pending` / `resolved` / `closed` |\r\n| `priority` | string | `low` / `medium` / `high` / `urgent` |\r\n| `type_id` | integer \\| string | Ticket type ID |\r\n| `channel_id` | integer \\| string | Ticket channel ID |\r\n| `agent_id` | integer \\| string | Assign to agent |\r\n| `user_id` | integer \\| string | Reporter user ID |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — high-priority open tickets\r\n{ \"method\": \"GET\", \"status\": \"open\", \"priority\": \"high\" }\r\n\r\n// POST — create ticket\r\n{ \"method\": \"POST\", \"subject\": \"Cannot export report\",\r\n  \"description\": \"Export button not responding\",\r\n  \"priority\": \"medium\", \"type_id\": 1, \"channel_id\": 2, \"user_id\": 7 }\r\n\r\n// PUT — resolve and reassign\r\n{ \"method\": \"PUT\", \"id\": 500, \"status\": \"resolved\", \"agent_id\": 8 }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 500 }\r\n```\r\n\r\n---\r\n\r\n### 11. `attendance`\r\n\r\n**Manage attendance records and time tracking**\r\n\r\nMethods: `GET` `POST` `PUT`\r\n\r\n> **POST** → clock in (`attendance/clock-in`)\r\n> **PUT** → clock out (`attendance/clock-out`)\r\n> **GET with `today: true`** → today's attendance summary\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` |\r\n| `id` | integer \\| string | Attendance record ID — required for PUT (clock-out) |\r\n| `employee_id` | integer \\| string | Employee ID |\r\n| `date` | string | Specific date `YYYY-MM-DD` |\r\n| `month` | string | Filter by month |\r\n| `year` | string | Filter by year |\r\n| `clock_in_time` | string | Clock-in time `HH:MM:SS` |\r\n| `clock_out_time` | string | Clock-out time `HH:MM:SS` |\r\n| `working_from` | string | `office` / `home` / `other` |\r\n| `late_reason` | string | Reason if arriving late |\r\n| `today` | boolean \\| string | Set `true` to get today's records (GET) |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — today's attendance\r\n{ \"method\": \"GET\", \"today\": true }\r\n\r\n// GET — by month/year\r\n{ \"method\": \"GET\", \"employee_id\": 7, \"month\": \"5\", \"year\": \"2026\" }\r\n\r\n// POST — clock in\r\n{ \"method\": \"POST\", \"employee_id\": 7, \"working_from\": \"office\" }\r\n\r\n// PUT — clock out\r\n{ \"method\": \"PUT\", \"id\": 300 }\r\n```\r\n\r\n---\r\n\r\n### 12. `leave`\r\n\r\n**Manage employee leave requests**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Leave ID — required for PUT / DELETE |\r\n| `user_id` | integer \\| string | Employee user ID — required for POST |\r\n| `leave_type_id` | integer \\| string | Leave type ID — required for POST / PUT |\r\n| `leave_date` | string | Leave start date `YYYY-MM-DD` — required for POST |\r\n| `duration` | string | `full day` / `half day` / `multiple` |\r\n| `reason` | string | Leave reason |\r\n| `status` | string | `pending` / `approved` / `rejected` (PUT for approval) |\r\n| `multi_date` | string | Comma-separated dates for `multiple` duration |\r\n| `userId` | integer \\| string | Filter by employee (GET) |\r\n| `startDate` | string | Filter from date (GET) |\r\n| `endDate` | string | Filter to date (GET) |\r\n| `search` | string | Search keyword |\r\n| `all` | boolean \\| string | Return all records without pagination |\r\n| `per_page` | integer | Page size |\r\n| `page` | integer | Page number |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — pending leaves for employee 7\r\n{ \"method\": \"GET\", \"userId\": 7, \"status\": \"pending\" }\r\n\r\n// POST — apply for leave\r\n{ \"method\": \"POST\", \"user_id\": 7, \"leave_type_id\": 1,\r\n  \"leave_date\": \"2026-05-15\", \"duration\": \"full day\", \"reason\": \"Family event\" }\r\n\r\n// PUT — approve leave\r\n{ \"method\": \"PUT\", \"id\": 88, \"status\": \"approved\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 88 }\r\n```\r\n\r\n---\r\n\r\n### 13. `department`\r\n\r\n**Manage departments and teams**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n> Supports lookup by `name` (string) in addition to `id` for PUT / DELETE.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Department ID |\r\n| `name` | string | Current department name — for lookup (PUT / DELETE) |\r\n| `team_name` | string | Department name — required for POST / PUT |\r\n| `description` | string | Department description |\r\n| `parent_id` | integer \\| string | Parent department ID |\r\n| `leader_id` | integer \\| string | Department leader employee ID |\r\n| `search` | string | Search by name |\r\n| `sort_field` | string | Sort column |\r\n| `sort_direction` | string | `asc` / `desc` |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — search departments\r\n{ \"method\": \"GET\", \"search\": \"marketing\" }\r\n\r\n// POST — create department\r\n{ \"method\": \"POST\", \"team_name\": \"Product Design\",\r\n  \"description\": \"UI/UX and product design team\" }\r\n\r\n// PUT — rename by ID\r\n{ \"method\": \"PUT\", \"id\": 4, \"team_name\": \"Digital Marketing & SEO\" }\r\n\r\n// PUT — rename by name (auto-resolves ID)\r\n{ \"method\": \"PUT\", \"name\": \"Digital Marketing\", \"team_name\": \"Digital Marketing & SEO\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 4 }\r\n```\r\n\r\n---\r\n\r\n### 14. `designation`\r\n\r\n**Manage job designations and roles**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Designation ID — required for PUT / DELETE |\r\n| `name` | string | Designation name — required for POST / PUT |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — search designations\r\n{ \"method\": \"GET\", \"search\": \"engineer\" }\r\n\r\n// POST — create designation\r\n{ \"method\": \"POST\", \"name\": \"DevOps Engineer\" }\r\n\r\n// PUT — rename\r\n{ \"method\": \"PUT\", \"id\": 2, \"name\": \"Principal Software Engineer\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 2 }\r\n```\r\n\r\n---\r\n\r\n### 15. `performance-cycle`\r\n\r\n**Manage performance / OKR cycles**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Cycle ID — required for PUT / DELETE |\r\n| `name` | string | Cycle name — required for POST / PUT |\r\n| `cycle_type` | string | Cycle type — required for POST / PUT (e.g. `quarterly`, `annual`) |\r\n| `started_at` | string | Start date `YYYY-MM-DD` — required for POST / PUT |\r\n| `finished_at` | string | End date `YYYY-MM-DD` — required for POST / PUT |\r\n| `sort_field` | string | Sort column |\r\n| `sort_direction` | string | `asc` / `desc` |\r\n| `per_page` | integer | Page size |\r\n| `page` | integer | Page number |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list cycles\r\n{ \"method\": \"GET\", \"per_page\": 10, \"page\": 1 }\r\n\r\n// POST — create quarterly cycle\r\n{ \"method\": \"POST\", \"name\": \"Q3 2026\", \"cycle_type\": \"quarterly\",\r\n  \"started_at\": \"2026-07-01\", \"finished_at\": \"2026-09-30\" }\r\n\r\n// PUT — rename cycle\r\n{ \"method\": \"PUT\", \"id\": 3, \"name\": \"Q2 2026 Revised\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 3 }\r\n```\r\n\r\n---\r\n\r\n### 16. `holiday`\r\n\r\n**Manage company holidays**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Holiday ID — required for PUT / DELETE |\r\n| `occasion` | string | Holiday name — required for POST / PUT |\r\n| `date` | string | Date in `dd/mm/yyyy` format — required for POST / PUT |\r\n| `year` | integer \\| string | Filter by year (GET) |\r\n| `status` | string | `upcoming` / `past` / `all` (GET) |\r\n| `search` | string | Search by keyword |\r\n| `all` | boolean \\| string | Return all records without pagination |\r\n| `sort_field` | string | Sort column |\r\n| `sort_direction` | string | `asc` / `desc` |\r\n| `per_page` | integer | Page size |\r\n| `page` | integer | Page number |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — upcoming holidays in 2026\r\n{ \"method\": \"GET\", \"year\": 2026, \"status\": \"upcoming\" }\r\n\r\n// POST — add holiday\r\n{ \"method\": \"POST\", \"occasion\": \"New Year's Day\", \"date\": \"01/01/2027\" }\r\n\r\n// PUT — rename holiday\r\n{ \"method\": \"PUT\", \"id\": 10, \"occasion\": \"National Independence Day\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 10 }\r\n```\r\n\r\n---\r\n\r\n### 17. `project-category`\r\n\r\n**Manage project categories and classifications**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Category ID — required for PUT / DELETE |\r\n| `category_name` | string | Category name — required for POST / PUT |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — search categories\r\n{ \"method\": \"GET\", \"search\": \"web\" }\r\n\r\n// POST\r\n{ \"method\": \"POST\", \"category_name\": \"Mobile Development\" }\r\n\r\n// PUT\r\n{ \"method\": \"PUT\", \"id\": 1, \"category_name\": \"Web & PWA Development\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 1 }\r\n```\r\n\r\n---\r\n\r\n### 18. `task-category`\r\n\r\n**Manage task categories and types**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Category ID — required for PUT / DELETE |\r\n| `category_name` | string | Category name — required for POST / PUT |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET\r\n{ \"method\": \"GET\", \"search\": \"bug\" }\r\n\r\n// POST\r\n{ \"method\": \"POST\", \"category_name\": \"Feature Request\" }\r\n\r\n// PUT\r\n{ \"method\": \"PUT\", \"id\": 1, \"category_name\": \"Critical Bug Fix\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 1 }\r\n```\r\n\r\n---\r\n\r\n### 19. `ticket-type`\r\n\r\n**Manage ticket types and classifications**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Ticket type ID — required for PUT / DELETE |\r\n| `type` | string | Ticket type name — required for POST / PUT |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET\r\n{ \"method\": \"GET\", \"search\": \"bug\" }\r\n\r\n// POST\r\n{ \"method\": \"POST\", \"type\": \"Feature Request\" }\r\n\r\n// PUT\r\n{ \"method\": \"PUT\", \"id\": 1, \"type\": \"Critical Bug\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 1 }\r\n```\r\n\r\n---\r\n\r\n### 20. `ticket-channel`\r\n\r\n**Manage ticket channels and submission methods**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Channel ID — required for PUT / DELETE |\r\n| `channel_name` | string | Channel name — required for POST / PUT |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list all channels\r\n{ \"method\": \"GET\" }\r\n\r\n// POST\r\n{ \"method\": \"POST\", \"channel_name\": \"WhatsApp\" }\r\n\r\n// PUT\r\n{ \"method\": \"PUT\", \"id\": 1, \"channel_name\": \"Email Support\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 1 }\r\n```\r\n\r\n---\r\n\r\n### 21. `ticket-agent`\r\n\r\n**List ticket agents and their groups**\r\n\r\nMethods: `GET`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` |\r\n\r\n**Example:**\r\n\r\n```json\r\n// GET — list all ticket agents\r\n{ \"method\": \"GET\" }\r\n```\r\n\r\n**Response:**\r\n\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"data\": [\r\n    { \"id\": 7, \"name\": \"Sarah Lee\", \"email\": \"sarah@company.com\", \"group\": \"Technical Support\" }\r\n  ]\r\n}\r\n```\r\n\r\n---\r\n\r\n### 22. `indicator-category`\r\n\r\n**Manage KPI / indicator categories**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Category ID — required for PUT / DELETE |\r\n| `indicator_type_name` | string | Category name — required for POST / PUT |\r\n| `status` | string | Filter by status; omit or `all` for no filter (GET) |\r\n| `search` | string | Search by keyword |\r\n| `all` | boolean \\| string | Return all records without pagination |\r\n| `sort_field` | string | Sort column |\r\n| `sort_direction` | string | `asc` / `desc` |\r\n| `per_page` | integer | Page size |\r\n| `page` | integer | Page number |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list all categories\r\n{ \"method\": \"GET\", \"all\": true }\r\n\r\n// POST\r\n{ \"method\": \"POST\", \"indicator_type_name\": \"Engineering\" }\r\n\r\n// PUT\r\n{ \"method\": \"PUT\", \"id\": 1, \"indicator_type_name\": \"Revenue & Sales\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 1 }\r\n```\r\n\r\n---\r\n\r\n### 23. `leave-type`\r\n\r\n**Manage leave types (Annual, Sick, etc.)**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n> Write operations (POST/PUT/DELETE) are admin-only.\r\n> Lookup by `id` or `type_name` (partial match) for PUT/DELETE.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | string | Leave type ID — or use `type_name` to look up |\r\n| `type_name` | string | Leave type name — required for POST |\r\n| `days` | number | Number of allowed days per year |\r\n| `color` | string | Color code e.g. `#FF0000` |\r\n| `is_paid` | boolean | Is this a paid leave type? Default: `true` |\r\n| `search` | string | Search by name |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list all leave types\r\n{ \"method\": \"GET\" }\r\n\r\n// POST\r\n{ \"method\": \"POST\", \"type_name\": \"Maternity Leave\", \"days\": 90, \"is_paid\": true }\r\n\r\n// PUT — update days allowed\r\n{ \"method\": \"PUT\", \"type_name\": \"Annual Leave\", \"days\": 14 }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": \"3\" }\r\n```\r\n\r\n---\r\n\r\n### 24. `invoices`\r\n\r\n**Manage client invoices**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n> Requires `invoices` module enabled. POST/PUT/DELETE are admin-only.\r\n> Lookup by `id` or `invoice_number` (e.g. `INV#0001`) for PUT/DELETE.\r\n> Employees see only invoices linked to projects they are members of.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | string | Invoice ID |\r\n| `invoice_number` | string | Display number e.g. `INV#0001` — used to look up for PUT/DELETE |\r\n| `client_id` | string | Client user ID |\r\n| `client_name` | string | Client company or contact name — auto-resolved to ID |\r\n| `project_id` | string | Link to project |\r\n| `issue_date` | string | Issue date `YYYY-MM-DD` (defaults to today) |\r\n| `due_date` | string | Due date `YYYY-MM-DD` |\r\n| `sub_total` | number | Subtotal amount |\r\n| `total` | number | Total amount — **required for POST** |\r\n| `currency_id` | string | Currency ID |\r\n| `note` | string | Invoice notes |\r\n| `search` | string | Search by invoice number or client name |\r\n| `startDate` | string | Filter from issue date |\r\n| `endDate` | string | Filter to issue date |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list invoices\r\n{ \"method\": \"GET\", \"client_name\": \"Acme Corp\" }\r\n\r\n// POST — create invoice\r\n{ \"method\": \"POST\", \"client_name\": \"Acme Corp\", \"total\": 5000,\r\n  \"issue_date\": \"2026-05-01\", \"due_date\": \"2026-05-31\" }\r\n\r\n// PUT — update due date\r\n{ \"method\": \"PUT\", \"invoice_number\": \"INV#0001\", \"due_date\": \"2026-06-15\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"invoice_number\": \"INV#0001\" }\r\n```\r\n\r\n---\r\n\r\n### 25. `estimates`\r\n\r\n**Manage client estimates and quotes**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n> Requires `estimates` module enabled. POST/PUT/DELETE are admin-only.\r\n> Lookup by `id` or `estimate_number` (e.g. `EST#0001`) for PUT/DELETE.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | string | Estimate ID |\r\n| `estimate_number` | string | Display number e.g. `EST#0001` — look up for PUT/DELETE |\r\n| `client_id` | string | Client user ID |\r\n| `client_name` | string | Client company or contact name — auto-resolved to ID |\r\n| `valid_till` | string | Expiry date `YYYY-MM-DD` |\r\n| `sub_total` | number | Subtotal |\r\n| `total` | number | Total amount — **required for POST** |\r\n| `discount` | number | Discount amount |\r\n| `discount_type` | string | `percent` or `fixed` |\r\n| `currency_id` | string | Currency ID |\r\n| `note` | string | Notes |\r\n| `status` | string | `draft` / `sent` / `declined` / `accepted` |\r\n| `search` | string | Search by number or client |\r\n| `startDate` | string | Filter from `valid_till` |\r\n| `endDate` | string | Filter to `valid_till` |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list accepted estimates\r\n{ \"method\": \"GET\", \"status\": \"accepted\" }\r\n\r\n// POST — create estimate\r\n{ \"method\": \"POST\", \"client_name\": \"Acme Corp\", \"total\": 12000,\r\n  \"valid_till\": \"2026-06-30\", \"status\": \"draft\" }\r\n\r\n// PUT — mark as sent\r\n{ \"method\": \"PUT\", \"estimate_number\": \"EST#0003\", \"status\": \"sent\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"estimate_number\": \"EST#0003\" }\r\n```\r\n\r\n---\r\n\r\n### 26. `contracts`\r\n\r\n**Manage client contracts**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n> Requires `contracts` module enabled. POST/PUT/DELETE are admin-only.\r\n> Lookup by `id` or `subject` (partial match) for PUT/DELETE.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | string | Contract ID |\r\n| `subject` | string | Contract title — **required for POST**; also used for lookup |\r\n| `client_id` | string | Client user ID |\r\n| `client_name` | string | Client company name — auto-resolved to ID |\r\n| `contract_type_id` | string | Contract type ID |\r\n| `start_date` | string | Start date `YYYY-MM-DD` |\r\n| `end_date` | string | End date `YYYY-MM-DD` |\r\n| `amount` | number | Contract value |\r\n| `currency_id` | string | Currency ID |\r\n| `description` | string | Contract notes |\r\n| `search` | string | Search by contract subject |\r\n| `startDate` | string | Filter by start_date from |\r\n| `endDate` | string | Filter by end_date to |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list contracts for a client\r\n{ \"method\": \"GET\", \"client_name\": \"Acme Corp\" }\r\n\r\n// POST — create contract\r\n{ \"method\": \"POST\", \"subject\": \"Annual Support Contract\",\r\n  \"client_name\": \"Acme Corp\", \"start_date\": \"2026-01-01\",\r\n  \"end_date\": \"2026-12-31\", \"amount\": 24000 }\r\n\r\n// PUT — update amount\r\n{ \"method\": \"PUT\", \"subject\": \"Annual Support Contract\", \"amount\": 30000 }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": \"7\" }\r\n```\r\n\r\n---\r\n\r\n### 27. `events`\r\n\r\n**Manage company calendar events**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n> Requires `events` module enabled. POST/PUT/DELETE are admin-only.\r\n> Lookup by `id` or `event_name` (partial match) for PUT/DELETE.\r\n> Distinct from `holiday` — use `events` for internal company events, meetings, etc.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | string | Event ID |\r\n| `event_name` | string | Event name — **required for POST**; also used for lookup |\r\n| `where` | string | Event location |\r\n| `description` | string | Event description |\r\n| `start_date_time` | string | Start date/time `YYYY-MM-DD HH:mm` — **required for POST** |\r\n| `end_date_time` | string | End date/time `YYYY-MM-DD HH:mm` — **required for POST** |\r\n| `repeat` | string | `yes` / `no` (default: `no`) |\r\n| `repeat_every` | integer | Repeat interval (e.g. every 2 weeks) |\r\n| `repeat_cycles` | integer | Number of repetitions |\r\n| `repeat_type` | string | `daily` / `weekly` / `monthly` / `yearly` |\r\n| `label_color` | string | Bootstrap class or hex color (default: `bg-info`) |\r\n| `month` | string | Filter by month number 1–12 |\r\n| `year` | string | Filter by year |\r\n| `startDate` | string | Filter events from date |\r\n| `endDate` | string | Filter events to date |\r\n| `search` | string | Search by event name |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — events in June 2026\r\n{ \"method\": \"GET\", \"month\": \"6\", \"year\": \"2026\" }\r\n\r\n// POST — create event\r\n{ \"method\": \"POST\", \"event_name\": \"Q2 All-Hands Meeting\",\r\n  \"start_date_time\": \"2026-06-15 09:00\",\r\n  \"end_date_time\": \"2026-06-15 11:00\", \"where\": \"Main Conference Room\" }\r\n\r\n// PUT — change location\r\n{ \"method\": \"PUT\", \"event_name\": \"Q2 All-Hands Meeting\", \"where\": \"Zoom\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": \"15\" }\r\n```\r\n\r\n---\r\n\r\n### 28. `expenses`\r\n\r\n**Manage expenses and claims**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n> Requires `expenses` module enabled. DELETE is admin-only.\r\n> Employees can create/update their own pending expenses.\r\n> Admin-created expenses default to `approved`; employee-submitted default to `pending`.\r\n> Lookup by `id` or `item_name` (partial match) for PUT/DELETE.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | string | Expense ID |\r\n| `item_name` | string | Expense item name — **required for POST**; also used for lookup |\r\n| `purchase_date` | string | Purchase date `YYYY-MM-DD` — **required for POST** |\r\n| `price` | number | Expense amount — **required for POST** |\r\n| `purchase_from` | string | Where it was purchased |\r\n| `currency_id` | string | Currency ID (defaults to company currency) |\r\n| `expense_category_id` | string | Expense category ID |\r\n| `user_id` | string | Employee user ID (admin only; defaults to self) |\r\n| `employee_name` | string | Employee name — auto-resolved to `user_id` |\r\n| `project_id` | string | Link to project |\r\n| `description` | string | Additional notes |\r\n| `status` | string | `pending` / `approved` / `rejected` — filter (GET) or update (PUT, admin only) |\r\n| `can_claim` | integer \\| boolean | `1` = reimbursement claim, `0` = regular expense |\r\n| `startDate` | string | Filter from purchase date |\r\n| `endDate` | string | Filter to purchase date |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — pending expenses\r\n{ \"method\": \"GET\", \"status\": \"pending\" }\r\n\r\n// POST — submit expense\r\n{ \"method\": \"POST\", \"item_name\": \"Team Lunch\", \"purchase_date\": \"2026-05-10\",\r\n  \"price\": 250, \"can_claim\": 1, \"description\": \"Client meeting lunch\" }\r\n\r\n// PUT — approve expense (admin)\r\n{ \"method\": \"PUT\", \"id\": \"99\", \"status\": \"approved\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": \"99\" }\r\n```\r\n\r\n---\r\n\r\n### 29. `expense-category`\r\n\r\n**Manage expense categories**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n> Requires `expenses` module enabled. Write operations are admin-only.\r\n> Lookup by `id` or `category_name` (partial match) for PUT/DELETE.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | string | Category ID |\r\n| `category_name` | string | Category name — **required for POST**; also used for lookup |\r\n| `search` | string | Search by category name |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET\r\n{ \"method\": \"GET\" }\r\n\r\n// POST\r\n{ \"method\": \"POST\", \"category_name\": \"Travel & Accommodation\" }\r\n\r\n// PUT\r\n{ \"method\": \"PUT\", \"category_name\": \"Travel\", \"category_name\": \"Travel & Accommodation\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": \"5\" }\r\n```\r\n\r\n---\r\n\r\n### 30. `notices`\r\n\r\n**Manage company notice board**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n> Requires `notices` module enabled. POST/PUT/DELETE are admin-only.\r\n> Employees see only notices addressed to `all` or `employee`.\r\n> Lookup by `id` or `heading` (partial match) for PUT/DELETE.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | string | Notice ID |\r\n| `heading` | string | Notice title — **required for POST**; also used for lookup |\r\n| `description` | string | Notice content body — **required for POST** |\r\n| `to` | string | Target audience: `all` / `employee` / `client` (default: `all`) |\r\n| `search` | string | Search by heading |\r\n| `startDate` | string | Filter from created date |\r\n| `endDate` | string | Filter to created date |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — notices for employees\r\n{ \"method\": \"GET\", \"to\": \"employee\" }\r\n\r\n// POST — create announcement\r\n{ \"method\": \"POST\", \"heading\": \"Office Closed on Friday\",\r\n  \"description\": \"The office will be closed this Friday for maintenance.\",\r\n  \"to\": \"all\" }\r\n\r\n// PUT — update content\r\n{ \"method\": \"PUT\", \"heading\": \"Office Closed on Friday\",\r\n  \"description\": \"Updated: Office closed Friday AND Monday.\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": \"12\" }\r\n```\r\n\r\n---\r\n\r\n### 31. `timelogs`\r\n\r\n**Manage project and task time logs**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n> Requires `timelogs` module enabled. DELETE is admin-only.\r\n> **POST** starts a timer (sets `end_time = null`).\r\n> **PUT** stops a running timer by providing `end_time`, or edits any field.\r\n> PUT without `id` finds the active (running) timer for the target user.\r\n> Employees see only their own time logs.\r\n> Supports lookup by name: `project_name` → `project_id`, `task_name` → `task_id`, `employee_name` → `user_id`.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | string | Time log ID — required for DELETE |\r\n| `project_id` | string | Project ID |\r\n| `project_name` | string | Project name — auto-resolved to `project_id` |\r\n| `task_id` | string | Task ID |\r\n| `task_name` | string | Task heading — auto-resolved to `task_id` |\r\n| `user_id` | string | Employee user ID (admin only; defaults to self) |\r\n| `employee_name` | string | Employee name — auto-resolved to `user_id` |\r\n| `start_time` | string | Start datetime `YYYY-MM-DD HH:mm` (defaults to now on POST) |\r\n| `end_time` | string | End datetime — provide on PUT to stop the timer |\r\n| `memo` | string | Optional note for the time log |\r\n| `date` | string | Filter by specific date (GET) |\r\n| `month` | string | Filter by month number 1–12 (GET) |\r\n| `year` | string | Filter by year (GET) |\r\n| `active_only` | boolean \\| string | `true` = return only running timers (GET) |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — my time logs this month\r\n{ \"method\": \"GET\", \"month\": \"5\", \"year\": \"2026\" }\r\n\r\n// GET — active running timers\r\n{ \"method\": \"GET\", \"active_only\": true }\r\n\r\n// POST — start timer for a project\r\n{ \"method\": \"POST\", \"project_name\": \"Mobile App v2\",\r\n  \"task_name\": \"Design landing page\", \"memo\": \"Working on hero section\" }\r\n\r\n// PUT — stop running timer\r\n{ \"method\": \"PUT\", \"end_time\": \"2026-05-10 17:30\" }\r\n\r\n// PUT — stop timer by ID\r\n{ \"method\": \"PUT\", \"id\": \"88\", \"end_time\": \"2026-05-10 17:30\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": \"88\" }\r\n```\r\n\r\n---\r\n\r\n## Account Setup (no API token yet?)\r\n\r\n**Existing account:** Go to FlowyTeam → **Settings → MCP & AI Integration** → copy your API token, then use the [Recommended setup](#recommended--connect-with-api-token) above.\r\n\r\n**New account:** Use `auth_register` + `auth_verify_email` below. Both tools are available via `https://flowyteam.com/api/mcp/gateway` without a token, and **must only be invoked when the user explicitly requests it** — never autonomously.\r\n\r\n### `auth_register`\r\n\r\n**Create a new FlowyTeam company account.**\r\nCall only when the user explicitly requests account creation. A verification email with a 6-digit code is sent immediately. No setup password needed — one is generated and delivered via the verification email.\r\n\r\n| Parameter | Type | Required | Description |\r\n|---|---|---|---|\r\n| `name` | string | ✓ | Full name of the admin user |\r\n| `email` | string | ✓ | Email address |\r\n| `company_name` | string | ✓ | Company / organisation name |\r\n| `phone` | string | — | Phone number |\r\n\r\n**Response:** Returns `status: pending_verification`. Ask the user to check their email for the 6-digit code, then call `auth_verify_email`.\r\n\r\n---\r\n\r\n### `auth_verify_email`\r\n\r\n**Activate account and retrieve API token.**\r\nCall after `auth_register` once the user shares the 6-digit code from their verification email.\r\n\r\n| Parameter | Type | Required | Description |\r\n|---|---|---|---|\r\n| `verification_code` | string | ✓ | 6-digit code from the verification email |\r\n\r\n**Response:** Returns `api_token` — use this as the Bearer token and reconfigure the MCP connection.\r\n\r\n---\r\n\r\n## Error Codes\r\n\r\n| Code | Meaning |\r\n|---|---|\r\n| `200` | Success |\r\n| `401` | Unauthenticated — missing or invalid Bearer token |\r\n| `403` | Forbidden — authenticated but lacks permission |\r\n| `404` | Resource not found |\r\n| `422` | Validation error — check the `errors` object in the response |\r\n| `429` | Too many requests — rate limit exceeded |\r\n| `500` | Server error |\r\n\r\n---\r\n\r\n## Natural Language Examples\r\n\r\nOnce connected, you can ask Claude:\r\n\r\n```\r\n\"Create a task 'Review Q2 Report' in the Marketing project,\r\n assign to Sarah, due April 30\"\r\n\r\n\"Show me all open high-priority tickets\"\r\n\r\n\"List company-level OKRs for Q2 2026\"\r\n\r\n\"Who is on leave this week?\"\r\n\r\n\"Add a new employee: John Doe, email john@company.com,\r\n Engineering department, joining June 1\"\r\n\r\n\"What are the KPI scores for the Sales team this month?\"\r\n\r\n\"Create a new lead: PT Maju Jaya, contact info@majujaya.com,\r\n assign to agent ID 7\"\r\n\r\n\"Clock in employee 7 from office\"\r\n\r\n\"List all upcoming holidays in 2026\"\r\n\r\n\"Show me all pending expense claims\"\r\n\r\n\"Create an invoice for Acme Corp, total $5,000, due May 31\"\r\n\r\n\"What events do we have in June?\"\r\n\r\n\"Post an announcement: office closed Friday\"\r\n\r\n\"Log 8 hours on the Mobile App project for today\"\r\n\r\n\"Show me all running timers right now\"\r\n```\r\n\r\n---\r\n\r\n## Links\r\n\r\n- **Website:** [flowyteam.com](https://flowyteam.com)\r\n- **MCP Docs:** [flowyteam.com/get/mcp-server](https://flowyteam.com/get/mcp-server)\r\n- **API Reference:** [flowyteam.com/get/mcp-docs](https://flowyteam.com/get/mcp-docs)\r\n- **Sign Up:** [app.flowyteam.com/register](https://flowyteam.com/register)\n\nFile v1.1.7:README.md\n\n# FlowyTeam MCP\r\n\r\n> Connect Claude Code (or any MCP-compatible AI agent) to your FlowyTeam workspace and manage your entire business via natural language.\r\n\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)\r\n[![MCP Protocol](https://img.shields.io/badge/MCP-2024--11--05-blue.svg)](https://modelcontextprotocol.io)\r\n[![Tools](https://img.shields.io/badge/Tools-34-orange.svg)](SKILL.md)\r\n[![Platform](https://img.shields.io/badge/Platform-FlowyTeam-teal.svg)](https://flowyteam.com)\r\n[![ClawhHub](https://img.shields.io/badge/ClawhHub-flowyteam--mcp-purple.svg)](https://clawhub.ai/agungksidik/flowyteam-mcp)\r\n\r\n---\r\n\r\n## What is FlowyTeam?\r\n\r\n[FlowyTeam](https://flowyteam.com) is an all-in-one SaaS platform for team productivity and performance management — OKRs, KPIs, projects, HR, CRM, finance, and more. Trusted by 7,000+ organizations across 140+ countries.\r\n\r\n---\r\n\r\n## What does this MCP do?\r\n\r\nThis skill connects Claude Code (or any MCP client) to your FlowyTeam workspace via a remote HTTP MCP server. Once connected, you can manage your entire workspace through natural language — no need to open the app.\r\n\r\n**34 tools. Read and write access to your workspace. No extra software required.**\r\n\r\n---\r\n\r\n## Endpoints\r\n\r\n| Endpoint | Auth | Purpose |\r\n|---|---|---|\r\n| `POST /api/mcp/gateway` | None required | **Gateway** — public endpoint; exposes `auth_register`, `auth_verify_email` & `auth_login` plus all authenticated tools (token passed per-call in header) |\r\n| `POST /api/v2/mcp/rpc` | Bearer token | **RPC** — authenticated endpoint; all 31 workspace tools |\r\n\r\nUse the **Gateway** if you want a single URL for everything (bootstrap + use).\r\nUse the **RPC** endpoint if you already have a token.\r\n\r\n---\r\n\r\n## Install via ClawhHub\r\n\r\nThe easiest way to add FlowyTeam MCP is directly from [ClawhHub](https://clawhub.ai/agungksidik/flowyteam-mcp):\r\n\r\n```bash\r\n# Install from ClawhHub registry\r\nclawhub install agungksidik/flowyteam-mcp\r\n```\r\n\r\nOr add manually using the steps below.\r\n\r\n---\r\n\r\n## Quick Start\r\n\r\n### Option A — You already have an account & token\r\n\r\n#### 1. Get your API Token\r\n\r\nLog in to FlowyTeam → **Settings → MCP & AI Integration** → Copy your token.\r\n\r\n#### 2. Connect with Claude Code (CLI)\r\n\r\n```bash\r\nclaude mcp add flowyteam \\\r\n  --transport http \\\r\n  --url https://flowyteam.com/api/v2/mcp/rpc \\\r\n  --header \"Authorization: Bearer YOUR_API_TOKEN\"\r\n```\r\n\r\n#### 3. Or use Claude Desktop / Cursor\r\n\r\nAdd this to your `mcp.json`:\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"flowyteam\": {\r\n      \"transport\": \"http\",\r\n      \"url\": \"https://flowyteam.com/api/v2/mcp/rpc\",\r\n      \"headers\": {\r\n        \"Authorization\": \"Bearer YOUR_API_TOKEN\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n---\r\n\r\n### Option B — Existing account, no token configured\r\n\r\n**Recommended:** Log in to FlowyTeam via the web → **Settings → MCP & AI Integration** → generate and copy your API token, then use Option A above.\r\n\r\nIf you prefer to retrieve a token via the MCP Gateway instead:\r\n\r\n#### 1. Connect to the Gateway without a token\r\n\r\n```bash\r\nclaude mcp add flowyteam \\\r\n  --transport http \\\r\n  --url https://flowyteam.com/api/mcp/gateway\r\n```\r\n\r\n#### 2. Ask Claude to call `auth_login`\r\n\r\n> ⚠️ **Security note:** Your password will be sent to the FlowyTeam API to obtain a token. Use this flow only on a private, trusted device. Avoid pasting credentials in shared chat sessions or CI environments.\r\n\r\n```\r\n\"Call auth_login with my FlowyTeam email and password to get an API token\"\r\n```\r\n\r\nClaude calls `auth_login` → returns `api_token`. Save it, then reconnect using Option A with that token and remove the gateway connection.\r\n\r\n---\r\n\r\n### Option C — New account via Gateway\r\n\r\nIf MCP registration is enabled on the platform, you can create an account directly from the CLI.\r\n\r\n#### 1. Connect to the Gateway and register\r\n\r\n> ⚠️ **Security note:** Your password will be sent to the FlowyTeam API during registration. Use a strong, unique password. Avoid running this in shared chat sessions or CI environments.\r\n\r\n```\r\n\"Register a new FlowyTeam account — company Acme Corp, name Alice Smith, email alice@acme.com — I'll provide my password when prompted\"\r\n```\r\n\r\nClaude calls `auth_register` → a verification email is sent to your address.\r\n\r\n#### 2. Verify your email (choose one path)\r\n\r\n**Path A — paste code to CLI (fastest):**\r\nOpen the verification email, copy the code from the link URL\r\n(e.g. for `.../email-verification/ABC123XYZ` the code is `ABC123XYZ`), then tell Claude:\r\n\r\n```\r\n\"Verify my email with code ABC123XYZ\"\r\n```\r\n\r\nClaude calls `auth_verify_email` → returns `api_token` immediately.\r\n\r\n**Path B — click link in browser:**\r\nClick the verification link in the email to activate via the web, then tell Claude:\r\n\r\n```\r\n\"Call auth_login with my FlowyTeam email and password to get an API token\"\r\n```\r\n\r\nClaude calls `auth_login` → returns `api_token`.\r\n\r\n#### 3. Reconnect with the token\r\n\r\n```bash\r\nclaude mcp add flowyteam \\\r\n  --transport http \\\r\n  --url https://flowyteam.com/api/v2/mcp/rpc \\\r\n  --header \"Authorization: Bearer YOUR_API_TOKEN\"\r\n```\r\n\r\n#### 4. Reconnect with token for full workspace access\r\n\r\n```\r\n\"Create a task 'Review Q2 Report' in Marketing project, assign to Sarah, due April 30\"\r\n\"Show me all open high-priority tickets\"\r\n\"Who is on leave this week?\"\r\n\"What are our company OKRs for Q2 2026?\"\r\n\"Log 8 hours on the Mobile App project for today\"\r\n\"Create an invoice for Acme Corp, total $5,000, due May 31\"\r\n```\r\n\r\n---\r\n\r\n## Tools (34)\r\n\r\n### Authentication Tools (public — no token required)\r\n\r\n| # | Tool | Description | Methods |\r\n|---|---|---|---|\r\n| 1 | `auth_register` | Register a new company + admin user account. Sends a verification email — account is inactive until verified. Only available when the platform admin has enabled MCP registration. | POST |\r\n| 2 | `auth_verify_email` | Activate a pending account using the code from the verification email link URL. Returns `api_token` on success. | POST |\r\n| 3 | `auth_login` | Login with email + password (for existing or newly web-verified accounts). Returns `api_token` for use as Bearer token. | POST |\r\n\r\n### Workspace Tools (require Bearer token)\r\n\r\n| # | Tool | Description | Methods |\r\n|---|---|---|---|\r\n| 4 | `tasks` | Manage tasks and assignments | GET POST PUT DELETE |\r\n| 5 | `projects` | Manage projects and workflow | GET POST PUT DELETE |\r\n| 6 | `employees` | Manage employees and team members | GET POST PUT DELETE |\r\n| 7 | `objectives` | Manage OKR objectives | GET POST PUT DELETE |\r\n| 8 | `key-result` | Manage OKR key results | GET POST PUT DELETE |\r\n| 9 | `indicators` | Manage KPIs and performance indicators | GET POST PUT DELETE |\r\n| 10 | `indicator-record` | Log KPI actual values per period | GET POST DELETE |\r\n| 11 | `leads` | Manage sales leads and prospects | GET POST PUT DELETE |\r\n| 12 | `clients` | Manage clients and relationships | GET POST PUT DELETE |\r\n| 13 | `tickets` | Manage support tickets | GET POST PUT DELETE |\r\n| 14 | `attendance` | Clock in / clock out / attendance history | GET POST PUT |\r\n| 15 | `leave` | Manage leave requests and approvals | GET POST PUT DELETE |\r\n| 16 | `department` | Manage departments and teams | GET POST PUT DELETE |\r\n| 17 | `designation` | Manage job designations | GET POST PUT DELETE |\r\n| 18 | `performance-cycle` | Manage performance / OKR cycles | GET POST PUT DELETE |\r\n| 19 | `holiday` | Manage company public holidays | GET POST PUT DELETE |\r\n| 20 | `project-category` | Manage project categories | GET POST PUT DELETE |\r\n| 21 | `task-category` | Manage task categories | GET POST PUT DELETE |\r\n| 22 | `ticket-type` | Manage ticket types | GET POST PUT DELETE |\r\n| 23 | `ticket-channel` | Manage ticket channels | GET POST PUT DELETE |\r\n| 24 | `ticket-agent` | List ticket agents and groups | GET |\r\n| 25 | `indicator-category` | Manage KPI categories | GET POST PUT DELETE |\r\n| 26 | `leave-type` | Manage leave types (Annual, Sick, etc.) | GET POST PUT DELETE |\r\n| 27 | `invoices` | Manage client invoices | GET POST PUT DELETE |\r\n| 28 | `estimates` | Manage client estimates and quotes | GET POST PUT DELETE |\r\n| 29 | `contracts` | Manage client contracts | GET POST PUT DELETE |\r\n| 30 | `events` | Manage company calendar events | GET POST PUT DELETE |\r\n| 31 | `expenses` | Manage expenses and claims | GET POST PUT DELETE |\r\n| 32 | `expense-category` | Manage expense categories | GET POST PUT DELETE |\r\n| 33 | `notices` | Manage company notice board | GET POST PUT DELETE |\r\n| 34 | `timelogs` | Start/stop timers, log project hours | GET POST PUT DELETE |\r\n\r\n---\r\n\r\n## How It Works\r\n\r\nThis MCP uses **Streamable HTTP transport (JSON-RPC 2.0)**. Every workspace tool accepts a `method` parameter to select the operation:\r\n\r\n| `method` | Operation |\r\n|---|---|\r\n| `GET` | Read / list records |\r\n| `POST` | Create a new record |\r\n| `PUT` | Update an existing record |\r\n| `DELETE` | Delete a record |\r\n\r\nAuth tools (`auth_register`, `auth_verify_email`, `auth_login`) only support `POST` and do not require a `method` field.\r\n\r\n### Gateway vs RPC\r\n\r\n```\r\nGateway  POST /api/mcp/gateway           ← single URL for everything\r\n  ├── initialize / tools/list            ← no auth needed\r\n  ├── auth_register                      ← no auth needed (creates account, sends verification email)\r\n  ├── auth_verify_email                  ← no auth needed (activates account, returns api_token)\r\n  ├── auth_login                         ← no auth needed (returns api_token)\r\n  └── all workspace tools                ← reads Bearer token from header\r\n\r\nRPC      POST /api/v2/mcp/rpc            ← authenticated only\r\n  └── all workspace tools                ← requires Bearer token (middleware)\r\n```\r\n\r\n**MCP Protocol Version:** `2024-11-05`\r\n\r\n---\r\n\r\n## Smart Features\r\n\r\nSeveral tools support **name-based resolution** — you don't need to look up IDs manually:\r\n\r\n- `department` — lookup by `name` string (auto-finds the ID for PUT/DELETE)\r\n- `invoices` — lookup by `invoice_number` (e.g. `INV#0001`)\r\n- `estimates` — lookup by `estimate_number` (e.g. `EST#0003`)\r\n- `contracts` — lookup by `subject` (partial match)\r\n- `events` — lookup by `event_name` (partial match)\r\n- `expenses` — lookup by `item_name` (partial match)\r\n- `timelogs` — resolve `project_name` → ID, `task_name` → ID, `employee_name` → ID\r\n- `timelogs` PUT — without `id`, finds the currently running timer automatically\r\n\r\n---\r\n\r\n## Permissions\r\n\r\n| Role | Capabilities |\r\n|---|---|\r\n| **Admin** | Full read/write access to all tools |\r\n| **Employee** | Read + self-service (own tasks, attendance, leave, expenses, time logs) |\r\n\r\nSome modules (`invoices`, `estimates`, `contracts`, `events`, `expenses`, `notices`, `timelogs`) require the corresponding module to be enabled in your FlowyTeam plan.\r\n\r\n---\r\n\r\n## Security Best Practices\r\n\r\n- **Use the lowest-privilege token for your use case.** If you only need to read tasks and log time, use an Employee token — not an Admin token.\r\n- **Never share your API token** in public repositories, shared documents, or chat logs. Treat it like a password.\r\n- **Prefer the API token flow (Option A)** over passing credentials through the agent (Options B/C). Tokens can be rotated; passwords cannot.\r\n- **Rotate your token** via FlowyTeam Settings if you suspect it has been exposed.\r\n- **Avoid using admin tokens in automated or CI/CD workflows** — create a dedicated service account with limited permissions instead.\r\n- **Review and confirm destructive operations** (DELETE) before authorizing the agent to proceed.\r\n\r\n---\r\n\r\n## Security (Gateway)\r\n\r\nThe Gateway endpoint applies the following protections:\r\n\r\n| Layer | Details |\r\n|---|---|\r\n| **Rate limiting** | 60 requests/minute per IP (throttle:60,1) |\r\n| **Suspicious input check** | Blocks bot-like names and company names |\r\n| **Duplicate email check** | Prevents duplicate account creation |\r\n| **Email verification** | New accounts start as inactive — must be verified via `auth_verify_email` or web link before use |\r\n| **SuperAdmin notification** | Every new MCP registration triggers an email to all SuperAdmins |\r\n| **Platform toggle** | `allow_mcp_registration` must be enabled by SuperAdmin (default: off) |\r\n\r\n---\r\n\r\n## Full Documentation\r\n\r\n- **ClawhHub listing:** [clawhub.ai/agungksidik/flowyteam-mcp](https://clawhub.ai/agungksidik/flowyteam-mcp)\r\n- **MCP Server page:** [flowyteam.com/get/mcp-server](https://flowyteam.com/get/mcp-server)\r\n- **API Reference:** [flowyteam.com/get/mcp-docs](https://flowyteam.com/get/mcp-docs)\r\n- **Tool parameters:** See [SKILL.md](SKILL.md)\r\n\r\n---\r\n\r\n## Sign Up\r\n\r\nDon't have a FlowyTeam account yet? [Sign up free](https://flowyteam.com/register) or use the MCP Gateway with `auth_register` + `auth_verify_email` if MCP registration is enabled by the platform admin.\r\n\r\n---\r\n\r\n## License\r\n\r\nMIT — free to use, modify, and distribute.\n\nFile v1.1.7:_meta.json\n\n{\n  \"ownerId\": \"kn76v4197dam2qja4at8xvm4s185vn8x\",\n  \"slug\": \"flowyteam-mcp\",\n  \"version\": \"1.1.7\",\n  \"publishedAt\": 1777940656591\n}\n\nArchive v1.1.6: 3 files, 15183 bytes\n\nFiles: _meta.json (132b), README.md (11556b), SKILL.md (46107b)\n\nFile v1.1.6:SKILL.md\n\n---\r\nname: flowyteam\r\nversion: \"1.1.5\"\r\ndescription: Manage FlowyTeam projects, tasks, OKRs, KPIs, HR, CRM, finance, support tickets, attendance, and more via MCP — 34 tools for complete workspace management.\r\nlicense: MIT\r\nauthor: flowyteam\r\nhomepage: https://flowyteam.com\r\nsource: https://github.com/flowy-team/clawhub/tree/master/skills/flowyteam-mcp\r\nmetadata:\r\n  clawhub:\r\n    requires:\r\n      env:\r\n        - name: FLOWYTEAM_API_TOKEN\r\n          description: \"API token from FlowyTeam Settings → MCP & AI Integration.\"\r\n          required: true\r\n---\r\n\r\n# FlowyTeam MCP\r\n\r\nConnect Claude Code (or any MCP-compatible AI agent) to your FlowyTeam workspace.\r\nManage projects, tasks, OKRs, KPIs, employees, leads, clients, tickets, attendance,\r\nleave, invoices, estimates, contracts, expenses, events, notices, time logs, and more\r\n— all via natural language.\r\n\r\n**Platform:** [flowyteam.com](https://flowyteam.com) — All-in-one SaaS for team\r\nproductivity and performance management. 7,000+ organizations, 140+ countries.\r\n\r\n---\r\n\r\n## Endpoints\r\n\r\n| Endpoint | Auth | Purpose |\r\n|---|---|---|\r\n| `POST /api/mcp/gateway` | None (per-call) | **Gateway** — `auth_register` & `auth_verify_email` run without token for new account setup; all other tools read Bearer from header |\r\n| `POST /api/v2/mcp/rpc` | Bearer token | **RPC** — authenticated-only endpoint for all 31 workspace tools |\r\n\r\n---\r\n\r\n## Setup\r\n\r\n### Recommended — Connect with API token\r\n\r\n```bash\r\nclaude mcp add flowyteam \\\r\n  --transport http \\\r\n  --url https://flowyteam.com/api/v2/mcp/rpc \\\r\n  --header \"Authorization: Bearer $FLOWYTEAM_API_TOKEN\"\r\n```\r\n\r\nGet your token: FlowyTeam → **Settings → MCP & AI Integration** → copy token.\r\n\r\n### Claude Desktop / Cursor (`mcp.json`)\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"flowyteam\": {\r\n      \"transport\": \"http\",\r\n      \"url\": \"https://flowyteam.com/api/v2/mcp/rpc\",\r\n      \"headers\": {\r\n        \"Authorization\": \"Bearer YOUR_API_TOKEN\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n---\r\n\r\n## Protocol\r\n\r\n- **Gateway:** `POST https://flowyteam.com/api/mcp/gateway`\r\n- **RPC:** `POST https://flowyteam.com/api/v2/mcp/rpc`\r\n- **Transport:** Streamable HTTP (JSON-RPC 2.0)\r\n- **Auth:** `Authorization: Bearer <api_token>` (not required for `auth_register` / `auth_verify_email`)\r\n- **Protocol Version:** `2024-11-05`\r\n\r\nAll workspace tools share a `method` parameter to select the HTTP verb:\r\n\r\n| `method` | Operation |\r\n|---|---|\r\n| `GET` | Read / list records |\r\n| `POST` | Create a new record |\r\n| `PUT` | Update an existing record |\r\n| `DELETE` | Delete a record |\r\n\r\nAccount setup tools (`auth_register`, `auth_verify_email`) only use `POST` and do not need a `method` field.\r\n\r\n---\r\n\r\n## Safety Guidelines\r\n\r\n> **Important:** This skill has broad read and write access to your FlowyTeam workspace.\r\n\r\n- **Use a limited-permission token.** Avoid connecting an admin account unless you specifically need admin operations.\r\n- **Confirm before mutating.** Always ask the user to confirm before executing any `POST` (create), `PUT` (update), or `DELETE` operation — especially on sensitive data: employees, HR records, contracts, invoices, expenses, notices, and client data.\r\n- **Never act autonomously.** Do not perform any create, update, or delete action unless the user has explicitly requested it in the current turn.\r\n- **Prefer read-first.** When intent is ambiguous, default to `GET` to show the user what exists before offering to change it.\r\n\r\n---\r\n\r\n## Tools (34)\r\n\r\n> All tools require a valid `FLOWYTEAM_API_TOKEN` Bearer token. See [Setup](#setup) above.\r\n\r\n---\r\n\r\n### 1. `tasks` *(requires Bearer token)*\r\n\r\n**Manage tasks and assignments**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Task ID — required for PUT / DELETE |\r\n| `project_id` | integer \\| string | Filter by project (GET) or assign to project (POST) |\r\n| `heading` | string | Task title — required for POST |\r\n| `description` | string | Task description |\r\n| `status` | string | Task status (e.g. `incomplete`, `complete`) |\r\n| `priority` | string | `low` / `medium` / `high` / `urgent` |\r\n| `assigned_to` | integer \\| string | Employee user ID to assign |\r\n| `user_id` | integer \\| string | Alternative employee ID field |\r\n| `due_date` | string | Due date `YYYY-MM-DD` |\r\n| `task_category_id` | integer \\| string | Task category ID |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list incomplete tasks in project 12\r\n{ \"method\": \"GET\", \"project_id\": 12, \"status\": \"incomplete\" }\r\n\r\n// POST — create task\r\n{ \"method\": \"POST\", \"heading\": \"Write API docs\", \"project_id\": 12,\r\n  \"due_date\": \"2026-05-10\", \"priority\": \"medium\", \"assigned_to\": 7 }\r\n\r\n// PUT — mark complete\r\n{ \"method\": \"PUT\", \"id\": 101, \"status\": \"complete\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 101 }\r\n```\r\n\r\n---\r\n\r\n### 2. `projects`\r\n\r\n**Manage projects and project workflow**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Project ID — required for PUT / DELETE |\r\n| `project_name` | string | Project name — required for POST |\r\n| `status` | string | `not started` / `in progress` / `on hold` / `finished` |\r\n| `start_date` | string | Start date `YYYY-MM-DD` |\r\n| `deadline` | string | Deadline `YYYY-MM-DD` |\r\n| `client_id` | integer \\| string | Client ID |\r\n| `category_id` | integer \\| string | Project category ID |\r\n| `project_summary` | string | Short description |\r\n| `notes` | string | Additional notes |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list in-progress projects\r\n{ \"method\": \"GET\", \"status\": \"in progress\" }\r\n\r\n// POST — create project\r\n{ \"method\": \"POST\", \"project_name\": \"Mobile App v2\",\r\n  \"start_date\": \"2026-06-01\", \"deadline\": \"2026-09-30\", \"client_id\": 3 }\r\n\r\n// PUT — update status\r\n{ \"method\": \"PUT\", \"id\": 12, \"status\": \"on hold\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 12 }\r\n```\r\n\r\n---\r\n\r\n### 3. `employees`\r\n\r\n**Manage employees and team members**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Employee ID — required for PUT / DELETE |\r\n| `name` | string | Full name — required for POST |\r\n| `email` | string | Email — required for POST |\r\n| `password` | string | Optional — new employee sets their own on first login |\r\n| `department_id` | integer \\| string | Department ID |\r\n| `designation_id` | integer \\| string | Job designation ID |\r\n| `employee_id` | string | Custom employee ID/code |\r\n| `joining_date` | string | Joining date `YYYY-MM-DD` |\r\n| `status` | string | `active` / `inactive` |\r\n| `search` | string | Search by name or email |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list active employees in department 4\r\n{ \"method\": \"GET\", \"department_id\": 4, \"status\": \"active\" }\r\n\r\n// POST — create employee (password is set by the new employee on first login)\r\n{ \"method\": \"POST\", \"name\": \"John Doe\", \"email\": \"john@company.com\",\r\n  \"department_id\": 4, \"designation_id\": 2,\r\n  \"joining_date\": \"2026-06-01\" }\r\n\r\n// PUT — deactivate\r\n{ \"method\": \"PUT\", \"id\": 7, \"status\": \"inactive\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 7 }\r\n```\r\n\r\n---\r\n\r\n### 4. `objectives`\r\n\r\n**Manage OKR objectives**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Objective ID — required for PUT / DELETE |\r\n| `heading` | string | Objective title — required for POST |\r\n| `description` | string | Objective description |\r\n| `level` | string | `company` / `department` / `individual` |\r\n| `type` | string | `qualitative` / `quantitative` |\r\n| `status` | string | `on track` / `at risk` / `behind` / `achieved` |\r\n| `cycle_id` | integer \\| string | Performance cycle ID |\r\n| `department_id` | integer \\| string | Filter by department |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — company-level objectives in cycle 3\r\n{ \"method\": \"GET\", \"cycle_id\": 3, \"level\": \"company\" }\r\n\r\n// POST — create objective\r\n{ \"method\": \"POST\", \"heading\": \"Improve NPS Score\",\r\n  \"level\": \"company\", \"cycle_id\": 3, \"type\": \"qualitative\" }\r\n\r\n// PUT — update status\r\n{ \"method\": \"PUT\", \"id\": 20, \"status\": \"at risk\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 20 }\r\n```\r\n\r\n---\r\n\r\n### 5. `key-result`\r\n\r\n**Manage OKR key results linked to objectives**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Key result ID — required for PUT / DELETE |\r\n| `objective_id` | integer \\| string | Filter by objective (GET) |\r\n| `krs_owner` | integer \\| string | Objective ID owning this KR — required for POST |\r\n| `krs_title` | string | Key result title |\r\n| `krs_description` | string | Description |\r\n| `krs_init` | number \\| string | Initial value |\r\n| `krs_tar` | number \\| string | Target value |\r\n| `krs_now` | number \\| string | Current value |\r\n| `krs_weight` | number \\| string | Weight (1–100) |\r\n| `krs_unit` | string | Unit (default `%`) |\r\n| `krs_leader` | integer \\| string | Employee details ID for KR owner |\r\n| `krs_conf` | string | Confidence level |\r\n| `krs_remarks` | string | Remarks |\r\n| `associate_kpis` | array | Array of indicator IDs to link |\r\n| `per_page` | integer | Page size |\r\n| `page` | integer | Page number |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — key results for objective 20\r\n{ \"method\": \"GET\", \"objective_id\": 20 }\r\n\r\n// POST — create key result\r\n{ \"method\": \"POST\", \"krs_owner\": 20, \"krs_title\": \"Reduce churn to < 5%\",\r\n  \"krs_init\": 8, \"krs_tar\": 5, \"krs_now\": 8, \"krs_weight\": 100, \"krs_unit\": \"%\" }\r\n\r\n// PUT — update current value\r\n{ \"method\": \"PUT\", \"id\": 30, \"krs_now\": 4.2 }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 30 }\r\n```\r\n\r\n---\r\n\r\n### 6. `indicators`\r\n\r\n**Manage KPIs and performance indicators**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | KPI ID — required for PUT / DELETE |\r\n| `name` | string | KPI name — required for POST |\r\n| `target` | number \\| string | Target value |\r\n| `unit` | string | Unit (e.g. `%`, `USD`, `count`) |\r\n| `frequency` | string | `daily` / `weekly` / `monthly` / `quarterly` / `yearly` |\r\n| `category_id` | integer \\| string | Indicator category ID |\r\n| `employee_id` | integer \\| string | Assign to employee |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — monthly KPIs for employee 7\r\n{ \"method\": \"GET\", \"employee_id\": 7, \"frequency\": \"monthly\" }\r\n\r\n// POST — create KPI\r\n{ \"method\": \"POST\", \"name\": \"Customer Satisfaction Score\",\r\n  \"target\": 90, \"unit\": \"%\", \"frequency\": \"monthly\",\r\n  \"employee_id\": 7, \"category_id\": 2 }\r\n\r\n// PUT — update target\r\n{ \"method\": \"PUT\", \"id\": 40, \"target\": 95 }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 40 }\r\n```\r\n\r\n---\r\n\r\n### 7. `indicator-record`\r\n\r\n**Manage KPI actual values per period**\r\n\r\nMethods: `GET` `POST` `DELETE`\r\n\r\n> **POST** maps to `indicator-record/update-record` (upsert by period).\r\n> **GET with `id`** returns a single record; **GET without `id`** returns a list.\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `DELETE` |\r\n| `id` | integer \\| string | Record ID — GET single / DELETE |\r\n| `indicator_id` | integer \\| string | KPI indicator ID — required for GET list and POST |\r\n| `period_key` | string | Period date `dd-m-YYYY` e.g. `01-6-2026` — required for POST |\r\n| `current_value` | number \\| string | Actual value for the period |\r\n| `target_value` | number \\| string | Target value for the period |\r\n| `remark` | string | Notes |\r\n| `score` | number \\| string | Computed score |\r\n| `month` | integer \\| string | Filter by month number (GET list) |\r\n| `year` | integer \\| string | Filter by year (GET list) |\r\n| `start_date` | string | Filter from date (GET list) |\r\n| `end_date` | string | Filter to date (GET list) |\r\n| `all` | boolean \\| string | Return all records without pagination |\r\n| `per_page` | integer | Page size |\r\n| `page` | integer | Page number |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — records for KPI 40 in May 2026\r\n{ \"method\": \"GET\", \"indicator_id\": 40, \"month\": 5, \"year\": 2026 }\r\n\r\n// POST — submit/update actual value for a period\r\n{ \"method\": \"POST\", \"indicator_id\": 40, \"period_key\": \"01-6-2026\",\r\n  \"current_value\": 112000, \"target_value\": 100000, \"remark\": \"Exceeded target\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 200 }\r\n```\r\n\r\n---\r\n\r\n### 8. `leads`\r\n\r\n**Manage sales leads and prospects**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Lead ID — required for PUT / DELETE |\r\n| `client_name` | string | Lead contact name — required for POST |\r\n| `company_name` | string | Company name |\r\n| `email` | string | Contact email |\r\n| `mobile` | string | Contact mobile |\r\n| `website` | string | Company website |\r\n| `address` | string | Address |\r\n| `note` | string | Notes |\r\n| `agent_id` | integer \\| string | Assign to sales agent |\r\n| `source_id` | integer \\| string | Lead source ID (POST) |\r\n| `status_id` | integer \\| string | Lead status ID (POST) |\r\n| `status` | integer \\| string | Lead status ID (PUT) |\r\n| `source` | integer \\| string | Lead source ID (PUT) |\r\n| `meeting_date` | string | Scheduled meeting date |\r\n| `next_follow_up` | string | `yes` or `no` |\r\n| `client` | string | `lead` or `client` filter (GET) |\r\n| `followUp` | string | Filter follow-up required (GET) |\r\n| `startDate` | string | Filter from date (GET) |\r\n| `endDate` | string | Filter to date (GET) |\r\n| `sort_field` | string | Sort column |\r\n| `sort_direction` | string | `asc` / `desc` |\r\n| `per_page` | integer | Page size |\r\n| `page` | integer | Page number |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — list leads with pagination\r\n{ \"method\": \"GET\", \"client\": \"lead\", \"per_page\": 20, \"page\": 1 }\r\n\r\n// POST — create lead\r\n{ \"method\": \"POST\", \"client_name\": \"PT Maju Jaya\",\r\n  \"email\": \"info@majujaya.com\", \"mobile\": \"+6281234567890\",\r\n  \"status_id\": 1, \"agent_id\": 7 }\r\n\r\n// PUT — update status and add note\r\n{ \"method\": \"PUT\", \"id\": 55, \"status\": 3, \"note\": \"Proposal sent\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 55 }\r\n```\r\n\r\n---\r\n\r\n### 9. `clients`\r\n\r\n**Manage clients and customer relationships**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Client ID — required for PUT / DELETE |\r\n| `name` | string | Contact name — required for POST |\r\n| `email` | string | Email — required for POST |\r\n| `company_name` | string | Company name |\r\n| `website` | string | Company website |\r\n| `address` | string | Address |\r\n| `mobile` | string | Phone number |\r\n| `send_email` | string | `yes` / `no` — send welcome email |\r\n| `skype` | string \\| null | Skype handle |\r\n| `linkedin` | string \\| null | LinkedIn URL |\r\n| `twitter` | string \\| null | Twitter handle |\r\n| `facebook` | string \\| null | Facebook URL |\r\n| `gst_number` | string \\| null | Tax/GST number |\r\n| `note` | string \\| null | Notes |\r\n| `search` | string | Search by name or company |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — search clients\r\n{ \"method\": \"GET\", \"search\": \"acme\" }\r\n\r\n// POST — create client\r\n{ \"method\": \"POST\", \"name\": \"Alice Johnson\",\r\n  \"email\": \"alice@newclient.com\", \"company_name\": \"New Client Ltd\",\r\n  \"mobile\": \"+0987654321\", \"send_email\": \"yes\" }\r\n\r\n// PUT — update website\r\n{ \"method\": \"PUT\", \"id\": 3, \"website\": \"https://acme-new.com\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 3 }\r\n```\r\n\r\n---\r\n\r\n### 10. `tickets`\r\n\r\n**Manage support tickets and issues**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Ticket ID — required for PUT / DELETE |\r\n| `subject` | string | Ticket subject — required for POST |\r\n| `description` | string | Ticket description |\r\n| `status` | string | `open` / `pending` / `resolved` / `closed` |\r\n| `priority` | string | `low` / `medium` / `high` / `urgent` |\r\n| `type_id` | integer \\| string | Ticket type ID |\r\n| `channel_id` | integer \\| string | Ticket channel ID |\r\n| `agent_id` | integer \\| string | Assign to agent |\r\n| `user_id` | integer \\| string | Reporter user ID |\r\n| `search` | string | Search by keyword |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — high-priority open tickets\r\n{ \"method\": \"GET\", \"status\": \"open\", \"priority\": \"high\" }\r\n\r\n// POST — create ticket\r\n{ \"method\": \"POST\", \"subject\": \"Cannot export report\",\r\n  \"description\": \"Export button not responding\",\r\n  \"priority\": \"medium\", \"type_id\": 1, \"channel_id\": 2, \"user_id\": 7 }\r\n\r\n// PUT — resolve and reassign\r\n{ \"method\": \"PUT\", \"id\": 500, \"status\": \"resolved\", \"agent_id\": 8 }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 500 }\r\n```\r\n\r\n---\r\n\r\n### 11. `attendance`\r\n\r\n**Manage attendance records and time tracking**\r\n\r\nMethods: `GET` `POST` `PUT`\r\n\r\n> **POST** → clock in (`attendance/clock-in`)\r\n> **PUT** → clock out (`attendance/clock-out`)\r\n> **GET with `today: true`** → today's attendance summary\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` |\r\n| `id` | integer \\| string | Attendance record ID — required for PUT (clock-out) |\r\n| `employee_id` | integer \\| string | Employee ID |\r\n| `date` | string | Specific date `YYYY-MM-DD` |\r\n| `month` | string | Filter by month |\r\n| `year` | string | Filter by year |\r\n| `clock_in_time` | string | Clock-in time `HH:MM:SS` |\r\n| `clock_out_time` | string | Clock-out time `HH:MM:SS` |\r\n| `working_from` | string | `office` / `home` / `other` |\r\n| `late_reason` | string | Reason if arriving late |\r\n| `today` | boolean \\| string | Set `true` to get today's records (GET) |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — today's attendance\r\n{ \"method\": \"GET\", \"today\": true }\r\n\r\n// GET — by month/year\r\n{ \"method\": \"GET\", \"employee_id\": 7, \"month\": \"5\", \"year\": \"2026\" }\r\n\r\n// POST — clock in\r\n{ \"method\": \"POST\", \"employee_id\": 7, \"working_from\": \"office\" }\r\n\r\n// PUT — clock out\r\n{ \"method\": \"PUT\", \"id\": 300 }\r\n```\r\n\r\n---\r\n\r\n### 12. `leave`\r\n\r\n**Manage employee leave requests**\r\n\r\nMethods: `GET` `POST` `PUT` `DELETE`\r\n\r\n| Parameter | Type | Description |\r\n|---|---|---|\r\n| `method` | string | `GET` / `POST` / `PUT` / `DELETE` |\r\n| `id` | integer \\| string | Leave ID — required for PUT / DELETE |\r\n| `user_id` | integer \\| string | Employee user ID — required for POST |\r\n| `leave_type_id` | integer \\| string | Leave type ID — required for POST / PUT |\r\n| `leave_date` | string | Leave start date `YYYY-MM-DD` — required for POST |\r\n| `duration` | string | `full day` / `half day` / `multiple` |\r\n| `reason` | string | Leave reason |\r\n| `status` | string | `pending` / `approved` / `rejected` (PUT for approval) |\r\n| `multi_date` | string | Comma-separated dates for `multiple` duration |\r\n| `userId` | integer \\| string | Filter by employee (GET) |\r\n| `startDate` | string | Filter from date (GET) |\r\n| `endDate` | string | Filter to date (GET) |\r\n| `search` | string | Search keyword |\r\n| `all` | boolean \\| string | Return all records without pagination |\r\n| `per_page` | integer | Page size |\r\n| `page` | integer | Page number |\r\n\r\n**Examples:**\r\n\r\n```json\r\n// GET — pending leaves for employee 7\r\n{ \"method\": \"GET\", \"userId\": 7, \"status\": \"pending\" }\r\n\r\n// POST — apply for leave\r\n{ \"method\": \"POST\", \"user_id\": 7, \"leave_type_id\": 1,\r\n  \"leave_date\": \"2026-05-15\", \"duration\": \"full day\", \"reason\": \"Family event\" }\r\n\r\n// PUT — approve leave\r\n{ \"method\": \"PUT\", \"id\": 88, \"status\": \"approved\" }\r\n\r\n// DELETE\r\n{ \"method\": \"DELETE\", \"id\": 88 }\r\n```\r\n\r\n---\r\n\r\n### 13. `department`\r\n\r\n**Manage departments an\n\nArchive v1.1.5: 3 files, 14822 bytes\n\nFiles: _meta.json (132b), README.md (11556b), SKILL.md (45333b)\n\nArchive v1.1.4: 3 files, 15180 bytes\n\nFiles: _meta.json (132b), README.md (11556b), SKILL.md (46603b)\n\nArchive v1.1.3: 3 files, 15225 bytes\n\nFiles: _meta.json (132b), README.md (11556b), SKILL.md (46694b)\n\nArchive v1.1.2: 3 files, 15073 bytes\n\nFiles: _meta.json (132b), README.md (11556b), SKILL.md (46300b)\n\nArchive v1.1.1: 3 files, 14546 bytes\n\nFiles: _meta.json (132b), README.md (10079b), SKILL.md (46647b)\n\nArchive v1.0.3: 3 files, 14347 bytes\n\nFiles: _meta.json (132b), README.md (10079b), SKILL.md (46105b)\n\nArchive v1.0.2: 6 files, 24538 bytes\n\nFiles: README.md (6478b), SKILL.md (42765b), skills/flowyteam-mcp/_meta.json (132b), skills/flowyteam-mcp/README.md (6478b), skills/flowyteam-mcp/SKILL.md (42765b), _meta.json (132b)","readmeExcerpt":"Skill: Flowyteam Mcp Owner: flowy-team Summary: Manage FlowyTeam projects, tasks, OKRs, KPIs, HR, CRM, finance, support tickets, attendance, and more via MCP — 34 tools for complete workspace management. Tags: latest:1.1.8 Version history: v1.1.8 | 2026-05-05T00:39:54.978Z | auto flowyteam-mcp 1.1.8 changelog - Updated safety guidelines: Now explicitly instructs to always require user confirmation before any write or","codeSnippets":[],"executableExamples":[],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\r\nname: flowyteam\r\nversion: \"1.1.8\"\r\ndescription: Manage FlowyTeam projects, tasks, OKRs, KPIs, HR, CRM, finance, support tickets, attendance, and more via MCP — 34 tools for complete workspace management.\r\nlicense: MIT\r\nauthor: flowyteam\r\nhomepage: https://flowyteam.com\r\nsource: https://github.com/flowy-team/clawhub/tree/master/skills/flowyteam-mcp\r\nmetadata:\r\n  clawhub:\r\n    requires:\r\n      env:\r\n        - name: FLOWYTEAM_API_TOKEN\r\n          description: \"API token from FlowyTeam Settings → MCP & AI Integration.\"\r\n          required: true\r\n---\r\n\r\n# FlowyTeam MCP\r\n\r\nConnect Claude Code (or any MCP-compatible AI agent) to your FlowyTeam workspace.\r\nManage projects, tasks, OKRs, KPIs, employees, leads, clients, tickets, attendance,\r\nleave, invoices, estimates, contracts, expenses, events, notices, time logs, and more\r\n— all via natural language.\r\n\r\n**Platform:** [flowyteam.com](https://flowyteam.com) — All-in-one SaaS for team\r\nproductivity and performance management. 7,000+ organizations, 140+ countries.\r\n\r\n---\r\n\r\n## Endpoints\r\n\r\n| Endpoint | Auth | Purpose |\r\n|---|---|---|\r\n| `POST /api/mcp/gateway` | None (per-call) | **Gateway** — `auth_register` & `auth_verify_email` run without token for new account setup; all other tools read Bearer from header |\r\n| `POST /api/v2/mcp/rpc` | Bearer token | **RPC** — authenticated-only endpoint for all 31 workspace tools |\r\n\r\n---\r\n\r\n## Setup\r\n\r\n### Recommended — Connect with API token\r\n\r\n```bash\r\nclaude mcp add flowyteam \\\r\n  --transport http \\\r\n  --url https://flowyteam.com/api/v2/mcp/rpc \\\r\n  --header \"Authorization: Bearer $FLOWYTEAM_API_TOKEN\"\r\n```\r\n\r\nGet your token: FlowyTeam → **Settings → MCP & AI Integration** → copy token.\r\n\r\n### Claude Desktop / Cursor (`mcp.json`)\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"flowyteam\": {\r\n      \"transport\": \"http\",\r\n      \"url\": \"https://flowyteam.com/api/v2/mcp/rpc\",\r\n      \"headers\": {\r\n        \"Authorization\": \"Bearer YOUR_API_TOKEN\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n---\r\n\r\n## Protocol\r\n\r\n- **Gateway:** `POST https://flowyteam.com/api/mcp/gateway`\r\n- **RPC:** `POST https://flowyteam.com/api/v2/mcp/rpc`\r\n- **Transport:** Streamable HTTP (JSON-RPC 2.0)\r\n- **Auth:** `Authorization: Bearer <api_token>` (not required for `auth_register` / `auth_verify_email`)\r\n- **Protocol Version:** `2024-11-05`\r\n\r\nAll workspace tools share a `method` parameter to select the HTTP verb:\r\n\r\n| `method` | Operation |\r\n|---|---|\r\n| `GET` | Read / list records |\r\n| `POST` | Create a new record |\r\n| `PUT` | Update an existing record |\r\n| `DELETE` | Delete a record |\r\n\r\nAccount setup tools (`auth_register`, `auth_verify_email`) only use `POST` and do not need a `method` field.\r\n\r\n---\r\n\r\n## Safety Guidelines\r\n\r\n> **Always require explicit user confirmation before any write or delete action.**\r\n\r\n- **Use a limited-permission token.** Connect with an Employee token for self-service tasks; request an Admin token only when admin operations are explicitly needed.\r\n- **Require explicit confirmation."},{"path":"README.md","content":"# FlowyTeam MCP\r\n\r\n> Connect Claude Code (or any MCP-compatible AI agent) to your FlowyTeam workspace and manage your entire business via natural language.\r\n\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)\r\n[![MCP Protocol](https://img.shields.io/badge/MCP-2024--11--05-blue.svg)](https://modelcontextprotocol.io)\r\n[![Tools](https://img.shields.io/badge/Tools-34-orange.svg)](SKILL.md)\r\n[![Platform](https://img.shields.io/badge/Platform-FlowyTeam-teal.svg)](https://flowyteam.com)\r\n[![ClawhHub](https://img.shields.io/badge/ClawhHub-flowyteam--mcp-purple.svg)](https://clawhub.ai/agungksidik/flowyteam-mcp)\r\n\r\n---\r\n\r\n## What is FlowyTeam?\r\n\r\n[FlowyTeam](https://flowyteam.com) is an all-in-one SaaS platform for team productivity and performance management — OKRs, KPIs, projects, HR, CRM, finance, and more. Trusted by 7,000+ organizations across 140+ countries.\r\n\r\n---\r\n\r\n## What does this MCP do?\r\n\r\nThis skill connects Claude Code (or any MCP client) to your FlowyTeam workspace via a remote HTTP MCP server. Once connected, you can manage your entire workspace through natural language — no need to open the app.\r\n\r\n**34 tools. Read and write access to your workspace. No extra software required.**\r\n\r\n---\r\n\r\n## Endpoints\r\n\r\n| Endpoint | Auth | Purpose |\r\n|---|---|---|\r\n| `POST /api/mcp/gateway` | None required | **Gateway** — public endpoint; exposes `auth_register`, `auth_verify_email` & `auth_login` plus all authenticated tools (token passed per-call in header) |\r\n| `POST /api/v2/mcp/rpc` | Bearer token | **RPC** — authenticated endpoint; all 31 workspace tools |\r\n\r\nUse the **Gateway** if you want a single URL for everything (bootstrap + use).\r\nUse the **RPC** endpoint if you already have a token.\r\n\r\n---\r\n\r\n## Install via ClawhHub\r\n\r\nThe easiest way to add FlowyTeam MCP is directly from [ClawhHub](https://clawhub.ai/agungksidik/flowyteam-mcp):\r\n\r\n```bash\r\n# Install from ClawhHub registry\r\nclawhub install agungksidik/flowyteam-mcp\r\n```\r\n\r\nOr add manually using the steps below.\r\n\r\n---\r\n\r\n## Quick Start\r\n\r\n### Option A — You already have an account & token\r\n\r\n#### 1. Get your API Token\r\n\r\nLog in to FlowyTeam → **Settings → MCP & AI Integration** → Copy your token.\r\n\r\n#### 2. Connect with Claude Code (CLI)\r\n\r\n```bash\r\nclaude mcp add flowyteam \\\r\n  --transport http \\\r\n  --url https://flowyteam.com/api/v2/mcp/rpc \\\r\n  --header \"Authorization: Bearer YOUR_API_TOKEN\"\r\n```\r\n\r\n#### 3. Or use Claude Desktop / Cursor\r\n\r\nAdd this to your `mcp.json`:\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"flowyteam\": {\r\n      \"transport\": \"http\",\r\n      \"url\": \"https://flowyteam.com/api/v2/mcp/rpc\",\r\n      \"headers\": {\r\n        \"Authorization\": \"Bearer YOUR_API_TOKEN\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n---\r\n\r\n### Option B — Existing account, no token configured\r\n\r\n**Recommended:** Log in to FlowyTeam via the web → **Settings → MCP & AI Integration** → generate and copy your API token, then use Option A above.\r\n\r\nIf you prefer to retrieve a token via the MCP G"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn76v4197dam2qja4at8xvm4s185vn8x\",\n  \"slug\": \"flowyteam-mcp\",\n  \"version\": \"1.1.8\",\n  \"publishedAt\": 1777941594978\n}"},{"path":"skill-card.md","content":"## Description:\n\nManage FlowyTeam projects, tasks, OKRs, KPIs, HR, CRM, finance, support tickets, attendance, and related workspace records through MCP.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[flowy-team](https://clawhub.ai/user/flowy-team)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and workspace operators use this skill to connect an MCP-compatible agent to FlowyTeam so the agent can read and manage projects, tasks, OKRs, KPIs, HR records, CRM records, finance records, support tickets, attendance, and other workspace data.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can operate on broad FlowyTeam workspace data according to the permissions attached to the user's token.\n\nMitigation: Use the lowest-privilege token possible and avoid admin tokens unless an admin-only action is explicitly required.\n\nRisk: Create, update, or delete actions can change tasks, HR data, CRM records, finance records, support tickets, and other business records.\n\nMitigation: Require explicit user confirmation in the current turn before any POST, PUT, or DELETE action.\n\nRisk: A leaked API token could expose the connected FlowyTeam workspace.\n\nMitigation: Keep tokens out of shared chats and repositories, and prefer the API-token flow over password-based login.\n\n## Reference(s):\n\n- [ClawHub Skill Page](https://clawhub.ai/flowy-team/skills/flowyteam-mcp)\n- [FlowyTeam Website](https://flowyteam.com)\n- [FlowyTeam MCP Docs](https://flowyteam.com/get/mcp-server)\n- [FlowyTeam API Reference](https://flowyteam.com/get/mcp-docs)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance, API calls]\n\n**Output Format:** [Markdown guidance with JSON configuration snippets, shell commands, and MCP API calls]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires a FlowyTeam API token for authenticated workspace tools.]\n\n## Skill Version(s):\n\n1.1.8 (source: server release metadata and skill frontmatter)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1615,"uniquenessScore":38,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T11:23:01.078Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T11:23:01.078Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T14:14:55.663Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}