|
@@ -2,7 +2,7 @@
|
|
|
"id": "zoho-tasks",
|
|
"id": "zoho-tasks",
|
|
|
"name": "Zoho Tasks",
|
|
"name": "Zoho Tasks",
|
|
|
"description": "Zoho Projects task management integration for EU data center",
|
|
"description": "Zoho Projects task management integration for EU data center",
|
|
|
- "version": "2.0.0",
|
|
|
|
|
|
|
+ "version": "2.2.0",
|
|
|
"author": "Ferenc Szontagh & Zoë",
|
|
"author": "Ferenc Szontagh & Zoë",
|
|
|
"sdkVersion": 1,
|
|
"sdkVersion": 1,
|
|
|
"entry": "index.js",
|
|
"entry": "index.js",
|
|
@@ -18,223 +18,440 @@
|
|
|
],
|
|
],
|
|
|
"tools": [
|
|
"tools": [
|
|
|
{
|
|
{
|
|
|
- "name": "setup_auth",
|
|
|
|
|
- "description": "Exchange a Zoho grant token for access + refresh tokens. Run this ONCE after getting a grant token from the Zoho Developer Console.",
|
|
|
|
|
|
|
+ "name": "zoho_auth",
|
|
|
|
|
+ "description": "Authenticate with Zoho Projects (EU). One-time setup exchanges a grant token for refresh+access tokens; status checks current token; resolve_portal picks the portal the plugin operates against.",
|
|
|
"parameters": {
|
|
"parameters": {
|
|
|
- "type": "object",
|
|
|
|
|
- "properties": {
|
|
|
|
|
- "grant_token": { "type": "string", "description": "Grant token from Zoho Developer Console (Self Client → Generate)" }
|
|
|
|
|
- },
|
|
|
|
|
- "required": ["grant_token"]
|
|
|
|
|
|
|
+ "oneOf": [
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "setup", "description": "Exchange a Zoho grant_token for refresh + access tokens. Run ONCE." },
|
|
|
|
|
+ "grant_token": { "type": "string", "description": "Grant token from Zoho Developer Console (Self Client → Generate)." }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "grant_token"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "status", "description": "Check authentication status and token validity." }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "resolve_portal", "description": "Resolve a portal URL or display name to its numeric portal_id and persist it in plugin config." },
|
|
|
|
|
+ "portal_url": { "type": "string", "description": "Full portal URL or portal name slug." },
|
|
|
|
|
+ "portal_name": { "type": "string", "description": "Portal display name to match." }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ }
|
|
|
|
|
+ ]
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
- "name": "resolve_portal",
|
|
|
|
|
- "description": "Resolve a portal URL or name to its numeric portal ID. Call this after setup_auth to auto-configure the portal. Optionally pass portal_url or portal_name to match a specific portal.",
|
|
|
|
|
|
|
+ "name": "zoho_project",
|
|
|
|
|
+ "description": "Read-only project queries + reference data needed for task authoring (user zpuids, status ids).",
|
|
|
"parameters": {
|
|
"parameters": {
|
|
|
- "type": "object",
|
|
|
|
|
- "properties": {
|
|
|
|
|
- "portal_url": { "type": "string", "description": "Full portal URL (e.g. https://projects.zoho.eu/portal/aicaller) or portal name slug" },
|
|
|
|
|
- "portal_name": { "type": "string", "description": "Portal display name to match" }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ "oneOf": [
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "list", "description": "List all accessible projects in the portal." },
|
|
|
|
|
+ "index": { "type": "number", "description": "Page index (default 1)." }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "get", "description": "Get details for a single project." },
|
|
|
|
|
+ "project_id": { "type": "string" }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "users", "description": "List portal users. Returns zpuid, name, email — resolve these before assigning a task owner." },
|
|
|
|
|
+ "user_type": { "type": "string", "description": "active or inactive (optional)." },
|
|
|
|
|
+ "index": { "type": "number", "description": "Page index (default 1)." }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "statuses", "description": "List project-local task status IDs. Required input for zoho_task status_id." },
|
|
|
|
|
+ "project_id": { "type": "string" }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ }
|
|
|
|
|
+ ]
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
- "name": "auth_status",
|
|
|
|
|
- "description": "Check authentication status and token validity",
|
|
|
|
|
- "parameters": { "type": "object", "properties": {} }
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- "name": "list_projects",
|
|
|
|
|
- "description": "List all accessible Zoho Projects in the portal",
|
|
|
|
|
- "parameters": {
|
|
|
|
|
- "type": "object",
|
|
|
|
|
- "properties": {
|
|
|
|
|
- "index": { "type": "number", "description": "Page index (default 1)" }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- "name": "list_tasks",
|
|
|
|
|
- "description": "List tasks from a Zoho Projects project. Supports filtering by status, priority, assignee, and date range.",
|
|
|
|
|
- "parameters": {
|
|
|
|
|
- "type": "object",
|
|
|
|
|
- "properties": {
|
|
|
|
|
- "project_id": { "type": "string", "description": "Zoho Projects project ID" },
|
|
|
|
|
- "status": { "type": "string", "description": "Filter: all, completed, notcompleted (default: all)" },
|
|
|
|
|
- "priority": { "type": "string", "description": "Filter: all, none, low, medium, high" },
|
|
|
|
|
- "owner": { "type": "string", "description": "Filter: all or user ID" },
|
|
|
|
|
- "index": { "type": "number", "description": "Page index (default 1)" }
|
|
|
|
|
- },
|
|
|
|
|
- "required": ["project_id"]
|
|
|
|
|
- }
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- "name": "get_task",
|
|
|
|
|
- "description": "Get full details of a single task",
|
|
|
|
|
- "parameters": {
|
|
|
|
|
- "type": "object",
|
|
|
|
|
- "properties": {
|
|
|
|
|
- "project_id": { "type": "string", "description": "Zoho Projects project ID" },
|
|
|
|
|
- "task_id": { "type": "string", "description": "Task ID" }
|
|
|
|
|
- },
|
|
|
|
|
- "required": ["project_id", "task_id"]
|
|
|
|
|
- }
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- "name": "create_task",
|
|
|
|
|
- "description": "Create a new task in a Zoho Projects project",
|
|
|
|
|
- "parameters": {
|
|
|
|
|
- "type": "object",
|
|
|
|
|
- "properties": {
|
|
|
|
|
- "project_id": { "type": "string", "description": "Zoho Projects project ID" },
|
|
|
|
|
- "name": { "type": "string", "description": "Task name/title" },
|
|
|
|
|
- "description": { "type": "string", "description": "Task description (HTML allowed)" },
|
|
|
|
|
- "person_responsible": { "type": "string", "description": "Owner user ID(s), comma-separated" },
|
|
|
|
|
- "priority": { "type": "string", "description": "none, low, medium, high" },
|
|
|
|
|
- "start_date": { "type": "string", "description": "Start date (MM-DD-YYYY format)" },
|
|
|
|
|
- "end_date": { "type": "string", "description": "Due date (MM-DD-YYYY format)" },
|
|
|
|
|
- "tasklist_id": { "type": "string", "description": "Task list ID to add the task to" }
|
|
|
|
|
- },
|
|
|
|
|
- "required": ["project_id", "name"]
|
|
|
|
|
- }
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- "name": "update_task",
|
|
|
|
|
- "description": "Update an existing task in Zoho Projects",
|
|
|
|
|
- "parameters": {
|
|
|
|
|
- "type": "object",
|
|
|
|
|
- "properties": {
|
|
|
|
|
- "project_id": { "type": "string", "description": "Zoho Projects project ID" },
|
|
|
|
|
- "task_id": { "type": "string", "description": "Task ID to update" },
|
|
|
|
|
- "name": { "type": "string", "description": "New task name" },
|
|
|
|
|
- "description": { "type": "string", "description": "New description (HTML allowed)" },
|
|
|
|
|
- "person_responsible": { "type": "string", "description": "New owner user ID(s), comma-separated" },
|
|
|
|
|
- "priority": { "type": "string", "description": "none, low, medium, high" },
|
|
|
|
|
- "start_date": { "type": "string", "description": "New start date (MM-DD-YYYY)" },
|
|
|
|
|
- "end_date": { "type": "string", "description": "New due date (MM-DD-YYYY)" },
|
|
|
|
|
- "percent_complete": { "type": "string", "description": "Completion percentage (0-100)" }
|
|
|
|
|
- },
|
|
|
|
|
- "required": ["project_id", "task_id"]
|
|
|
|
|
- }
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- "name": "delete_task",
|
|
|
|
|
- "description": "Delete a task from Zoho Projects",
|
|
|
|
|
- "parameters": {
|
|
|
|
|
- "type": "object",
|
|
|
|
|
- "properties": {
|
|
|
|
|
- "project_id": { "type": "string", "description": "Zoho Projects project ID" },
|
|
|
|
|
- "task_id": { "type": "string", "description": "Task ID to delete" }
|
|
|
|
|
- },
|
|
|
|
|
- "required": ["project_id", "task_id"]
|
|
|
|
|
- }
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- "name": "add_comment",
|
|
|
|
|
- "description": "Add a comment to a task",
|
|
|
|
|
- "parameters": {
|
|
|
|
|
- "type": "object",
|
|
|
|
|
- "properties": {
|
|
|
|
|
- "project_id": { "type": "string", "description": "Zoho Projects project ID" },
|
|
|
|
|
- "task_id": { "type": "string", "description": "Task ID" },
|
|
|
|
|
- "content": { "type": "string", "description": "Comment text (HTML allowed)" }
|
|
|
|
|
- },
|
|
|
|
|
- "required": ["project_id", "task_id", "content"]
|
|
|
|
|
- }
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- "name": "update_comment",
|
|
|
|
|
- "description": "Update an existing comment on a task",
|
|
|
|
|
- "parameters": {
|
|
|
|
|
- "type": "object",
|
|
|
|
|
- "properties": {
|
|
|
|
|
- "project_id": { "type": "string", "description": "Zoho Projects project ID" },
|
|
|
|
|
- "task_id": { "type": "string", "description": "Task ID" },
|
|
|
|
|
- "comment_id": { "type": "string", "description": "Comment ID to update" },
|
|
|
|
|
- "content": { "type": "string", "description": "New comment text (HTML allowed)" }
|
|
|
|
|
- },
|
|
|
|
|
- "required": ["project_id", "task_id", "comment_id", "content"]
|
|
|
|
|
- }
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- "name": "delete_comment",
|
|
|
|
|
- "description": "Delete a comment from a task",
|
|
|
|
|
- "parameters": {
|
|
|
|
|
- "type": "object",
|
|
|
|
|
- "properties": {
|
|
|
|
|
- "project_id": { "type": "string", "description": "Zoho Projects project ID" },
|
|
|
|
|
- "task_id": { "type": "string", "description": "Task ID" },
|
|
|
|
|
- "comment_id": { "type": "string", "description": "Comment ID to delete" }
|
|
|
|
|
- },
|
|
|
|
|
- "required": ["project_id", "task_id", "comment_id"]
|
|
|
|
|
- }
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- "name": "my_tasks",
|
|
|
|
|
- "description": "Get tasks assigned to the authenticated user across all projects",
|
|
|
|
|
|
|
+ "name": "zoho_task",
|
|
|
|
|
+ "description": "Manage tasks. Resolve owner zpuid via zoho_project action=users; resolve status_id via zoho_project action=statuses.",
|
|
|
"parameters": {
|
|
"parameters": {
|
|
|
- "type": "object",
|
|
|
|
|
- "properties": {
|
|
|
|
|
- "status": { "type": "string", "description": "Filter: all, completed, notcompleted (default: all)" },
|
|
|
|
|
- "priority": { "type": "string", "description": "Filter: all, none, low, medium, high" },
|
|
|
|
|
- "index": { "type": "number", "description": "Page index (default 1)" }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ "oneOf": [
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "list", "description": "List tasks in a project with optional filters." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "status": { "type": "string", "description": "all, completed, notcompleted (default all)." },
|
|
|
|
|
+ "priority": { "type": "string", "description": "all, none, low, medium, high." },
|
|
|
|
|
+ "owner": { "type": "string", "description": "all or zpuid." },
|
|
|
|
|
+ "milestone_id": { "type": "string" },
|
|
|
|
|
+ "tasklist_id": { "type": "string" },
|
|
|
|
|
+ "index": { "type": "number", "description": "Page index (default 1)." }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "get", "description": "Get full details of a single task." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "task_id": { "type": "string" }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id", "task_id"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "create", "description": "Create a new task." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "name": { "type": "string", "description": "Task name/title." },
|
|
|
|
|
+ "description": { "type": "string", "description": "HTML allowed." },
|
|
|
|
|
+ "person_responsible": { "type": "string", "description": "Owner zpuid(s), comma-separated." },
|
|
|
|
|
+ "priority": { "type": "string", "description": "none, low, medium, high." },
|
|
|
|
|
+ "start_date": { "type": "string", "description": "MM-DD-YYYY." },
|
|
|
|
|
+ "end_date": { "type": "string", "description": "MM-DD-YYYY." },
|
|
|
|
|
+ "tasklist_id": { "type": "string" },
|
|
|
|
|
+ "milestone_id": { "type": "string" },
|
|
|
|
|
+ "status_id": { "type": "string", "description": "From zoho_project action=statuses." },
|
|
|
|
|
+ "parent_task_id": { "type": "string", "description": "If set, the new task becomes a subtask of this one." },
|
|
|
|
|
+ "billing_type": { "type": "string", "description": "billable, non_billable." },
|
|
|
|
|
+ "percent_complete": { "type": "string", "description": "0-100." }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id", "name"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "update", "description": "Modify an existing task." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "task_id": { "type": "string" },
|
|
|
|
|
+ "name": { "type": "string" },
|
|
|
|
|
+ "description": { "type": "string", "description": "HTML allowed." },
|
|
|
|
|
+ "person_responsible": { "type": "string", "description": "Owner zpuid(s), comma-separated." },
|
|
|
|
|
+ "priority": { "type": "string", "description": "none, low, medium, high." },
|
|
|
|
|
+ "start_date": { "type": "string", "description": "MM-DD-YYYY." },
|
|
|
|
|
+ "end_date": { "type": "string", "description": "MM-DD-YYYY." },
|
|
|
|
|
+ "tasklist_id": { "type": "string" },
|
|
|
|
|
+ "milestone_id": { "type": "string" },
|
|
|
|
|
+ "status_id": { "type": "string" },
|
|
|
|
|
+ "billing_type": { "type": "string" },
|
|
|
|
|
+ "percent_complete": { "type": "string" }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id", "task_id"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "delete", "description": "Delete a task." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "task_id": { "type": "string" }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id", "task_id"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "subtasks", "description": "List subtasks of a given task." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "task_id": { "type": "string" }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id", "task_id"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "my", "description": "Tasks assigned to the authenticated user across all projects." },
|
|
|
|
|
+ "status": { "type": "string", "description": "all, completed, notcompleted." },
|
|
|
|
|
+ "priority": { "type": "string" },
|
|
|
|
|
+ "index": { "type": "number" }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "search", "description": "Keyword search across all projects (or a single project if project_id is set)." },
|
|
|
|
|
+ "query": { "type": "string" },
|
|
|
|
|
+ "project_id": { "type": "string" }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "query"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ }
|
|
|
|
|
+ ]
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
- "name": "search_tasks",
|
|
|
|
|
- "description": "Search tasks by keyword across all projects in the portal",
|
|
|
|
|
|
|
+ "name": "zoho_comment",
|
|
|
|
|
+ "description": "Manage task comments.",
|
|
|
"parameters": {
|
|
"parameters": {
|
|
|
- "type": "object",
|
|
|
|
|
- "properties": {
|
|
|
|
|
- "query": { "type": "string", "description": "Search term" },
|
|
|
|
|
- "project_id": { "type": "string", "description": "Optional: limit search to a specific project" }
|
|
|
|
|
- },
|
|
|
|
|
- "required": ["query"]
|
|
|
|
|
|
|
+ "oneOf": [
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "list", "description": "List comments on a task." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "task_id": { "type": "string" },
|
|
|
|
|
+ "index": { "type": "number" }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id", "task_id"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "add", "description": "Add a comment to a task." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "task_id": { "type": "string" },
|
|
|
|
|
+ "content": { "type": "string", "description": "HTML allowed." }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id", "task_id", "content"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "update", "description": "Update an existing comment." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "task_id": { "type": "string" },
|
|
|
|
|
+ "comment_id": { "type": "string" },
|
|
|
|
|
+ "content": { "type": "string", "description": "HTML allowed." }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id", "task_id", "comment_id", "content"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "delete", "description": "Delete a comment." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "task_id": { "type": "string" },
|
|
|
|
|
+ "comment_id": { "type": "string" }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id", "task_id", "comment_id"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ }
|
|
|
|
|
+ ]
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
- "name": "log_time",
|
|
|
|
|
- "description": "Log time (timesheet entry) against a task in Zoho Projects",
|
|
|
|
|
|
|
+ "name": "zoho_milestone",
|
|
|
|
|
+ "description": "Manage project milestones.",
|
|
|
"parameters": {
|
|
"parameters": {
|
|
|
- "type": "object",
|
|
|
|
|
- "properties": {
|
|
|
|
|
- "project_id": { "type": "string", "description": "Zoho Projects project ID" },
|
|
|
|
|
- "task_id": { "type": "string", "description": "Task ID to log time against" },
|
|
|
|
|
- "hours": { "type": "number", "description": "Hours worked (can include decimals, e.g. 1.5 for 1h 30m)" },
|
|
|
|
|
- "minutes": { "type": "number", "description": "Additional minutes (optional)" },
|
|
|
|
|
- "date": { "type": "string", "description": "Date of work (MM-DD-YYYY format, default: today)" },
|
|
|
|
|
- "notes": { "type": "string", "description": "Description of the work done" }
|
|
|
|
|
- },
|
|
|
|
|
- "required": ["project_id", "task_id", "hours"]
|
|
|
|
|
|
|
+ "oneOf": [
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "list", "description": "List milestones in a project." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "status": { "type": "string", "description": "internal, external, upcoming, delayed, completed, all." },
|
|
|
|
|
+ "index": { "type": "number" }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "create", "description": "Create a new milestone." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "name": { "type": "string" },
|
|
|
|
|
+ "start_date": { "type": "string", "description": "MM-DD-YYYY." },
|
|
|
|
|
+ "end_date": { "type": "string", "description": "MM-DD-YYYY." },
|
|
|
|
|
+ "owner": { "type": "string", "description": "Owner zpuid." },
|
|
|
|
|
+ "flag": { "type": "string", "description": "internal or external." },
|
|
|
|
|
+ "milestone_type": { "type": "string", "description": "general or custom." }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id", "name"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "update", "description": "Update a milestone." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "milestone_id": { "type": "string" },
|
|
|
|
|
+ "name": { "type": "string" },
|
|
|
|
|
+ "start_date": { "type": "string" },
|
|
|
|
|
+ "end_date": { "type": "string" },
|
|
|
|
|
+ "owner": { "type": "string" },
|
|
|
|
|
+ "flag": { "type": "string" },
|
|
|
|
|
+ "status": { "type": "string", "description": "active, archived, completed." }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id", "milestone_id"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "delete", "description": "Delete a milestone." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "milestone_id": { "type": "string" }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id", "milestone_id"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ }
|
|
|
|
|
+ ]
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
- "name": "list_timesheets",
|
|
|
|
|
- "description": "List timesheet entries for a project, optionally filtered by task and date range",
|
|
|
|
|
|
|
+ "name": "zoho_tasklist",
|
|
|
|
|
+ "description": "Manage tasklists within a project (or list portal-wide).",
|
|
|
"parameters": {
|
|
"parameters": {
|
|
|
- "type": "object",
|
|
|
|
|
- "properties": {
|
|
|
|
|
- "project_id": { "type": "string", "description": "Zoho Projects project ID" },
|
|
|
|
|
- "task_id": { "type": "string", "description": "Optional: filter by task ID" },
|
|
|
|
|
- "from_date": { "type": "string", "description": "Start date (MM-DD-YYYY)" },
|
|
|
|
|
- "to_date": { "type": "string", "description": "End date (MM-DD-YYYY)" },
|
|
|
|
|
- "index": { "type": "number", "description": "Page index (default 1)" }
|
|
|
|
|
- },
|
|
|
|
|
- "required": ["project_id"]
|
|
|
|
|
|
|
+ "oneOf": [
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "list", "description": "List tasklists in a project, or portal-wide if project_id is omitted." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "flag": { "type": "string", "description": "internal or external." },
|
|
|
|
|
+ "index": { "type": "number" }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "get", "description": "Get details of a single tasklist." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "tasklist_id": { "type": "string" }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id", "tasklist_id"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "create", "description": "Create a new tasklist." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "name": { "type": "string" },
|
|
|
|
|
+ "milestone_id": { "type": "string" },
|
|
|
|
|
+ "flag": { "type": "string", "description": "internal or external." },
|
|
|
|
|
+ "status": { "type": "string", "description": "active or archived." }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id", "name"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "update", "description": "Update a tasklist." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "tasklist_id": { "type": "string" },
|
|
|
|
|
+ "name": { "type": "string" },
|
|
|
|
|
+ "milestone_id": { "type": "string" },
|
|
|
|
|
+ "flag": { "type": "string" },
|
|
|
|
|
+ "status": { "type": "string" }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id", "tasklist_id"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "delete", "description": "Delete a tasklist." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "tasklist_id": { "type": "string" }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id", "tasklist_id"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ }
|
|
|
|
|
+ ]
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
- "name": "delete_timesheet",
|
|
|
|
|
- "description": "Delete a timesheet entry from a Zoho Projects project",
|
|
|
|
|
|
|
+ "name": "zoho_timesheet",
|
|
|
|
|
+ "description": "Manage time log entries against tasks.",
|
|
|
"parameters": {
|
|
"parameters": {
|
|
|
- "type": "object",
|
|
|
|
|
- "properties": {
|
|
|
|
|
- "project_id": { "type": "string", "description": "Zoho Projects project ID" },
|
|
|
|
|
- "log_id": { "type": "string", "description": "Timesheet log ID to delete" }
|
|
|
|
|
- },
|
|
|
|
|
- "required": ["project_id", "log_id"]
|
|
|
|
|
|
|
+ "oneOf": [
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "list", "description": "List timesheet entries for a project, optionally filtered by task and date range." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "task_id": { "type": "string", "description": "Filter by task id (optional)." },
|
|
|
|
|
+ "from_date": { "type": "string", "description": "MM-DD-YYYY. Default: 30 days ago." },
|
|
|
|
|
+ "to_date": { "type": "string", "description": "MM-DD-YYYY. Default: today." },
|
|
|
|
|
+ "index": { "type": "number", "description": "Page index (default 1)." }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "create", "description": "Log time against a task." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "task_id": { "type": "string" },
|
|
|
|
|
+ "hours": { "type": "number", "description": "Hours worked (decimals allowed, e.g. 1.5)." },
|
|
|
|
|
+ "minutes": { "type": "number", "description": "Additional minutes (optional)." },
|
|
|
|
|
+ "date": { "type": "string", "description": "MM-DD-YYYY. Default: today." },
|
|
|
|
|
+ "notes": { "type": "string", "description": "Description of the work done." },
|
|
|
|
|
+ "bill_status": { "type": "string", "description": "Billable or Non Billable. Default: Billable." }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id", "task_id", "hours"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "update", "description": "Modify an existing time log entry." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "log_id": { "type": "string" },
|
|
|
|
|
+ "hours": { "type": "number" },
|
|
|
|
|
+ "minutes": { "type": "number" },
|
|
|
|
|
+ "date": { "type": "string", "description": "MM-DD-YYYY." },
|
|
|
|
|
+ "notes": { "type": "string" },
|
|
|
|
|
+ "log_name": { "type": "string" },
|
|
|
|
|
+ "bill_status": { "type": "string" }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id", "log_id"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ },
|
|
|
|
|
+ {
|
|
|
|
|
+ "type": "object",
|
|
|
|
|
+ "properties": {
|
|
|
|
|
+ "action": { "const": "delete", "description": "Delete a time log entry." },
|
|
|
|
|
+ "project_id": { "type": "string" },
|
|
|
|
|
+ "log_id": { "type": "string" }
|
|
|
|
|
+ },
|
|
|
|
|
+ "required": ["action", "project_id", "log_id"],
|
|
|
|
|
+ "additionalProperties": false
|
|
|
|
|
+ }
|
|
|
|
|
+ ]
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
],
|
|
],
|