{"name":"com.teamwork/mcp","slug":"teamwork-mcp","title":null,"description":"The Teamwork.com official MCP server helps teams efficiently manage client projects with AI.","url":"https://mcp.market/server/teamwork-mcp","rating":null,"grade":"A","score":89,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":34,"stars":25,"forks":18,"downloads_week":null,"last_push_at":"2026-09-18T17:19:57.000Z","license":"MIT"},"claimed":false,"transport":"mixed","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/teamwork/mcp","website":null,"version":"1.43.2","remotes":[{"type":"sse","url":"https://mcp.ai.teamwork.com/sse","headers":[{"description":"API key generated from the Teamwork.com OAuth2 process: https://apidocs.teamwork.com/guides/teamwork/app-login-flow","isRequired":true,"isSecret":true,"name":"Authorization"}]},{"type":"streamable-http","url":"https://mcp.ai.teamwork.com","headers":[{"description":"API key generated from the Teamwork.com OAuth2 process: https://apidocs.teamwork.com/guides/teamwork/app-login-flow","isRequired":true,"isSecret":true,"name":"Authorization"}]}],"packages":[{"registryType":"oci","identifier":"docker.io/teamwork/mcp:v1.43.2","transport":{"type":"stdio"},"environmentVariables":[{"description":"API key generated from the Teamwork.com OAuth2 process: https://apidocs.teamwork.com/guides/teamwork/app-login-flow","isRequired":true,"format":"string","isSecret":true,"name":"TW_MCP_BEARER_TOKEN"},{"description":"Choose log output format between 'text' or 'json'. Default is 'text'.","format":"string","name":"TW_MCP_LOG_FORMAT"},{"description":"Choose log level between 'debug', 'info', 'warn' or 'error'. Default is 'info'.","format":"string","name":"TW_MCP_LOG_LEVEL"}]}],"tools":[{"name":"twchat-get_conversation","description":"Get a single Teamwork Chat conversation by ID.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"conversation_id":{"type":"integer","description":"The ID of the conversation to retrieve."}},"required":["conversation_id"]}},{"name":"twchat-get_current_user","description":"Get the current authenticated Teamwork Chat user, including identity, counts (unread conversations/messages, mentions), and settings.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"twchat-get_or_create_dm","description":"Get the 1:1 direct-message conversation with a person, creating it if it does not exist yet. Returns the conversation (use its id with send_message). Use list_people to find user_id. The authenticated user cannot be the target: naming your own user id is rejected.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"user_id":{"type":"integer","description":"The ID of the person to get the direct-message conversation with. Must be somebody other than the authenticated user; see get_current_user."}},"required":["user_id"]}},{"name":"twchat-list_conversations","description":"List Teamwork Chat conversations the current user is a member of.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"include_message_data":{"type":"boolean","description":"Include the latest message in each conversation."},"page_limit":{"type":"integer","description":"Number of conversations to return (max 10)."},"page_offset":{"type":"integer","description":"The index position to start retrieving results from (not a page number)."},"search_term":{"type":"string","description":"A search term to filter conversations by title."},"sort":{"type":"string","description":"Sort order for the returned conversations.","enum":["name","lastActivityAt","createdAt","updatedAt","relevance"]},"status":{"type":"string","description":"Filter by conversation status.","enum":["all","active"]},"type":{"type":"string","description":"Filter by conversation type: \"rooms\" for group/channel conversations, \"pair\" for 1:1 direct messages.","enum":["rooms","pair"]}}}},{"name":"twchat-list_messages","description":"List messages within a Teamwork Chat conversation. Requires conversation_id.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"after_message_id":{"type":"integer","description":"Return messages newer than this message ID (cursor)."},"before_message_id":{"type":"integer","description":"Return messages older than this message ID (cursor)."},"conversation_id":{"type":"integer","description":"The ID of the conversation to read messages from."},"created_after":{"description":"Return messages created after this time. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"created_before":{"description":"Return messages created before this time. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of messages per page (1-200)."},"search_term":{"type":"string","description":"A search term to filter messages by text content."}},"required":["conversation_id"]}},{"name":"twchat-list_people","description":"List people in the Teamwork Chat installation. Useful for resolving names to user IDs.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"page_limit":{"type":"integer","description":"Number of people to return."},"page_offset":{"type":"integer","description":"The index position to start retrieving results from (not a page number)."},"search_term":{"type":"string","description":"A search term to filter people by name or email."}}}},{"name":"twchat-send_dm","description":"Send a direct message to a person, resolving (or creating) the 1:1 conversation automatically. Requires user_id and body. Use list_people to find user_id. The authenticated user cannot be the recipient: naming your own user id is rejected and nothing is sent, so report a summary in the conversation instead of messaging yourself in chat.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"body":{"type":"string","description":"The message text. Supports Markdown."},"user_id":{"type":"integer","description":"The ID of the person to send the direct message to. Must be somebody other than the authenticated user; see get_current_user."}},"required":["user_id","body"]}},{"name":"twchat-send_message","description":"Send a message to a Teamwork Chat conversation. Requires conversation_id and body.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"body":{"type":"string","description":"The message text. Supports Markdown."},"conversation_id":{"type":"integer","description":"The ID of the conversation to post the message to."}},"required":["conversation_id","body"]}},{"name":"twdesk-create_company","description":"Create Desk company.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"description":{"type":"string","description":"The description of the company."},"details":{"type":"string","description":"The details of the company."},"domains":{"type":"array","items":{"type":"string"},"description":"The domains for the company."},"industry":{"type":"string","description":"The industry of the company."},"kind":{"type":"string","description":"The kind of the company.","enum":["company","group"]},"name":{"type":"string","description":"The name of the company."},"note":{"type":"string","description":"The note for the company."},"permission":{"type":"string","description":"The permission level of the company.","enum":["own","all"]},"website":{"type":"string","description":"The website of the company."}},"required":["name"],"additionalProperties":false}},{"name":"twdesk-create_customer","description":"Create customer.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"address":{"type":"string","description":"The address of the customer."},"email":{"type":"string","description":"The email of the customer."},"extraData":{"type":"string","description":"The extra data of the customer."},"facebookURL":{"type":"string","description":"The Facebook URL of the customer."},"firstName":{"type":"string","description":"The first name of the customer."},"jobTitle":{"type":"string","description":"The job title of the customer."},"lastName":{"type":"string","description":"The last name of the customer."},"linkedinURL":{"type":"string","description":"The LinkedIn URL of the customer."},"mobile":{"type":"string","description":"The mobile number of the customer."},"notes":{"type":"string","description":"The notes of the customer."},"organization":{"type":"string","description":"The organization of the customer."},"phone":{"type":"string","description":"The phone number of the customer."},"twitterHandle":{"type":"string","description":"The Twitter handle of the customer."}},"additionalProperties":false}},{"name":"twdesk-create_file","description":"Upload file. Attach the returned ID to tickets or messages.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"data":{"type":"string","description":"The content of the file as a base64-encoded string."},"disposition":{"type":"string","description":"The disposition of the file.","enum":["attachment","attachment-inline"]},"mimeType":{"type":"string","description":"The MIME type of the file."},"name":{"type":"string","description":"The name of the file."}},"required":["name","mimeType","data"],"additionalProperties":false}},{"name":"twdesk-create_helpdoc_article","description":"Create a new help doc article.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"contents":{"type":"string","description":"The body content of the article."},"description":{"type":"string","description":"A short description / summary of the article."},"isPrivate":{"type":"boolean","description":"Set to true to make the article private."},"siteID":{"type":"integer","description":"The ID of the help doc site to create the article in. Use twdesk-list_helpdoc_sites to discover."},"status":{"type":"string","description":"Publication status of the article (e.g. \"published\", \"draft\")."},"title":{"type":"string","description":"The title of the article."}},"required":["siteID","title"],"additionalProperties":false}},{"name":"twdesk-create_priority","description":"Create ticket priority.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"color":{"type":"string","description":"The color of the priority."},"name":{"type":"string","description":"The name of the priority."}},"required":["name"],"additionalProperties":false}},{"name":"twdesk-create_status","description":"Create ticket status.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"color":{"type":"string","description":"The color of the status."},"displayOrder":{"type":"integer","description":"The display order of the status."},"name":{"type":"string","description":"The name of the status."}},"required":["name"],"additionalProperties":false}},{"name":"twdesk-create_tag","description":"Create Desk tag.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"color":{"type":"string","description":"The color of the tag."},"name":{"type":"string","description":"The name of the tag."}},"required":["name"],"additionalProperties":false}},{"name":"twdesk-create_ticket","description":"Create ticket.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"integer","description":"Agent the ticket is assigned to. Use twdesk-list_users to discover."},"bcc":{"type":"array","items":{"type":"string"},"description":"Email addresses to BCC."},"body":{"type":"string","description":"The body of the ticket."},"cc":{"type":"array","items":{"type":"string"},"description":"Email addresses to CC."},"customerEmail":{"type":"string","description":"Customer email; required when customerId is not given. Existing customers are matched, otherwise a new customer is created."},"customerId":{"type":"integer","description":"Customer of the ticket. Use twdesk-list_customers to discover."},"files":{"type":"array","items":{"type":"integer"},"description":"File IDs to attach. Use twdesk-create_file to upload."},"inboxId":{"type":"integer","description":"Inbox of the ticket. Use twdesk-list_inboxes to discover."},"notifyCustomer":{"type":"boolean","description":"Set to true if the customer should be sent a copy of the ticket."},"priorityId":{"type":"integer","description":"Priority of the ticket. Use twdesk-list_priorities to discover."},"statusId":{"type":"integer","description":"Status of the ticket. Use twdesk-list_statuses to discover."},"subject":{"type":"string","description":"The subject of the ticket."},"tags":{"type":"array","items":{"type":"integer"},"description":"Tags to associate with the ticket. Use twdesk-list_tags to discover."},"typeId":{"type":"integer","description":"Ticket type. Use twdesk-list_ticket_types to discover."}},"required":["subject","body","inboxId"],"additionalProperties":false}},{"name":"twdesk-create_ticket_type","description":"Create ticket type.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"displayOrder":{"type":"integer","description":"The display order of the type."},"enabledForFutureInboxes":{"type":"boolean","description":"Whether the type is enabled for future inboxes."},"name":{"type":"string","description":"The name of the ticket type."}},"required":["name"],"additionalProperties":false}},{"name":"twdesk-get_company","description":"Get Desk company (customer organization).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string"},"description":"Sparse fieldset: field names to include (e.g. [\"id\",\"name\"]). Omit to receive all fields."},"id":{"type":"integer","description":"The ID of the company to retrieve."}},"required":["id"],"additionalProperties":false}},{"name":"twdesk-get_customer","description":"Get customer.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string"},"description":"Sparse fieldset: field names to include (e.g. [\"id\",\"name\"]). Omit to receive all fields."},"id":{"type":"integer","description":"The ID of the customer to retrieve."}},"required":["id"],"additionalProperties":false}},{"name":"twdesk-get_helpdoc_article","description":"Get a help doc article by ID.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string"},"description":"Sparse fieldset: field names to include (e.g. [\"id\",\"name\"]). Omit to receive all fields."},"id":{"type":"integer","description":"The ID of the help doc article to retrieve."}},"required":["id"],"additionalProperties":false}},{"name":"twdesk-get_helpdoc_site","description":"Get a help doc site (knowledge base) by ID, including its subdomain, branding and article counts.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string"},"description":"Sparse fieldset: field names to include (e.g. [\"id\",\"name\"]). Omit to receive all fields."},"id":{"type":"integer","description":"The ID of the help doc site to retrieve."}},"required":["id"],"additionalProperties":false}},{"name":"twdesk-get_inbox","description":"Get inbox.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string"},"description":"Sparse fieldset: field names to include (e.g. [\"id\",\"name\"]). Omit to receive all fields."},"id":{"type":"integer","description":"The ID of the inbox to retrieve."}},"required":["id"],"additionalProperties":false}},{"name":"twdesk-get_priority","description":"Get ticket priority.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string"},"description":"Sparse fieldset: field names to include (e.g. [\"id\",\"name\"]). Omit to receive all fields."},"id":{"type":"integer","description":"The ID of the priority to retrieve."}},"required":["id"],"additionalProperties":false}},{"name":"twdesk-get_status","description":"Get ticket status.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string"},"description":"Sparse fieldset: field names to include (e.g. [\"id\",\"name\"]). Omit to receive all fields."},"id":{"type":"integer","description":"The ID of the status to retrieve."}},"required":["id"],"additionalProperties":false}},{"name":"twdesk-get_tag","description":"Get Desk tag.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string"},"description":"Sparse fieldset: field names to include (e.g. [\"id\",\"name\"]). Omit to receive all fields."},"id":{"type":"integer","description":"The ID of the tag to retrieve."}},"required":["id"],"additionalProperties":false}},{"name":"twdesk-get_ticket","description":"Get ticket.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string"},"description":"Sparse fieldset: field names to include (e.g. [\"id\",\"name\"]). Omit to receive all fields."},"id":{"type":"integer","description":"The ID of the ticket to retrieve."}},"required":["id"],"additionalProperties":false}},{"name":"twdesk-get_ticket_type","description":"Get ticket type.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string"},"description":"Sparse fieldset: field names to include (e.g. [\"id\",\"name\"]). Omit to receive all fields."},"id":{"type":"integer","description":"The ID of the ticket type to retrieve."}},"required":["id"],"additionalProperties":false}},{"name":"twdesk-get_user","description":"Get support agent.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string"},"description":"Sparse fieldset: field names to include (e.g. [\"id\",\"name\"]). Omit to receive all fields."},"id":{"type":"integer","description":"The ID of the user to retrieve."}},"required":["id"],"additionalProperties":false}},{"name":"twdesk-link_task_to_ticket","description":"Link a Teamwork Projects task to a Desk ticket, so the ticket shows the work tracked by that task.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"taskId":{"type":"integer","description":"The ID of the Teamwork Projects task. Use twprojects-list_tasks or twprojects-search to discover."},"ticketId":{"type":"integer","description":"The ID of the Desk ticket. Use twdesk-search_tickets to discover."}},"required":["ticketId","taskId"],"additionalProperties":false}},{"name":"twdesk-list_companies","description":"List Desk companies. Filter by name, domains, or kind.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"domains":{"type":"array","items":{"type":"string"},"description":"The domains of the company to filter by."},"fields":{"type":"array","items":{"type":"string"},"description":"Sparse fieldset: field names to include (e.g. [\"id\",\"name\"]). Omit to receive all fields."},"kind":{"type":"string","description":"The kind of the company to filter by.","enum":["company","group"]},"name":{"type":"string","description":"The name of the company to filter by."},"orderBy":{"type":"string","description":"The field to order the results by."},"orderDirection":{"type":"string","description":"The direction to order the results by (asc, desc).","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"pageSize":{"type":"integer","description":"Number of results per page for pagination (1-100). The API silently reduces anything above 100, so a larger value returns fewer results rather than more.","minimum":1,"maximum":100}},"additionalProperties":false}},{"name":"twdesk-list_customers","description":"List customers. Filter by company or email.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"companyIDs":{"type":"array","items":{"type":"integer"},"description":"The IDs of the companies to filter by."},"companyNames":{"type":"array","items":{"type":"string"},"description":"The names of the companies to filter by."},"emails":{"type":"array","items":{"type":"string"},"description":"The emails of the customers to filter by."},"fields":{"type":"array","items":{"type":"string"},"description":"Sparse fieldset: field names to include (e.g. [\"id\",\"name\"]). Omit to receive all fields."},"orderBy":{"type":"string","description":"The field to order the results by."},"orderDirection":{"type":"string","description":"The direction to order the results by (asc, desc).","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"pageSize":{"type":"integer","description":"Number of results per page for pagination (1-100). The API silently reduces anything above 100, so a larger value returns fewer results rather than more.","minimum":1,"maximum":100}},"additionalProperties":false}},{"name":"twdesk-list_helpdoc_sites","description":"List help doc sites (knowledge bases). Filter by name or subdomain. Use this to discover the site ID required by the help doc article tools.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string"},"description":"Sparse fieldset: field names to include (e.g. [\"id\",\"name\"]). Omit to receive all fields."},"name":{"type":"array","items":{"type":"string"},"description":"The name of the help doc site to filter by."},"orderBy":{"type":"string","description":"The field to order the results by."},"orderDirection":{"type":"string","description":"The direction to order the results by (asc, desc).","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"pageSize":{"type":"integer","description":"Number of results per page for pagination (1-100). The API silently reduces anything above 100, so a larger value returns fewer results rather than more.","minimum":1,"maximum":100},"subdomain":{"type":"array","items":{"type":"string"},"description":"The subdomain of the help doc site to filter by."}},"additionalProperties":false}},{"name":"twdesk-list_inboxes","description":"List inboxes. Filter by name or email.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"email":{"type":"array","items":{"type":"string"},"description":"The email of the inbox to filter by."},"fields":{"type":"array","items":{"type":"string"},"description":"Sparse fieldset: field names to include (e.g. [\"id\",\"name\"]). Omit to receive all fields."},"name":{"type":"array","items":{"type":"string"},"description":"The name of the inbox to filter by."},"orderBy":{"type":"string","description":"The field to order the results by."},"orderDirection":{"type":"string","description":"The direction to order the results by (asc, desc).","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"pageSize":{"type":"integer","description":"Number of results per page for pagination (1-100). The API silently reduces anything above 100, so a larger value returns fewer results rather than more.","minimum":1,"maximum":100}},"additionalProperties":false}},{"name":"twdesk-list_priorities","description":"List ticket priorities. Filter by name or color.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"color":{"type":"array","items":{"type":"string"},"description":"The color of the priority to filter by."},"fields":{"type":"array","items":{"type":"string"},"description":"Sparse fieldset: field names to include (e.g. [\"id\",\"name\"]). Omit to receive all fields."},"name":{"type":"array","items":{"type":"string"},"description":"The name of the priority to filter by."},"orderBy":{"type":"string","description":"The field to order the results by."},"orderDirection":{"type":"string","description":"The direction to order the results by (asc, desc).","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"pageSize":{"type":"integer","description":"Number of results per page for pagination (1-100). The API silently reduces anything above 100, so a larger value returns fewer results rather than more.","minimum":1,"maximum":100}},"additionalProperties":false}},{"name":"twdesk-list_statuses","description":"List ticket statuses. Filter by name, color, or code.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"code":{"type":"array","items":{"type":"string"},"description":"The code of the status to filter by."},"color":{"type":"array","items":{"type":"string"},"description":"The color of the status to filter by."},"fields":{"type":"array","items":{"type":"string"},"description":"Sparse fieldset: field names to include (e.g. [\"id\",\"name\"]). Omit to receive all fields."},"name":{"type":"array","items":{"type":"string"},"description":"The name of the status to filter by."},"orderBy":{"type":"string","description":"The field to order the results by."},"orderDirection":{"type":"string","description":"The direction to order the results by (asc, desc).","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"pageSize":{"type":"integer","description":"Number of results per page for pagination (1-100). The API silently reduces anything above 100, so a larger value returns fewer results rather than more.","minimum":1,"maximum":100}},"additionalProperties":false}},{"name":"twdesk-list_tags","description":"List Desk tags. Filter by name, color, or inbox.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"color":{"type":"string","description":"The color of the tag to filter by."},"fields":{"type":"array","items":{"type":"string"},"description":"Sparse fieldset: field names to include (e.g. [\"id\",\"name\"]). Omit to receive all fields."},"inboxIDs":{"type":"array","items":{"type":"integer"},"description":"The IDs of the inboxes to filter by."},"name":{"type":"string","description":"The name of the tag to filter by."},"orderBy":{"type":"string","description":"The field to order the results by."},"orderDirection":{"type":"string","description":"The direction to order the results by (asc, desc).","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"pageSize":{"type":"integer","description":"Number of results per page for pagination (1-100). The API silently reduces anything above 100, so a larger value returns fewer results rather than more.","minimum":1,"maximum":100}},"additionalProperties":false}},{"name":"twdesk-list_ticket_types","description":"List ticket types. Filter by name or inbox.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string"},"description":"Sparse fieldset: field names to include (e.g. [\"id\",\"name\"]). Omit to receive all fields."},"inboxIDs":{"type":"array","items":{"type":"integer"},"description":"Filter by inbox. Use twdesk-list_inboxes to discover."},"name":{"type":"array","items":{"type":"string"},"description":"The name of the type to filter by."},"orderBy":{"type":"string","description":"The field to order the results by."},"orderDirection":{"type":"string","description":"The direction to order the results by (asc, desc).","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"pageSize":{"type":"integer","description":"Number of results per page for pagination (1-100). The API silently reduces anything above 100, so a larger value returns fewer results rather than more.","minimum":1,"maximum":100}},"additionalProperties":false}},{"name":"twdesk-list_users","description":"List support agents. For customers, use twdesk-list_customers.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"email":{"type":"array","items":{"type":"string"},"description":"The email addresses of the users to filter by."},"fields":{"type":"array","items":{"type":"string"},"description":"Sparse fieldset: field names to include (e.g. [\"id\",\"name\"]). Omit to receive all fields."},"firstName":{"type":"array","items":{"type":"string"},"description":"The first names of the users to filter by."},"inboxIDs":{"type":"array","items":{"type":"integer"},"description":"The IDs of the inboxes to filter by."},"isPartTime":{"type":"boolean","description":"Whether to include part-time users in the results."},"lastName":{"type":"array","items":{"type":"string"},"description":"The last names of the users to filter by."},"orderBy":{"type":"string","description":"The field to order the results by."},"orderDirection":{"type":"string","description":"The direction to order the results by (asc, desc).","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"pageSize":{"type":"integer","description":"Number of results per page for pagination (1-100). The API silently reduces anything above 100, so a larger value returns fewer results rather than more.","minimum":1,"maximum":100}},"additionalProperties":false}},{"name":"twdesk-reply_ticket","description":"Reply to a ticket. Use threadType=note for internal agent notes.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"bcc":{"type":"array","items":{"type":"string"},"description":"Email addresses to BCC."},"body":{"type":"string","description":"The body of the message."},"cc":{"type":"array","items":{"type":"string"},"description":"Email addresses to CC."},"threadType":{"type":"string","description":"'message' is a customer-facing reply; 'note' is an internal agent note.","default":"message","enum":["message","note"]},"ticketID":{"type":"integer","description":"The ID of the ticket that the message will be sent to."}},"required":["ticketID","body"],"additionalProperties":false}},{"name":"twdesk-search_helpdoc_articles","description":"Search help doc articles. Filter by search term, status, site, or category.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"categoryID":{"type":"integer","description":"Filter by help doc category ID."},"page":{"type":"integer","description":"Page number (1-based)."},"pageSize":{"type":"integer","description":"Number of results per page."},"search":{"type":"string","description":"Free-text search term matched against article title and content."},"siteID":{"type":"integer","description":"Filter by help doc site ID. Use twdesk-list_helpdoc_sites to discover."},"status":{"type":"string","description":"Filter by article status (e.g. \"published\", \"draft\")."}},"additionalProperties":false}},{"name":"twdesk-search_tickets","description":"Search tickets. Filter by inbox, customer, company, tag, status, priority, user, or creation date range. Name the attributes you need in fields: a ticket returned whole carries every activity, message, file and timelog identifier it has, and a full page of those is large enough to be truncated in transit. The record and page totals saturate at 10000: a search reporting exactly that many has 10000 or more, and asking for a page past the 10000th result is rejected rather than answered empty, so narrow the filters instead of paging deeper.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"companyIDs":{"type":"array","items":{"type":"integer"},"description":"Filter by company. Use twdesk-list_companies to discover."},"createdAfter":{"description":"Filter by ticket creation date: only tickets created on or after this day. This search filters by whole days, so a time of day is ignored. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"createdBefore":{"description":"Filter by ticket creation date: only tickets created on or before this day. This search filters by whole days, so a time of day is ignored. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"customerIDs":{"type":"array","items":{"type":"integer"},"description":"Filter by customer. Use twdesk-list_customers to discover."},"fields":{"type":"array","items":{"type":"string","enum":["activities","agent","bcc","message","cc","contact","customer","files","happinessSurveySentAt","imagesHidden","inbox","isRead","messageCount","messages","notifyCustomer","originalRecipient","previewText","priority","readonly","resolutionTimeMins","responseTimeMins","source","spam_rules","spam_score","status","subject","suggestions","tags","tasks","timelogs","type","id","createdAt","updatedAt","createdBy","updatedBy","state"]},"description":"The attributes to return for each ticket, from the listed names. Omit to receive the whole record, which carries every activity, message, file and timelog identifier the ticket has and is large enough that a full page of them may be truncated before it reaches you. Name the attributes you need. \"id\" is always returned."},"inboxIDs":{"type":"array","items":{"type":"integer"},"description":"Filter by inbox. Use twdesk-list_inboxes to discover."},"omitMerged":{"type":"boolean","description":"If true, exclude tickets that have been merged into another ticket. Merged tickets are not a status, so they cannot be filtered out with statusIDs. Defaults to false, which returns them alongside the rest.","default":false},"orderBy":{"type":"string","description":"The field to order the results by."},"orderDirection":{"type":"string","description":"The direction to order the results by (asc, desc).","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"pageSize":{"type":"integer","description":"Number of results per page for pagination (1-200). The API silently reduces anything above 200, so a larger value returns fewer results rather than more.","minimum":1,"maximum":200},"priorityIDs":{"type":"array","items":{"type":"integer"},"description":"Filter by priority. Use twdesk-list_priorities to discover."},"search":{"type":"string","description":"Search term matched against subject, body, and other ticket fields."},"statusIDs":{"type":"array","items":{"type":"integer"},"description":"Filter by status. Use twdesk-list_statuses to discover."},"tagIDs":{"type":"array","items":{"type":"integer"},"description":"Filter by tag. Use twdesk-list_tags to discover."},"userIDs":{"type":"array","items":{"type":"integer"},"description":"Filter by user. Use twdesk-list_users to discover."}},"additionalProperties":false}},{"name":"twdesk-unlink_task_from_ticket","description":"Unlink a Teamwork Projects task from a Desk ticket. The task and the ticket themselves are kept.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"taskId":{"type":"integer","description":"The ID of the Teamwork Projects task. Use twprojects-list_tasks or twprojects-search to discover."},"ticketId":{"type":"integer","description":"The ID of the Desk ticket. Use twdesk-search_tickets to discover."}},"required":["ticketId","taskId"],"additionalProperties":false}},{"name":"twdesk-update_company","description":"Update Desk company.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"description":{"type":"string","description":"The new description of the company."},"details":{"type":"string","description":"The new details of the company."},"domains":{"type":"array","items":{"type":"string"},"description":"The new domains for the company."},"id":{"type":"integer","description":"The ID of the company to update."},"industry":{"type":"string","description":"The new industry of the company."},"kind":{"type":"string","description":"The new kind of the company.","enum":["company","group"]},"name":{"type":"string","description":"The new name of the company."},"note":{"type":"string","description":"The new note for the company."},"permission":{"type":"string","description":"The new permission level of the company.","enum":["own","all"]},"website":{"type":"string","description":"The new website of the company."}},"required":["id"],"additionalProperties":false}},{"name":"twdesk-update_customer","description":"Update customer.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"address":{"type":"string","description":"The new address of the customer."},"email":{"type":"string","description":"The new email of the customer."},"extraData":{"type":"string","description":"The new extra data of the customer."},"facebookURL":{"type":"string","description":"The new Facebook URL of the customer."},"firstName":{"type":"string","description":"The new first name of the customer."},"id":{"type":"integer","description":"The ID of the customer to update."},"jobTitle":{"type":"string","description":"The new job title of the customer."},"lastName":{"type":"string","description":"The new last name of the customer."},"linkedinURL":{"type":"string","description":"The new LinkedIn URL of the customer."},"mobile":{"type":"string","description":"The new mobile number of the customer."},"notes":{"type":"string","description":"The new notes of the customer."},"organization":{"type":"string","description":"The new organization of the customer."},"phone":{"type":"string","description":"The new phone number of the customer."},"twitterHandle":{"type":"string","description":"The new Twitter handle of the customer."}},"required":["id"],"additionalProperties":false}},{"name":"twdesk-update_helpdoc_article","description":"Update an existing help doc article.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"contents":{"type":"string","description":"The new body content of the article."},"description":{"type":"string","description":"A short description / summary of the article."},"id":{"type":"integer","description":"The ID of the help doc article to update."},"isPrivate":{"type":"boolean","description":"Set to true to make the article private."},"status":{"type":"string","description":"Publication status (e.g. \"published\", \"draft\")."},"title":{"type":"string","description":"The new title of the article."}},"required":["id"],"additionalProperties":false}},{"name":"twdesk-update_priority","description":"Update ticket priority.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"color":{"type":"string","description":"The color of the priority."},"id":{"type":"integer","description":"The ID of the priority to update."},"name":{"type":"string","description":"The new name of the priority."}},"required":["id"],"additionalProperties":false}},{"name":"twdesk-update_status","description":"Update ticket status.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"color":{"type":"string","description":"The color of the status."},"displayOrder":{"type":"integer","description":"The display order of the status."},"id":{"type":"integer","description":"The ID of the status to update."},"name":{"type":"string","description":"The new name of the status."}},"required":["id"],"additionalProperties":false}},{"name":"twdesk-update_tag","description":"Update Desk tag.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"color":{"type":"string","description":"The color of the tag."},"id":{"type":"integer","description":"The ID of the tag to update."},"name":{"type":"string","description":"The new name of the tag."}},"required":["id"],"additionalProperties":false}},{"name":"twdesk-update_ticket","description":"Update ticket.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"integer","description":"Agent the ticket is assigned to. Use twdesk-list_users to discover."},"bcc":{"type":"array","items":{"type":"string"},"description":"Email addresses to BCC."},"body":{"type":"string","description":"The body of the ticket."},"cc":{"type":"array","items":{"type":"string"},"description":"Email addresses to CC."},"deleteTags":{"type":"array","items":{"type":"integer"},"description":"Tags to remove from the ticket. Use twdesk-list_tags to discover."},"id":{"type":"integer","description":"The ID of the ticket to update."},"inboxId":{"type":"integer","description":"Inbox of the ticket. Use twdesk-list_inboxes to discover."},"priorityId":{"type":"integer","description":"Priority of the ticket. Use twdesk-list_priorities to discover."},"statusId":{"type":"integer","description":"Status of the ticket. Use twdesk-list_statuses to discover."},"subject":{"type":"string","description":"The subject of the ticket."},"tags":{"type":"array","items":{"type":"integer"},"description":"Tags to associate with the ticket. Use twdesk-list_tags to discover."},"typeId":{"type":"integer","description":"Ticket type. Use twdesk-list_ticket_types to discover."}},"required":["id"],"additionalProperties":false}},{"name":"twdesk-update_ticket_type","description":"Update ticket type.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"displayOrder":{"type":"integer","description":"The display order of the type."},"enabledForFutureInboxes":{"type":"boolean","description":"Whether the type is enabled for future inboxes."},"id":{"type":"integer","description":"The ID of the ticket type to update."},"name":{"type":"string","description":"The new name of the type."}},"required":["id"],"additionalProperties":false}},{"name":"twprojects-add_project_file","description":"Store an uploaded file in a project's files area, where people find it outside any one task or comment. Upload it first with twprojects-create_upload_url, then pass the reference here. Returns a numeric file ID which, unlike a reference, survives being used: pass it in attachment_file_ids on twprojects-create_task or twprojects-update_task to attach the same file to as many tasks as needed. Attaching a reference to a task, comment or message already files it here, so use this tool to store a file on its own, to describe or categorise it, or when it has to reach more than one place.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"auto_new_version":{"type":"boolean","description":"Store it as a new version of an existing file with the same name in the project, rather than as a separate file."},"category_id":{"type":"integer","description":"File it under an existing file category. Wins over category_name."},"category_name":{"type":"string","description":"File it under a category with this name, creating one when the project has none. Ignored when category_id is given."},"description":{"type":"string","description":"A description of the file."},"name":{"type":"string","description":"Override the name the file was uploaded with, including its extension."},"notify_current_user":{"type":"boolean","description":"Notify the user adding the file. Defaults to false."},"private":{"type":"boolean","description":"Hide the file from client users."},"project_id":{"type":"integer","description":"The ID of the project whose files area will hold the file."},"reference":{"type":"string","description":"The reference of an uploaded file, as returned by twprojects-create_upload_url or twprojects-create_file. It is \"tf_\" followed by a UUID and the file extension, and can only be used once.","minLength":1},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to associate with the file."}},"required":["project_id","reference"]}},{"name":"twprojects-add_project_member","description":"Add a user to a project.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project_id":{"type":"integer","description":"The ID of the project to add the member to."},"user_ids":{"type":"array","items":{"type":"integer"},"description":"Users to add."}},"required":["project_id"]}},{"name":"twprojects-clone_project","description":"Clone/copy an existing project or instantiate one from a template.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"company_id":{"type":"integer","description":"The ID of the company associated with the new cloned project. If not provided, the company of the original project will be used."},"days_offset":{"type":"integer","description":"DaysOffset is the number of days to shift all scheduled dates in the cloned project relative to the base date. When cloning from a template, it defines the project duration span. When copying an existing project, it shifts the original start and end dates by this many days. If omitted, calculated automatically from the source project's date range."},"description":{"type":"string","description":"The description of the new cloned project. If not provided, the description of the original project will be used."},"id":{"type":"integer","description":"The ID of the project to clone."},"name":{"type":"string","description":"The name of the new cloned project. If not provided, the name of the original project will be used with an incremental suffix (e.g., 'Project Name (1)')."},"new_from_template":{"type":"boolean","description":"Indicates whether the new project should be a regular one created from a template."},"target_date":{"type":"string","description":"Desired start or end date for the cloned project (chosen by template_date_target). Only applies when new_from_template=true. Format: YYYYMMDD. Defaults to today."},"template_date_target":{"type":"string","description":"Specifies whether target_date represents the project's start or end date. When 'end', the start date is calculated by subtracting the template project's duration from target_date. Only applicable when new_from_template=true.","default":"start","enum":["start","end"]},"to_template":{"type":"boolean","description":"Indicates whether the new project should be set as a template."}},"required":["id"]}},{"name":"twprojects-complete_task","description":"Mark task complete.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the task to mark as complete."}},"required":["id"]}},{"name":"twprojects-complete_timer","description":"Stop a timer permanently and convert it to a timelog. Use pause_timer to pause without converting.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the timer to complete."}},"required":["id"]}},{"name":"twprojects-count_milestones","description":"Exact milestone count for any filter set: one call, one number, no rows. Use for \"how many milestones\" questions (per project, per tag, matching a term) instead of paging twprojects-list_milestones to count rows. Use twprojects-list_milestones when the rows are needed.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"due_after":{"type":"string","description":"Only include milestones with a deadline on or after this date.","format":"date"},"due_before":{"type":"string","description":"Only include milestones with a deadline on or before this date.","format":"date"},"match_all_tags":{"type":"boolean","description":"If true, match all tags; if false, match any.","default":false},"project_id":{"type":"integer","description":"The ID of the project from which to retrieve milestones. Omit to list milestones across all projects."},"search_term":{"type":"string","description":"A search term to filter milestones by name. Each word from the search term is used to match against the milestone name and description. The milestone will be selected if each word of the term matches the milestone name or description, not requiring that the word matches are in the same field."},"show_completed":{"type":"boolean","description":"If false, only return milestones that are not completed yet. Included by default, unlike the task and tasklist lists.","default":true},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to filter milestones by tags."}}}},{"name":"twprojects-count_projects","description":"Exact project count for any filter set: one call, one number, no rows. Use for \"how many projects\" questions (mine, late, per category, per tag, per company, per owner, matching a term) instead of paging twprojects-list_projects to count rows. Use twprojects-list_projects when the rows are needed.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"description":"Filter projects by the company that owns them."},"hide_observed":{"type":"boolean","description":"If true, leave out the projects the calling user only observes, keeping the ones they actually work on."},"include_archived":{"type":"boolean","description":"If true, return archived projects alongside the active ones; excluded by default."},"include_subcategories":{"type":"boolean","description":"If true, project_category_ids also matches the categories nested under the ones given."},"include_tentative":{"type":"boolean","description":"If true, return tentative projects alongside the normal ones; excluded by default."},"match_all_tags":{"type":"boolean","description":"If true, match all tags; if false, match any.","default":false},"only_admin_access":{"type":"boolean","description":"If true, only return the projects the calling user administers."},"only_archived":{"type":"boolean","description":"If true, only return archived projects."},"only_starred":{"type":"boolean","description":"If true, only return the projects the calling user has starred."},"project_category_ids":{"type":"array","items":{"type":"integer"},"description":"Filter projects by category."},"project_healths":{"type":"array","items":{"type":"string","enum":["good","ok","bad","not_set"]},"description":"Filter projects by the health rating set on them, matching any of the values given. \"not_set\" matches the projects nobody has rated."},"project_owner_ids":{"type":"array","items":{"type":"integer"},"description":"Filter projects by the user who owns them."},"project_statuses":{"type":"array","items":{"type":"string","enum":["active","current","late","upcoming","completed","deleted"]},"description":"Filter projects by progress state, matching any of the values given. \"late\" is past its end date and not yet completed, \"upcoming\" has not started yet, \"current\" is running now, and \"active\" is every project that is neither completed nor archived. Omit to keep the endpoint's own default set."},"search_term":{"type":"string","description":"A search term to filter projects by name or description."},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to filter projects by tags."},"team_ids":{"type":"array","items":{"type":"integer"},"description":"Filter projects by team, matching the projects any member of those teams belongs to."},"updated_after":{"description":"Only include projects whose last activity is strictly after this moment; the boundary itself does not match. Any activity in the project counts, not just edits to the project record. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"user_ids":{"type":"array","items":{"type":"integer"},"description":"Filter projects by the users holding an explicit membership of them. For \"my projects\", pass the ID returned by twprojects-get_user_me."}}}},{"name":"twprojects-count_tasks","description":"Exact task count for any filter set: one call, one number, no rows. Use for \"how many\" questions (totals, late, per person, per project, per tag, completed in a window) instead of paging twprojects-list_tasks to count rows. Note due_before excludes tasks with no due date, unless a related milestone due date matches. Use twprojects-list_tasks when the rows are needed.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"assignee_user_ids":{"type":"array","items":{"type":"integer"},"description":"Filter tasks by assignee."},"completed_after":{"description":"Only include tasks completed at or after this moment; the boundary itself matches. Setting it narrows the result to completed tasks. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"completed_before":{"description":"Only include tasks completed at or before this moment; the boundary itself matches. Setting it narrows the result to completed tasks. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"created_after":{"description":"Only include tasks created at or after this moment; the boundary itself matches. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"created_before":{"description":"Only include tasks created at or before this moment; the boundary itself matches. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"created_by_user_ids":{"type":"array","items":{"type":"integer"},"description":"Filter tasks by creator."},"date_filter":{"type":"string","description":"Where the task's dates fall relative to today, in your own timezone. This is the filter for \"late\", \"overdue\", \"due today\", \"started\" and \"upcoming\"; omit it for no date restriction. overdue: due before today and not completed — this is \"late\", and it never returns completed tasks whatever show_completed says. today: due today, without adding the overdue ones. thisweek: the calendar week containing today, the days of it already past included. upcoming: due today or later. started: the start date has arrived and the due date has not passed — start date on or before today, and either no due date at all or one falling today or later. within7, within14, within30, within365: due between today and that many days from today, both days included. nodate: no start date, no due date and no milestone. anytime: no date restriction, what the endpoint applies when this is omitted. Completed tasks stay hidden unless show_completed is true, and overdue never returns one even then; for completed work alone use only_completed, which combines with any value here except overdue. A task with no due date of its own is matched on its milestone's.","enum":["anytime","overdue","today","tomorrow","yesterday","thisweek","upcoming","started","within7","within14","within30","within365","nodate","noduedate","nostartdate","hasdate"]},"due_after":{"type":"string","description":"Only include tasks due after this date, excluding the day itself — unless due_before is set too, which makes both bounds inclusive. A task with no due date is matched on its milestone's.","examples":["2023-01-01"],"format":"date"},"due_before":{"type":"string","description":"Only include tasks due before this date, excluding the day itself — unless due_after is set too, which makes both bounds inclusive. A task with no due date is matched on its milestone's.","examples":["2023-12-31"],"format":"date"},"exclude_assignee_user_ids":{"type":"array","items":{"type":"integer"},"description":"Leave out tasks assigned to any of these users. A task is dropped when any one of the listed users is assigned to it, even when it also carries assignees you did not exclude. A user reached only through a team, company or job-role assignment on the task is not matched. Combines with assignee_user_ids and every other filter."},"match_all_tags":{"type":"boolean","description":"If true, match all tags; if false, match any.","default":false},"only_completed":{"type":"boolean","description":"If true, return only completed tasks. It combines with every other filter, date_filter included — except date_filter=overdue, which never matches a completed task and so returns nothing. Tasks in completed tasklists still need show_completed."},"only_unassigned":{"type":"boolean","description":"If true, only return tasks that have no assignee."},"only_unplanned":{"type":"boolean","description":"If true, only return tasks that are unplanned, meaning they are missing an assignee, a due date, or estimated time."},"project_id":{"type":"integer","description":"The ID of the project from which to retrieve tasks. Omit to list tasks across all projects."},"search_term":{"type":"string","description":"A search term to filter tasks by name."},"show_completed":{"type":"boolean","description":"If true, include completed tasks and tasks belonging to completed tasklists; both excluded by default.","default":false},"start_after":{"type":"string","description":"Only include tasks whose own start date falls on or after this date; the day itself matches. A task with no start date never matches — there is no milestone fallback. There is no upper bound on the start date, so for work that has already begun use date_filter=started instead.","examples":["2023-01-01"],"format":"date"},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to filter tasks by tags."},"tasklist_id":{"type":"integer","description":"The ID of the tasklist from which to retrieve tasks. Takes precedence over project_id."},"updated_after":{"description":"Only include tasks updated strictly after this moment; the boundary itself does not match. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"updated_before":{"description":"Only include tasks updated strictly before this moment; the boundary itself does not match. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]}}}},{"name":"twprojects-count_timelogs","description":"Exact count of time entries for any filter set: one call, one number, no rows. This counts entries, not hours — for logged, billable or billed time totals use twprojects-summarize_timelogs. Use for \"how many time entries\" questions (per project, per task, per person, in a date window) instead of paging twprojects-list_timelogs to count rows.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"assigned_company_ids":{"type":"array","items":{"type":"integer"},"description":"Filter timelogs by assigned company."},"assigned_team_ids":{"type":"array","items":{"type":"integer"},"description":"Filter timelogs by assigned team."},"assigned_user_ids":{"type":"array","items":{"type":"integer"},"description":"Filter timelogs by assigned user."},"billable_type":{"type":"string","description":"Restrict the results to billable or non-billable timelogs. Omit, or pass all, to include both. For billable hours rather than the entries themselves, twprojects-summarize_timelogs reports them without paging.","enum":["all","billable","nonbillable"]},"end_date":{"description":"End of the timelog window; the boundary itself is included, and a plain date covers that whole day. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"invoiced_type":{"type":"string","description":"Restrict the results to timelogs that have or have not been added to an invoice. Omit, or pass all, to include both. Invoiced is not the same as billed: noninvoiced answers \"what is still to be invoiced\" only for billable time, so pass billable_type alongside it.","enum":["all","invoiced","noninvoiced"]},"match_all_tags":{"type":"boolean","description":"If true, match all tags; if false, match any.","default":false},"project_id":{"type":"integer","description":"The ID of the project from which to retrieve timelogs. Omit to list timelogs across all projects."},"start_date":{"description":"Start of the timelog window; the boundary itself is included. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to filter timelogs by tags."},"task_id":{"type":"integer","description":"The ID of the task from which to retrieve timelogs. Omit to list timelogs across all tasks."},"ticketIds":{"type":"array","items":{"type":"integer"},"description":"Filter timelogs by associated desk ticket."}}}},{"name":"twprojects-create_allocation","description":"Commit a user's time to a project over a date range (a scheduler allocation). This is planned time, a separate plane from task estimates and logged time.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"assigned_user_id":{"type":"integer","description":"The ID of the user whose time is committed. Accepts a real person or a placeholder user — a stand-in used to plan work before the person who will do it is known. Nothing in the response distinguishes the two, so confirm which one an ID refers to before reporting who is booked.","minimum":1},"color":{"type":"string","description":"The allocation's colour as six hexadecimal digits, with or without a leading '#'."},"description":{"type":"string","description":"An optional description of the allocation, at most 255 characters.","maxLength":255},"end_date":{"type":"string","description":"The last day of the allocation (format: YYYY-MM-DD). Must not precede start_date. Extending it ADDS committed time rather than spreading the existing total: the per-day rate is what is held constant, so the total is the working days in the range times that rate."},"ignore_collisions":{"type":"boolean","description":"Skip the capacity check altogether. Prefer inform_of_over_allocation: this one also lets the change through, but suppresses the over-allocation report with it, so nobody is told the person is over-booked. It takes precedence when both are set."},"inform_of_over_allocation":{"type":"boolean","description":"Accept a change that puts the user over their capacity and report it, rather than rejecting it. Defaults to true, and the result says so when it happens. Turning it off means an over-allocating change is refused outright."},"is_billable":{"type":"boolean","description":"Whether the allocated time can be charged to a client."},"linked_task_ids":{"type":"array","items":{"type":"integer"},"description":"The tasks to associate with the allocation. This REPLACES the whole set of linked tasks, so send every task that should stay linked. To add or remove one task without touching the rest, use twprojects-link_task_to_allocation or twprojects-unlink_task_from_allocation instead."},"project_id":{"type":"integer","description":"The ID of the project to commit the time to.","minimum":1},"seconds_per_day":{"type":"integer","description":"The time committed on each working day of the range, in SECONDS — 4 hours a day is 14400. Must be between 60 (one minute) and 86400 (24 hours). Seconds rather than hours because the hours form is a float and rounds. This rate is what is held constant: the total is the working days in the range times this, so widening the range adds committed time.","minimum":60},"start_date":{"type":"string","description":"The first day of the allocation (format: YYYY-MM-DD)."},"title":{"type":"string","description":"The name of the allocation, at most 100 characters.","maxLength":100}},"required":["project_id","assigned_user_id","title","start_date","end_date","seconds_per_day","color"]}},{"name":"twprojects-create_comment","description":"Create comment on a task, milestone, notebook, file, or link.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"attachment_refs":{"type":"array","items":{"type":"string"},"description":"References of files to attach to the comment, as returned by twprojects-create_upload_url or twprojects-create_file. Each is \"tf_\" followed by a UUID and the file extension, and can only be used once, so reserve an upload for each place a file should go. Files are added to whatever is already attached; nothing is removed."},"body":{"type":"string","description":"The content of the comment. The content can be added as text or HTML."},"content_type":{"type":"string","description":"The content type of the comment. It can be either 'TEXT' or 'HTML'.","enum":["TEXT","HTML"]},"notify":{"description":"Who to notify of the new comment. Omit it unless the user named who to notify: the default notifies every follower of the related entity, and a value here replaces that set rather than adding to it, so a narrower one silently drops everyone else who would have been told. Accepts the string \"all\" to notify all project members, the boolean true to notify all followers of the related entity, the boolean false to notify nobody, a plain array of user IDs (e.g. [123, 456]), or an object selecting user_ids, company_ids, team_ids and/or job_role_ids (e.g. {\"user_ids\": [123, 456]}).","default":true,"anyOf":[{"type":"string","description":"Notify all project members.","enum":["all"]},{"type":"boolean","description":"true notifies all followers of the entity this comment is related to. false notifies nobody."},{"type":"array","items":{"type":"integer"},"description":"The IDs of the users to notify; shorthand for {\"user_ids\": [...]}.","minItems":1},{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"job_role_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"team_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"user_ids":{"type":"array","items":{"type":"integer"},"minItems":1}},"minProperties":1,"maxProperties":4,"anyOf":[{"required":["user_ids"]},{"required":["company_ids"]},{"required":["team_ids"]},{"required":["job_role_ids"]}]}]},"notify_current_user":{"type":"boolean","description":"Whether the current user should be notified about the new comment."},"object":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the object to create the comment for."},"type":{"type":"string","description":"The type of object to create the comment for.","enum":["tasks","milestones","files","notebooks","links"]}},"description":"The object to create the comment for. It can be a tasks, milestones, files or notebooks.","required":["type","id"]}},"required":["object","body"]}},{"name":"twprojects-create_company","description":"Create company (aka client).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"address_one":{"type":"string","description":"The first line of the address of the company."},"address_two":{"type":"string","description":"The second line of the address of the company."},"city":{"type":"string","description":"The city of the company."},"country_code":{"type":"string","description":"The country code of the company, e.g., 'US' for the United States."},"email_one":{"type":"string","description":"The primary email address of the company."},"email_three":{"type":"string","description":"The tertiary email address of the company."},"email_two":{"type":"string","description":"The secondary email address of the company."},"fax":{"type":"string","description":"The fax number of the company."},"industry_id":{"type":"integer","description":"The ID of the industry the company belongs to."},"manager_id":{"type":"integer","description":"The ID of the user who manages the company."},"name":{"type":"string","description":"The name of the company."},"phone":{"type":"string","description":"The phone number of the company."},"profile":{"type":"string","description":"A profile description for the company."},"state":{"type":"string","description":"The state of the company."},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to associate with the company."},"website":{"type":"string","description":"The website of the company."},"zip":{"type":"string","description":"The ZIP or postal code of the company."}},"required":["name"]}},{"name":"twprojects-create_custom_field","description":"Create custom field.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"currency_code":{"type":"string","description":"The ISO currency code for 'currency' or 'financial' type custom fields."},"description":{"type":"string","description":"An optional description for the custom field."},"entity":{"type":"string","description":"The type of entity this custom field can be applied to. Use 'all' for installation-level custom fields that are available across the workspace.","enum":["all","project","task","company"]},"formula":{"type":"string","description":"The formula expression for 'formula' type custom fields."},"name":{"type":"string","description":"The display name of the custom field."},"options":{"description":"Type-specific options for the custom field. For 'dropdown' and 'multiselect' types, provide {\"choices\": [{\"value\": \"...\", \"color\": \"#rrggbb\"}, ...]}. For 'rating' type, provide {\"icon\": \"star|heart|...\", \"color\": \"#rrggbb\"}. For 'number-decimal' type, provide {\"decimals\": <int>}.","anyOf":[{"type":"object","properties":{"choices":{"type":"array","items":{"type":"object","properties":{"color":{"type":"string","description":"The hex color code for the choice (e.g. #ff0000)."},"value":{"type":"string","description":"The display value of the choice. For 'dropdown' fields, this is the value that will be set on entities when this choice is selected."}}}}}},{"type":"object","properties":{"color":{"type":"string","description":"The hex color code for the rating icons (e.g. #ff0000)."},"icon":{"type":"string","description":"The icon to use for the rating, e.g. 'star', 'heart', etc."}}},{"type":"object","properties":{"decimals":{"type":"integer","description":"The number of decimal places to allow for number-decimal custom fields."}}}]},"project_id":{"type":"integer","description":"The ID of the project to scope the custom field to. When omitted, the custom field is created at the installation level."},"required":{"type":"boolean","description":"Whether the custom field must have a value when set on an entity."},"type":{"type":"string","description":"The data type of the custom field.","enum":["text-short","text-long","number-decimal","number-integer","financial","dropdown","multiselect","checkbox","percentage","url","tw-url","user","rating","date","phone","email","status"]},"unit":{"type":"string","description":"The unit associated with the custom field, when applicable.","enum":["currency","duration","date","percent","currency/duration","duration/currency"]}},"required":["name","type","entity"]}},{"name":"twprojects-create_custom_field_value","description":"Set a custom field value on a task, project or company. The custom field must already exist and be applicable to the target entity.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"country_code":{"type":"string","description":"The country code for currency-type custom field values."},"currency_code":{"type":"string","description":"The ISO currency code for currency-type custom field values."},"custom_field_id":{"type":"integer","description":"The ID of the custom field the value belongs to."},"entity":{"type":"string","description":"The type of entity the custom field value is attached to.","enum":["task","project","company"]},"entity_id":{"type":"integer","description":"The ID of the task, project or company the custom field value is attached to."},"value":{"description":"The value to assign, typed per the field: string (text), number (number), boolean (checkbox), choice value string (dropdown/status; array for multiselect), ISO-8601 string (date).","anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}]}},"required":["entity","entity_id","custom_field_id"]}},{"name":"twprojects-create_custom_item","description":"Create a new custom item type (e.g. Contracts, Leads, Deals) on a project. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"description":{"type":"string","description":"An optional human-readable description for the custom item type."},"display_name":{"type":"string","description":"The display name of the custom item type (e.g. \"Contracts\")."},"label_plural":{"type":"string","description":"Plural label for many records (e.g. \"Contracts\"). Defaults to the display name when omitted."},"label_singular":{"type":"string","description":"Singular label for one record (e.g. \"Contract\"). Defaults to the display name when omitted."},"project_id":{"type":"integer","description":"Project ID that will own the new custom item type."}},"required":["project_id","display_name"]}},{"name":"twprojects-create_custom_item_field","description":"Add a field (column) to a custom item type. Field types include text, number, dropdown, multiselect, checkbox, url, user, date, time and datetime. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"custom_item_id":{"type":"integer","description":"Custom item type ID that will own the new field."},"definition":{"type":"object","description":"Optional type-specific configuration as a JSON object. Examples: for number-decimal fields {\"precision\": \"2\", \"unit\": {\"type\": \"currency\"}}; for user fields {\"limit\": 1, \"source\": \"workspace\"}. See the API docs for the exact shape per type."},"display_name":{"type":"string","description":"Human-readable name of the field (e.g. \"Status\")."},"options":{"type":"array","items":{"type":"object","properties":{"color":{"type":"string"},"label":{"type":"string"}},"required":["label"]},"description":"Choices for dropdown/multiselect fields. Each option is {label: \"Active\", color: \"#22c55e\"}."},"position_after_id":{"type":"integer","description":"Place this field after the given field ID. Null appends to the end."},"tw_type":{"type":"string","description":"Optional sub-classification for dropdown fields. Use \"status\" for a Status field.","enum":["status"]},"type":{"type":"string","description":"Field data type.","enum":["text-short","text-long","number-decimal","number-integer","dropdown","multiselect","checkbox","url","user","date","time","datetime"]}},"required":["custom_item_id","display_name","type"]}},{"name":"twprojects-create_custom_item_record","description":"Create a record (row) on a custom item type. For example, add a Contract on the Contracts type. Pass field values by name; the tool resolves names to the API's internal IDs. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"custom_item_id":{"type":"integer","description":"Custom item type ID that will own the new record."},"field_values":{"type":"array","items":{"type":"object","properties":{"field_name":{"type":"string","description":"Display name of the field, case-insensitive."},"value":{"description":"Value to set. Type depends on the field — see the tool description.","anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},{"type":"object"}]}},"required":["field_name"]},"description":"Field values to set on the record. Each entry is {field_name, value}. Field names are matched case-insensitively against the custom item type's fields. Values are coerced by field type: dropdown/multiselect accept option labels or option twIds; date/time/datetime accept ISO-8601 strings; checkbox accepts bool or yes/no/true/false; number accepts numeric or numeric string; user accepts a user ID (or array of IDs for multi-user fields). To clear a field, send null."},"name":{"type":"string","description":"Display name of the record (e.g. \"Acme Inc Contract\")."},"position_after_id":{"type":"integer","description":"Place the record after the given record ID. Null appends to the end."},"section_id":{"type":"integer","description":"Optional section ID to place the record in."}},"required":["custom_item_id","name"]}},{"name":"twprojects-create_file","description":"Upload short text you are generating yourself, such as a plan, a spec or a CSV, so it can be attached to a task, comment or message. Returns a single-use reference; pass it in attachment_refs on twprojects-create_task, twprojects-update_task, twprojects-create_comment or twprojects-create_message. Content is sent inline as base64, which means you have to emit the whole file as text, so use twprojects-create_upload_url instead for anything that already exists as a file — it hands back a URL to send the bytes to directly, and is the only safe option for a document that must stay byte-for-byte identical.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"data":{"type":"string","description":"The file content, base64-encoded with the standard alphabet. It must decode to between 1 byte and 5242880 bytes.","maxLength":6990508},"name":{"type":"string","description":"The file name, including its extension, for example \"plan.md\". Teamwork.com works out how to display the file from the extension, so a name without one is harder to open. Any directory part is removed.","minLength":1}},"required":["name","data"]}},{"name":"twprojects-create_jobrole","description":"Create job role.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","description":"The name of the job role."}},"required":["name"]}},{"name":"twprojects-create_link","description":"Create link.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"code":{"type":"string","description":"The URL of the link. This is the actual web address that the link points to."},"description":{"type":"string","description":"The description of the link. Longer text that provides detailed information about the link."},"notify":{"description":"Who to notify of the new link. Omit it unless the user named who to notify: the default notifies all project members, and a value here replaces that set rather than adding to it, so a narrower one silently drops everyone else who would have been told. Accepts the string \"all\" to notify all project members, the boolean true as an alias for \"all\", the boolean false to notify nobody, a plain array of user IDs (e.g. [123, 456]), or an object selecting user_ids, company_ids, team_ids and/or job_role_ids (e.g. {\"user_ids\": [123, 456]}).","default":"all","anyOf":[{"type":"string","description":"Notify all project members.","enum":["all"]},{"type":"boolean","description":"true is the same as \"all\": notify all project members. false notifies nobody."},{"type":"array","items":{"type":"integer"},"description":"The IDs of the users to notify; shorthand for {\"user_ids\": [...]}.","minItems":1},{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"job_role_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"team_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"user_ids":{"type":"array","items":{"type":"integer"},"minItems":1}},"minProperties":1,"maxProperties":4,"anyOf":[{"required":["user_ids"]},{"required":["company_ids"]},{"required":["team_ids"]},{"required":["job_role_ids"]}]}]},"notify_current_user":{"type":"boolean","description":"Whether the current user should be notified about the new link."},"project_id":{"type":"integer","description":"The ID of the project to create the link in."},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to associate with the link."},"title":{"type":"string","description":"The title of the link, which provides a brief summary of the purpose of the link."}},"required":["project_id","code"]}},{"name":"twprojects-create_message","description":"Create message in a project.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"attachment_refs":{"type":"array","items":{"type":"string"},"description":"References of files to attach to the message, as returned by twprojects-create_upload_url or twprojects-create_file. Each is \"tf_\" followed by a UUID and the file extension, and can only be used once, so reserve an upload for each place a file should go. Files are added to whatever is already attached; nothing is removed."},"body":{"type":"string","description":"The body of the message."},"notify":{"description":"Who to notify of the new message. Omit it unless the user named who to notify: the default notifies all project members, and a value here replaces that set rather than adding to it, so a narrower one silently drops everyone else who would have been told. Accepts the string \"all\" to notify all project members, the boolean true as an alias for \"all\", the boolean false to notify nobody, a plain array of user IDs (e.g. [123, 456]), or an object selecting user_ids, company_ids, team_ids and/or job_role_ids (e.g. {\"user_ids\": [123, 456]}).","default":"all","anyOf":[{"type":"string","description":"Notify all project members.","enum":["all"]},{"type":"boolean","description":"true is the same as \"all\": notify all project members. false notifies nobody."},{"type":"array","items":{"type":"integer"},"description":"The IDs of the users to notify; shorthand for {\"user_ids\": [...]}.","minItems":1},{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"job_role_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"team_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"user_ids":{"type":"array","items":{"type":"integer"},"minItems":1}},"minProperties":1,"maxProperties":4,"anyOf":[{"required":["user_ids"]},{"required":["company_ids"]},{"required":["team_ids"]},{"required":["job_role_ids"]}]}]},"notify_current_user":{"type":"boolean","description":"Whether the current user should be notified about the new message."},"project_id":{"type":"integer","description":"The ID of the project to create the message in."},"title":{"type":"string","description":"The title of the message."}},"required":["title","project_id","body"]}},{"name":"twprojects-create_message_reply","description":"Create message reply.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"body":{"type":"string","description":"The body of the message reply."},"message_id":{"type":"integer","description":"The ID of the message to create the reply in."},"notify":{"description":"Who to notify of the new reply. Omit it unless the user named who to notify: the default notifies all project members, and a value here replaces that set rather than adding to it, so a narrower one silently drops everyone else who would have been told. Accepts the string \"all\" to notify all project members, the boolean true as an alias for \"all\", the boolean false to notify nobody, a plain array of user IDs (e.g. [123, 456]), or an object selecting user_ids, company_ids, team_ids and/or job_role_ids (e.g. {\"user_ids\": [123, 456]}).","default":"all","anyOf":[{"type":"string","description":"Notify all project members.","enum":["all"]},{"type":"boolean","description":"true is the same as \"all\": notify all project members. false notifies nobody."},{"type":"array","items":{"type":"integer"},"description":"The IDs of the users to notify; shorthand for {\"user_ids\": [...]}.","minItems":1},{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"job_role_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"team_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"user_ids":{"type":"array","items":{"type":"integer"},"minItems":1}},"minProperties":1,"maxProperties":4,"anyOf":[{"required":["user_ids"]},{"required":["company_ids"]},{"required":["team_ids"]},{"required":["job_role_ids"]}]}]},"notify_current_user":{"type":"boolean","description":"Whether the current user should be notified about the new message reply."}},"required":["message_id","body"]}},{"name":"twprojects-create_milestone","description":"Create milestone in a project.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"assignees":{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"team_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"user_ids":{"type":"array","items":{"type":"integer"},"minItems":1}},"description":"Assignees for the milestone.","minProperties":1,"maxProperties":3,"anyOf":[{"required":["user_ids"]},{"required":["company_ids"]},{"required":["team_ids"]}]},"description":{"type":"string","description":"A description of the milestone."},"due_date":{"type":"string","description":"The due date of the milestone (format: YYYYMMDD). Used for related tasks without their own due date."},"name":{"type":"string","description":"The name of the milestone."},"project_id":{"type":"integer","description":"The ID of the project to create the milestone in."},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to associate with the milestone."},"tasklist_ids":{"type":"array","items":{"type":"integer"},"description":"Tasklists to associate with the milestone."}},"required":["name","project_id","due_date","assignees"]}},{"name":"twprojects-create_notebook","description":"Create notebook in a project.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"contents":{"type":"string","description":"The contents of the notebook."},"description":{"type":"string","description":"A description of the notebook."},"name":{"type":"string","description":"The name of the notebook."},"project_id":{"type":"integer","description":"The ID of the project to create the notebook in."},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to associate with the notebook."},"type":{"type":"string","description":"The type of the notebook.","enum":["MARKDOWN","HTML"]}},"required":["name","project_id","contents","type"]}},{"name":"twprojects-create_project","description":"Create project.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"category_id":{"type":"integer","description":"The ID of the category to which the project belongs."},"company_id":{"type":"integer","description":"The ID of the company associated with the project."},"description":{"type":"string","description":"The description of the project."},"end_at":{"type":"string","description":"End date of the project (format: YYYYMMDD)."},"name":{"type":"string","description":"The name of the project."},"owned_id":{"type":"integer","description":"The ID of the user who owns the project."},"start_at":{"type":"string","description":"Start date of the project (format: YYYYMMDD)."},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to associate with the project."}},"required":["name"]}},{"name":"twprojects-create_project_category","description":"Create project category.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"color":{"type":"string","description":"The color of the project category in hex format (e.g., #FF5733)."},"name":{"type":"string","description":"The name of the project category."},"parent_id":{"type":"integer","description":"The ID of the parent project category, if any. This allows for nested categories."}},"required":["name"]}},{"name":"twprojects-create_project_template","description":"Create project template.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"category_id":{"type":"integer","description":"The ID of the category to which the project template belongs."},"company_id":{"type":"integer","description":"The ID of the company associated with the project template."},"description":{"type":"string","description":"The description of the project template."},"end_at":{"type":"string","description":"End date of the project template (format: YYYYMMDD)."},"name":{"type":"string","description":"The name of the project template."},"owned_id":{"type":"integer","description":"The ID of the user who owns the project template."},"start_at":{"type":"string","description":"Start date of the project template (format: YYYYMMDD)."},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to associate with the project template."}},"required":["name"]}},{"name":"twprojects-create_skill","description":"Create skill.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","description":"The name of the skill."},"user_ids":{"type":"array","items":{"type":"integer"},"description":"The user IDs associated with the skill."}},"required":["name"]}},{"name":"twprojects-create_tag","description":"Create tag.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"color":{"type":"string","description":"The color of the tag. It must be a valid hex color code."},"name":{"type":"string","description":"The name of the tag. It must have less than 50 characters."},"project_id":{"type":"integer","description":"The ID of the project to associate the tag with. This is for project-scoped tags."}},"required":["name"]}},{"name":"twprojects-create_task","description":"Create task in a tasklist.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"assignees":{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"job_role_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"team_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"user_ids":{"type":"array","items":{"type":"integer"},"minItems":1}},"description":"Assignees for the task.","minProperties":1,"maxProperties":4},"attachment_file_ids":{"type":"array","items":{"type":"integer"},"description":"IDs of files already in a project's files area to attach to the task, as returned by twprojects-add_project_file. Unlike a reference these can be used repeatedly, so this is how one file reaches several tasks. Files are added to whatever is already attached; nothing is removed."},"attachment_refs":{"type":"array","items":{"type":"string"},"description":"References of files to attach to the task, as returned by twprojects-create_upload_url or twprojects-create_file. Each is \"tf_\" followed by a UUID and the file extension, and can only be used once, so reserve an upload for each place a file should go. Files are added to whatever is already attached; nothing is removed."},"change_followers":{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"job_role_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"team_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"user_ids":{"type":"array","items":{"type":"integer"},"minItems":1}},"description":"Followers of any task changes.","minProperties":1,"maxProperties":4},"comment_followers":{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"job_role_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"team_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"user_ids":{"type":"array","items":{"type":"integer"},"minItems":1}},"description":"Followers of any task comments.","minProperties":1,"maxProperties":4},"complete_followers":{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"job_role_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"team_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"user_ids":{"type":"array","items":{"type":"integer"},"minItems":1}},"description":"Followers of any task completions.","minProperties":1,"maxProperties":4},"description":{"type":"string","description":"The description of the task. Support for plain text and Markdown formatting."},"due_date":{"type":"string","description":"The due date of the task. If omitted, falls back to the milestone due date when one is set.","format":"date"},"estimated_minutes":{"type":"integer","description":"The estimated time to complete the task in minutes."},"name":{"type":"string","description":"The name of the task."},"notify":{"type":"boolean","description":"Whether to notify the task's assignees and followers, which sends them an email. Defaults to true. Set it to false for bulk or housekeeping changes nobody needs to hear about.","default":true},"parent_task_id":{"type":"integer","description":"The ID of the parent task if creating a subtask."},"predecessors":{"type":"array","items":{"type":"object","properties":{"task_id":{"type":"integer","description":"The ID of the predecessor task."},"type":{"type":"string","description":"'start' means this task can complete when the predecessor starts; 'complete' means this task can complete when the predecessor completes.","enum":["start","complete"]}}},"description":"Task dependencies that must be completed before this task can start."},"priority":{"type":"string","description":"The priority of the task.","enum":["low","medium","high"]},"progress":{"type":"integer","description":"The progress of the task, as a percentage (0-100). Only whole numbers are allowed.","minimum":0,"maximum":100},"stage_id":{"type":"integer","description":"The ID of the workflow stage to place the new task in. Required together with workflow_id. Omit both to leave the task in the workflow's backlog. Use twprojects-list_workflow_stages to find one."},"start_date":{"type":"string","description":"The start date of the task.","format":"date"},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to associate with the task."},"tasklist_id":{"type":"integer","description":"Tasklist ID. Use twprojects-list_tasklists to find one."},"workflow_id":{"type":"integer","description":"The ID of the workflow to place the new task in a stage of. Required together with stage_id, and must be a workflow attached to the task's own project: another one is ignored and the task lands in the backlog, with nothing in the response saying so. Use twprojects-list_workflows to find one."}},"required":["name","tasklist_id"]}},{"name":"twprojects-create_tasklist","description":"Create tasklist in a project.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"description":{"type":"string","description":"The description of the tasklist."},"milestone_id":{"type":"integer","description":"The ID of the milestone to associate with the tasklist."},"name":{"type":"string","description":"The name of the tasklist."},"project_id":{"type":"integer","description":"The ID of the project to create the tasklist in."}},"required":["name","project_id"]}},{"name":"twprojects-create_team","description":"Create team.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"company_id":{"type":"integer","description":"The ID of the company. This is used to create a team scoped for a specific company."},"description":{"type":"string","description":"The description of the team."},"handle":{"type":"string","description":"The handle of the team. It is a unique identifier for the team. It must not have spaces or special characters."},"name":{"type":"string","description":"The name of the team."},"parent_team_id":{"type":"integer","description":"The ID of the parent team. This is used to create a hierarchy of teams."},"project_id":{"type":"integer","description":"The ID of the project. This is used to create a team scoped for a specific project."},"user_ids":{"type":"array","items":{"type":"integer"},"description":"Users to add to the team."}},"required":["name"]}},{"name":"twprojects-create_timelog","description":"Create timelog entry against a project or task.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"billable":{"type":"boolean","description":"If true, the timelog is billable."},"date":{"type":"string","description":"The date of the timelog.","format":"date"},"description":{"type":"string","description":"A description of the timelog."},"hours":{"type":"integer","description":"The number of hours spent on the timelog. Must be a positive integer."},"is_utc":{"type":"boolean","description":"If true, the time is in UTC.","default":false},"minutes":{"type":"integer","description":"Minutes spent on the timelog. Must be a positive integer less than 60; otherwise increment hours instead."},"project_id":{"type":"integer","description":"Project the timelog is logged against. Provide exactly one of project_id or task_id."},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to associate with the timelog."},"task_id":{"type":"integer","description":"Task the timelog is logged against. Provide exactly one of project_id or task_id."},"time":{"type":"string","description":"The time of the timelog in the format HH:MM:SS.","pattern":"^(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d$"},"user_id":{"type":"integer","description":"User the timelog is logged for. Defaults to the authenticated user."}},"required":["date","time","hours","minutes"]}},{"name":"twprojects-create_timer","description":"Create and start a timer.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"billable":{"type":"boolean","description":"If true, the timer is billable.","default":false},"description":{"type":"string","description":"A description of the timer."},"project_id":{"type":"integer","description":"The ID of the project to associate the timer with."},"running":{"type":"boolean","description":"If true, the timer will start running immediately."},"seconds":{"type":"integer","description":"The number of seconds to set the timer for."},"stop_running_timers":{"type":"boolean","description":"If true, any other running timers will be stopped when this timer is created."},"task_id":{"type":"integer","description":"The ID of the task to associate the timer with."}},"required":["project_id"]}},{"name":"twprojects-create_upload_url","description":"Reserve an upload for a file and get back a short-lived URL to send its bytes to, plus a single-use reference. Use this for any file that already exists — a PDF, an image, a signed document — because the bytes go straight from you to storage and are never read into the conversation. Send the file with the returned method and URL, setting exactly the headers returned and no authorization of your own. Then pass the reference in attachment_refs on twprojects-create_task, twprojects-update_task, twprojects-create_comment or twprojects-create_message. Prefer twprojects-create_file only for short text you are generating yourself.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","description":"The file name, including its extension, for example \"contract.pdf\". Teamwork.com works out how to display the file from the extension, so a name without one is harder to open. Any directory part is removed.","minLength":1},"size":{"type":"integer","description":"The exact size of the file in bytes. The reservation is signed against this number, so an upload of any other length is rejected.","minimum":1}},"required":["name","size"]}},{"name":"twprojects-create_user","description":"Create user.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"admin":{"type":"boolean","description":"Indicates whether the user is an administrator."},"company_id":{"type":"integer","description":"The ID of the client/company to which the user belongs."},"email":{"type":"string","description":"The email address of the user."},"first_name":{"type":"string","description":"The first name of the user."},"last_name":{"type":"string","description":"The last name of the user."},"title":{"type":"string","description":"The job title of the user, such as 'Project Manager' or 'Senior Software Developer'."},"type":{"type":"string","description":"The type of user, such as 'account', 'collaborator', or 'contact'."}},"required":["first_name","last_name","email"]}},{"name":"twprojects-create_workflow","description":"Create workflow.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","description":"The name of the workflow."}},"required":["name"]}},{"name":"twprojects-create_workflow_stage","description":"Create workflow stage.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","description":"The name of the workflow stage."},"workflow_id":{"type":"integer","description":"The ID of the workflow to add the stage to."}},"required":["workflow_id","name"]}},{"name":"twprojects-download_file","description":"Read the content of a file stored in Teamwork.com: text files come back as text, images as an image, and anything else as a base64 resource with its media type. Files over 10 MB are refused; point the user at the file's downloadURL from twprojects-get_file instead. The file ID is in a task's or message reply's attachments and a comment's files (each {id, type: \"files\"}), or comes from twprojects-list_files.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the file to download."},"version":{"type":"integer","description":"The version number to download. Omit for the latest version.","minimum":1}},"required":["id"]}},{"name":"twprojects-get_allocation","description":"Get an allocation. linkedTaskEstimatedTime counts each linked task whole, and a task can sit behind more than one allocation, so it must not be summed across allocations.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","enum":["id","project","assignedUser","title","description","startedAt","endedAt","duration","availableDuration","allocatedDuration","hoursPerDay","secondsPerDay","color","status","isBillable","overAllocated","recurringRule","linkedTaskIDs","linkedTaskEstimatedTime","financialDetails","canViewFinancialDetails","createdAt","createdBy","updatedAt","updatedBy","deletedAt","deletedBy"]},"description":"The attributes to return for each allocation, from the listed names."},"id":{"type":"integer","description":"The ID of the allocation to get.","minimum":1},"include_financial_details":{"type":"boolean","description":"Include forecasted revenue and cost for the allocated time. Requires the scheduler rates entitlement and financial permission on the project; without either, the request still succeeds but the figures are withheld. Read canViewFinancialDetails on each row to tell a withheld figure from a zero one."}},"required":["id"]}},{"name":"twprojects-get_comment","description":"Get comment.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","enum":["id","body","htmlBody","contentType","object","project","postedBy","postedDateTime","lastEditedBy","dateLastEdited","deleted","deletedBy","dateDeleted","files"]},"description":"The attributes to return for each comment, from the listed names."},"id":{"type":"integer","description":"The ID of the comment to get."}},"required":["id"]}},{"name":"twprojects-get_company","description":"Get company (aka client).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","enum":["id","addressOne","addressTwo","city","countryCode","emailOne","emailTwo","emailThree","fax","name","phone","profileText","state","website","zip","clientManagedBy","industry","tags","createdAt","updatedAt","status"]},"description":"The attributes to return for each company, from the listed names."},"id":{"type":"integer","description":"The ID of the company to get."}},"required":["id"]}},{"name":"twprojects-get_custom_field","description":"Get custom field.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the custom field to get."}},"required":["id"]}},{"name":"twprojects-get_custom_field_value","description":"Get a single custom field value from a task, project or company.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"entity":{"type":"string","description":"The type of entity the custom field value is attached to.","enum":["task","project","company"]},"entity_id":{"type":"integer","description":"The ID of the task, project or company the custom field value belongs to."},"value_id":{"type":"integer","description":"The ID of the custom field value entry to retrieve."}},"required":["entity","entity_id","value_id"]}},{"name":"twprojects-get_custom_item","description":"Get a custom item type with its fields and sections inline, so you can see its schema before creating or updating records. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"Custom item type ID to retrieve."}},"required":["id"]}},{"name":"twprojects-get_custom_item_field","description":"Get a single field on a custom item type. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"custom_item_id":{"type":"integer","description":"Custom item type ID the field belongs to."},"id":{"type":"integer","description":"Field ID."}},"required":["custom_item_id","id"]}},{"name":"twprojects-get_custom_item_record","description":"Get a single record. Field values come back keyed by display name with dropdown values translated to their human-readable labels. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"custom_item_id":{"type":"integer","description":"Custom item type ID the record belongs to."},"id":{"type":"integer","description":"Record ID."}},"required":["custom_item_id","id"]}},{"name":"twprojects-get_file","description":"Get a file's details: name, size, uploader, version history, the tasks, messages and comments it is attached to, and its downloadURL. The downloadURL needs the caller's own Teamwork session, so hand it to a signed-in user rather than fetching it; use twprojects-download_file to read the content here.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","enum":["id","displayName","originalName","description","size","status","isPrivate","isLocked","lockedBy","lockedAt","version","latestFileVersionNo","versions","project","category","tags","fileSource","uploadedBy","uploadedAt","updatedAt","deletedAt","deletedBy","downloadURL","previewURL","thumbURL","relatedItems","commentsCount","shareable"]},"description":"The attributes to return for each file, from the listed names."},"id":{"type":"integer","description":"The ID of the file to get."},"include_versions":{"type":"boolean","description":"Whether to include the file's whole version history under versions. Defaults to false."},"version":{"type":"integer","description":"The version number whose details, size and downloadURL are returned. Omit for the latest version.","minimum":1}},"required":["id"]}},{"name":"twprojects-get_jobrole","description":"Get job role. The people assigned to the role come back under users, and those holding it as their primary role under primaryUsers; both are references, resolved to names under included.users.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","enum":["id","name","isActive","createdByUser","createdAt","updatedByUser","updatedAt","deletedByUser","deletedAt","users","primaryUsers"]},"description":"The attributes to return for each job role, from the listed names."},"id":{"type":"integer","description":"The ID of the job role to get."}},"required":["id"]}},{"name":"twprojects-get_link","description":"Get link.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the link to get."}},"required":["id"]}},{"name":"twprojects-get_message","description":"Get message.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","enum":["id","title","project","tags","lastReply","replyStatus","status","body","author","message","meta","createdAt","updatedAt","attachments"]},"description":"The attributes to return for each message, from the listed names."},"id":{"type":"integer","description":"The ID of the message to get."}},"required":["id"]}},{"name":"twprojects-get_message_reply","description":"Get message reply.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","enum":["id","body","author","message","meta","createdAt","updatedAt","status","attachments"]},"description":"The attributes to return for each message reply, from the listed names."},"id":{"type":"integer","description":"The ID of the message reply to get."}},"required":["id"]}},{"name":"twprojects-get_milestone","description":"Get milestone.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","enum":["id","name","description","deadline","project","tasklists","tags","responsibleParties","createdOn","lastChangedOn","deletedOn","completedOn","completedBy","completed","status"]},"description":"The attributes to return for each milestone, from the listed names."},"id":{"type":"integer","description":"The ID of the milestone to get."}},"required":["id"]}},{"name":"twprojects-get_notebook","description":"Get notebook.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","enum":["id","name","description","contents","type","project","tags","createdAt","createdBy","updatedAt","updatedBy","deletedAt","deletedBy","deleted"]},"description":"The attributes to return for each notebook, from the listed names."},"id":{"type":"integer","description":"The ID of the notebook to get."}},"required":["id"]}},{"name":"twprojects-get_project","description":"Get project.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","enum":["id","description","name","startAt","endAt","category","company","projectOwner","tags","update","lastWorkedOn","createdAt","createdBy","updatedAt","updatedBy","completedAt","completedBy","status","isBillable","type"]},"description":"The attributes to return for each project, from the listed names."},"id":{"type":"integer","description":"The ID of the project to get."}},"required":["id"]}},{"name":"twprojects-get_project_category","description":"Get project category.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","enum":["id","name","color","parent","count"]},"description":"The attributes to return for each project category, from the listed names."},"id":{"type":"integer","description":"The ID of the project category to get."}},"required":["id"]}},{"name":"twprojects-get_skill","description":"Get skill.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the skill to get."}},"required":["id"]}},{"name":"twprojects-get_tag","description":"Get tag.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the tag to get."}},"required":["id"]}},{"name":"twprojects-get_task","description":"Get task.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","enum":["id","name","description","descriptionContentType","priority","progress","startDate","dueDate","estimateMinutes","tasklist","parentTask","assignees","tags","attachments","predecessors","subTaskIds","workflowStages","createdBy","createdAt","updatedBy","updatedAt","deletedBy","deletedAt","completedBy","completedAt","status"]},"description":"The attributes to return for each task, from the listed names."},"id":{"type":"integer","description":"The ID of the task to get."}},"required":["id"]}},{"name":"twprojects-get_tasklist","description":"Get tasklist.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","enum":["id","name","description","project","milestone","createdAt","updatedAt","status"]},"description":"The attributes to return for each tasklist, from the listed names."},"id":{"type":"integer","description":"The ID of the tasklist to get."}},"required":["id"]}},{"name":"twprojects-get_team","description":"Get team.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the team to get."}},"required":["id"]}},{"name":"twprojects-get_timelog","description":"Get timelog.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","enum":["id","description","billable","minutes","timeLogged","user","task","project","tags","deskTicketId","createdAt","loggedBy","updatedAt","updatedBy","deletedAt","deletedBy","deleted"]},"description":"The attributes to return for each timelog, from the listed names."},"id":{"type":"integer","description":"The ID of the timelog to get."}},"required":["id"]}},{"name":"twprojects-get_timer","description":"Get timer.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","enum":["id","description","running","billable","user","task","project","timelog","createdAt","updatedAt","deletedAt","deleted","duration","lastStartedAt","timerLastIntervalEnd","intervals"]},"description":"The attributes to return for each timer, from the listed names."},"id":{"type":"integer","description":"The ID of the timer to get."}},"required":["id"]}},{"name":"twprojects-get_user","description":"Get user.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","enum":["id","firstName","lastName","title","email","isAdmin","type","userCost","userRate","company","jobRoles","skills","workingHour","lengthOfDay","deleted","createdBy","createdAt","updatedBy","updatedAt"]},"description":"The attributes to return for each user, from the listed names."},"id":{"type":"integer","description":"The ID of the user to get."}},"required":["id"]}},{"name":"twprojects-get_user_me","description":"Get the currently authenticated user.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"twprojects-get_workflow","description":"Get workflow.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","enum":["id","name","defaultWorkflow"]},"description":"The attributes to return for each workflow, from the listed names."},"id":{"type":"integer","description":"The ID of the workflow to get."}},"required":["id"]}},{"name":"twprojects-get_workflow_stage","description":"Get workflow stage.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","enum":["id","name","workflow"]},"description":"The attributes to return for each workflow stage, from the listed names."},"id":{"type":"integer","description":"The ID of the workflow stage to get."},"workflow_id":{"type":"integer","description":"The ID of the workflow that owns the stage."}},"required":["workflow_id","id"]}},{"name":"twprojects-link_project_to_workflow","description":"Link a project to a workflow so its tasks track through workflow stages.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project_id":{"type":"integer","description":"The ID of the project to link to the workflow."},"workflow_id":{"type":"integer","description":"The ID of the workflow to link the project to."}},"required":["project_id","workflow_id"]}},{"name":"twprojects-link_task_to_allocation","description":"Link one task to an allocation, showing what task work sits behind the committed time. The task and the allocation must be in the same project. This adds a single link and leaves the allocation's other links alone, unlike linked_task_ids on twprojects-update_allocation, which replaces the whole set.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"allocation_id":{"type":"integer","description":"The ID of the allocation.","minimum":1},"task_id":{"type":"integer","description":"The ID of the task to link. Must belong to the allocation's project.","minimum":1}},"required":["allocation_id","task_id"]}},{"name":"twprojects-list_activities","description":"List recent activity events. Scope by project_id or omit for site-wide.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching activities, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"end_date":{"description":"End of the activity window; the boundary itself is included, and a plain date covers that whole day. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"exclude_user_ids":{"type":"array","items":{"type":"integer"},"description":"Exclude activities created by these users. Pass the current user's ID to drop their own activity from the feed."},"fields":{"type":"array","items":{"type":"string","enum":["id","activityType","latestActivityType","dateTime","description","extraDescription","publicInfo","dueDate","forUserName","itemLink","link","user","forUser","project","company","item"]},"description":"The attributes to return for each activity, from the listed names."},"item_ids":{"type":"array","items":{"type":"integer"},"description":"Filter activities by the IDs of the items they refer to, such as task, milestone or message IDs. Item IDs are only unique within an item type, so combine this with log_item_types to avoid matching activities of other types that happen to share an ID."},"log_item_types":{"type":"array","items":{"type":"string","enum":["message","comment","task","tasklist","taskgroup","milestone","file","form","notebook","timelog","task_comment","notebook_comment","file_comment","link_comment","milestone_comment","project","link","billingInvoice","risk","projectUpdate","reacted","budget"]},"description":"Filter activities by item types."},"order_by":{"type":"string","description":"The field to sort the activities by. Omit to keep the ordering the API applies by default.","enum":["date","projectId","userId","activityTypes","id"]},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_id":{"type":"integer","description":"The ID of the project to retrieve activities from. Omit to list activities across all projects."},"start_date":{"description":"Start of the activity window; the boundary itself is included. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"user_ids":{"type":"array","items":{"type":"integer"},"description":"Filter activities by the users who created them."},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_allocations","description":"List scheduler allocations — who is committed to which project, and when. ALWAYS pass start_date and end_date: with neither set the endpoint returns only today through 30 days from today, and says nothing about having narrowed the range, so an unbounded call silently answers a question about a wider period with one month of data. Allocations are planned time and a separate plane from task estimates and logged time; the two are not summed. linkedTaskEstimatedTime counts each linked task whole and must not be summed across allocations.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"assigned_user_ids":{"type":"array","items":{"type":"integer"},"description":"Only return allocations assigned to these users. Accepts real people and placeholder users alike."},"assigned_user_team_ids":{"type":"array","items":{"type":"integer"},"description":"Only return allocations whose assigned user belongs to one of these teams."},"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching allocations, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"deleted_after":{"description":"Only return allocations deleted at or after this moment; the boundary itself matches, unlike updated_after. Pair it with show_deleted, which is what switches the results to deleted allocations. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"end_date":{"type":"string","description":"Return allocations overlapping up to and including this day (format: YYYY-MM-DD). Defaults to 30 days from today when omitted.","format":"date"},"fields":{"type":"array","items":{"type":"string","enum":["id","project","assignedUser","title","description","startedAt","endedAt","duration","availableDuration","allocatedDuration","hoursPerDay","secondsPerDay","color","status","isBillable","overAllocated","recurringRule","linkedTaskIDs","linkedTaskEstimatedTime","financialDetails","canViewFinancialDetails","createdAt","createdBy","updatedAt","updatedBy","deletedAt","deletedBy"]},"description":"The attributes to return for each allocation, from the listed names."},"include_financial_details":{"type":"boolean","description":"Include forecasted revenue and cost for the allocated time. Requires the scheduler rates entitlement and financial permission on the project; without either, the request still succeeds but the figures are withheld. Read canViewFinancialDetails on each row to tell a withheld figure from a zero one."},"match_all_project_tags":{"type":"boolean","description":"Require a project to carry every tag in project_tag_ids rather than any of them."},"order_by":{"type":"string","description":"The field to sort the allocations by. Omit to keep the ordering the API applies by default.","enum":["startdate","enddate","project","assigneduser","id"]},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_category_ids":{"type":"array","items":{"type":"integer"},"description":"Only return allocations on projects in these categories."},"project_company_ids":{"type":"array","items":{"type":"integer"},"description":"Only return allocations on projects belonging to these companies."},"project_ids":{"type":"array","items":{"type":"integer"},"description":"Only return allocations on these projects."},"project_owner_ids":{"type":"array","items":{"type":"integer"},"description":"Only return allocations on projects owned by these users."},"project_status":{"type":"string","description":"Only return allocations on projects with this status.","enum":["active","current","late","upcoming","completed","deleted"]},"project_tag_ids":{"type":"array","items":{"type":"integer"},"description":"Only return allocations on projects carrying these tags."},"search_term":{"type":"string","description":"A search term to filter allocations by title."},"show_deleted":{"type":"boolean","description":"Return ONLY deleted allocations instead of the active ones — this replaces the result set rather than adding to it, so a call with this set says nothing about what is currently scheduled. Deleting an allocation is a soft delete, and this is how a deleted one is found again."},"start_date":{"type":"string","description":"Return allocations overlapping this day onwards (format: YYYY-MM-DD). Defaults to today when omitted.","format":"date"},"updated_after":{"description":"Only return allocations updated strictly after this moment; the boundary itself does not match. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_calendar_events","description":"List events from a calendar, including time-blocking events that link a calendar slot to a Teamwork project, task or timelog. Omit calendar_id to read the calling user's own calendar. Use twprojects-list_calendars to name a different one; the calendar of type 'blocked_time' holds the account's time-blocking events.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"calendar_id":{"type":"integer","description":"The ID of the calendar to list events from. Omit it for the calling user's own calendar: the connected Google or Outlook calendar when there is one, otherwise the calendar of type 'blocked_time'. Every event reports the calendar it came from."},"cursor":{"type":"string","description":"Cursor for fetching the next page of results."},"ended_before_date":{"type":"string","description":"Only include events ending before this day starts, so the day named here is itself excluded — pass the day after the last one you want (format: YYYY-MM-DD). Note the asymmetry with started_after_date.","examples":["2023-12-31"],"format":"date"},"fields":{"type":"array","items":{"type":"string","enum":["id","summary","description","organizer","eventCreator","start","end","allDay","location","type","recurrence","guestsCanInviteOthers","guestsCanModify","guestsCanSeeOtherGuests","transparency","visibility","videoCallLink","calOwnerCanEdit","timeblock","attendees","attendeesOmitted","calendar","status","createdBy","createdAt","updatedAt"]},"description":"The attributes to return for each calendar event, from the listed names."},"limit":{"type":"integer","description":"Maximum number of events to return."},"order_by":{"type":"string","description":"The field to sort the calendar events by. Omit to keep the ordering the API applies by default.","enum":["startTime","updated","id"]},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"started_after_date":{"type":"string","description":"Only include events starting on or after this day, which is itself included (format: YYYY-MM-DD).","examples":["2023-01-01"],"format":"date"},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_calendars","description":"List calendars. Calendars hold events such as meetings, out-of-office periods and time-blocking entries; the calendar of type 'blocked_time' holds the account's time-blocking events.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching calendars, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"fields":{"type":"array","items":{"type":"string","enum":["id","name","type","createdAt","updatedAt"]},"description":"The attributes to return for each calendar, from the listed names."},"order_by":{"type":"string","description":"The field to sort the calendars by. Omit to keep the ordering the API applies by default.","enum":["name","id"]},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_comments","description":"List comments. Scope by one of task_id, milestone_id, notebook_id, link_id, or file_version_id; omit all for site-wide. Comment bodies are truncated at 500 characters and marked where they are cut; use twprojects-get_comment for the full text.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching comments, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"fields":{"type":"array","items":{"type":"string","enum":["id","body","htmlBody","contentType","object","project","postedBy","postedDateTime","lastEditedBy","dateLastEdited","deleted","deletedBy","dateDeleted","files"]},"description":"The attributes to return for each comment, from the listed names."},"file_version_id":{"type":"integer","description":"The ID of the file version to retrieve comments for. Each file can have multiple versions, and comments can be associated with specific versions."},"link_id":{"type":"integer","description":"The ID of the link to retrieve comments for. Provide this to scope comments to a link."},"milestone_id":{"type":"integer","description":"The ID of the milestone to retrieve comments for. Provide this to scope comments to a milestone."},"notebook_id":{"type":"integer","description":"The ID of the notebook to retrieve comments for. Provide this to scope comments to a notebook."},"order_by":{"type":"string","description":"The field to sort the comments by. Omit to keep the ordering the API applies by default.","enum":["all","date","project","user","type","id"]},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"search_term":{"type":"string","description":"A search term to filter comments by name."},"task_id":{"type":"integer","description":"The ID of the task to retrieve comments for. Provide this to scope comments to a task."},"updated_after":{"description":"Only include comments edited strictly after this moment; the boundary itself does not match. Defaults to the last 3 months. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"user_ids":{"type":"array","items":{"type":"integer"},"description":"A list of user IDs to filter comments by"},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_companies","description":"List companies (aka clients).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching companies, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"fields":{"type":"array","items":{"type":"string","enum":["id","addressOne","addressTwo","city","countryCode","emailOne","emailTwo","emailThree","fax","name","phone","profileText","state","website","zip","clientManagedBy","industry","tags","createdAt","updatedAt","status"]},"description":"The attributes to return for each company, from the listed names."},"match_all_tags":{"type":"boolean","description":"If true, match all tags; if false, match any.","default":false},"order_by":{"type":"string","description":"The field to sort the companies by. Omit to keep the ordering the API applies by default.","enum":["name","accounts","clients","collaborators","contacts","projects","tasks","country","health","website","email","phone","fax","industry","dateadded","ownercompany","ownername","taskscompletion","customfield","id"]},"order_by_custom_field_id":{"type":"integer","description":"The custom field to sort the companies by. Required when order_by is \"customfield\", and ignored otherwise.","minimum":1},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"search_term":{"type":"string","description":"A search term to filter companies by name. Each word from the search term is used to match against the company name."},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to filter companies by tags."},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_custom_field_values","description":"List the custom field values of a task, project or company.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching custom field values, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"custom_field_ids":{"type":"array","items":{"type":"integer"},"description":"Filter by custom field."},"entity":{"type":"string","description":"The type of entity to list custom field values for.","enum":["task","project","company"]},"entity_id":{"type":"integer","description":"The ID of the task, project or company to list custom field values for."},"fields":{"type":"array","items":{"type":"string","enum":["id","value","currencySymbol","countryCode","customfield","task","project","company","createdBy","createdAt","updatedBy","updatedAt"]},"description":"The attributes to return for each custom field value, from the listed names."},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}},"required":["entity","entity_id"]}},{"name":"twprojects-list_custom_fields","description":"List custom fields.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching custom fields, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"entities":{"type":"array","items":{"type":"string","enum":["project","task","company"]},"description":"Filter custom fields by entity type."},"fields":{"type":"array","items":{"type":"string","enum":["options","id","name","description","type","entity","required","formula","currencyCode","unitId","project","createdBy","createdAt","updatedBy","updatedAt","deleted","deletedBy","deletedAt"]},"description":"The attributes to return for each custom field, from the listed names."},"ids":{"type":"array","items":{"type":"integer"},"description":"Custom field IDs to retrieve."},"include_site_level":{"type":"boolean","description":"Whether to also include installation-level custom fields when filtering by project."},"only_project_level":{"type":"boolean","description":"Whether to return only project-level custom fields."},"only_site_level":{"type":"boolean","description":"Whether to return only installation-level custom fields."},"order_by":{"type":"string","description":"The field to sort the custom fields by. Omit to keep the ordering the API applies by default.","enum":["name","project","datecreated","dateupdated","id"]},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_ids":{"type":"array","items":{"type":"integer"},"description":"Filter custom fields by project."},"search_term":{"type":"string","description":"A search term to filter custom fields by name."},"show_deleted":{"type":"boolean","description":"Whether to include deleted custom fields in the results."},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_custom_item_fields","description":"List fields on a custom item type. Each entry includes the twId you need when writing record values. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching custom item fields, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"custom_item_id":{"type":"integer","description":"Custom item type ID to list fields for."},"ids":{"type":"array","items":{"type":"integer"},"description":"Restrict to these field IDs."},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"search_term":{"type":"string","description":"A search term to filter custom item fields by display name."},"show_deleted":{"type":"boolean","description":"Include deleted fields."}},"required":["custom_item_id"]}},{"name":"twprojects-list_custom_item_records","description":"List records on a custom item type. Returns each record with field values keyed by display name. Use the section_ids filter to scope to a specific section. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching custom item records, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"custom_item_id":{"type":"integer","description":"Custom item type ID to list records for."},"ids":{"type":"array","items":{"type":"integer"},"description":"Restrict to these record IDs."},"order_by":{"type":"string","description":"The field to sort the custom item records by. Omit to keep the ordering the API applies by default.","enum":["displayorder","name","customitemfield","id"]},"order_by_field_id":{"type":"integer","description":"The custom field to sort the records by. Required when order_by is \"customitemfield\", and ignored otherwise.","minimum":1},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"search_term":{"type":"string","description":"A search term to filter custom item records by name."},"section_ids":{"type":"array","items":{"type":"integer"},"description":"Restrict to records in these sections."},"show_deleted":{"type":"boolean","description":"Include deleted records."}},"required":["custom_item_id"]}},{"name":"twprojects-list_custom_items","description":"List the custom item types defined on a project. Returns each type's id, display name and labels — call get_custom_item to see a type's fields and sections. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching custom items, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"ids":{"type":"array","items":{"type":"integer"},"description":"Restrict to these custom item type IDs."},"order_by":{"type":"string","description":"The field to sort the custom items by. Omit to keep the ordering the API applies by default.","enum":["name","id"]},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_id":{"type":"integer","description":"Project ID to list custom item types for."},"search_term":{"type":"string","description":"A search term to filter custom items by display name or labels."},"show_deleted":{"type":"boolean","description":"Include deleted custom item types."}},"required":["project_id"]}},{"name":"twprojects-list_files","description":"List the files in a project's files area, or across every project when no project_id is given. Files attached to tasks, comments and messages live there too, so task_id answers \"what is attached to this task\". Deleted files are left out unless show_deleted is true. Each row carries a downloadURL that needs the caller's own Teamwork session; use twprojects-download_file to read the content here.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"category_id":{"type":"integer","description":"Only files in this file category."},"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching files, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"fields":{"type":"array","items":{"type":"string","enum":["id","displayName","originalName","description","size","status","isPrivate","isLocked","lockedBy","lockedAt","version","latestFileVersionNo","versions","project","category","tags","fileSource","uploadedBy","uploadedAt","updatedAt","deletedAt","deletedBy","downloadURL","previewURL","thumbURL","relatedItems","commentsCount","shareable"]},"description":"The attributes to return for each file, from the listed names."},"ids":{"type":"array","items":{"type":"integer"},"description":"Only files with these IDs."},"order_by":{"type":"string","description":"The field to sort the files by. Omit to keep the ordering the API applies by default.","enum":["name","projectname","categoryname","dateuploaded","size","id"]},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_id":{"type":"integer","description":"The ID of the project whose files area to list. Omit to list files across every project the caller can access."},"search_all_fields":{"type":"boolean","description":"Whether search_term also matches the file extension, the file category, the original file name and the name of the latest uploader. Defaults to false."},"search_term":{"type":"string","description":"Only files whose name contains this term. Set search_all_fields to also match the extension, the category, the original name and the uploader's name."},"show_deleted":{"type":"boolean","description":"Whether to also list deleted files. Defaults to false."},"skip_external_files":{"type":"boolean","description":"Whether to leave out files that live in a linked cloud storage provider (Google Drive, Dropbox, Box, OneDrive, SharePoint) and list uploads only. Defaults to false. A row's fileSource tells the two apart."},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"Only files carrying any of these tags."},"task_id":{"type":"integer","description":"Only files attached to this task."},"updated_after":{"description":"Only files changed strictly after this instant, on the file or on its selected version. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"uploaded_after":{"type":"string","description":"Only files whose selected version was uploaded on or after this day (YYYY-MM-DD). The day itself is included.","format":"date"},"uploaded_before":{"type":"string","description":"Only files whose selected version was uploaded before this day (YYYY-MM-DD). The bound is the first instant of the day, so files uploaded during it are excluded; name the following day to include it.","format":"date"},"user_ids":{"type":"array","items":{"type":"integer"},"description":"Only files uploaded by these users."},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_industries","description":"List supported company (aka client) industries.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"twprojects-list_jobroles","description":"List job roles. A verbose row carries the people assigned to the role under users, and those holding it as their primary role under primaryUsers; both are references, resolved to names under included.users.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching job roles, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"fields":{"type":"array","items":{"type":"string","enum":["id","name","isActive","createdByUser","createdAt","updatedByUser","updatedAt","deletedByUser","deletedAt","users","primaryUsers"]},"description":"The attributes to return for each job role, from the listed names."},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"search_term":{"type":"string","description":"A search term to filter job roles by name, or assigned users. The job role will be selected if each word of the term matches the name, or assigned user first or last name, not requiring that the word matches are in the same field."},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_links","description":"List links.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string","enum":["id","name","description","code","project-id","tags","created-by-userId","created-date","updated-by-userId","updated-date"]},"description":"The attributes to return for each link, from the listed names."},"match_all_tags":{"type":"boolean","description":"If true, match all tags; if false, match any.","default":false},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_id":{"type":"integer","description":"The ID of the project to filter links by."},"search_term":{"type":"string","description":"A search term to filter links by title or description. Each word from the search term is used to match against the link title or description. The link will be selected if each word of the term matches the link title or description, not requiring that the word matches are in the same field."},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to filter links by tags."},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_message_replies","description":"List replies under a message thread. Filter by message_ids or project_ids.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching message replies, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"fields":{"type":"array","items":{"type":"string","enum":["id","body","author","message","meta","createdAt","updatedAt","status","attachments"]},"description":"The attributes to return for each message reply, from the listed names."},"message_ids":{"type":"array","items":{"type":"integer"},"description":"Filter by message."},"order_by":{"type":"string","description":"The field to sort the message replies by. Omit to keep the ordering the API applies by default.","enum":["createdat","id"]},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_ids":{"type":"array","items":{"type":"integer"},"description":"Filter by project."},"search_term":{"type":"string","description":"A search term to filter message replies by body or title. Each word from the search term is used to match against the message reply body or title. The message reply will be selected if each word of the term matches the message reply body or title, not requiring that the word matches are in the same field."},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_messages","description":"List project messages (top-level posts). Use twprojects-list_message_replies for thread replies.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching messages, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"fields":{"type":"array","items":{"type":"string","enum":["id","title","project","tags","lastReply","replyStatus","status","body","author","message","meta","createdAt","updatedAt","attachments"]},"description":"The attributes to return for each message, from the listed names."},"match_all_tags":{"type":"boolean","description":"If true, match all tags; if false, match any.","default":false},"order_by":{"type":"string","description":"The field to sort the messages by. Omit to keep the ordering the API applies by default.","enum":["createdat","updatedat","category","project","createdby","unread","id"]},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_ids":{"type":"array","items":{"type":"integer"},"description":"Filter messages by project."},"search_term":{"type":"string","description":"A search term to filter messages by body or title. Each word from the search term is used to match against the message body or title. The message will be selected if each word of the term matches the message body or title, not requiring that the word matches are in the same field."},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to filter messages by tags."},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_milestones","description":"List milestones. Scope by project_id or omit for site-wide. Completed milestones are included by default; pass show_completed false to see only the outstanding ones. Use due_after and due_before to bound the deadline instead of listing everything and filtering afterwards.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching milestones, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"due_after":{"type":"string","description":"Only include milestones with a deadline on or after this date.","format":"date"},"due_before":{"type":"string","description":"Only include milestones with a deadline on or before this date.","format":"date"},"fields":{"type":"array","items":{"type":"string","enum":["id","name","description","deadline","project","tasklists","tags","responsibleParties","createdOn","lastChangedOn","deletedOn","completedOn","completedBy","completed","status"]},"description":"The attributes to return for each milestone, from the listed names."},"match_all_tags":{"type":"boolean","description":"If true, match all tags; if false, match any.","default":false},"order_by":{"type":"string","description":"The field to sort the milestones by. Omit to keep the ordering the API applies by default.","enum":["date","dateonly","name","project","user","dateCreated","dateUpdated","id"]},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_id":{"type":"integer","description":"The ID of the project from which to retrieve milestones. Omit to list milestones across all projects."},"search_term":{"type":"string","description":"A search term to filter milestones by name. Each word from the search term is used to match against the milestone name and description. The milestone will be selected if each word of the term matches the milestone name or description, not requiring that the word matches are in the same field."},"show_completed":{"type":"boolean","description":"If false, only return milestones that are not completed yet. Included by default, unlike the task and tasklist lists.","default":true},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to filter milestones by tags."},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_notebooks","description":"List notebooks.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching notebooks, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"fields":{"type":"array","items":{"type":"string","enum":["id","name","description","contents","type","project","tags","createdAt","createdBy","updatedAt","updatedBy","deletedAt","deletedBy","deleted"]},"description":"The attributes to return for each notebook, from the listed names."},"include_contents":{"type":"boolean","description":"If true, include notebook contents in the response.","default":true},"match_all_tags":{"type":"boolean","description":"If true, match all tags; if false, match any.","default":false},"order_by":{"type":"string","description":"The field to sort the notebooks by. Omit to keep the ordering the API applies by default.","enum":["name","project","dateCreated","dateUpdated","category","id"]},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_ids":{"type":"array","items":{"type":"integer"},"description":"Filter notebooks by project."},"search_term":{"type":"string","description":"A search term to filter notebooks by name or description. The notebook will be selected if each word of the term matches the notebook name or description, not requiring that the word matches are in the same field."},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to filter notebooks by tags."},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_project_budgets","description":"Lists top-level project budgets. Filters: project_ids, status.Returns only budgeted projects (diff with twprojects-list_projects for budgetless).Filter server-side via project_ids when known. 1-based page pagination (pageOffset = page - 1)","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching project budgets, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"cursor":{"type":"string","description":"Opaque cursor from a previous response, for cursor pagination. This is not an offset or a page number — never construct one. Setting it makes the endpoint ignore page and page_size. To walk pages, use page instead."},"fields":{"type":"array","items":{"type":"string","enum":["id","projectId","type","status","capacity","capacityUsed","originatorBudgetId","isRepeating","repeatPeriod","repeatUnit","repeatsRemaining","sequenceNumber","startDateTime","endDateTime","currencyCode","timelogType","expenseType","defaultRate","notificationIds","createdByUserId","dateCreated","updatedBy","dateUpdated","completedByUserId","dateCompleted","deletedByUserId","dateDeleted"]},"description":"The attributes to return for each project budget, from the listed names."},"limit":{"type":"integer","description":"Maximum number of budgets to return. Only applies alongside cursor; ignored when paging with page/page_size."},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_ids":{"type":"array","items":{"type":"integer"},"description":"Filter budgets by project."},"status":{"type":"string","description":"Filter budgets by status.","enum":["UPCOMING","ACTIVE","COMPLETED"]},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_project_categories","description":"List project categories.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching project categories, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"fields":{"type":"array","items":{"type":"string","enum":["id","name","color","parent","count"]},"description":"The attributes to return for each project category, from the listed names."},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"search_term":{"type":"string","description":"A search term to filter project categories by name."},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_project_templates","description":"List project templates.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"match_all_tags":{"type":"boolean","description":"If true, match all tags; if false, match any.","default":false},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_category_ids":{"type":"array","items":{"type":"integer"},"description":"Filter project templates by category."},"search_term":{"type":"string","description":"A search term to filter project templates by name or description."},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to filter project templates by tags."}}}},{"name":"twprojects-list_project_updates","description":"List project updates: the Markdown text on a project's dashboard and the health it reports. Nothing else returns either — a project row carries no health, and the activity log holds a preview of the text, not the text. Newest first. Only each project's current update is returned unless active_only is false, so an unfiltered call is not the whole history. Rows carry text (Markdown, in full, emoji codes already converted to characters), health (0 not set, 1 bad, 2 ok, 3 good), healthLabel (the name this installation gives that rating — read it, never build one from health) and color (hex, empty when the health is not set). The author and the project are bare IDs, sideloaded under included when verbose is true. Keep a response small with fields and page_size; verbose=false drops the text and returns the ratings.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"active_only":{"type":"boolean","description":"If true (the default), return only each project's current update. Set it to false to read the update history, which returns every past update in full.","default":true},"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching project updates, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"created_after":{"description":"Only include updates posted at or after this moment; the boundary itself matches. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"fields":{"type":"array","items":{"type":"string","enum":["id","text","health","healthLabel","color","project","createdBy","createdAt","updatedAt","isActive","deleted","deletedAt","deletedBy","likeFromUsers","reactions"]},"description":"The attributes to return for each project update, from the listed names."},"include_archived":{"type":"boolean","description":"If true, return the updates of archived projects alongside those of the active ones; excluded by default. Ignored when project_ids is set."},"order_by":{"type":"string","description":"The field to sort the project updates by. Omit to keep the ordering the API applies by default.","enum":["date","color","health","project","user","id"]},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_healths":{"type":"array","items":{"type":"string","enum":["good","ok","bad","not_set"]},"description":"Only return the updates reporting these health ratings, matching any of the values given. \"not_set\" matches an update that rates nothing. Ignored when project_ids is set."},"project_ids":{"type":"array","items":{"type":"integer"},"description":"Only return the updates of these projects. Naming any project makes the endpoint ignore every other project filter, including project_healths and include_archived."},"show_deleted":{"type":"boolean","description":"If true, return deleted updates alongside the live ones; excluded by default."},"updated_after":{"description":"Only include updates last edited strictly after this moment; the boundary itself does not match. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_projects","description":"List projects with structured filters (membership, progress state, health, category, tag, company, owner). For \"my projects\" pass user_ids with the ID from twprojects-get_user_me, or only_starred. For projects that have slipped pass project_statuses=[\"late\"] — a project row carries no late flag, so this filter is the only way to ask.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"description":"Filter projects by the company that owns them."},"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching projects, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"fields":{"type":"array","items":{"type":"string","enum":["id","description","name","startAt","endAt","category","company","projectOwner","tags","update","lastWorkedOn","createdAt","createdBy","updatedAt","updatedBy","completedAt","completedBy","status","isBillable","type"]},"description":"The attributes to return for each project, from the listed names."},"hide_observed":{"type":"boolean","description":"If true, leave out the projects the calling user only observes, keeping the ones they actually work on."},"include_archived":{"type":"boolean","description":"If true, return archived projects alongside the active ones; excluded by default."},"include_subcategories":{"type":"boolean","description":"If true, project_category_ids also matches the categories nested under the ones given."},"include_tentative":{"type":"boolean","description":"If true, return tentative projects alongside the normal ones; excluded by default."},"match_all_tags":{"type":"boolean","description":"If true, match all tags; if false, match any.","default":false},"only_admin_access":{"type":"boolean","description":"If true, only return the projects the calling user administers."},"only_archived":{"type":"boolean","description":"If true, only return archived projects."},"only_starred":{"type":"boolean","description":"If true, only return the projects the calling user has starred."},"order_by":{"type":"string","description":"The field to sort the projects by. Omit to keep the ordering the API applies by default.","enum":["budgetused","categoryname","companyname","creatorname","customfield","datecreated","duedate","health","lastactivity","lastworkedon","mobilespecial","name","namecaseinsensitive","ownercompany","ownername","starred","starredcompanyname","starredfirst","startdate","status","taskcompletion","id"]},"order_by_custom_field_id":{"type":"integer","description":"The custom field to sort the projects by. Required when order_by is \"customfield\", and ignored otherwise.","minimum":1},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_category_ids":{"type":"array","items":{"type":"integer"},"description":"Filter projects by category."},"project_healths":{"type":"array","items":{"type":"string","enum":["good","ok","bad","not_set"]},"description":"Filter projects by the health rating set on them, matching any of the values given. \"not_set\" matches the projects nobody has rated."},"project_owner_ids":{"type":"array","items":{"type":"integer"},"description":"Filter projects by the user who owns them."},"project_statuses":{"type":"array","items":{"type":"string","enum":["active","current","late","upcoming","completed","deleted"]},"description":"Filter projects by progress state, matching any of the values given. \"late\" is past its end date and not yet completed, \"upcoming\" has not started yet, \"current\" is running now, and \"active\" is every project that is neither completed nor archived. Omit to keep the endpoint's own default set."},"search_term":{"type":"string","description":"A search term to filter projects by name or description."},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to filter projects by tags."},"team_ids":{"type":"array","items":{"type":"integer"},"description":"Filter projects by team, matching the projects any member of those teams belongs to."},"updated_after":{"description":"Only include projects whose last activity is strictly after this moment; the boundary itself does not match. Any activity in the project counts, not just edits to the project record. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"user_ids":{"type":"array","items":{"type":"integer"},"description":"Filter projects by the users holding an explicit membership of them. For \"my projects\", pass the ID returned by twprojects-get_user_me."},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_skills","description":"List skills.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching skills, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"fields":{"type":"array","items":{"type":"string","enum":["id","name","createdByUser","createdAt","updatedByUser","updatedAt","deletedByUser","deletedAt","users"]},"description":"The attributes to return for each skill, from the listed names."},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"search_term":{"type":"string","description":"A search term to filter skills by name, or assigned users. The skill will be selected if each word of the term matches the name, or assigned user first or last name, not requiring that the word matches are in the same field."},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_tags","description":"List tags.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching tags, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"fields":{"type":"array","items":{"type":"string","enum":["id","name","color","project"]},"description":"The attributes to return for each tag, from the listed names."},"item_type":{"type":"string","description":"Filter tags by item type.","enum":["PROJECT","TASK","TASKLIST","MILESTONE","MESSAGE","TIMELOG","NOTEBOOK","FILE","COMPANY","LINK"]},"order_by":{"type":"string","description":"The field to sort the tags by. Omit to keep the ordering the API applies by default.","enum":["name","count","project","color","datelastupdated","projectdatelastused","id"]},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_ids":{"type":"array","items":{"type":"integer"},"description":"Filter by project."},"search_term":{"type":"string","description":"A search term to filter tags by name. Each word from the search term is used to match against the tag name."},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_tasklist_budgets","description":"List tasklist budgets nested under a project budget. Requires project_budget_id.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching tasklist budgets, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"fields":{"type":"array","items":{"type":"string","enum":["id","type","capacity","capacityUsed","projectId","projectbudget","tasklist","milestone","notifications","createdAt","createdBy","updatedAt","updatedBy","deletedAt","deletedBy"]},"description":"The attributes to return for each tasklist budget, from the listed names."},"order_by":{"type":"string","description":"The field to sort the task list budgets by. Omit to keep the ordering the API applies by default.","enum":["dateCreated","displayOrder","id"]},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_budget_id":{"type":"integer","description":"The ID of the project budget to list tasklist budgets for."},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}},"required":["project_budget_id"]}},{"name":"twprojects-list_tasklists","description":"List tasklists. Scope by project_id or omit for site-wide.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching tasklists, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"fields":{"type":"array","items":{"type":"string","enum":["id","name","description","project","milestone","createdAt","updatedAt","status"]},"description":"The attributes to return for each tasklist, from the listed names."},"order_by":{"type":"string","description":"The field to sort the task lists by. Omit to keep the ordering the API applies by default.","enum":["displayorder","name","status","createdat","updatedat","project","id"]},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_id":{"type":"integer","description":"The ID of the project from which to retrieve tasklists. Omit to list tasklists across all projects."},"search_term":{"type":"string","description":"A search term to filter tasklists by name."},"show_completed":{"type":"boolean","description":"If true, include completed tasklists; excluded by default.","default":false},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_tasks","description":"List tasks with structured filters (tasklist_id, project_id, or site-wide). For keyword search use search. Completed tasks and tasks in completed tasklists are excluded unless show_completed is true, so an empty result may mean the matching work is already done rather than missing. Ask for \"late\", \"overdue\", \"due today\", \"started\" or \"upcoming\" work through date_filter, and leave people out through exclude_assignee_user_ids, rather than reading rows and filtering them yourself.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"assignee_user_ids":{"type":"array","items":{"type":"integer"},"description":"Filter tasks by assignee."},"completed_after":{"description":"Only include tasks completed at or after this moment; the boundary itself matches. Setting it narrows the result to completed tasks. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"completed_before":{"description":"Only include tasks completed at or before this moment; the boundary itself matches. Setting it narrows the result to completed tasks. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching tasks, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"created_after":{"description":"Only include tasks created at or after this moment; the boundary itself matches. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"created_before":{"description":"Only include tasks created at or before this moment; the boundary itself matches. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"created_by_user_ids":{"type":"array","items":{"type":"integer"},"description":"Filter tasks by creator."},"date_filter":{"type":"string","description":"Where the task's dates fall relative to today, in your own timezone. This is the filter for \"late\", \"overdue\", \"due today\", \"started\" and \"upcoming\"; omit it for no date restriction. overdue: due before today and not completed — this is \"late\", and it never returns completed tasks whatever show_completed says. today: due today, without adding the overdue ones. thisweek: the calendar week containing today, the days of it already past included. upcoming: due today or later. started: the start date has arrived and the due date has not passed — start date on or before today, and either no due date at all or one falling today or later. within7, within14, within30, within365: due between today and that many days from today, both days included. nodate: no start date, no due date and no milestone. anytime: no date restriction, what the endpoint applies when this is omitted. Completed tasks stay hidden unless show_completed is true, and overdue never returns one even then; for completed work alone use only_completed, which combines with any value here except overdue. A task with no due date of its own is matched on its milestone's.","enum":["anytime","overdue","today","tomorrow","yesterday","thisweek","upcoming","started","within7","within14","within30","within365","nodate","noduedate","nostartdate","hasdate"]},"due_after":{"type":"string","description":"Only include tasks due after this date, excluding the day itself — unless due_before is set too, which makes both bounds inclusive. A task with no due date is matched on its milestone's.","examples":["2023-01-01"],"format":"date"},"due_before":{"type":"string","description":"Only include tasks due before this date, excluding the day itself — unless due_after is set too, which makes both bounds inclusive. A task with no due date is matched on its milestone's.","examples":["2023-12-31"],"format":"date"},"exclude_assignee_user_ids":{"type":"array","items":{"type":"integer"},"description":"Leave out tasks assigned to any of these users. A task is dropped when any one of the listed users is assigned to it, even when it also carries assignees you did not exclude. A user reached only through a team, company or job-role assignment on the task is not matched. Combines with assignee_user_ids and every other filter."},"fields":{"type":"array","items":{"type":"string","enum":["id","name","description","descriptionContentType","priority","progress","startDate","dueDate","estimateMinutes","tasklist","parentTask","assignees","tags","attachments","predecessors","subTaskIds","workflowStages","createdBy","createdAt","updatedBy","updatedAt","deletedBy","deletedAt","completedBy","completedAt","status"]},"description":"The attributes to return for each task, from the listed names."},"match_all_tags":{"type":"boolean","description":"If true, match all tags; if false, match any.","default":false},"only_completed":{"type":"boolean","description":"If true, return only completed tasks. It combines with every other filter, date_filter included — except date_filter=overdue, which never matches a completed task and so returns nothing. Tasks in completed tasklists still need show_completed."},"only_unassigned":{"type":"boolean","description":"If true, only return tasks that have no assignee."},"only_unplanned":{"type":"boolean","description":"If true, only return tasks that are unplanned, meaning they are missing an assignee, a due date, or estimated time."},"order_by":{"type":"string","description":"The field to sort the tasks by. Omit to keep the ordering the API applies by default.","enum":["id","startdate","createdat","priority","project","flattenedtasklist","company","manual","active","completedat","duestartdate","alldates","tasklistname","tasklistdisplayorder","tasklistid","duedate","updatedat","taskname","createdby","completedby","assignedto","taskstatus","taskduedate","customfield","estimatedtime","boardcolumn","taskgroupid","taskgroupname","taskgroup","displayorder","projectmanual","stagedisplayorder","stage","parenttask"]},"order_by_custom_field_id":{"type":"integer","description":"The custom field to sort the tasks by. Required when order_by is \"customfield\", and ignored otherwise.","minimum":1},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_id":{"type":"integer","description":"The ID of the project from which to retrieve tasks. Omit to list tasks across all projects."},"search_term":{"type":"string","description":"A search term to filter tasks by name."},"show_completed":{"type":"boolean","description":"If true, include completed tasks and tasks belonging to completed tasklists; both excluded by default.","default":false},"start_after":{"type":"string","description":"Only include tasks whose own start date falls on or after this date; the day itself matches. A task with no start date never matches — there is no milestone fallback. There is no upper bound on the start date, so for work that has already begun use date_filter=started instead.","examples":["2023-01-01"],"format":"date"},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to filter tasks by tags."},"tasklist_id":{"type":"integer","description":"The ID of the tasklist from which to retrieve tasks. Takes precedence over project_id."},"updated_after":{"description":"Only include tasks updated strictly after this moment; the boundary itself does not match. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"updated_before":{"description":"Only include tasks updated strictly before this moment; the boundary itself does not match. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_teams","description":"List teams. Scope by company_id or project_id, or omit for site-wide.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"company_id":{"type":"integer","description":"The ID of the company from which to retrieve teams. Omit to list teams across all companies."},"fields":{"type":"array","items":{"type":"string","enum":["id","name","description","handle","logoUrl","logoIcon","logoColor","projectId","company","parentTeam","rootTeam","members","createdByUserId","dateCreated","updatedByUserId","dateUpdated","deleted","deletedDate"]},"description":"The attributes to return for each team, from the listed names."},"order_by":{"type":"string","description":"The field to sort the teams by. Omit to keep the ordering the API applies by default.","enum":["name","picker","dateAdded"]},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_id":{"type":"integer","description":"The ID of the project from which to retrieve teams. Omit to list teams across all projects."},"search_term":{"type":"string","description":"A search term to filter teams by name or handle."},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_timelogs","description":"List timelogs. Scope by project_id or task_id, or omit for site-wide.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"assigned_company_ids":{"type":"array","items":{"type":"integer"},"description":"Filter timelogs by assigned company."},"assigned_team_ids":{"type":"array","items":{"type":"integer"},"description":"Filter timelogs by assigned team."},"assigned_user_ids":{"type":"array","items":{"type":"integer"},"description":"Filter timelogs by assigned user."},"billable_type":{"type":"string","description":"Restrict the results to billable or non-billable timelogs. Omit, or pass all, to include both. For billable hours rather than the entries themselves, twprojects-summarize_timelogs reports them without paging.","enum":["all","billable","nonbillable"]},"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching timelogs, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"end_date":{"description":"End of the timelog window; the boundary itself is included, and a plain date covers that whole day. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"fields":{"type":"array","items":{"type":"string","enum":["id","description","billable","minutes","timeLogged","user","task","project","tags","deskTicketId","createdAt","loggedBy","updatedAt","updatedBy","deletedAt","deletedBy","deleted"]},"description":"The attributes to return for each timelog, from the listed names."},"invoiced_type":{"type":"string","description":"Restrict the results to timelogs that have or have not been added to an invoice. Omit, or pass all, to include both. Invoiced is not the same as billed: noninvoiced answers \"what is still to be invoiced\" only for billable time, so pass billable_type alongside it.","enum":["all","invoiced","noninvoiced"]},"match_all_tags":{"type":"boolean","description":"If true, match all tags; if false, match any.","default":false},"order_by":{"type":"string","description":"The field to sort the timelogs by. Omit to keep the ordering the API applies by default.","enum":["company","date","dateupdated","project","task","tasklist","user","description","billed","billable","timespent","id"]},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_id":{"type":"integer","description":"The ID of the project from which to retrieve timelogs. Omit to list timelogs across all projects."},"start_date":{"description":"Start of the timelog window; the boundary itself is included. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to filter timelogs by tags."},"task_id":{"type":"integer","description":"The ID of the task from which to retrieve timelogs. Omit to list timelogs across all tasks."},"ticketIds":{"type":"array","items":{"type":"integer"},"description":"Filter timelogs by associated desk ticket."},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_timers","description":"List timers.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching timers, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"fields":{"type":"array","items":{"type":"string","enum":["id","description","running","billable","user","task","project","timelog","createdAt","updatedAt","deletedAt","deleted","duration","lastStartedAt","timerLastIntervalEnd","intervals"]},"description":"The attributes to return for each timer, from the listed names."},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_id":{"type":"integer","description":"The ID of the project to filter timers by. Only timers associated with this project will be returned."},"running_timers_only":{"type":"boolean","description":"If true, only running timers are returned.","default":false},"task_id":{"type":"integer","description":"The ID of the task to filter timers by. Only timers associated with this task will be returned."},"user_id":{"type":"integer","description":"The ID of the user to filter timers by. Only timers associated with this user will be returned."},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_users","description":"List users. Scope by project_id or filter by type (account/collaborator/contact).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching users, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"fields":{"type":"array","items":{"type":"string","enum":["id","firstName","lastName","title","email","isAdmin","type","userCost","userRate","company","jobRoles","skills","workingHour","lengthOfDay","deleted","createdBy","createdAt","updatedBy","updatedAt"]},"description":"The attributes to return for each user, from the listed names."},"order_by":{"type":"string","description":"The field to sort the users by. Omit to keep the ordering the API applies by default.","enum":["name","namecaseinsensitive","company","id"]},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_id":{"type":"integer","description":"The ID of the project from which to retrieve users. Omit to list users across all projects."},"search_term":{"type":"string","description":"A search term to filter users by first or last names, or e-mail. The user will be selected if each word of the term matches the first or last name, or e-mail, not requiring that the word matches are in the same field."},"type":{"type":"string","description":"Type of user to filter by. The available options are account, collaborator or contact."},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-list_workflow_stages","description":"List workflow stages.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching workflow stages, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"fields":{"type":"array","items":{"type":"string","enum":["id","name","workflow"]},"description":"The attributes to return for each workflow stage, from the listed names."},"order_by":{"type":"string","description":"The field to sort the workflow stages by. Omit to keep the ordering the API applies by default.","enum":["id","name","displayorder"]},"order_mode":{"type":"string","description":"The direction to sort the results in.","enum":["asc","desc"]},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true},"workflow_id":{"type":"integer","description":"The ID of the workflow whose stages to list."}},"required":["workflow_id"]}},{"name":"twprojects-list_workflows","description":"List workflows.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"count_only":{"type":"boolean","description":"If true, return only {\"count\": N}: the exact number of matching workflows, no rows — use for \"how many\". Ignores page, page_size, verbose, fields.","default":false},"fields":{"type":"array","items":{"type":"string","enum":["id","name","defaultWorkflow"]},"description":"The attributes to return for each workflow, from the listed names."},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"search_term":{"type":"string","description":"A search term to filter workflows by name."},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-move_task_to_workflow_stage","description":"Move one or more tasks to a workflow stage.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"stage_id":{"type":"integer","description":"The ID of the workflow stage to move the tasks to."},"task_ids":{"type":"array","items":{"type":"integer"},"description":"The IDs of the tasks to move. At least one is needed; each is appended to the end of the stage in the order given. The workflow must be attached to the project the task belongs to."},"workflow_id":{"type":"integer","description":"The ID of the workflow that contains the target stage."}},"required":["workflow_id","stage_id"]}},{"name":"twprojects-move_tasks","description":"Move tasks and all their subtasks to another tasklist, preserving the parent/child structure. Subtasks move with their parent automatically, so only the topmost task of each subtree needs to be listed. A task whose parent is not part of the move is detached from it, becoming a top-level task in the destination.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"task_ids":{"type":"array","items":{"type":"integer"},"description":"The IDs of the tasks to move. Subtasks are moved automatically."},"tasklist_id":{"type":"integer","description":"The ID of the destination tasklist."}},"required":["task_ids","tasklist_id"]}},{"name":"twprojects-pause_timer","description":"Pause a running timer; can be resumed later. Use complete_timer to stop permanently.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the timer to pause."}},"required":["id"]}},{"name":"twprojects-restore_allocation","description":"Restore a deleted allocation. Find the ID first with twprojects-list_allocations and show_deleted set, since a deleted allocation is otherwise not returned.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the allocation to restore.","minimum":1}},"required":["id"]}},{"name":"twprojects-resume_timer","description":"Resume a paused timer back to running.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the timer to resume."}},"required":["id"]}},{"name":"twprojects-search","description":"Cross-entity keyword search across projects, tasks, messages, comments, users and more; restrict which entity types are searched with types. Long content fields in the sideloaded records are truncated at 500 characters and marked where they are cut; the marker names the tool that returns the full record. Completed items are excluded unless include_completed_items is true, so an empty result may mean the matching work is already done rather than missing.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"cursor":{"type":"string","description":"Cursor for pagination of results."},"extended_search":{"type":"boolean","description":"Whether to perform an extended search, which includes items updated more than 5 years ago."},"include_completed_items":{"type":"boolean","description":"Whether to include completed items in the search results. Excluded by default."},"include_highlights":{"type":"boolean","description":"Whether to return why each result matched, as fragments under its meta.highlights. Unavailable on an extended search."},"limit":{"type":"integer","description":"Number of results per page for pagination."},"project_id":{"type":"integer","description":"The ID of the project to limit the search to."},"search_term":{"type":"string","description":"A search term to to look for items."},"sideload":{"type":"array","items":{"type":"string","enum":["comments","companies","links","messages","milestones","notebooks","projects","tasklists","tasks","teams","timelogs","users"]},"description":"Which of the matched records are expanded into full records under the response's included section. It never changes which records are found — use types for that. Defaults to every type listed; a hit whose type is left out comes back as a bare {id, type} pair with no name."},"types":{"type":"array","items":{"type":"string","enum":["projects","tasks","tasklists","milestones","messages","notebooks","links","comments","taskcomments","milestonecomments","filecomments","linkcomments","notebookcomments","timelogs","users","teams","companies"]},"description":"Entity types to search. Only records of these types are found. Omit it to search every type."},"updated_after":{"description":"Only include items updated strictly after this moment; the boundary itself does not match. Accepts an RFC 3339 timestamp (2026-08-03T14:30:00Z) or a plain YYYY-MM-DD date (2026-08-03), which covers that whole day in UTC.","examples":["2026-08-03","2026-08-03T14:30:00Z"],"anyOf":[{"type":"string","format":"date-time"},{"type":"string","format":"date"}]},"verbose":{"type":"boolean","description":"If false, returns id + name only — useful when scanning many results.","default":true}}}},{"name":"twprojects-summarize_timelogs","description":"Complete time totals for a date window, grouped by user, project or task (rows in groups) or by day, week or month (rows in periods). One call returns every row, in exact minutes and hours to 2 decimals. Prefer it over twprojects-list_timelogs for any total, sum or breakdown; list_timelogs is for individual entries. Minutes are authoritative, unbilledBillable = billable − billed, and rows sum to totals. One dimension per call: for hours per user per week, call once per user with user_ids. Task rows omit project-level and subtask time, so never add totals across group_by values. Period rows cover every period in order, zeros included, first and last clipped to the window; weeks follow the caller's start-of-week setting, so buckets can differ per user, and a weekend-only week with no time is dropped.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"description":"Filter to timelogs on projects of these companies/clients."},"end_date":{"type":"string","description":"Inclusive end of the report window (YYYY-MM-DD).","format":"date"},"group_by":{"type":"string","description":"Dimension to group by. Defaults to user. user, project and task fill groups; day, week and month fill periods. Filter a task grouping on a busy account.","default":"user","enum":["user","project","task","day","week","month"]},"include_archived_projects":{"type":"boolean","description":"Include time from archived projects. Defaults to false.","default":false},"order_by":{"type":"string","description":"The field to sort the summary rows by. Omit to keep the ordering the API applies by default. Rejected for day, week and month: period rows are chronological.","enum":["name","loggedtime","billabletime","nonbillabletime","billedtime","budget"]},"order_mode":{"type":"string","description":"The direction to sort the results in. Rejected for day, week and month: period rows are chronological.","enum":["asc","desc"]},"project_ids":{"type":"array","items":{"type":"integer"},"description":"Filter to timelogs on these projects."},"start_date":{"type":"string","description":"Inclusive start of the report window (YYYY-MM-DD).","format":"date"},"task_ids":{"type":"array","items":{"type":"integer"},"description":"Filter to timelogs on these tasks."},"tasklist_ids":{"type":"array","items":{"type":"integer"},"description":"Filter to timelogs on these task lists."},"team_ids":{"type":"array","items":{"type":"integer"},"description":"Filter to timelogs logged by members of these teams."},"timelog_tag_ids":{"type":"array","items":{"type":"integer"},"description":"Filter to timelogs carrying these tags."},"user_ids":{"type":"array","items":{"type":"integer"},"description":"Filter to timelogs logged for these users."}},"required":["start_date","end_date"]}},{"name":"twprojects-unlink_task_from_allocation","description":"Remove the link between one task and an allocation. Only the association is removed: both the task and the allocation are left in place. This removes a single link and leaves the allocation's other links alone.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"allocation_id":{"type":"integer","description":"The ID of the allocation.","minimum":1},"task_id":{"type":"integer","description":"The ID of the task to unlink.","minimum":1}},"required":["allocation_id","task_id"]}},{"name":"twprojects-update_allocation","description":"Update an allocation. Changing end_date ADDS or REMOVES committed time rather than redistributing it, because the per-day rate is what is held constant.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"assigned_user_id":{"type":"integer","description":"The ID of the user whose time is committed. Accepts a real person or a placeholder user — a stand-in used to plan work before the person who will do it is known. Nothing in the response distinguishes the two, so confirm which one an ID refers to before reporting who is booked.","minimum":1},"color":{"type":"string","description":"The allocation's colour as six hexadecimal digits, with or without a leading '#'."},"description":{"type":"string","description":"An optional description of the allocation, at most 255 characters.","maxLength":255},"end_date":{"type":"string","description":"The last day of the allocation (format: YYYY-MM-DD). Must not precede start_date. Extending it ADDS committed time rather than spreading the existing total: the per-day rate is what is held constant, so the total is the working days in the range times that rate."},"id":{"type":"integer","description":"The ID of the allocation to update.","minimum":1},"ignore_collisions":{"type":"boolean","description":"Skip the capacity check altogether. Prefer inform_of_over_allocation: this one also lets the change through, but suppresses the over-allocation report with it, so nobody is told the person is over-booked. It takes precedence when both are set."},"inform_of_over_allocation":{"type":"boolean","description":"Accept a change that puts the user over their capacity and report it, rather than rejecting it. Defaults to true, and the result says so when it happens. Turning it off means an over-allocating change is refused outright."},"is_billable":{"type":"boolean","description":"Whether the allocated time can be charged to a client."},"linked_task_ids":{"type":"array","items":{"type":"integer"},"description":"The tasks to associate with the allocation. This REPLACES the whole set of linked tasks, so send every task that should stay linked. To add or remove one task without touching the rest, use twprojects-link_task_to_allocation or twprojects-unlink_task_from_allocation instead."},"project_id":{"type":"integer","description":"The ID of the project to commit the time to.","minimum":1},"seconds_per_day":{"type":"integer","description":"The time committed on each working day of the range, in SECONDS — 4 hours a day is 14400. Must be between 60 (one minute) and 86400 (24 hours). Seconds rather than hours because the hours form is a float and rounds. This rate is what is held constant: the total is the working days in the range times this, so widening the range adds committed time.","minimum":60},"start_date":{"type":"string","description":"The first day of the allocation (format: YYYY-MM-DD)."},"title":{"type":"string","description":"The name of the allocation, at most 100 characters.","maxLength":100}},"required":["id"]}},{"name":"twprojects-update_comment","description":"Update comment.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"body":{"type":"string","description":"The content of the comment. The content can be added as text or HTML."},"content_type":{"type":"string","description":"The content type of the comment. It can be either 'TEXT' or 'HTML'.","enum":["TEXT","HTML"]},"id":{"type":"integer","description":"The ID of the comment to update."},"notify":{"description":"Who to notify of the comment change. Omit it unless the user named who to notify: the default notifies every follower of the related entity, and a value here replaces that set rather than adding to it, so a narrower one silently drops everyone else who would have been told. Accepts the string \"all\" to notify all project members, the boolean true to notify all followers of the related entity, the boolean false to notify nobody, a plain array of user IDs (e.g. [123, 456]), or an object selecting user_ids, company_ids, team_ids and/or job_role_ids (e.g. {\"user_ids\": [123, 456]}).","default":true,"anyOf":[{"type":"string","description":"Notify all project members.","enum":["all"]},{"type":"boolean","description":"true notifies all followers of the entity this comment is related to. false notifies nobody."},{"type":"array","items":{"type":"integer"},"description":"The IDs of the users to notify; shorthand for {\"user_ids\": [...]}.","minItems":1},{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"job_role_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"team_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"user_ids":{"type":"array","items":{"type":"integer"},"minItems":1}},"minProperties":1,"maxProperties":4,"anyOf":[{"required":["user_ids"]},{"required":["company_ids"]},{"required":["team_ids"]},{"required":["job_role_ids"]}]}]},"notify_current_user":{"type":"boolean","description":"Whether the current user should be notified about the comment change."}},"required":["id","body"]}},{"name":"twprojects-update_company","description":"Update company (aka client).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"address_one":{"type":"string","description":"The first line of the address of the company."},"address_two":{"type":"string","description":"The second line of the address of the company."},"city":{"type":"string","description":"The city of the company."},"country_code":{"type":"string","description":"The country code of the company, e.g., 'US' for the United States."},"email_one":{"type":"string","description":"The primary email address of the company."},"email_three":{"type":"string","description":"The tertiary email address of the company."},"email_two":{"type":"string","description":"The secondary email address of the company."},"fax":{"type":"string","description":"The fax number of the company."},"id":{"type":"integer","description":"The ID of the company to update."},"industry_id":{"type":"integer","description":"The ID of the industry the company belongs to."},"manager_id":{"type":"integer","description":"The ID of the user who manages the company."},"name":{"type":"string","description":"The name of the company."},"phone":{"type":"string","description":"The phone number of the company."},"profile":{"type":"string","description":"A profile description for the company."},"state":{"type":"string","description":"The state of the company."},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to associate with the company."},"website":{"type":"string","description":"The website of the company."},"zip":{"type":"string","description":"The ZIP or postal code of the company."}},"required":["id"]}},{"name":"twprojects-update_custom_field","description":"Update custom field.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"currency_code":{"type":"string","description":"The ISO currency code for 'currency' or 'financial' type custom fields."},"description":{"type":"string","description":"An optional description for the custom field."},"formula":{"type":"string","description":"The formula expression for 'formula' type custom fields."},"id":{"type":"integer","description":"The ID of the custom field to update."},"name":{"type":"string","description":"The display name of the custom field."},"options":{"description":"Type-specific options for the custom field. For 'dropdown' and 'multiselect' types, provide {\"choices\": [{\"value\": \"...\", \"color\": \"#rrggbb\"}, ...]}. For 'rating' type, provide {\"icon\": \"star|heart|...\", \"color\": \"#rrggbb\"}. For 'number-decimal' type, provide {\"decimals\": <int>}.","anyOf":[{"type":"object","properties":{"choices":{"type":"array","items":{"type":"object","properties":{"color":{"type":"string","description":"The hex color code for the choice (e.g. #ff0000)."},"value":{"type":"string","description":"The display value of the choice. For 'dropdown' fields, this is the value that will be set on entities when this choice is selected."}}}}}},{"type":"object","properties":{"color":{"type":"string","description":"The hex color code for the rating icons (e.g. #ff0000)."},"icon":{"type":"string","description":"The icon to use for the rating, e.g. 'star', 'heart', etc."}}},{"type":"object","properties":{"decimals":{"type":"integer","description":"The number of decimal places to allow for number-decimal custom fields."}}}]},"required":{"type":"boolean","description":"Whether the custom field must have a value when set on an entity."},"unit":{"type":"string","description":"The unit associated with the custom field, when applicable.","enum":["currency","duration","date","percent","currency/duration","duration/currency"]}},"required":["id"]}},{"name":"twprojects-update_custom_field_value","description":"Update a custom field value on a task, project or company.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"country_code":{"type":"string","description":"The country code for currency-type custom field values."},"currency_code":{"type":"string","description":"The ISO currency code for currency-type custom field values."},"custom_field_id":{"type":"integer","description":"The ID of the custom field the value belongs to."},"entity":{"type":"string","description":"The type of entity the custom field value is attached to.","enum":["task","project","company"]},"entity_id":{"type":"integer","description":"The ID of the task, project or company the custom field value belongs to."},"value":{"description":"The value to assign, typed per the field: string (text), number (number), boolean (checkbox), choice value string (dropdown/status; array for multiselect), ISO-8601 string (date).","anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}}]},"value_id":{"type":"integer","description":"The ID of the custom field value entry to update."}},"required":["entity","entity_id","value_id","custom_field_id"]}},{"name":"twprojects-update_custom_item","description":"Update a custom item type's display name, description, or labels. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"description":{"type":"string","description":"New description for the custom item type."},"display_name":{"type":"string","description":"New display name for the custom item type."},"id":{"type":"integer","description":"Custom item type ID to update."},"label_plural":{"type":"string","description":"New plural label."},"label_singular":{"type":"string","description":"New singular label."}},"required":["id"]}},{"name":"twprojects-update_custom_item_field","description":"Update a field on a custom item type. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"custom_item_id":{"type":"integer","description":"Custom item type ID the field belongs to."},"definition":{"type":"object","description":"Replacement type-specific configuration as a JSON object."},"display_name":{"type":"string","description":"New display name."},"id":{"type":"integer","description":"Field ID to update."},"position_after_id":{"type":"integer","description":"Move this field after the given field ID."}},"required":["custom_item_id","id"]}},{"name":"twprojects-update_custom_item_record","description":"Update a record on a custom item type. Only the fields you supply are changed; others are left as-is. Set section_id to null to remove the record from any section. Custom items are user-defined entity types — Contracts, Leads, Deals, or anything else a customer has set up on a project. Use these tools when the user refers to an entity that is NOT a built-in Teamwork concept (Task, Tasklist, Project, Milestone, Comment, Notebook, Company, Team, User, Tag). If you don't recognise an entity name in the user's request, assume it is a custom item and call twprojects-list_custom_items on the relevant project to confirm.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"clear_section":{"type":"boolean","description":"Set to true to explicitly clear the record's section. Use this instead of section_id when you want null semantics."},"custom_item_id":{"type":"integer","description":"Custom item type ID the record belongs to."},"field_values":{"type":"array","items":{"type":"object","properties":{"field_name":{"type":"string","description":"Display name of the field, case-insensitive."},"value":{"description":"Value to set. Type depends on the field — see the tool description.","anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},{"type":"object"}]}},"required":["field_name"]},"description":"Field values to set on the record. Each entry is {field_name, value}. Field names are matched case-insensitively against the custom item type's fields. Values are coerced by field type: dropdown/multiselect accept option labels or option twIds; date/time/datetime accept ISO-8601 strings; checkbox accepts bool or yes/no/true/false; number accepts numeric or numeric string; user accepts a user ID (or array of IDs for multi-user fields). To clear a field, send null."},"id":{"type":"integer","description":"Record ID to update."},"name":{"type":"string","description":"New display name for the record."},"position_after_id":{"type":"integer","description":"Move the record after the given record ID."},"section_id":{"type":"integer","description":"New section ID, or null to remove the record from any section."}},"required":["custom_item_id","id"]}},{"name":"twprojects-update_jobrole","description":"Update job role.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the job role to update."},"name":{"type":"string","description":"The name of the job role."}},"required":["id"]}},{"name":"twprojects-update_link","description":"Update link.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"code":{"type":"string","description":"The URL of the link. This is the actual web address that the link points to."},"description":{"type":"string","description":"The description of the link. Longer text that provides detailed information about the link."},"id":{"type":"integer","description":"The ID of the link to update."},"notify":{"description":"Who to notify of the link update. Omit it unless the user named who to notify: the default notifies all project members, and a value here replaces that set rather than adding to it, so a narrower one silently drops everyone else who would have been told. Accepts the string \"all\" to notify all project members, the boolean true as an alias for \"all\", the boolean false to notify nobody, a plain array of user IDs (e.g. [123, 456]), or an object selecting user_ids, company_ids, team_ids and/or job_role_ids (e.g. {\"user_ids\": [123, 456]}).","default":"all","anyOf":[{"type":"string","description":"Notify all project members.","enum":["all"]},{"type":"boolean","description":"true is the same as \"all\": notify all project members. false notifies nobody."},{"type":"array","items":{"type":"integer"},"description":"The IDs of the users to notify; shorthand for {\"user_ids\": [...]}.","minItems":1},{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"job_role_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"team_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"user_ids":{"type":"array","items":{"type":"integer"},"minItems":1}},"minProperties":1,"maxProperties":4,"anyOf":[{"required":["user_ids"]},{"required":["company_ids"]},{"required":["team_ids"]},{"required":["job_role_ids"]}]}]},"notify_current_user":{"type":"boolean","description":"Whether the current user should be notified about the new link."},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to associate with the link."},"title":{"type":"string","description":"The title of the link, which provides a brief summary of the purpose of the link."}},"required":["id"]}},{"name":"twprojects-update_message","description":"Update message.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"body":{"type":"string","description":"The body of the message."},"id":{"type":"integer","description":"The ID of the message to update."},"notify":{"description":"Who to notify of the message update. Omit it unless the user named who to notify: the default notifies all project members, and a value here replaces that set rather than adding to it, so a narrower one silently drops everyone else who would have been told. Accepts the string \"all\" to notify all project members, the boolean true as an alias for \"all\", the boolean false to notify nobody, a plain array of user IDs (e.g. [123, 456]), or an object selecting user_ids, company_ids, team_ids and/or job_role_ids (e.g. {\"user_ids\": [123, 456]}).","default":"all","anyOf":[{"type":"string","description":"Notify all project members.","enum":["all"]},{"type":"boolean","description":"true is the same as \"all\": notify all project members. false notifies nobody."},{"type":"array","items":{"type":"integer"},"description":"The IDs of the users to notify; shorthand for {\"user_ids\": [...]}.","minItems":1},{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"job_role_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"team_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"user_ids":{"type":"array","items":{"type":"integer"},"minItems":1}},"minProperties":1,"maxProperties":4,"anyOf":[{"required":["user_ids"]},{"required":["company_ids"]},{"required":["team_ids"]},{"required":["job_role_ids"]}]}]},"notify_current_user":{"type":"boolean","description":"Whether the current user should be notified about the new message."},"title":{"type":"string","description":"The title of the message."}},"required":["id"]}},{"name":"twprojects-update_message_reply","description":"Update message reply.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"body":{"type":"string","description":"The body of the message reply."},"id":{"type":"integer","description":"The ID of the message reply to update."},"notify":{"description":"Who to notify of the reply update. Omit it unless the user named who to notify: the default notifies all project members, and a value here replaces that set rather than adding to it, so a narrower one silently drops everyone else who would have been told. Accepts the string \"all\" to notify all project members, the boolean true as an alias for \"all\", the boolean false to notify nobody, a plain array of user IDs (e.g. [123, 456]), or an object selecting user_ids, company_ids, team_ids and/or job_role_ids (e.g. {\"user_ids\": [123, 456]}).","default":"all","anyOf":[{"type":"string","description":"Notify all project members.","enum":["all"]},{"type":"boolean","description":"true is the same as \"all\": notify all project members. false notifies nobody."},{"type":"array","items":{"type":"integer"},"description":"The IDs of the users to notify; shorthand for {\"user_ids\": [...]}.","minItems":1},{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"job_role_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"team_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"user_ids":{"type":"array","items":{"type":"integer"},"minItems":1}},"minProperties":1,"maxProperties":4,"anyOf":[{"required":["user_ids"]},{"required":["company_ids"]},{"required":["team_ids"]},{"required":["job_role_ids"]}]}]},"notify_current_user":{"type":"boolean","description":"Whether the current user should be notified about the new messageReply."}},"required":["id"]}},{"name":"twprojects-update_milestone","description":"Update milestone.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"assignees":{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"team_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"user_ids":{"type":"array","items":{"type":"integer"},"minItems":1}},"description":"Assignees for the milestone.","minProperties":1,"maxProperties":3},"description":{"type":"string","description":"A description of the milestone."},"due_date":{"type":"string","description":"The due date of the milestone (format: YYYYMMDD). Used for related tasks without their own due date."},"id":{"type":"integer","description":"The ID of the milestone to update."},"name":{"type":"string","description":"The name of the milestone."},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to associate with the milestone."},"tasklist_ids":{"type":"array","items":{"type":"integer"},"description":"Tasklists to associate with the milestone."}},"required":["id"]}},{"name":"twprojects-update_notebook","description":"Update notebook.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"contents":{"type":"string","description":"The contents of the notebook."},"description":{"type":"string","description":"A description of the notebook."},"id":{"type":"integer","description":"The ID of the notebook to update."},"name":{"type":"string","description":"The name of the notebook."},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to associate with the notebook."},"type":{"type":"string","description":"The type of the notebook.","enum":["MARKDOWN","HTML"]}},"required":["id"]}},{"name":"twprojects-update_project","description":"Update project.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"category_id":{"type":"integer","description":"The ID of the category to which the project belongs."},"company_id":{"type":"integer","description":"The ID of the company associated with the project."},"description":{"type":"string","description":"The description of the project."},"end_at":{"type":"string","description":"End date of the project (format: YYYYMMDD)."},"id":{"type":"integer","description":"The ID of the project to update."},"name":{"type":"string","description":"The name of the project."},"owned_id":{"type":"integer","description":"The ID of the user who owns the project."},"start_at":{"type":"string","description":"Start date of the project (format: YYYYMMDD)."},"status":{"type":"string","description":"The status of the project.","enum":["active","archived"]},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to associate with the project."}},"required":["id"]}},{"name":"twprojects-update_project_category","description":"Update project category.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"color":{"type":"string","description":"The color of the project category in hex format (e.g., #FF5733)."},"id":{"type":"integer","description":"The ID of the project category to update."},"name":{"type":"string","description":"The name of the project category."},"parent_id":{"type":"integer","description":"The ID of the parent project category, if any. This allows for nested categories."}},"required":["id"]}},{"name":"twprojects-update_skill","description":"Update skill.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the skill to update."},"name":{"type":"string","description":"The name of the skill."},"user_ids":{"type":"array","items":{"type":"integer"},"description":"The user IDs associated with the skill."}},"required":["id"]}},{"name":"twprojects-update_tag","description":"Update tag.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"color":{"type":"string","description":"The color of the tag. It must be a valid hex color code."},"id":{"type":"integer","description":"The ID of the tag to update."},"name":{"type":"string","description":"The name of the tag. It must have less than 50 characters."},"project_id":{"type":"integer","description":"The ID of the project to associate the tag with. This is for project-scoped tags."}},"required":["id"]}},{"name":"twprojects-update_task","description":"Update task.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"assignees":{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"job_role_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"team_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"user_ids":{"type":"array","items":{"type":"integer"},"minItems":1}},"description":"Assignees for the task. To remove all assignees, use clear_assignees instead.","minProperties":1,"maxProperties":4},"attachment_file_ids":{"type":"array","items":{"type":"integer"},"description":"IDs of files already in a project's files area to attach to the task, as returned by twprojects-add_project_file. Unlike a reference these can be used repeatedly, so this is how one file reaches several tasks. Files are added to whatever is already attached; nothing is removed."},"attachment_refs":{"type":"array","items":{"type":"string"},"description":"References of files to attach to the task, as returned by twprojects-create_upload_url or twprojects-create_file. Each is \"tf_\" followed by a UUID and the file extension, and can only be used once, so reserve an upload for each place a file should go. Files are added to whatever is already attached; nothing is removed."},"change_followers":{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"job_role_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"team_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"user_ids":{"type":"array","items":{"type":"integer"},"minItems":1}},"description":"Followers of any task changes.","minProperties":1,"maxProperties":4},"clear_assignees":{"type":"boolean","description":"If true, removes all assignees from the task, leaving it unassigned. Cannot be combined with a non-empty assignees value."},"clear_parent_task":{"type":"boolean","description":"If true, detaches the task from its parent, promoting it to a top-level task. Cannot be combined with parent_task_id."},"comment_followers":{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"job_role_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"team_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"user_ids":{"type":"array","items":{"type":"integer"},"minItems":1}},"description":"Followers of any task comments.","minProperties":1,"maxProperties":4},"complete_followers":{"type":"object","properties":{"company_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"job_role_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"team_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"user_ids":{"type":"array","items":{"type":"integer"},"minItems":1}},"description":"Followers of any task completions.","minProperties":1,"maxProperties":4},"description":{"type":"string","description":"The description of the task. Support for plain text and Markdown formatting."},"due_date":{"type":"string","description":"The due date of the task. If omitted, falls back to the milestone due date when one is set.","format":"date"},"estimated_minutes":{"type":"integer","description":"The estimated time to complete the task in minutes."},"id":{"type":"integer","description":"The ID of the task to update."},"name":{"type":"string","description":"The name/title of the task."},"notify":{"type":"boolean","description":"Whether to notify the task's assignees and followers, which sends them an email. Defaults to true. Set it to false for bulk or housekeeping changes nobody needs to hear about.","default":true},"parent_task_id":{"type":"integer","description":"The ID of the parent task, making this task a subtask. A subtask must live in the same tasklist as its parent, so moving one with tasklist_id fails until the parent has moved or the link is cleared. To detach the task from its parent, use clear_parent_task instead."},"predecessors":{"type":"array","items":{"type":"object","properties":{"task_id":{"type":"integer","description":"The ID of the predecessor task."},"type":{"type":"string","description":"'start' means this task can complete when the predecessor starts; 'complete' means this task can complete when the predecessor completes.","enum":["start","complete"]}}},"description":"Task dependencies that must be completed before this task can start."},"priority":{"type":"string","description":"The priority of the task.","enum":["low","medium","high"]},"progress":{"type":"integer","description":"The progress of the task, as a percentage (0-100). Only whole numbers are allowed.","minimum":0,"maximum":100},"start_date":{"type":"string","description":"The start date of the task.","format":"date"},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to associate with the task."},"tasklist_id":{"type":"integer","description":"The ID of the tasklist. Moving the task carries its subtasks along and detaches it from any parent staying behind. Use twprojects-move_tasks to move several tasks at once."}},"required":["id"]}},{"name":"twprojects-update_tasklist","description":"Update tasklist.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"description":{"type":"string","description":"The description of the tasklist."},"id":{"type":"integer","description":"The ID of the tasklist to update."},"milestone_id":{"type":"integer","description":"The ID of the milestone to associate with the tasklist."},"name":{"type":"string","description":"The name of the tasklist."}},"required":["id"]}},{"name":"twprojects-update_team","description":"Update team.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"company_id":{"type":"integer","description":"The ID of the company. This is used to create a team scoped for a specific company."},"description":{"type":"string","description":"The description of the team."},"handle":{"type":"string","description":"The handle of the team. It is a unique identifier for the team. It must not have spaces or special characters."},"id":{"type":"integer","description":"The ID of the team to update."},"name":{"type":"string","description":"The name of the team."},"parent_team_id":{"type":"integer","description":"The ID of the parent team, which places this team in a hierarchy. Pass 0 to move the team back to the top level."},"project_id":{"type":"integer","description":"The ID of the project. This is used to create a team scoped for a specific project."},"user_ids":{"type":"array","items":{"type":"integer"},"description":"Users to add to the team."}},"required":["id"]}},{"name":"twprojects-update_timelog","description":"Update timelog. It can also be moved to another project or task.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"billable":{"type":"boolean","description":"If true, the timelog is billable."},"clear_task":{"type":"boolean","description":"Set to true to detach the timelog from its task, leaving it logged against the project. Cannot be combined with task_id."},"date":{"type":"string","description":"The date of the timelog.","format":"date"},"description":{"type":"string","description":"A description of the timelog."},"hours":{"type":"integer","description":"The number of hours spent on the timelog. Must be a positive integer."},"id":{"type":"integer","description":"The ID of the timelog to update."},"is_utc":{"type":"boolean","description":"If true, the time is in UTC.","default":false},"minutes":{"type":"integer","description":"Minutes spent on the timelog. Must be a positive integer less than 60; otherwise increment hours instead."},"project_id":{"type":"integer","description":"Move the timelog to this project. The API takes the project from the task whenever the timelog is logged against one, so pass clear_task alongside it to move a timelog off its task."},"tag_ids":{"type":"array","items":{"type":"integer"},"description":"A list of tag IDs to associate with the timelog."},"task_id":{"type":"integer","description":"Move the timelog to this task, and with it to the task's own project."},"time":{"type":"string","description":"The time of the timelog in the format HH:MM:SS.","pattern":"^(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d$"},"user_id":{"type":"integer","description":"User the timelog is logged for. Defaults to the authenticated user."}},"required":["id"]}},{"name":"twprojects-update_timer","description":"Update timer.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"billable":{"type":"boolean","description":"If true, the timer is billable."},"description":{"type":"string","description":"A description of the timer."},"id":{"type":"integer","description":"The ID of the timer to update."},"project_id":{"type":"integer","description":"The ID of the project to associate the timer with."},"running":{"type":"boolean","description":"If true, the timer will start running immediately."},"task_id":{"type":"integer","description":"The ID of the task to associate the timer with."}},"required":["id"]}},{"name":"twprojects-update_user","description":"Update user.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"admin":{"type":"boolean","description":"Indicates whether the user is an administrator."},"company_id":{"type":"integer","description":"The ID of the client/company to which the user belongs."},"email":{"type":"string","description":"The email address of the user."},"first_name":{"type":"string","description":"The first name of the user."},"id":{"type":"integer","description":"The ID of the user to update."},"last_name":{"type":"string","description":"The last name of the user."},"title":{"type":"string","description":"The job title of the user, such as 'Project Manager' or 'Senior Software Developer'."},"type":{"type":"string","description":"The type of user, such as 'account', 'collaborator', or 'contact'."}},"required":["id"]}},{"name":"twprojects-update_workflow","description":"Update workflow.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the workflow to update."},"name":{"type":"string","description":"The new name of the workflow."}},"required":["id"]}},{"name":"twprojects-update_workflow_stage","description":"Update workflow stage.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the workflow stage to update."},"name":{"type":"string","description":"The new name of the workflow stage."},"workflow_id":{"type":"integer","description":"The ID of the workflow that owns the stage."}},"required":["workflow_id","id"]}},{"name":"twprojects-users_workload","description":"Get task allocation across users for a date range. (workload of users)","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"end_date":{"type":"string","description":"End of the workload period; the boundary day itself is included.","format":"date"},"page":{"type":"integer","description":"Page number for pagination of results (1-based).","minimum":1},"page_size":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"project_ids":{"type":"array","items":{"type":"integer"},"description":"Filter workload by project."},"start_date":{"type":"string","description":"Start of the workload period; the boundary day itself is included.","format":"date"},"user_company_ids":{"type":"array","items":{"type":"integer"},"description":"Filter workload by users' client/company."},"user_ids":{"type":"array","items":{"type":"integer"},"description":"Filter workload by user."},"user_team_ids":{"type":"array","items":{"type":"integer"},"description":"Filter workload by users' team."}},"required":["start_date","end_date"]}},{"name":"twspaces-create_category","description":"Create space category.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"color":{"type":"string","description":"A hex color code for the category (e.g. \"#FF5733\")."},"name":{"type":"string","description":"The name of the category."}},"required":["name"]}},{"name":"twspaces-create_comment","description":"Create comment on a page. Use parentId for replies.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"content":{"type":"string","description":"The content of the comment."},"isPrivate":{"type":"boolean","description":"Set to true to create a private comment visible only to space members."},"pageId":{"type":"integer","description":"The ID of the page to comment on."},"parentId":{"type":"integer","description":"The ID of the parent comment (for creating a reply)."},"spaceId":{"type":"integer","description":"The ID of the space containing the page."}},"required":["spaceId","pageId","content"]}},{"name":"twspaces-create_page","description":"Create page in a space.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"changeMessage":{"type":"string","description":"A message describing the changes made in this version."},"content":{"type":"string","description":"The HTML content of the page."},"isFullWidth":{"type":"boolean","description":"Display the page in full-width layout."},"isPublish":{"type":"boolean","description":"Set to true to publish the page immediately (default: draft)."},"isRequiredReading":{"type":"boolean","description":"Mark this page as required reading for space members."},"parentId":{"type":"integer","description":"The ID of the parent page (for creating a sub-page)."},"readerInlineCommentsEnabled":{"type":"boolean","description":"Allow readers to add inline comments on this page."},"slug":{"type":"string","description":"A URL-friendly slug for the page."},"spaceId":{"type":"integer","description":"The ID of the space to create the page in."},"title":{"type":"string","description":"The title of the page."}},"required":["spaceId","title"]}},{"name":"twspaces-create_space","description":"Create space.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"categoryId":{"type":"integer","description":"Category to assign. Use twspaces-list_categories to discover."},"code":{"type":"string","description":"A short unique code/identifier for the space (e.g. \"ENG\", \"DOCS\")."},"icon":{"type":"string","description":"An icon identifier for the space."},"projectId":{"type":"integer","description":"The ID of a Teamwork project to link to this space."},"purpose":{"type":"string","description":"A brief description of the space's purpose."},"spaceColor":{"type":"string","description":"A hex color code for the space (e.g. \"#FF5733\")."},"title":{"type":"string","description":"The title of the space."}},"required":["title","code"]}},{"name":"twspaces-create_tags","description":"Create one or more Spaces tags in a single request.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"object","properties":{"color":{"type":"string","description":"A hex color code for the tag (e.g. \"#FF5733\")."},"name":{"type":"string","description":"The name of the tag."}},"required":["name"]},"description":"Tags to create."}},"required":["tags"]}},{"name":"twspaces-duplicate_page","description":"Duplicate page with a new title.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"pageId":{"type":"integer","description":"The ID of the page to duplicate."},"parentId":{"type":"integer","description":"The ID of the parent page for the duplicate (defaults to same parent)."},"slug":{"type":"string","description":"A URL-friendly slug for the duplicated page."},"spaceId":{"type":"integer","description":"The ID of the space containing the page."},"title":{"type":"string","description":"The title for the duplicated page."}},"required":["spaceId","pageId","title"]}},{"name":"twspaces-get_category","description":"Get space category.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the category to retrieve."}},"required":["id"]}},{"name":"twspaces-get_comment","description":"Get page comment.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"commentId":{"type":"integer","description":"The ID of the comment to retrieve."},"pageId":{"type":"integer","description":"The ID of the page containing the comment."},"spaceId":{"type":"integer","description":"The ID of the space containing the page."}},"required":["spaceId","pageId","commentId"]}},{"name":"twspaces-get_homepage","description":"Get a space's homepage.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"spaceId":{"type":"integer","description":"The ID of the space to retrieve the homepage for."}},"required":["spaceId"]}},{"name":"twspaces-get_page","description":"Get page. Returns content, metadata, tags, and revision info.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"pageId":{"type":"integer","description":"The ID of the page to retrieve."},"spaceId":{"type":"integer","description":"The ID of the space containing the page."}},"required":["spaceId","pageId"]}},{"name":"twspaces-get_space","description":"Get space.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the space to retrieve."}},"required":["id"]}},{"name":"twspaces-get_tag","description":"Get Spaces tag.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the tag to retrieve."}},"required":["id"]}},{"name":"twspaces-list_categories","description":"List space categories.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"pageOffset":{"type":"integer","description":"The index position to start retrieving results from (not a page number)."},"pageSize":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500}}}},{"name":"twspaces-list_comments","description":"List comments on a page. Returns top-level comments with replies.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"pageId":{"type":"integer","description":"The ID of the page to list comments for."},"pageOffset":{"type":"integer","description":"The index position to start retrieving results from (not a page number)."},"pageSize":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"spaceId":{"type":"integer","description":"The ID of the space containing the page."}},"required":["spaceId","pageId"]}},{"name":"twspaces-list_pages","description":"List pages in a space as a hierarchical tree. Returns the space's open pages under `pages`; set includePrivate to also receive, under a sibling `private` key, the restricted pages the calling user has access to. Returns at most 100 pages per call by default, up to 500 with pageSize, counted across both trees. A space with more pages than that is cut in depth-first order and the response carries a `truncated` marker naming the total page count, the pageOffset that returns the next set, and twspaces-get_page for a single page in full.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"includePrivate":{"type":"boolean","description":"Return the restricted pages the calling user has access to as well, under a `private` key beside `pages`. Defaults to false, so an unfiltered call answers with the open pages only and a private page is missing rather than reported as inaccessible. Both trees share one pageSize budget and one pageOffset."},"pageOffset":{"type":"integer","description":"Number of pages to skip, counted in depth-first order (not a page number), across the open tree and then the private one. Use the value the `truncated` marker names to read the next set.","minimum":0},"pageSize":{"type":"integer","description":"Maximum number of pages to return (1-500). Defaults to 100.","minimum":1,"maximum":500},"spaceId":{"type":"integer","description":"The ID of the space to list pages for."}},"required":["spaceId"]}},{"name":"twspaces-list_space_collaborators","description":"List space collaborators (users and teams).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the space to retrieve collaborators for."}},"required":["id"]}},{"name":"twspaces-list_spaces","description":"List spaces.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"pageOffset":{"type":"integer","description":"The index position to start retrieving results from (not a page number)."},"pageSize":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500}}}},{"name":"twspaces-list_tags","description":"List Spaces tags.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"pageOffset":{"type":"integer","description":"The index position to start retrieving results from (not a page number)."},"pageSize":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500}}}},{"name":"twspaces-search","description":"Full-text search across pages. Filter by space.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"includeDeleted":{"type":"boolean","description":"Include deleted pages in search results."},"pageOffset":{"type":"integer","description":"The index position to start retrieving results from (not a page number)."},"pageSize":{"type":"integer","description":"Number of results per page for pagination (1-500).","minimum":1,"maximum":500},"query":{"type":"string","description":"The search query string."},"spaceIds":{"type":"array","items":{"type":"integer"},"description":"Limit search to specific spaces. Use twspaces-list_spaces to discover."}},"required":["query"]}},{"name":"twspaces-update_category","description":"Update space category.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"color":{"type":"string","description":"A new hex color code for the category."},"id":{"type":"integer","description":"The ID of the category to update."},"name":{"type":"string","description":"The new name for the category."}},"required":["id"]}},{"name":"twspaces-update_comment","description":"Update page comment.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"commentId":{"type":"integer","description":"The ID of the comment to update."},"content":{"type":"string","description":"The new content of the comment."},"isPrivate":{"type":"boolean","description":"Change the privacy setting of the comment."},"pageId":{"type":"integer","description":"The ID of the page containing the comment."},"spaceId":{"type":"integer","description":"The ID of the space containing the page."},"state":{"type":"string","description":"The new state of the comment (e.g. \"active\", \"resolved\")."}},"required":["spaceId","pageId","commentId"]}},{"name":"twspaces-update_page","description":"Update page. Note: content and publish changes update the published page only, not the live collaborative editor draft; if the page has an active editor draft, re-publishing from the Spaces web editor can overwrite these changes (known Spaces limitation).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"changeMessage":{"type":"string","description":"A message describing the changes made in this version."},"content":{"type":"string","description":"The new HTML content of the page."},"draftVersion":{"type":"integer","description":"Optimistic concurrency token for the page's draft content. Required when updating `content`; optional otherwise. Obtain the current value from the `draftVersion` field with twspaces-get_page or twspaces-list_pages tools."},"isFullWidth":{"type":"boolean","description":"Toggle full-width layout for this page."},"isMinorChange":{"type":"boolean","description":"Mark this update as a minor change (won't notify watchers)."},"isPublish":{"type":"boolean","description":"Set to true to publish the page, false to revert to draft."},"isRequiredReading":{"type":"boolean","description":"Mark or unmark this page as required reading."},"pageId":{"type":"integer","description":"The ID of the page to update."},"parentId":{"type":"integer","description":"The ID of the new parent page (to move the page)."},"readerInlineCommentsEnabled":{"type":"boolean","description":"Allow or disallow readers from adding inline comments."},"slug":{"type":"string","description":"A new URL-friendly slug for the page."},"spaceId":{"type":"integer","description":"The ID of the space containing the page."},"title":{"type":"string","description":"The new title of the page."}},"required":["spaceId","pageId"]}},{"name":"twspaces-update_space","description":"Update space.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"categoryId":{"type":"integer","description":"Category to assign. Use twspaces-list_categories to discover."},"code":{"type":"string","description":"A new short unique code/identifier for the space."},"icon":{"type":"string","description":"A new icon identifier for the space."},"id":{"type":"integer","description":"The ID of the space to update."},"projectId":{"type":"integer","description":"The ID of a Teamwork project to link to this space."},"purpose":{"type":"string","description":"A new brief description of the space's purpose."},"spaceColor":{"type":"string","description":"A new hex color code for the space."},"state":{"type":"string","description":"The state of the space (e.g. \"active\", \"archived\")."},"title":{"type":"string","description":"The new title of the space."}},"required":["id"]}},{"name":"twspaces-update_tag","description":"Update Spaces tag.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"color":{"type":"string","description":"A new hex color code for the tag."},"id":{"type":"integer","description":"The ID of the tag to update."},"name":{"type":"string","description":"The new name for the tag."}},"required":["id"]}}],"scan":{"score":89,"grade":"A","scanned_at":"2026-09-19T10:16:27.323Z","report":{"scannerVersion":"0.1.3","scannedAt":"2026-09-19T10:16:27.313Z","components":{"code":{"score":-1,"max":25,"notes":["package could not be scanned"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 442ms"]},"poisoning":{"score":15,"max":15,"notes":["213 tool descriptions checked"]},"auth":{"score":8,"max":15,"notes":["API key sent as a header"]},"maintenance":{"score":15,"max":15,"notes":["last push 1 days ago"]},"identity":{"score":9,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"probes":[{"url":"https://mcp.ai.teamwork.com/sse","reachable":false,"authRequired":false,"latencyMs":104,"error":"SSE error: Non-200 status code (401)"},{"url":"https://mcp.ai.teamwork.com","reachable":true,"authRequired":false,"latencyMs":442,"serverInfo":{"name":"Teamwork.com","version":"1.43.2"}}],"packages":[],"repo":{"found":true,"owner":"teamwork","repo":"mcp","archived":false,"pushedAt":"2026-09-18T17:19:57Z","stars":25,"forks":18,"openIssues":4,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/4037476?v=4","ownerCreatedAt":"2013-04-02T13:49:04Z","license":"MIT"},"icon":{"url":"https://cdn-website.teamwork.com/offload/app/uploads/2019/03/04183535/cropped-favicon-192x192.png","source":"site","width":192,"height":192},"presence":{"stars":25,"forks":18,"downloadsWeek":null,"license":"MIT","lastPushAt":"2026-09-18T17:19:57.000Z","score":34}}}},"grade_history":[],"reviews":[]}