{ "name": "save_comment", "description": "Create or update a comment on a Linear issue, project, initiative, document, or project milestone. If `id` is provided, updates the existing comment; otherwise creates a new one. To start a new thread, pass `body` and exactly one of `issueId`, `projectId`, `initiativeId`, `documentId`, or `milestoneId` — comments on issues/projects/initiatives become top-level discussion threads; comments on documents/milestones become description comments. To reply to an existing thread, pass `parentId` and `body`; the reply inherits the parent's thread type, so no entity reference is needed.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { "id": { "description": "Comment ID. If provided, updates the existing comment", "type": "string" }, "issueId": { "description": "Issue ID or identifier (e.g., LIN-123) (provide exactly one parent)", "type": "string" }, "projectId": { "description": "Project name, ID, or slug (provide exactly one parent)", "type": "string" }, "initiativeId": { "description": "Initiative name or ID (provide exactly one parent)", "type": "string" }, "documentId": { "description": "Document ID or slug (provide exactly one parent)", "type": "string" }, "milestoneId": { "description": "Milestone UUID (provide exactly one parent). Resolve milestone names via `list_milestones` first.", "type": "string" }, "parentId": { "description": "Parent comment ID (for replies, only when creating)", "type": "string" }, "body": { "type": "string", "description": "Content as Markdown. Do not escape the string — use literal newlines and special characters, not escape sequences. To mention a user, use @displayName (e.g., @johndoe)" } }, "required": [ "body" ], "additionalProperties": false } }