{
  "tools": [
    {
      "name": "get_attachment",
      "title": "Get attachment",
      "description": "Retrieve an issue attachment by ID. Use format=url to get its title and download URL without fetching the file content. Linear upload URLs are signed for five minutes; call again to refresh. External URLs are returned unchanged. Files embedded in comments have no issue attachment ID; use the URLs in list_comments attachments instead. Download and process documents with your own file tools.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Attachment ID"
          },
          "format": {
            "description": "Response format. Defaults to content.",
            "type": "string",
            "enum": [
              "content",
              "url"
            ]
          }
        },
        "required": [
          "id"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "prepare_attachment_upload",
      "title": "Prepare attachment upload",
      "description": "Prepare a direct Linear file upload for an existing issue.\n\nWorkflow:\n1. Call this tool with issue, filename, contentType, and size.\n2. Upload raw bytes with PUT to uploadRequest.url outside MCP.\n3. All headers in uploadRequest.headers are part of the signed request, so send them verbatim.\n4. After PUT succeeds, call create_attachment_from_upload with assetUrl to link it to the issue.\n\nDo not base64-encode or transform the file. Use curl --data-binary @path or fetch(url, { method: 'PUT', body: blob }).\nOmitting or modifying any signed header, including casing, will return HTTP 403.\nThe signed URL must be used within 60 seconds or it will expire.\n\nUpload sequencing:\nPrepare, PUT, and finalize one file before calling this tool for another file.\nDo not batch multiple prepare_attachment_upload calls before starting the PUTs because earlier signed URLs can expire while later files are prepared.\n\nExample:\ncurl -X PUT --data-binary @file.png \\\n  -H \"content-type: image/png\" \\\n  -H \"x-goog-content-length-range: N,N\" \\\n  -H \"cache-control: public, max-age=31536000\" \\\n  -H 'Content-Disposition: attachment; filename=\"file.png\"' \\\n  \"<uploadRequest.url>\"",
      "inputSchema": {
        "type": "object",
        "properties": {
          "issue": {
            "type": "string",
            "description": "Issue ID or identifier (e.g., LIN-123). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues"
          },
          "filename": {
            "type": "string",
            "description": "Filename for the upload, e.g. screenshot.png"
          },
          "contentType": {
            "type": "string",
            "description": "MIME type, e.g. image/png or application/pdf"
          },
          "size": {
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "description": "Exact file size in bytes. Must be smaller than 2 GB."
          },
          "title": {
            "description": "Suggested attachment title for the finalize step",
            "type": "string"
          },
          "subtitle": {
            "description": "Suggested attachment subtitle for the finalize step",
            "type": "string"
          }
        },
        "required": [
          "issue",
          "filename",
          "contentType",
          "size"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "create_attachment_from_upload",
      "title": "Create attachment from upload",
      "description": "Link an already-uploaded Linear assetUrl to an existing issue as an attachment.\n\nUse this only after:\n1. prepare_attachment_upload returned an assetUrl and uploadRequest.\n2. The client successfully PUT raw file bytes to uploadRequest.url.\n\nThis tool does not upload file content. It only creates the Linear attachment row.\nIf the direct upload failed or the signed URL expired, rerun prepare_attachment_upload and upload again.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "issue": {
            "type": "string",
            "description": "Issue ID or identifier (e.g., LIN-123). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues"
          },
          "assetUrl": {
            "type": "string",
            "format": "uri",
            "description": "Linear upload assetUrl returned by prepare_attachment_upload"
          },
          "title": {
            "description": "Attachment title. Defaults to filename or asset URL",
            "type": "string"
          },
          "subtitle": {
            "description": "Optional attachment subtitle",
            "type": "string"
          }
        },
        "required": [
          "issue",
          "assetUrl"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "create_attachment",
      "title": "Create attachment (deprecated)",
      "description": "Deprecated fallback for tiny files only. Accepts base64 file content, verifies SHA-256 checksum, and uploads it through the MCP worker.\nPrefer `prepare_attachment_upload` plus direct PUT plus `create_attachment_from_upload`.\n\nCRITICAL: Do not print base64Content and then copy it into this tool call.\nOpaque base64 copied through model-visible text is easy to corrupt.\n\nGenerate base64Content mechanically from the source bytes and pass it through a programmatic argument construction path whenever available. Before calling this tool, verify the values are consistent:\n\nUnix-like shells:\nfile=\"/path/to/file\"\nbase64Content=$(base64 < \"$file\" | tr -d '\\n\\r')\nsha256=$(shasum -a 256 \"$file\" | awk '{print $1}')\ndecodedSha256=$(printf '%s' \"$base64Content\" | base64 -d | shasum -a 256 | awk '{print $1}')\nsize=$(wc -c < \"$file\" | tr -d ' ') # optional; stat can also get file byte size\ndecodedSize=$(printf '%s' \"$base64Content\" | base64 -d | wc -c | tr -d ' ')\n\nPowerShell:\n$file = 'C:\\path\\to\\file'\n$bytes = [IO.File]::ReadAllBytes($file)\n$base64Content = [Convert]::ToBase64String($bytes)\n$sha256 = (Get-FileHash -Algorithm SHA256 -Path $file).Hash.ToLower()\n$size = $bytes.Length # optional\n$decoded = [Convert]::FromBase64String($base64Content)\n$decodedStream = [IO.MemoryStream]::new($decoded)\n$decodedSha256 = (Get-FileHash -Algorithm SHA256 -InputStream $decodedStream).Hash.ToLower()\n$decodedSize = $decoded.Length\n\ndecodedSha256 must equal sha256. If you pass size, decodedSize must equal size.\nPass `sha256`. Passing `size` is optional, but recommended for clearer mismatch errors.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "issue": {
            "type": "string",
            "description": "Issue ID or identifier (e.g., LIN-123). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues"
          },
          "base64Content": {
            "type": "string",
            "description": "Deprecated base64-encoded file content to upload"
          },
          "filename": {
            "type": "string",
            "description": "Filename for the upload (e.g., 'screenshot.png')"
          },
          "contentType": {
            "type": "string",
            "description": "MIME type for the upload (e.g., 'image/png', 'application/pdf')"
          },
          "size": {
            "description": "Optional expected decoded file size in bytes. Rejects the upload if it does not match.",
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991
          },
          "sha256": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{64}$",
            "description": "Expected SHA-256 hex digest of the decoded file bytes."
          },
          "title": {
            "description": "Optional title for the attachment",
            "type": "string"
          },
          "subtitle": {
            "description": "Optional subtitle for the attachment",
            "type": "string"
          }
        },
        "required": [
          "issue",
          "base64Content",
          "filename",
          "contentType",
          "sha256"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "delete_attachment",
      "title": "Delete attachment",
      "description": "Delete an attachment by ID",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Attachment ID"
          }
        },
        "required": [
          "id"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "list_agent_skills",
      "title": "List agent skills",
      "description": "List Linear Agent skills available to the authenticated user.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "type": "number",
            "maximum": 250
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "type": "string",
            "enum": [
              "createdAt",
              "updatedAt"
            ]
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "get_agent_skill",
      "title": "Get agent skill",
      "description": "Retrieve a Linear Agent skill by ID, including its full markdown instructions.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Agent skill ID"
          }
        },
        "required": [
          "id"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "list_comments",
      "title": "List comments",
      "description": "List comments on a Linear issue, project, initiative, document, project milestone, or project/initiative status update. Provide exactly one of `issueId`, `projectId`, `initiativeId`, `documentId`, `milestoneId`, or `statusUpdateId`. For issues, projects, and initiatives this returns both top-level discussion threads and inline description comments. Inline (anchored) comments carry a non-null `quotedText` set to the snippet of description text they reference. Returned comments include `author` and nullable `onBehalfOf`; when set, `onBehalfOf` identifies the user the agent author acted for. Files uploaded in comment bodies are returned in `attachments` with titles and download URLs, not issue attachment IDs. Signed upload URLs expire after five minutes; call list_comments again to refresh them. Download documents using these URLs and process them with your own file tools.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "type": "number",
            "maximum": 250
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "type": "string",
            "enum": [
              "createdAt",
              "updatedAt"
            ]
          },
          "issueId": {
            "description": "Issue ID or identifier (e.g., LIN-123). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues (provide exactly one parent)",
            "type": "string"
          },
          "projectId": {
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug (provide exactly one parent)",
            "type": "string"
          },
          "initiativeId": {
            "description": "Initiative name, ID, identifier (e.g., I-123), or slug (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"
          },
          "statusUpdateId": {
            "description": "Status update UUID (provide exactly one parent). Resolve status updates via `get_status_updates` first.",
            "type": "string"
          },
          "statusUpdateType": {
            "description": "Type of status update named by `statusUpdateId`, as returned by `get_status_updates`. Only valid together with `statusUpdateId`; omit to check both project and initiative status updates.",
            "type": "string",
            "enum": [
              "project",
              "initiative"
            ]
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "save_comment",
      "title": "Save comment",
      "description": "Create or update a comment on a Linear issue, project, initiative, document, project milestone, or project/initiative status update. 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`, `milestoneId`, or `statusUpdateId` — comments on issues/projects/initiatives become top-level discussion threads; comments on documents/milestones become description comments. A status update holds a single thread, so a comment on an update that already has one is added to it as a reply. To reply to an existing thread, pass `parentId` and `body`; the reply inherits the parent's thread type, so no entity reference is needed. Parent reference fields are ignored when `id` or `parentId` is provided (`statusUpdateType` is rejected instead).",
      "inputSchema": {
        "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). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues (provide exactly one parent)",
            "type": "string"
          },
          "projectId": {
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug (provide exactly one parent)",
            "type": "string"
          },
          "initiativeId": {
            "description": "Initiative name, ID, identifier (e.g., I-123), or slug (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"
          },
          "statusUpdateId": {
            "description": "Status update UUID (provide exactly one parent). Resolve status updates via `get_status_updates` first.",
            "type": "string"
          },
          "statusUpdateType": {
            "description": "Type of status update named by `statusUpdateId`, as returned by `get_status_updates`. Only valid together with `statusUpdateId`; omit to check both project and initiative status updates.",
            "type": "string",
            "enum": [
              "project",
              "initiative"
            ]
          },
          "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"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "delete_comment",
      "title": "Delete comment",
      "description": "Delete a Linear comment. Inline description comments (those with non-null `quotedText`) anchor a mark in the editor, so their root cannot be deleted — delete the replies individually or resolve the thread instead.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Comment ID"
          }
        },
        "required": [
          "id"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "list_cycles",
      "title": "List cycles",
      "description": "Retrieve cycles for a specific Linear team",
      "inputSchema": {
        "type": "object",
        "properties": {
          "teamId": {
            "type": "string",
            "description": "Team ID"
          },
          "type": {
            "description": "Filter: current, previous, next, or all",
            "type": "string",
            "enum": [
              "current",
              "previous",
              "next"
            ]
          }
        },
        "required": [
          "teamId"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "get_document",
      "title": "Get document",
      "description": "Retrieve a Linear document by ID or slug",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Document ID or slug"
          }
        },
        "required": [
          "id"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "list_documents",
      "title": "List documents",
      "description": "List documents in the user's Linear workspace",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "type": "number",
            "maximum": 250
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "type": "string",
            "enum": [
              "createdAt",
              "updatedAt"
            ]
          },
          "query": {
            "description": "Search query",
            "type": "string"
          },
          "projectId": {
            "description": "Filter by project ID",
            "type": "string"
          },
          "initiativeId": {
            "description": "Filter by initiative ID",
            "type": "string"
          },
          "teamId": {
            "description": "Filter by team ID",
            "type": "string"
          },
          "creatorId": {
            "description": "Filter by creator ID",
            "type": "string"
          },
          "createdAt": {
            "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "updatedAt": {
            "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "includeArchived": {
            "default": false,
            "description": "Include archived items",
            "type": "boolean"
          },
          "fields": {
            "description": "Fields to include in each result. `id` is always included. Omit or pass an empty array for the default response.",
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "id",
                "title",
                "content",
                "url",
                "createdAt",
                "updatedAt",
                "archivedAt",
                "creator",
                "updatedBy",
                "project",
                "initiative",
                "team",
                "issue"
              ]
            }
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "save_document",
      "title": "Save document",
      "description": "Create or update a Linear document. If `id` is provided, edits the existing document; otherwise creates a new one. When creating, `title` is required and exactly one parent (`project`, `issue`, `initiative`, `cycle`, or `team`) must be specified. On update, passing a parent reparents the document. To change parts of the content without resending all of it, pass `patch` instead of `content`.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "description": "Document ID or slug to update. Omit to create a new document.",
            "type": "string"
          },
          "title": {
            "description": "Document title (required when creating)",
            "type": "string"
          },
          "content": {
            "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)",
            "type": "string"
          },
          "patch": {
            "description": "Partial edits applied to the current content, in order and atomically (one failing operation aborts the whole save). Every anchor string must match the current content exactly once. Only valid on update, in place of the full content/description field",
            "minItems": 1,
            "maxItems": 50,
            "type": "array",
            "items": {
              "oneOf": [
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "replace"
                    },
                    "old_string": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Exact text to replace. Must match the current content exactly once"
                    },
                    "new_string": {
                      "type": "string",
                      "description": "Replacement text. Empty string deletes the match"
                    },
                    "replace_all": {
                      "description": "Replace every occurrence instead of requiring a unique match",
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "op",
                    "old_string",
                    "new_string"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "insert_before"
                    },
                    "anchor": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Exact text to insert before. Must match the current content exactly once"
                    },
                    "text": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Text to insert directly before the anchor. Include separators (e.g. \"\\n\\n\")"
                    }
                  },
                  "required": [
                    "op",
                    "anchor",
                    "text"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "insert_after"
                    },
                    "anchor": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Exact text to insert after. Must match the current content exactly once"
                    },
                    "text": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Text to insert directly after the anchor. Include separators (e.g. \"\\n\\n\")"
                    }
                  },
                  "required": [
                    "op",
                    "anchor",
                    "text"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "prepend"
                    },
                    "text": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Text to insert at the very start of the content"
                    }
                  },
                  "required": [
                    "op",
                    "text"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "append"
                    },
                    "text": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Text to insert at the very end of the content"
                    }
                  },
                  "required": [
                    "op",
                    "text"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "replace_range"
                    },
                    "from": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Exact text where the range starts (inclusive). Must match exactly once"
                    },
                    "to": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Exact text where the range ends (exclusive, stays in place). Must match exactly once after `from`"
                    },
                    "new_string": {
                      "type": "string",
                      "description": "Text replacing the range. Empty string deletes it"
                    }
                  },
                  "required": [
                    "op",
                    "from",
                    "to",
                    "new_string"
                  ]
                }
              ]
            }
          },
          "project": {
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug",
            "type": "string"
          },
          "issue": {
            "description": "Issue ID or identifier (e.g., LIN-123). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues",
            "type": "string"
          },
          "initiative": {
            "description": "Initiative name, ID, identifier (e.g., I-123), or slug",
            "type": "string"
          },
          "cycle": {
            "description": "Cycle name, number, or ID. When passing a name or number, also pass `team` to disambiguate.",
            "type": "string"
          },
          "team": {
            "description": "Team name or ID. Attaches the document to the team, unless `cycle` is also passed, in which case it disambiguates the cycle.",
            "type": "string"
          },
          "icon": {
            "description": "Icon name or emoji code (e.g. \"Rocket\" or \":eagle:\"), not a raw Unicode emoji",
            "type": "string"
          },
          "color": {
            "description": "Hex color",
            "type": "string"
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "extract_images",
      "title": "Extract images",
      "description": "Extract and fetch images from markdown content. Use this to view screenshots, diagrams, or other images embedded in Linear issues, comments, or documents. Pass the markdown content (e.g., issue description) and receive the images as viewable data.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "markdown": {
            "type": "string",
            "description": "Markdown content containing image references (e.g., issue description, comment body)"
          }
        },
        "required": [
          "markdown"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "get_issue",
      "title": "Get issue",
      "description": "Retrieve detailed information about an issue by ID, including attachments, git branch name, and active Triage Intelligence suggestions when the issue is in triage",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Issue ID or identifier (e.g., LIN-123). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues"
          },
          "includeRelations": {
            "default": false,
            "description": "Include blocking/related/duplicate relations",
            "type": "boolean"
          },
          "includeCustomerNeeds": {
            "default": false,
            "description": "Include associated customer needs",
            "type": "boolean"
          },
          "includeReleases": {
            "default": false,
            "description": "Include associated releases",
            "type": "boolean"
          }
        },
        "required": [
          "id"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "list_issues",
      "title": "List issues",
      "description": "List issues in the user's Linear workspace, including active Triage Intelligence suggestions for issues in triage. For my issues, use \"me\" as the assignee. Use \"null\" for no assignee.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "type": "number",
            "maximum": 250
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "type": "string",
            "enum": [
              "createdAt",
              "updatedAt"
            ]
          },
          "query": {
            "description": "Search issue title or description",
            "type": "string"
          },
          "team": {
            "description": "Team name or ID",
            "type": "string"
          },
          "state": {
            "description": "State type, name, or ID",
            "type": "string"
          },
          "cycle": {
            "description": "Cycle name, number, or ID",
            "type": "string"
          },
          "label": {
            "description": "Label name or ID",
            "type": "string"
          },
          "assignee": {
            "description": "User ID, name, email, or \"me\"",
            "type": [
              "string",
              "null"
            ]
          },
          "delegate": {
            "description": "Agent name or ID. When the user asks to delegate to \"Linear\" or \"the Linear agent\", this refers to the \"Linear\" app user specifically",
            "type": "string"
          },
          "project": {
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug",
            "type": "string"
          },
          "release": {
            "description": "Release ID or slug",
            "type": "string"
          },
          "priority": {
            "description": "0=None, 1=Urgent, 2=High, 3=Medium, 4=Low",
            "type": "number"
          },
          "parentId": {
            "description": "Parent issue ID or identifier (e.g., LIN-123)",
            "type": "string"
          },
          "fields": {
            "description": "Fields to include in each result. `id` is always included. Omit or pass an empty array for the default response.",
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "id",
                "uuid",
                "title",
                "description",
                "projectMilestone",
                "priority",
                "estimate",
                "url",
                "gitBranchName",
                "createdAt",
                "updatedAt",
                "archivedAt",
                "completedAt",
                "startedAt",
                "canceledAt",
                "dueDate",
                "slaStartedAt",
                "slaMediumRiskAt",
                "slaHighRiskAt",
                "slaBreachesAt",
                "slaType",
                "status",
                "statusType",
                "labels",
                "triageIntel",
                "createdBy",
                "createdById",
                "assignee",
                "assigneeId",
                "delegate",
                "delegateId",
                "project",
                "projectId",
                "parentId",
                "team",
                "teamId",
                "cycleId"
              ]
            }
          },
          "createdAt": {
            "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "updatedAt": {
            "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "includeArchived": {
            "default": false,
            "description": "Include archived items",
            "type": "boolean"
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "save_issue",
      "title": "Save issue",
      "description": "Create or update a Linear issue. If `id` is provided, updates the existing issue; otherwise creates a new one. When creating, `team` is required, and `title` is required unless `template` is set. Note: use `assignee` (not `assigneeId`) to set the assignee — it accepts a user ID, name, email, or \"me\".",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "description": "Only for updating an existing issue. Pass the issue ID or identifier (e.g., LIN-123). Do NOT pass this parameter when creating a new issue.",
            "type": "string"
          },
          "title": {
            "description": "Issue title (required when creating, unless template is set)",
            "type": "string"
          },
          "description": {
            "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)",
            "type": "string"
          },
          "patch": {
            "description": "Partial edits applied to the current content, in order and atomically (one failing operation aborts the whole save). Every anchor string must match the current content exactly once. Only valid on update, in place of the full content/description field",
            "minItems": 1,
            "maxItems": 50,
            "type": "array",
            "items": {
              "oneOf": [
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "replace"
                    },
                    "old_string": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Exact text to replace. Must match the current content exactly once"
                    },
                    "new_string": {
                      "type": "string",
                      "description": "Replacement text. Empty string deletes the match"
                    },
                    "replace_all": {
                      "description": "Replace every occurrence instead of requiring a unique match",
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "op",
                    "old_string",
                    "new_string"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "insert_before"
                    },
                    "anchor": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Exact text to insert before. Must match the current content exactly once"
                    },
                    "text": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Text to insert directly before the anchor. Include separators (e.g. \"\\n\\n\")"
                    }
                  },
                  "required": [
                    "op",
                    "anchor",
                    "text"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "insert_after"
                    },
                    "anchor": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Exact text to insert after. Must match the current content exactly once"
                    },
                    "text": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Text to insert directly after the anchor. Include separators (e.g. \"\\n\\n\")"
                    }
                  },
                  "required": [
                    "op",
                    "anchor",
                    "text"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "prepend"
                    },
                    "text": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Text to insert at the very start of the content"
                    }
                  },
                  "required": [
                    "op",
                    "text"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "append"
                    },
                    "text": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Text to insert at the very end of the content"
                    }
                  },
                  "required": [
                    "op",
                    "text"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "replace_range"
                    },
                    "from": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Exact text where the range starts (inclusive). Must match exactly once"
                    },
                    "to": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Exact text where the range ends (exclusive, stays in place). Must match exactly once after `from`"
                    },
                    "new_string": {
                      "type": "string",
                      "description": "Text replacing the range. Empty string deletes it"
                    }
                  },
                  "required": [
                    "op",
                    "from",
                    "to",
                    "new_string"
                  ]
                }
              ]
            }
          },
          "team": {
            "description": "Team name or ID (required when creating)",
            "type": "string"
          },
          "template": {
            "description": "Template name or ID. Applied on create only. The template fills in the content, fields, and sub-issues server-side. A `description` replaces the template body rather than merging with it, but an empty `description` keeps the template body. Labels merge with the template's own",
            "type": "string"
          },
          "cycle": {
            "description": "Cycle name, number, or ID. Null to remove",
            "type": [
              "string",
              "null"
            ]
          },
          "milestone": {
            "description": "Milestone name or ID",
            "type": "string"
          },
          "priority": {
            "description": "0=None, 1=Urgent, 2=High, 3=Medium, 4=Low",
            "type": "number"
          },
          "project": {
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug. Null to remove",
            "type": [
              "string",
              "null"
            ]
          },
          "state": {
            "description": "State type, name, or ID",
            "type": "string"
          },
          "assignee": {
            "description": "User ID, name, email, or \"me\". Null to remove",
            "type": [
              "string",
              "null"
            ]
          },
          "delegate": {
            "description": "Agent name or ID. When the user asks to delegate to \"Linear\" or \"the Linear agent\", this refers to the \"Linear\" app user specifically. Null to remove",
            "type": [
              "string",
              "null"
            ]
          },
          "labels": {
            "description": "Label names or IDs as a JSON array of strings (e.g. [\"Bug\", \"Urgent\"]). Replaces the full label set; existing labels not included are removed. Omit to leave labels unchanged. Cannot be combined with addLabels/removeLabels; prefer those for incremental changes",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "addLabels": {
            "description": "Label names or IDs as a JSON array of strings (e.g. [\"Bug\", \"Urgent\"]) to add. Append-only; existing labels are never removed. Cannot be combined with a team change",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "removeLabels": {
            "description": "Label names or IDs as a JSON array of strings (e.g. [\"Bug\", \"Urgent\"]) to remove. Only valid when updating an existing issue. Cannot be combined with a team change",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "dueDate": {
            "description": "Due date (ISO format). On update, pass null to remove the due date",
            "type": [
              "string",
              "null"
            ]
          },
          "slaBreachesAt": {
            "description": "ISO-8601 timestamp when the SLA will breach. On update, pass null to remove the SLA",
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "slaType": {
            "description": "SLA day counting type: \"all\" or \"onlyBusinessDays\". Only use with slaBreachesAt; null means unset",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "all",
                  "onlyBusinessDays"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "parentId": {
            "description": "Parent issue ID or identifier (e.g., LIN-123). Null to remove",
            "type": [
              "string",
              "null"
            ]
          },
          "estimate": {
            "description": "Issue estimate value. On create, pass null or omit for no estimate. On update, pass null to clear the estimate; omitting leaves it unchanged. 0 is a real estimate only on teams that allow zero estimates.",
            "type": [
              "number",
              "null"
            ]
          },
          "links": {
            "description": "Link attachments to add [{url, title}]. Append-only; existing links are never removed",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "title": {
                  "type": "string",
                  "minLength": 1
                }
              },
              "required": [
                "url",
                "title"
              ]
            }
          },
          "setReleases": {
            "description": "Replace all releases on the issue with these. Cannot be combined with addReleases/removeReleases",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "addReleases": {
            "description": "Release IDs or slugs to add. Append-only; existing releases are never removed",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "removeReleases": {
            "description": "Release IDs or slugs to remove. Only valid when updating an existing issue",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "blocks": {
            "description": "Issue IDs/identifiers this blocks. Append-only; existing relations are never removed",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "blockedBy": {
            "description": "Issue IDs/identifiers blocking this. Append-only; existing relations are never removed",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "relatedTo": {
            "description": "Related issue IDs/identifiers. Append-only; existing relations are never removed",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "duplicateOf": {
            "description": "Duplicate of issue ID/identifier. Null to remove",
            "type": [
              "string",
              "null"
            ]
          },
          "removeBlocks": {
            "description": "Issue IDs/identifiers to stop blocking",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "removeBlockedBy": {
            "description": "Issue IDs/identifiers to remove as blockers of this issue",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "removeRelatedTo": {
            "description": "Related issue IDs/identifiers to remove",
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "list_issue_statuses",
      "title": "List issue statuses",
      "description": "List available issue statuses in a Linear team",
      "inputSchema": {
        "type": "object",
        "properties": {
          "team": {
            "type": "string",
            "description": "Team name or ID"
          }
        },
        "required": [
          "team"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "get_issue_status",
      "title": "Get issue status",
      "description": "Retrieve detailed information about an issue status in Linear by name or ID",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Status ID"
          },
          "name": {
            "type": "string",
            "description": "Status name"
          },
          "team": {
            "type": "string",
            "description": "Team name or ID"
          }
        },
        "required": [
          "id",
          "name",
          "team"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "list_issue_labels",
      "title": "List issue labels",
      "description": "List available issue labels in a Linear workspace or team. A retired label carries `retiredAt` and cannot be applied to new issues.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "type": "number",
            "maximum": 250
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "type": "string",
            "enum": [
              "createdAt",
              "updatedAt"
            ]
          },
          "name": {
            "description": "Filter by name",
            "type": "string"
          },
          "team": {
            "description": "Team name or ID",
            "type": "string"
          },
          "includeArchived": {
            "default": false,
            "description": "Include archived items",
            "type": "boolean"
          },
          "includeGroups": {
            "default": false,
            "description": "Include label groups in the results, marked with `isGroup`. A group cannot be applied directly; retiring or restoring one cascades to its child labels",
            "type": "boolean"
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "save_issue_label",
      "title": "Save issue label",
      "description": "Create or update a Linear issue label. If `id` is provided, updates the existing label; otherwise creates a new one. When creating, `name` is required.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "description": "Label name or ID. If provided, updates the existing label",
            "type": "string"
          },
          "name": {
            "description": "Label name (required when creating)",
            "type": "string"
          },
          "description": {
            "description": "Label description. Null to clear it",
            "type": [
              "string",
              "null"
            ]
          },
          "color": {
            "description": "Hex color code",
            "type": "string"
          },
          "teamId": {
            "description": "Team UUID (omit for workspace label). When updating, only disambiguates `id` by name; a label's team cannot be changed",
            "type": "string"
          },
          "parent": {
            "description": "Parent label group name or ID. Null to remove from its group",
            "type": [
              "string",
              "null"
            ]
          },
          "isGroup": {
            "description": "Whether the label is a group",
            "type": "boolean"
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "create_issue_label",
      "title": "Create issue label (deprecated)",
      "description": "Create a new Linear issue label. Deprecated: use `save_issue_label`, which can also update labels.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Label name"
          },
          "description": {
            "description": "Label description",
            "type": "string"
          },
          "color": {
            "description": "Hex color code",
            "type": "string"
          },
          "teamId": {
            "description": "Team UUID (omit for workspace label)",
            "type": "string"
          },
          "parent": {
            "description": "Parent label group name or ID",
            "type": "string"
          },
          "isGroup": {
            "default": false,
            "description": "Whether the label is a group",
            "type": "boolean"
          }
        },
        "required": [
          "name"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "retire_issue_label",
      "title": "Retire issue label",
      "description": "Retire a Linear issue label so it cannot be applied to new issues. The label stays visible on issues that already have it. Retiring a label group also retires its child labels. Undo with `restore_issue_label`.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Label or label group ID"
          }
        },
        "required": [
          "id"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "restore_issue_label",
      "title": "Restore issue label",
      "description": "Restore a retired Linear issue label, making it available for use on issues again. Restoring a label group also restores every child label, including any that were retired separately.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Label or label group ID"
          }
        },
        "required": [
          "id"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "list_projects",
      "title": "List projects",
      "description": "List projects in the user's Linear workspace",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 50)",
            "type": "number",
            "maximum": 50
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "type": "string",
            "enum": [
              "createdAt",
              "updatedAt"
            ]
          },
          "query": {
            "description": "Search project name",
            "type": "string"
          },
          "state": {
            "description": "State type, name, or ID",
            "type": "string"
          },
          "initiative": {
            "description": "Initiative name, ID, identifier (e.g., I-123), or slug",
            "type": "string"
          },
          "team": {
            "description": "Team name or ID",
            "type": "string"
          },
          "member": {
            "description": "User ID, name, email, or \"me\"",
            "type": "string"
          },
          "label": {
            "description": "Label name or ID",
            "type": "string"
          },
          "createdAt": {
            "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "updatedAt": {
            "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "includeMilestones": {
            "default": false,
            "description": "Include milestones",
            "type": "boolean"
          },
          "includeMembers": {
            "default": false,
            "description": "Include project members",
            "type": "boolean"
          },
          "includeArchived": {
            "default": false,
            "description": "Include archived items",
            "type": "boolean"
          },
          "fields": {
            "description": "Fields to include in each result. `id` is always included. Omit or pass an empty array for the default response.",
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "id",
                "uuid",
                "name",
                "summary",
                "description",
                "url",
                "trashed",
                "createdAt",
                "updatedAt",
                "startedAt",
                "completedAt",
                "canceledAt",
                "startDate",
                "startDateResolution",
                "targetDate",
                "targetDateResolution",
                "priority",
                "sortOrder",
                "labels",
                "initiatives",
                "lead",
                "leadTeam",
                "status",
                "teams",
                "members",
                "milestones"
              ]
            }
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "get_project",
      "title": "Get project",
      "description": "Retrieve details of a specific project in Linear",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug"
          },
          "includeCustomerNeeds": {
            "default": false,
            "description": "Include one page of customer needs attached directly to the project",
            "type": "boolean"
          },
          "customerNeedsLimit": {
            "default": 10,
            "description": "Customer needs per page when includeCustomerNeeds is true (default 10, max 50)",
            "type": "integer",
            "minimum": 1,
            "maximum": 50
          },
          "customerNeedsCursor": {
            "description": "Next customer-needs page: pass customerNeedsPageInfo.endCursor with includeCustomerNeeds true",
            "type": "string"
          },
          "includeMilestones": {
            "default": false,
            "description": "Include milestones",
            "type": "boolean"
          },
          "includeMembers": {
            "default": false,
            "description": "Include project members",
            "type": "boolean"
          },
          "includeResources": {
            "default": false,
            "description": "Include resources (documents, links, attachments)",
            "type": "boolean"
          }
        },
        "required": [
          "query"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "save_project",
      "title": "Save project",
      "description": "Create or update a Linear project. If `id` is provided, updates the existing project; otherwise creates a new one. When creating, `name` and at least one team (via `addTeams` or `setTeams`) are required. Pass `template` to create the project from a project template. To change parts of the description without resending all of it, pass `patch` instead of `description`. `state` resolves against the project statuses of the lead team, so pass `leadTeam` when creating a multi-team project whose teams use different statuses.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug. If provided, updates the existing project",
            "type": "string"
          },
          "name": {
            "description": "Project name (required when creating)",
            "type": "string"
          },
          "template": {
            "description": "Template name or ID. Applied on create only. The template fills in the content, fields, and sub-issues server-side. A `description` replaces the template body rather than merging with it, but an empty `description` keeps the template body. Labels merge with the template's own",
            "type": "string"
          },
          "icon": {
            "description": "Icon name or emoji code (e.g. \"Rocket\" or \":eagle:\"), not a raw Unicode emoji",
            "type": "string"
          },
          "color": {
            "description": "Hex color",
            "type": "string"
          },
          "summary": {
            "description": "Short summary (max 255 chars)",
            "type": "string"
          },
          "description": {
            "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)",
            "type": "string"
          },
          "patch": {
            "description": "Partial edits applied to the current content, in order and atomically (one failing operation aborts the whole save). Every anchor string must match the current content exactly once. Only valid on update, in place of the full content/description field",
            "minItems": 1,
            "maxItems": 50,
            "type": "array",
            "items": {
              "oneOf": [
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "replace"
                    },
                    "old_string": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Exact text to replace. Must match the current content exactly once"
                    },
                    "new_string": {
                      "type": "string",
                      "description": "Replacement text. Empty string deletes the match"
                    },
                    "replace_all": {
                      "description": "Replace every occurrence instead of requiring a unique match",
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "op",
                    "old_string",
                    "new_string"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "insert_before"
                    },
                    "anchor": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Exact text to insert before. Must match the current content exactly once"
                    },
                    "text": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Text to insert directly before the anchor. Include separators (e.g. \"\\n\\n\")"
                    }
                  },
                  "required": [
                    "op",
                    "anchor",
                    "text"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "insert_after"
                    },
                    "anchor": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Exact text to insert after. Must match the current content exactly once"
                    },
                    "text": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Text to insert directly after the anchor. Include separators (e.g. \"\\n\\n\")"
                    }
                  },
                  "required": [
                    "op",
                    "anchor",
                    "text"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "prepend"
                    },
                    "text": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Text to insert at the very start of the content"
                    }
                  },
                  "required": [
                    "op",
                    "text"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "append"
                    },
                    "text": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Text to insert at the very end of the content"
                    }
                  },
                  "required": [
                    "op",
                    "text"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "replace_range"
                    },
                    "from": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Exact text where the range starts (inclusive). Must match exactly once"
                    },
                    "to": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Exact text where the range ends (exclusive, stays in place). Must match exactly once after `from`"
                    },
                    "new_string": {
                      "type": "string",
                      "description": "Text replacing the range. Empty string deletes it"
                    }
                  },
                  "required": [
                    "op",
                    "from",
                    "to",
                    "new_string"
                  ]
                }
              ]
            }
          },
          "state": {
            "description": "Project status name, type, or ID. Names resolve within the lead team's project statuses. If the lead team is unknown, standard labels resolve as status types; custom names require a status ID or leadTeam",
            "type": "string"
          },
          "startDate": {
            "description": "Start date (ISO format). Pair with startDateResolution to indicate precision (e.g. month, quarter)",
            "type": "string"
          },
          "startDateResolution": {
            "description": "Start date resolution",
            "type": "string",
            "enum": [
              "halfYear",
              "month",
              "quarter",
              "year"
            ]
          },
          "targetDate": {
            "description": "Target date (ISO format). Pair with targetDateResolution to indicate precision (e.g. month, quarter)",
            "type": "string"
          },
          "targetDateResolution": {
            "description": "Target date resolution",
            "type": "string",
            "enum": [
              "halfYear",
              "month",
              "quarter",
              "year"
            ]
          },
          "priority": {
            "description": "0=None, 1=Urgent, 2=High, 3=Medium, 4=Low",
            "type": "integer",
            "minimum": 0,
            "maximum": 4
          },
          "addTeams": {
            "description": "Team name or ID to add",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "removeTeams": {
            "description": "Team name or ID to remove",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "setTeams": {
            "description": "Replace all teams with these. Cannot combine with addTeams/removeTeams",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "leadTeam": {
            "description": "Team that leads the project. Team name or ID. Overrides the default lead team; added to the project's teams when not among them",
            "type": "string"
          },
          "labels": {
            "description": "Label names or IDs as a JSON array of strings (e.g. [\"Bug\", \"Urgent\"]). Replaces the full label set; existing labels not included are removed. Omit to leave labels unchanged",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "lead": {
            "description": "User ID, name, email, or \"me\". Null to remove, except on create with a template that names a lead",
            "type": [
              "string",
              "null"
            ]
          },
          "addInitiatives": {
            "description": "Initiatives to add. Initiative name, ID, identifier (e.g., I-123), or slug",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "removeInitiatives": {
            "description": "Initiatives to remove. Initiative name, ID, identifier (e.g., I-123), or slug",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "setInitiatives": {
            "description": "Replace all initiatives with these. Initiative name, ID, identifier (e.g., I-123), or slug. Cannot combine with addInitiatives/removeInitiatives",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "links": {
            "description": "External resource links to add [{url, title}]. Append-only; existing links are never removed",
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "title": {
                  "type": "string",
                  "minLength": 1
                }
              },
              "required": [
                "url",
                "title"
              ]
            }
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "list_project_labels",
      "title": "List project labels",
      "description": "List available project labels in a Linear workspace or team. Returns workspace labels by default; pass `team` to also include that team's labels. A team-scoped label carries a `team` field; different teams can hold same-named labels, so check it before acting on an ID. A retired label carries `retiredAt` and cannot be applied to new projects.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "type": "number",
            "maximum": 250
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "type": "string",
            "enum": [
              "createdAt",
              "updatedAt"
            ]
          },
          "name": {
            "description": "Filter by name",
            "type": "string"
          },
          "team": {
            "description": "Team name or ID",
            "type": "string"
          },
          "includeArchived": {
            "default": false,
            "description": "Include archived items",
            "type": "boolean"
          },
          "includeGroups": {
            "default": false,
            "description": "Include label groups in the results, marked with `isGroup`. A group cannot be applied directly; retiring or restoring one cascades to its child labels",
            "type": "boolean"
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "retire_project_label",
      "title": "Retire project label",
      "description": "Retire a Linear project label so it cannot be applied to new projects. The label stays visible on projects that already have it. Retiring a label group also retires its child labels. Undo with `restore_project_label`.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Label or label group ID"
          }
        },
        "required": [
          "id"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "restore_project_label",
      "title": "Restore project label",
      "description": "Restore a retired Linear project label, making it available for use on projects again. Restoring a label group also restores every child label, including any that were retired separately.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Label or label group ID"
          }
        },
        "required": [
          "id"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "save_project_label",
      "title": "Save project label",
      "description": "Create or update a Linear project label. If `id` is provided, updates the existing label; otherwise creates a new one. When creating, `name` is required.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "description": "Label name or ID. If provided, updates the existing label",
            "type": "string"
          },
          "name": {
            "description": "Label name (required when creating)",
            "type": "string"
          },
          "description": {
            "description": "Label description. Null to clear it",
            "type": [
              "string",
              "null"
            ]
          },
          "color": {
            "description": "Hex color code",
            "type": "string"
          },
          "teamId": {
            "description": "Team UUID (omit for workspace label). When updating, only disambiguates `id` by name; a label's team cannot be changed",
            "type": "string"
          },
          "parent": {
            "description": "Parent label group name or ID. Null to remove from its group",
            "type": [
              "string",
              "null"
            ]
          },
          "isGroup": {
            "description": "Whether the label is a group",
            "type": "boolean"
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "list_release_pipelines",
      "title": "List release pipelines",
      "description": "List release pipelines in the workspace.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "type": "number",
            "maximum": 250
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "type": "string",
            "enum": [
              "createdAt",
              "updatedAt"
            ]
          },
          "query": {
            "description": "Search pipeline name",
            "type": "string"
          },
          "team": {
            "description": "Team name or ID",
            "type": "string"
          },
          "type": {
            "description": "Pipeline type: continuous | scheduled",
            "type": "string",
            "enum": [
              "continuous",
              "scheduled"
            ]
          },
          "isProduction": {
            "description": "Filter by production pipeline flag",
            "type": "boolean"
          },
          "includeStages": {
            "default": false,
            "description": "Include each pipeline's stages",
            "type": "boolean"
          },
          "includeTeams": {
            "default": false,
            "description": "Include each pipeline's teams",
            "type": "boolean"
          },
          "createdAt": {
            "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "updatedAt": {
            "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "includeArchived": {
            "default": false,
            "description": "Include archived items",
            "type": "boolean"
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "list_releases",
      "title": "List releases",
      "description": "List releases in the workspace, with optional filtering by pipeline, stage, version, and text.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "type": "number",
            "maximum": 250
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "type": "string",
            "enum": [
              "createdAt",
              "updatedAt"
            ]
          },
          "query": {
            "description": "Search release name or version",
            "type": "string"
          },
          "pipeline": {
            "description": "Release pipeline ID, slug, or exact name",
            "type": "string"
          },
          "stage": {
            "description": "Release stage ID or exact name",
            "type": "string"
          },
          "stageType": {
            "description": "Filter by stage lifecycle type",
            "type": "string",
            "enum": [
              "planned",
              "started",
              "completed",
              "canceled"
            ]
          },
          "version": {
            "description": "Exact version match",
            "type": "string"
          },
          "hasReleaseNotes": {
            "description": "Filter to releases that do (true) or do not (false) have release notes",
            "type": "boolean"
          },
          "includeReleaseNotes": {
            "default": false,
            "description": "Include associated release notes",
            "type": "boolean"
          },
          "createdAt": {
            "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "updatedAt": {
            "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "includeArchived": {
            "default": false,
            "description": "Include archived items",
            "type": "boolean"
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "get_release",
      "title": "Get release",
      "description": "Retrieve details of a release by ID or slug.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Release ID or slug"
          },
          "includeReleaseNotes": {
            "default": false,
            "description": "Include associated release notes",
            "type": "boolean"
          }
        },
        "required": [
          "id"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "save_release",
      "title": "Save release",
      "description": "Create or update a release. If `id` is provided, updates the existing release; otherwise creates a new one. When creating, `name` and `pipeline` are required. Release status is modeled as the release pipeline stage.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "description": "Release ID or slug to update. Omit to create a new release.",
            "type": "string"
          },
          "name": {
            "description": "Release name (required when creating)",
            "type": "string"
          },
          "description": {
            "description": "Release description",
            "type": "string"
          },
          "version": {
            "description": "Version identifier",
            "type": "string"
          },
          "pipeline": {
            "description": "Release pipeline ID, slug, or exact name (required when creating)",
            "type": "string"
          },
          "stage": {
            "description": "Release stage ID, exact name, or lifecycle type within the release pipeline",
            "type": "string"
          },
          "startDate": {
            "description": "Estimated start date (ISO YYYY-MM-DD, null to remove)",
            "type": [
              "string",
              "null"
            ]
          },
          "targetDate": {
            "description": "Estimated completion date (ISO YYYY-MM-DD, null to remove)",
            "type": [
              "string",
              "null"
            ]
          },
          "createdAt": {
            "description": "Import/create timestamp (ISO DateTime)",
            "type": "string"
          },
          "startedAt": {
            "description": "Started timestamp (ISO DateTime, null to remove)",
            "type": [
              "string",
              "null"
            ]
          },
          "completedAt": {
            "description": "Completed timestamp (ISO DateTime, null to remove)",
            "type": [
              "string",
              "null"
            ]
          },
          "commitSha": {
            "description": "Commit SHA associated with the release",
            "type": "string"
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "list_release_notes",
      "title": "List release notes",
      "description": "List release notes in the workspace, optionally filtered by pipeline or covered release.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "type": "number",
            "maximum": 250
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "type": "string",
            "enum": [
              "createdAt",
              "updatedAt"
            ]
          },
          "query": {
            "description": "Search release notes title",
            "type": "string"
          },
          "pipeline": {
            "description": "Release pipeline ID, slug, or exact name",
            "type": "string"
          },
          "release": {
            "description": "Release ID or slug",
            "type": "string"
          },
          "includeContent": {
            "default": false,
            "description": "Include markdown release notes content",
            "type": "boolean"
          },
          "includeReleases": {
            "default": false,
            "description": "Include associated releases",
            "type": "boolean"
          },
          "createdAt": {
            "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "updatedAt": {
            "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "includeArchived": {
            "default": false,
            "description": "Include archived items",
            "type": "boolean"
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "get_release_note",
      "title": "Get release notes",
      "description": "Retrieve release notes by ID or slug, including markdown content.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Release notes ID or slug"
          },
          "includeReleases": {
            "default": false,
            "description": "Include associated releases",
            "type": "boolean"
          }
        },
        "required": [
          "id"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "save_release_note",
      "title": "Save release notes",
      "description": "Create or update release notes. If `id` is provided, updates the existing release notes; otherwise creates a new one. When creating, `pipeline` and either `releases` or a release range are required. To change parts of the content without resending all of it, pass `patch` instead of `content`.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "description": "Release notes ID or slug to update. Omit to create new release notes.",
            "type": "string"
          },
          "pipeline": {
            "description": "Release pipeline ID, slug, or exact name (required when creating)",
            "type": "string"
          },
          "title": {
            "description": "Release notes title",
            "type": "string"
          },
          "content": {
            "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)",
            "type": "string"
          },
          "patch": {
            "description": "Partial edits applied to the current content, in order and atomically (one failing operation aborts the whole save). Every anchor string must match the current content exactly once. Only valid on update, in place of the full content/description field",
            "minItems": 1,
            "maxItems": 50,
            "type": "array",
            "items": {
              "oneOf": [
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "replace"
                    },
                    "old_string": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Exact text to replace. Must match the current content exactly once"
                    },
                    "new_string": {
                      "type": "string",
                      "description": "Replacement text. Empty string deletes the match"
                    },
                    "replace_all": {
                      "description": "Replace every occurrence instead of requiring a unique match",
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "op",
                    "old_string",
                    "new_string"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "insert_before"
                    },
                    "anchor": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Exact text to insert before. Must match the current content exactly once"
                    },
                    "text": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Text to insert directly before the anchor. Include separators (e.g. \"\\n\\n\")"
                    }
                  },
                  "required": [
                    "op",
                    "anchor",
                    "text"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "insert_after"
                    },
                    "anchor": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Exact text to insert after. Must match the current content exactly once"
                    },
                    "text": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Text to insert directly after the anchor. Include separators (e.g. \"\\n\\n\")"
                    }
                  },
                  "required": [
                    "op",
                    "anchor",
                    "text"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "prepend"
                    },
                    "text": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Text to insert at the very start of the content"
                    }
                  },
                  "required": [
                    "op",
                    "text"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "append"
                    },
                    "text": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Text to insert at the very end of the content"
                    }
                  },
                  "required": [
                    "op",
                    "text"
                  ]
                },
                {
                  "type": "object",
                  "properties": {
                    "op": {
                      "type": "string",
                      "const": "replace_range"
                    },
                    "from": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Exact text where the range starts (inclusive). Must match exactly once"
                    },
                    "to": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Exact text where the range ends (exclusive, stays in place). Must match exactly once after `from`"
                    },
                    "new_string": {
                      "type": "string",
                      "description": "Text replacing the range. Empty string deletes it"
                    }
                  },
                  "required": [
                    "op",
                    "from",
                    "to",
                    "new_string"
                  ]
                }
              ]
            }
          },
          "releases": {
            "description": "Release IDs or slugs to include in the note",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "rangeFromRelease": {
            "description": "Oldest release ID or slug in the note range",
            "type": "string"
          },
          "rangeToRelease": {
            "description": "Newest release ID or slug in the note range",
            "type": "string"
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "get_diff",
      "title": "Get diff",
      "description": "Exact lookup for a Linear diff. Use with review URLs, GitHub PR URLs, Linear full identifiers, UUIDs, or slugs.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "urlOrId": {
            "type": "string",
            "minLength": 1,
            "description": "Linear review URL, diff slug, pull request ID, Linear full identifier, or GitHub PR URL"
          }
        },
        "required": [
          "urlOrId"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "list_diffs",
      "title": "List diffs",
      "description": "List Linear diff pull requests visible to the authenticated user",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "type": "number",
            "maximum": 250
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "type": "string",
            "enum": [
              "createdAt",
              "updatedAt"
            ]
          },
          "query": {
            "description": "Broad search by title, branch, PR number, or bare slug",
            "type": "string"
          },
          "owner": {
            "description": "Filter returned diffs by repository owner",
            "type": "string"
          },
          "repo": {
            "description": "Filter returned diffs by repository name",
            "type": "string"
          },
          "status": {
            "description": "Filter returned diffs by pull request status",
            "type": "string"
          },
          "author": {
            "description": "Filter by author ID, name, email, or \"me\"",
            "type": "string"
          },
          "reviewer": {
            "description": "Filter by reviewer ID, name, email, or \"me\"",
            "type": "string"
          },
          "reviewState": {
            "description": "Reviewer state; requires reviewer and defaults to pending when reviewer is set",
            "type": "string",
            "enum": [
              "pending",
              "approved",
              "changesRequested",
              "commented",
              "dismissed"
            ]
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "get_diff_threads",
      "title": "Get diff threads",
      "description": "Exact lookup for diff threads and the authenticated user's drafts. Use with review URLs, GitHub PR URLs, Linear full identifiers, UUIDs, or slugs.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "urlOrId": {
            "type": "string",
            "minLength": 1,
            "description": "Linear review URL, diff slug, pull request ID, Linear full identifier, or GitHub PR URL"
          },
          "threadId": {
            "description": "Optional Linear comment UUID of any comment in the thread (not its `externalThreadId`); a reply's UUID resolves to its thread root",
            "type": "string"
          },
          "resolved": {
            "description": "Filter returned threads by resolved state",
            "type": "boolean"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "type": "string",
            "enum": [
              "createdAt",
              "updatedAt"
            ]
          }
        },
        "required": [
          "urlOrId"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "save_diff_comment",
      "title": "Save diff comment",
      "description": "Create, reply to, or edit a comment or persisted draft on a Linear diff. Set draft to true to save without submitting. Provide draftId to edit or submit a persisted draft, and commentId only to edit a submitted comment. Submitting an inline draft reuses its saved anchor; submitting a reply draft requires parentId again.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "urlOrId": {
            "description": "Linear review URL, diff slug, pull request ID, Linear full identifier, or GitHub PR URL",
            "type": "string",
            "minLength": 1
          },
          "commentId": {
            "description": "Existing comment ID to edit",
            "type": "string"
          },
          "draftId": {
            "description": "Existing persisted draft ID to edit or submit",
            "type": "string"
          },
          "draft": {
            "default": false,
            "description": "Save as a private persisted draft without submitting",
            "type": "boolean"
          },
          "parentId": {
            "description": "Top-level comment ID to reply to; also required when submitting a persisted reply draft",
            "type": "string"
          },
          "body": {
            "type": "string",
            "minLength": 1,
            "description": "Content as Markdown. Do not escape the string — use literal newlines and special characters, not escape sequences"
          },
          "anchor": {
            "description": "Optional comment anchor copied from a diff thread or built for a file or diff hunk",
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "anchorContent": {
            "description": "Exact source text of the anchor's end line; stored with an inline draft so it can be re-anchored after the diff receives new revisions",
            "type": "string"
          }
        },
        "required": [
          "body"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": true
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "resolve_diff_thread",
      "title": "Resolve diff thread",
      "description": "Resolve or reopen a top-level comment thread on a Linear diff",
      "inputSchema": {
        "type": "object",
        "properties": {
          "threadId": {
            "type": "string",
            "minLength": 1,
            "description": "Top-level diff thread/comment ID"
          },
          "resolved": {
            "default": true,
            "description": "True to resolve the thread; false to reopen it",
            "type": "boolean"
          }
        },
        "required": [
          "threadId"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "delete_diff_comment",
      "title": "Delete diff comment",
      "description": "Delete a comment or persisted draft from a Linear diff",
      "inputSchema": {
        "type": "object",
        "properties": {
          "commentId": {
            "description": "Submitted diff comment ID to delete",
            "type": "string",
            "minLength": 1
          },
          "draftId": {
            "description": "Persisted diff comment draft ID to delete",
            "type": "string",
            "minLength": 1
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": true
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "submit_diff_review",
      "title": "Submit diff review",
      "description": "Approve a Linear diff, request changes, or submit a review comment",
      "inputSchema": {
        "type": "object",
        "properties": {
          "urlOrId": {
            "type": "string",
            "minLength": 1,
            "description": "Linear review URL, diff slug, pull request ID, Linear full identifier, or GitHub PR URL"
          },
          "decision": {
            "type": "string",
            "enum": [
              "approved",
              "changesRequested",
              "commented"
            ],
            "description": "Review decision: approved, changesRequested, or commented"
          },
          "body": {
            "description": "Content as Markdown. Do not escape the string — use literal newlines and special characters, not escape sequences. Required when requesting changes or commenting",
            "type": "string",
            "minLength": 1
          }
        },
        "required": [
          "urlOrId",
          "decision"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": true
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "update_diff",
      "title": "Update diff",
      "description": "Update a Linear diff's title, description, reviewer requests, issue links, or status. Provide at least one update. Combined updates can partially succeed; inspect the result before retrying. Use merge_diff to merge and submit_diff_review to approve or request changes.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "urlOrId": {
            "type": "string",
            "minLength": 1,
            "description": "Linear review URL, diff slug, pull request ID, Linear full identifier, or GitHub PR URL"
          },
          "title": {
            "description": "New diff title",
            "type": "string",
            "minLength": 1
          },
          "description": {
            "description": "New description as Markdown; an empty string clears it",
            "type": "string"
          },
          "addedReviewRequests": {
            "description": "Request or re-request reviews; existing pending requests are unchanged",
            "minItems": 1,
            "maxItems": 25,
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "user": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Workspace user ID, name, email, or \"me\""
                    }
                  },
                  "required": [
                    "user"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "externalUserId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                      "description": "External user ID from get_diff reviewer metadata"
                    }
                  },
                  "required": [
                    "externalUserId"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "githubTeamId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                      "description": "GitHub team ID from get_diff reviewer metadata"
                    }
                  },
                  "required": [
                    "githubTeamId"
                  ],
                  "additionalProperties": false
                }
              ]
            }
          },
          "removedReviewRequests": {
            "description": "Withdraw pending review requests; submitted reviews are preserved",
            "minItems": 1,
            "maxItems": 25,
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "user": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Workspace user ID, name, email, or \"me\""
                    }
                  },
                  "required": [
                    "user"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "externalUserId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                      "description": "External user ID from get_diff reviewer metadata"
                    }
                  },
                  "required": [
                    "externalUserId"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "githubTeamId": {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                      "description": "GitHub team ID from get_diff reviewer metadata"
                    }
                  },
                  "required": [
                    "githubTeamId"
                  ],
                  "additionalProperties": false
                }
              ]
            }
          },
          "addedIssueLinks": {
            "description": "Add issue links or change the relationship of an existing link",
            "minItems": 1,
            "maxItems": 25,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "issue": {
                  "type": "string",
                  "minLength": 1,
                  "description": "Linear issue identifier or UUID"
                },
                "type": {
                  "type": "string",
                  "enum": [
                    "closes",
                    "contributes",
                    "links",
                    "reopens"
                  ],
                  "description": "Relationship: closes, contributes, links, or reopens"
                }
              },
              "required": [
                "issue",
                "type"
              ],
              "additionalProperties": false
            }
          },
          "removedIssueLinks": {
            "description": "Linear issue identifiers or UUIDs to unlink",
            "minItems": 1,
            "maxItems": 25,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            }
          },
          "statusAction": {
            "description": "Status transition to perform after metadata is updated",
            "type": "string",
            "enum": [
              "markReadyForReview",
              "convertToDraft",
              "close",
              "reopen"
            ]
          }
        },
        "required": [
          "urlOrId"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": true
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "merge_diff",
      "title": "Merge diff",
      "description": "Merge a Linear diff or add it to the repository's merge queue",
      "inputSchema": {
        "type": "object",
        "properties": {
          "urlOrId": {
            "type": "string",
            "minLength": 1,
            "description": "Linear review URL, diff slug, pull request ID, Linear full identifier, or GitHub PR URL"
          },
          "mergeMethod": {
            "description": "Merge method; omit to use the repository default",
            "type": "string",
            "enum": [
              "MERGE",
              "REBASE",
              "SQUASH"
            ]
          }
        },
        "required": [
          "urlOrId"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": true
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "share_issue",
      "title": "Share issue",
      "description": "Share an issue with a workspace user who cannot otherwise access it. Use this tool only when the user explicitly asks to share the issue.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "issue": {
            "type": "string",
            "description": "Issue ID or identifier (e.g., LIN-123). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues"
          },
          "user": {
            "type": "string",
            "description": "User ID, name, email, or \"me\" Must be an email address or UUID."
          }
        },
        "required": [
          "issue",
          "user"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "unshare_issue",
      "title": "Unshare issue",
      "description": "Remove a workspace user's shared access to an issue. Use this tool only when the user explicitly asks to stop sharing the issue.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "issue": {
            "type": "string",
            "description": "Issue ID or identifier (e.g., LIN-123). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues"
          },
          "user": {
            "type": "string",
            "description": "User ID, name, email, or \"me\" Must be an email address or UUID."
          }
        },
        "required": [
          "issue",
          "user"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "list_milestones",
      "title": "List project milestones",
      "description": "List all milestones in a Linear project",
      "inputSchema": {
        "type": "object",
        "properties": {
          "project": {
            "type": "string",
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug"
          }
        },
        "required": [
          "project"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "get_milestone",
      "title": "Get milestone",
      "description": "Retrieve details of a specific milestone by ID or name",
      "inputSchema": {
        "type": "object",
        "properties": {
          "project": {
            "type": "string",
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug"
          },
          "query": {
            "type": "string",
            "description": "Milestone name or ID"
          }
        },
        "required": [
          "project",
          "query"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "save_milestone",
      "title": "Save milestone",
      "description": "Create or update a milestone in a Linear project. If `id` is provided, updates the existing milestone; otherwise creates a new one. When creating, `name` is required.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "project": {
            "type": "string",
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug"
          },
          "id": {
            "description": "Milestone name or ID",
            "type": "string"
          },
          "name": {
            "description": "Milestone name (required when creating)",
            "type": "string"
          },
          "description": {
            "description": "Milestone description",
            "type": "string"
          },
          "targetDate": {
            "description": "Target completion date (ISO format, null to remove)",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "project"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "get_notifications",
      "title": "Get notifications",
      "description": "Get a page of notifications from the authenticated user's Linear inbox.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "type": "number",
            "maximum": 250
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "unreadOnly": {
            "default": false,
            "description": "Only return unread notifications",
            "type": "boolean"
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "mark_notification",
      "title": "Mark notification",
      "description": "Mark a Linear inbox notification as read or unread, or snooze or unsnooze it.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Notification ID"
          },
          "read": {
            "description": "Whether the notification should be marked as read",
            "type": "boolean"
          },
          "snoozedUntilAt": {
            "description": "ISO-8601 time to snooze until, or null to unsnooze",
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "list_teams",
      "title": "List teams",
      "description": "List teams in the user's Linear workspace",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "type": "number",
            "maximum": 250
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "type": "string",
            "enum": [
              "createdAt",
              "updatedAt"
            ]
          },
          "query": {
            "description": "Search query",
            "type": "string"
          },
          "includeArchived": {
            "default": false,
            "description": "Include archived items",
            "type": "boolean"
          },
          "createdAt": {
            "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "updatedAt": {
            "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "get_team",
      "title": "Get team",
      "description": "Retrieve details of a specific Linear team",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Team UUID, key, or name"
          }
        },
        "required": [
          "query"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "list_templates",
      "title": "List templates",
      "description": "List the Linear issue, project, and document templates available to the authenticated user. Use this to find the template a team expects, then call get_template for its content.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "type": {
            "description": "Filter by template type. Omit to return every type",
            "type": "string",
            "enum": [
              "issue",
              "project",
              "document"
            ]
          },
          "team": {
            "description": "Team name or ID. Returns that team's templates plus workspace-level ones",
            "type": "string"
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "get_template",
      "title": "Get template",
      "description": "Retrieve a Linear template by ID or name: the content it pre-fills, the ids it applies, its sub-issues, and its form fields. Pass the template to save_issue or save_project to apply it. References come back as ids, so read a name with the matching tool when you need one. A form template collects its answers through a form, so applying one here creates an issue with the form unanswered.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Template ID or name"
          }
        },
        "required": [
          "id"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "list_users",
      "title": "List users",
      "description": "Retrieve users in the Linear workspace",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "type": "number",
            "maximum": 250
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "type": "string",
            "enum": [
              "createdAt",
              "updatedAt"
            ]
          },
          "query": {
            "description": "Filter by name or email",
            "type": "string"
          },
          "team": {
            "description": "Team name or ID",
            "type": "string"
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "get_user",
      "title": "Get user",
      "description": "Retrieve details of a specific Linear user",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "User ID, name, email, or \"me\""
          }
        },
        "required": [
          "query"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "get_workspace",
      "title": "Get workspace",
      "description": "Retrieve the connected Linear workspace",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "search_documentation",
      "title": "Search documentation",
      "description": "Search Linear's documentation to learn about features and usage",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Search query"
          },
          "page": {
            "default": 0,
            "description": "Page number",
            "type": "number"
          }
        },
        "required": [
          "query"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "get_status_updates",
      "title": "Get status updates",
      "description": "List or get project/initiative status updates. Pass `id` to get a specific update, or filter to list.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "type": "number",
            "maximum": 250
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "type": "string",
            "enum": [
              "createdAt",
              "updatedAt"
            ]
          },
          "type": {
            "type": "string",
            "enum": [
              "project",
              "initiative"
            ],
            "description": "Type of status update"
          },
          "id": {
            "description": "Status update ID - if provided, returns this specific update",
            "type": "string"
          },
          "project": {
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug",
            "type": "string"
          },
          "initiative": {
            "description": "Initiative name, ID, identifier (e.g., I-123), or slug",
            "type": "string"
          },
          "user": {
            "description": "User ID, name, email, or \"me\"",
            "type": "string"
          },
          "createdAt": {
            "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "updatedAt": {
            "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "includeArchived": {
            "default": false,
            "description": "Include archived items",
            "type": "boolean"
          }
        },
        "required": [
          "type"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "save_status_update",
      "title": "Save status update",
      "description": "Create or update a project/initiative status update. Omit `id` to create, provide `id` to update.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "project",
              "initiative"
            ],
            "description": "Type of status update"
          },
          "id": {
            "description": "Status update ID - if provided, updates this existing update",
            "type": "string"
          },
          "project": {
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug",
            "type": "string"
          },
          "initiative": {
            "description": "Initiative name, ID, identifier (e.g., I-123), or slug",
            "type": "string"
          },
          "body": {
            "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)",
            "type": "string"
          },
          "health": {
            "description": "onTrack | atRisk | offTrack",
            "type": "string",
            "enum": [
              "onTrack",
              "atRisk",
              "offTrack"
            ]
          },
          "isDiffHidden": {
            "description": "Deprecated. Hide diff with previous update (create only)",
            "type": "boolean"
          }
        },
        "required": [
          "type"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    },
    {
      "name": "delete_status_update",
      "title": "Delete status update",
      "description": "Delete (archive) a project or initiative status update.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "project",
              "initiative"
            ],
            "description": "Type of status update"
          },
          "id": {
            "type": "string",
            "description": "Status update ID"
          }
        },
        "required": [
          "type",
          "id"
        ],
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app<https://linear.app/>"
        ]
      }
    }
  ],
  "prompts": [],
  "resources": [],
  "resourceTemplates": [],
  "capabilities": {
    "tools": {
      "listChanged": false
    }
  },
  "serverInfo": {
    "name": "Linear MCP",
    "title": "Linear",
    "icons": [
      {
        "src": "https://static.linear.app/integrations/mcp/icon.svg",
        "mimeType": "image/svg+xml"
      }
    ],
    "version": "1.0.0",
    "websiteUrl": "https://linear.app"
  },
  "instructions": "When passing string values to tools, send the content directly without escape sequences. For example, use real newlines in markdown content rather than literal backslash-n (\\n) characters.",
  "protocolVersion": "2025-11-25",
  "listing": {
    "tools": {
      "items": [
        {
          "name": "get_attachment",
          "title": "Get attachment",
          "description": "Retrieve an issue attachment by ID. Use format=url to get its title and download URL without fetching the file content. Linear upload URLs are signed for five minutes; call again to refresh. External URLs are returned unchanged. Files embedded in comments have no issue attachment ID; use the URLs in list_comments attachments instead. Download and process documents with your own file tools.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Attachment ID"
              },
              "format": {
                "description": "Response format. Defaults to content.",
                "type": "string",
                "enum": [
                  "content",
                  "url"
                ]
              }
            },
            "required": [
              "id"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "prepare_attachment_upload",
          "title": "Prepare attachment upload",
          "description": "Prepare a direct Linear file upload for an existing issue.\n\nWorkflow:\n1. Call this tool with issue, filename, contentType, and size.\n2. Upload raw bytes with PUT to uploadRequest.url outside MCP.\n3. All headers in uploadRequest.headers are part of the signed request, so send them verbatim.\n4. After PUT succeeds, call create_attachment_from_upload with assetUrl to link it to the issue.\n\nDo not base64-encode or transform the file. Use curl --data-binary @path or fetch(url, { method: 'PUT', body: blob }).\nOmitting or modifying any signed header, including casing, will return HTTP 403.\nThe signed URL must be used within 60 seconds or it will expire.\n\nUpload sequencing:\nPrepare, PUT, and finalize one file before calling this tool for another file.\nDo not batch multiple prepare_attachment_upload calls before starting the PUTs because earlier signed URLs can expire while later files are prepared.\n\nExample:\ncurl -X PUT --data-binary @file.png \\\n  -H \"content-type: image/png\" \\\n  -H \"x-goog-content-length-range: N,N\" \\\n  -H \"cache-control: public, max-age=31536000\" \\\n  -H 'Content-Disposition: attachment; filename=\"file.png\"' \\\n  \"<uploadRequest.url>\"",
          "inputSchema": {
            "type": "object",
            "properties": {
              "issue": {
                "type": "string",
                "description": "Issue ID or identifier (e.g., LIN-123). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues"
              },
              "filename": {
                "type": "string",
                "description": "Filename for the upload, e.g. screenshot.png"
              },
              "contentType": {
                "type": "string",
                "description": "MIME type, e.g. image/png or application/pdf"
              },
              "size": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991,
                "description": "Exact file size in bytes. Must be smaller than 2 GB."
              },
              "title": {
                "description": "Suggested attachment title for the finalize step",
                "type": "string"
              },
              "subtitle": {
                "description": "Suggested attachment subtitle for the finalize step",
                "type": "string"
              }
            },
            "required": [
              "issue",
              "filename",
              "contentType",
              "size"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "create_attachment_from_upload",
          "title": "Create attachment from upload",
          "description": "Link an already-uploaded Linear assetUrl to an existing issue as an attachment.\n\nUse this only after:\n1. prepare_attachment_upload returned an assetUrl and uploadRequest.\n2. The client successfully PUT raw file bytes to uploadRequest.url.\n\nThis tool does not upload file content. It only creates the Linear attachment row.\nIf the direct upload failed or the signed URL expired, rerun prepare_attachment_upload and upload again.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "issue": {
                "type": "string",
                "description": "Issue ID or identifier (e.g., LIN-123). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues"
              },
              "assetUrl": {
                "type": "string",
                "format": "uri",
                "description": "Linear upload assetUrl returned by prepare_attachment_upload"
              },
              "title": {
                "description": "Attachment title. Defaults to filename or asset URL",
                "type": "string"
              },
              "subtitle": {
                "description": "Optional attachment subtitle",
                "type": "string"
              }
            },
            "required": [
              "issue",
              "assetUrl"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "create_attachment",
          "title": "Create attachment (deprecated)",
          "description": "Deprecated fallback for tiny files only. Accepts base64 file content, verifies SHA-256 checksum, and uploads it through the MCP worker.\nPrefer `prepare_attachment_upload` plus direct PUT plus `create_attachment_from_upload`.\n\nCRITICAL: Do not print base64Content and then copy it into this tool call.\nOpaque base64 copied through model-visible text is easy to corrupt.\n\nGenerate base64Content mechanically from the source bytes and pass it through a programmatic argument construction path whenever available. Before calling this tool, verify the values are consistent:\n\nUnix-like shells:\nfile=\"/path/to/file\"\nbase64Content=$(base64 < \"$file\" | tr -d '\\n\\r')\nsha256=$(shasum -a 256 \"$file\" | awk '{print $1}')\ndecodedSha256=$(printf '%s' \"$base64Content\" | base64 -d | shasum -a 256 | awk '{print $1}')\nsize=$(wc -c < \"$file\" | tr -d ' ') # optional; stat can also get file byte size\ndecodedSize=$(printf '%s' \"$base64Content\" | base64 -d | wc -c | tr -d ' ')\n\nPowerShell:\n$file = 'C:\\path\\to\\file'\n$bytes = [IO.File]::ReadAllBytes($file)\n$base64Content = [Convert]::ToBase64String($bytes)\n$sha256 = (Get-FileHash -Algorithm SHA256 -Path $file).Hash.ToLower()\n$size = $bytes.Length # optional\n$decoded = [Convert]::FromBase64String($base64Content)\n$decodedStream = [IO.MemoryStream]::new($decoded)\n$decodedSha256 = (Get-FileHash -Algorithm SHA256 -InputStream $decodedStream).Hash.ToLower()\n$decodedSize = $decoded.Length\n\ndecodedSha256 must equal sha256. If you pass size, decodedSize must equal size.\nPass `sha256`. Passing `size` is optional, but recommended for clearer mismatch errors.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "issue": {
                "type": "string",
                "description": "Issue ID or identifier (e.g., LIN-123). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues"
              },
              "base64Content": {
                "type": "string",
                "description": "Deprecated base64-encoded file content to upload"
              },
              "filename": {
                "type": "string",
                "description": "Filename for the upload (e.g., 'screenshot.png')"
              },
              "contentType": {
                "type": "string",
                "description": "MIME type for the upload (e.g., 'image/png', 'application/pdf')"
              },
              "size": {
                "description": "Optional expected decoded file size in bytes. Rejects the upload if it does not match.",
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "sha256": {
                "type": "string",
                "pattern": "^[a-fA-F0-9]{64}$",
                "description": "Expected SHA-256 hex digest of the decoded file bytes."
              },
              "title": {
                "description": "Optional title for the attachment",
                "type": "string"
              },
              "subtitle": {
                "description": "Optional subtitle for the attachment",
                "type": "string"
              }
            },
            "required": [
              "issue",
              "base64Content",
              "filename",
              "contentType",
              "sha256"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "delete_attachment",
          "title": "Delete attachment",
          "description": "Delete an attachment by ID",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Attachment ID"
              }
            },
            "required": [
              "id"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "list_agent_skills",
          "title": "List agent skills",
          "description": "List Linear Agent skills available to the authenticated user.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "limit": {
                "default": 50,
                "description": "Max results (default 50, max 250)",
                "type": "number",
                "maximum": 250
              },
              "cursor": {
                "description": "Next page cursor",
                "type": "string"
              },
              "orderBy": {
                "default": "updatedAt",
                "description": "Sort: createdAt | updatedAt",
                "type": "string",
                "enum": [
                  "createdAt",
                  "updatedAt"
                ]
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "get_agent_skill",
          "title": "Get agent skill",
          "description": "Retrieve a Linear Agent skill by ID, including its full markdown instructions.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Agent skill ID"
              }
            },
            "required": [
              "id"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "list_comments",
          "title": "List comments",
          "description": "List comments on a Linear issue, project, initiative, document, project milestone, or project/initiative status update. Provide exactly one of `issueId`, `projectId`, `initiativeId`, `documentId`, `milestoneId`, or `statusUpdateId`. For issues, projects, and initiatives this returns both top-level discussion threads and inline description comments. Inline (anchored) comments carry a non-null `quotedText` set to the snippet of description text they reference. Returned comments include `author` and nullable `onBehalfOf`; when set, `onBehalfOf` identifies the user the agent author acted for. Files uploaded in comment bodies are returned in `attachments` with titles and download URLs, not issue attachment IDs. Signed upload URLs expire after five minutes; call list_comments again to refresh them. Download documents using these URLs and process them with your own file tools.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "limit": {
                "default": 50,
                "description": "Max results (default 50, max 250)",
                "type": "number",
                "maximum": 250
              },
              "cursor": {
                "description": "Next page cursor",
                "type": "string"
              },
              "orderBy": {
                "default": "updatedAt",
                "description": "Sort: createdAt | updatedAt",
                "type": "string",
                "enum": [
                  "createdAt",
                  "updatedAt"
                ]
              },
              "issueId": {
                "description": "Issue ID or identifier (e.g., LIN-123). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues (provide exactly one parent)",
                "type": "string"
              },
              "projectId": {
                "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug (provide exactly one parent)",
                "type": "string"
              },
              "initiativeId": {
                "description": "Initiative name, ID, identifier (e.g., I-123), or slug (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"
              },
              "statusUpdateId": {
                "description": "Status update UUID (provide exactly one parent). Resolve status updates via `get_status_updates` first.",
                "type": "string"
              },
              "statusUpdateType": {
                "description": "Type of status update named by `statusUpdateId`, as returned by `get_status_updates`. Only valid together with `statusUpdateId`; omit to check both project and initiative status updates.",
                "type": "string",
                "enum": [
                  "project",
                  "initiative"
                ]
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "save_comment",
          "title": "Save comment",
          "description": "Create or update a comment on a Linear issue, project, initiative, document, project milestone, or project/initiative status update. 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`, `milestoneId`, or `statusUpdateId` — comments on issues/projects/initiatives become top-level discussion threads; comments on documents/milestones become description comments. A status update holds a single thread, so a comment on an update that already has one is added to it as a reply. To reply to an existing thread, pass `parentId` and `body`; the reply inherits the parent's thread type, so no entity reference is needed. Parent reference fields are ignored when `id` or `parentId` is provided (`statusUpdateType` is rejected instead).",
          "inputSchema": {
            "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). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues (provide exactly one parent)",
                "type": "string"
              },
              "projectId": {
                "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug (provide exactly one parent)",
                "type": "string"
              },
              "initiativeId": {
                "description": "Initiative name, ID, identifier (e.g., I-123), or slug (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"
              },
              "statusUpdateId": {
                "description": "Status update UUID (provide exactly one parent). Resolve status updates via `get_status_updates` first.",
                "type": "string"
              },
              "statusUpdateType": {
                "description": "Type of status update named by `statusUpdateId`, as returned by `get_status_updates`. Only valid together with `statusUpdateId`; omit to check both project and initiative status updates.",
                "type": "string",
                "enum": [
                  "project",
                  "initiative"
                ]
              },
              "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"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "delete_comment",
          "title": "Delete comment",
          "description": "Delete a Linear comment. Inline description comments (those with non-null `quotedText`) anchor a mark in the editor, so their root cannot be deleted — delete the replies individually or resolve the thread instead.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Comment ID"
              }
            },
            "required": [
              "id"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "list_cycles",
          "title": "List cycles",
          "description": "Retrieve cycles for a specific Linear team",
          "inputSchema": {
            "type": "object",
            "properties": {
              "teamId": {
                "type": "string",
                "description": "Team ID"
              },
              "type": {
                "description": "Filter: current, previous, next, or all",
                "type": "string",
                "enum": [
                  "current",
                  "previous",
                  "next"
                ]
              }
            },
            "required": [
              "teamId"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "get_document",
          "title": "Get document",
          "description": "Retrieve a Linear document by ID or slug",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Document ID or slug"
              }
            },
            "required": [
              "id"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "list_documents",
          "title": "List documents",
          "description": "List documents in the user's Linear workspace",
          "inputSchema": {
            "type": "object",
            "properties": {
              "limit": {
                "default": 50,
                "description": "Max results (default 50, max 250)",
                "type": "number",
                "maximum": 250
              },
              "cursor": {
                "description": "Next page cursor",
                "type": "string"
              },
              "orderBy": {
                "default": "updatedAt",
                "description": "Sort: createdAt | updatedAt",
                "type": "string",
                "enum": [
                  "createdAt",
                  "updatedAt"
                ]
              },
              "query": {
                "description": "Search query",
                "type": "string"
              },
              "projectId": {
                "description": "Filter by project ID",
                "type": "string"
              },
              "initiativeId": {
                "description": "Filter by initiative ID",
                "type": "string"
              },
              "teamId": {
                "description": "Filter by team ID",
                "type": "string"
              },
              "creatorId": {
                "description": "Filter by creator ID",
                "type": "string"
              },
              "createdAt": {
                "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
                "type": "string"
              },
              "updatedAt": {
                "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
                "type": "string"
              },
              "includeArchived": {
                "default": false,
                "description": "Include archived items",
                "type": "boolean"
              },
              "fields": {
                "description": "Fields to include in each result. `id` is always included. Omit or pass an empty array for the default response.",
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "id",
                    "title",
                    "content",
                    "url",
                    "createdAt",
                    "updatedAt",
                    "archivedAt",
                    "creator",
                    "updatedBy",
                    "project",
                    "initiative",
                    "team",
                    "issue"
                  ]
                }
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "save_document",
          "title": "Save document",
          "description": "Create or update a Linear document. If `id` is provided, edits the existing document; otherwise creates a new one. When creating, `title` is required and exactly one parent (`project`, `issue`, `initiative`, `cycle`, or `team`) must be specified. On update, passing a parent reparents the document. To change parts of the content without resending all of it, pass `patch` instead of `content`.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "description": "Document ID or slug to update. Omit to create a new document.",
                "type": "string"
              },
              "title": {
                "description": "Document title (required when creating)",
                "type": "string"
              },
              "content": {
                "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)",
                "type": "string"
              },
              "patch": {
                "description": "Partial edits applied to the current content, in order and atomically (one failing operation aborts the whole save). Every anchor string must match the current content exactly once. Only valid on update, in place of the full content/description field",
                "minItems": 1,
                "maxItems": 50,
                "type": "array",
                "items": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "replace"
                        },
                        "old_string": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Exact text to replace. Must match the current content exactly once"
                        },
                        "new_string": {
                          "type": "string",
                          "description": "Replacement text. Empty string deletes the match"
                        },
                        "replace_all": {
                          "description": "Replace every occurrence instead of requiring a unique match",
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "op",
                        "old_string",
                        "new_string"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "insert_before"
                        },
                        "anchor": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Exact text to insert before. Must match the current content exactly once"
                        },
                        "text": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Text to insert directly before the anchor. Include separators (e.g. \"\\n\\n\")"
                        }
                      },
                      "required": [
                        "op",
                        "anchor",
                        "text"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "insert_after"
                        },
                        "anchor": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Exact text to insert after. Must match the current content exactly once"
                        },
                        "text": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Text to insert directly after the anchor. Include separators (e.g. \"\\n\\n\")"
                        }
                      },
                      "required": [
                        "op",
                        "anchor",
                        "text"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "prepend"
                        },
                        "text": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Text to insert at the very start of the content"
                        }
                      },
                      "required": [
                        "op",
                        "text"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "append"
                        },
                        "text": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Text to insert at the very end of the content"
                        }
                      },
                      "required": [
                        "op",
                        "text"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "replace_range"
                        },
                        "from": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Exact text where the range starts (inclusive). Must match exactly once"
                        },
                        "to": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Exact text where the range ends (exclusive, stays in place). Must match exactly once after `from`"
                        },
                        "new_string": {
                          "type": "string",
                          "description": "Text replacing the range. Empty string deletes it"
                        }
                      },
                      "required": [
                        "op",
                        "from",
                        "to",
                        "new_string"
                      ]
                    }
                  ]
                }
              },
              "project": {
                "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug",
                "type": "string"
              },
              "issue": {
                "description": "Issue ID or identifier (e.g., LIN-123). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues",
                "type": "string"
              },
              "initiative": {
                "description": "Initiative name, ID, identifier (e.g., I-123), or slug",
                "type": "string"
              },
              "cycle": {
                "description": "Cycle name, number, or ID. When passing a name or number, also pass `team` to disambiguate.",
                "type": "string"
              },
              "team": {
                "description": "Team name or ID. Attaches the document to the team, unless `cycle` is also passed, in which case it disambiguates the cycle.",
                "type": "string"
              },
              "icon": {
                "description": "Icon name or emoji code (e.g. \"Rocket\" or \":eagle:\"), not a raw Unicode emoji",
                "type": "string"
              },
              "color": {
                "description": "Hex color",
                "type": "string"
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "extract_images",
          "title": "Extract images",
          "description": "Extract and fetch images from markdown content. Use this to view screenshots, diagrams, or other images embedded in Linear issues, comments, or documents. Pass the markdown content (e.g., issue description) and receive the images as viewable data.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "markdown": {
                "type": "string",
                "description": "Markdown content containing image references (e.g., issue description, comment body)"
              }
            },
            "required": [
              "markdown"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "get_issue",
          "title": "Get issue",
          "description": "Retrieve detailed information about an issue by ID, including attachments, git branch name, and active Triage Intelligence suggestions when the issue is in triage",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Issue ID or identifier (e.g., LIN-123). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues"
              },
              "includeRelations": {
                "default": false,
                "description": "Include blocking/related/duplicate relations",
                "type": "boolean"
              },
              "includeCustomerNeeds": {
                "default": false,
                "description": "Include associated customer needs",
                "type": "boolean"
              },
              "includeReleases": {
                "default": false,
                "description": "Include associated releases",
                "type": "boolean"
              }
            },
            "required": [
              "id"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "list_issues",
          "title": "List issues",
          "description": "List issues in the user's Linear workspace, including active Triage Intelligence suggestions for issues in triage. For my issues, use \"me\" as the assignee. Use \"null\" for no assignee.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "limit": {
                "default": 50,
                "description": "Max results (default 50, max 250)",
                "type": "number",
                "maximum": 250
              },
              "cursor": {
                "description": "Next page cursor",
                "type": "string"
              },
              "orderBy": {
                "default": "updatedAt",
                "description": "Sort: createdAt | updatedAt",
                "type": "string",
                "enum": [
                  "createdAt",
                  "updatedAt"
                ]
              },
              "query": {
                "description": "Search issue title or description",
                "type": "string"
              },
              "team": {
                "description": "Team name or ID",
                "type": "string"
              },
              "state": {
                "description": "State type, name, or ID",
                "type": "string"
              },
              "cycle": {
                "description": "Cycle name, number, or ID",
                "type": "string"
              },
              "label": {
                "description": "Label name or ID",
                "type": "string"
              },
              "assignee": {
                "description": "User ID, name, email, or \"me\"",
                "type": [
                  "string",
                  "null"
                ]
              },
              "delegate": {
                "description": "Agent name or ID. When the user asks to delegate to \"Linear\" or \"the Linear agent\", this refers to the \"Linear\" app user specifically",
                "type": "string"
              },
              "project": {
                "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug",
                "type": "string"
              },
              "release": {
                "description": "Release ID or slug",
                "type": "string"
              },
              "priority": {
                "description": "0=None, 1=Urgent, 2=High, 3=Medium, 4=Low",
                "type": "number"
              },
              "parentId": {
                "description": "Parent issue ID or identifier (e.g., LIN-123)",
                "type": "string"
              },
              "fields": {
                "description": "Fields to include in each result. `id` is always included. Omit or pass an empty array for the default response.",
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "id",
                    "uuid",
                    "title",
                    "description",
                    "projectMilestone",
                    "priority",
                    "estimate",
                    "url",
                    "gitBranchName",
                    "createdAt",
                    "updatedAt",
                    "archivedAt",
                    "completedAt",
                    "startedAt",
                    "canceledAt",
                    "dueDate",
                    "slaStartedAt",
                    "slaMediumRiskAt",
                    "slaHighRiskAt",
                    "slaBreachesAt",
                    "slaType",
                    "status",
                    "statusType",
                    "labels",
                    "triageIntel",
                    "createdBy",
                    "createdById",
                    "assignee",
                    "assigneeId",
                    "delegate",
                    "delegateId",
                    "project",
                    "projectId",
                    "parentId",
                    "team",
                    "teamId",
                    "cycleId"
                  ]
                }
              },
              "createdAt": {
                "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
                "type": "string"
              },
              "updatedAt": {
                "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
                "type": "string"
              },
              "includeArchived": {
                "default": false,
                "description": "Include archived items",
                "type": "boolean"
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "save_issue",
          "title": "Save issue",
          "description": "Create or update a Linear issue. If `id` is provided, updates the existing issue; otherwise creates a new one. When creating, `team` is required, and `title` is required unless `template` is set. Note: use `assignee` (not `assigneeId`) to set the assignee — it accepts a user ID, name, email, or \"me\".",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "description": "Only for updating an existing issue. Pass the issue ID or identifier (e.g., LIN-123). Do NOT pass this parameter when creating a new issue.",
                "type": "string"
              },
              "title": {
                "description": "Issue title (required when creating, unless template is set)",
                "type": "string"
              },
              "description": {
                "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)",
                "type": "string"
              },
              "patch": {
                "description": "Partial edits applied to the current content, in order and atomically (one failing operation aborts the whole save). Every anchor string must match the current content exactly once. Only valid on update, in place of the full content/description field",
                "minItems": 1,
                "maxItems": 50,
                "type": "array",
                "items": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "replace"
                        },
                        "old_string": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Exact text to replace. Must match the current content exactly once"
                        },
                        "new_string": {
                          "type": "string",
                          "description": "Replacement text. Empty string deletes the match"
                        },
                        "replace_all": {
                          "description": "Replace every occurrence instead of requiring a unique match",
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "op",
                        "old_string",
                        "new_string"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "insert_before"
                        },
                        "anchor": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Exact text to insert before. Must match the current content exactly once"
                        },
                        "text": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Text to insert directly before the anchor. Include separators (e.g. \"\\n\\n\")"
                        }
                      },
                      "required": [
                        "op",
                        "anchor",
                        "text"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "insert_after"
                        },
                        "anchor": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Exact text to insert after. Must match the current content exactly once"
                        },
                        "text": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Text to insert directly after the anchor. Include separators (e.g. \"\\n\\n\")"
                        }
                      },
                      "required": [
                        "op",
                        "anchor",
                        "text"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "prepend"
                        },
                        "text": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Text to insert at the very start of the content"
                        }
                      },
                      "required": [
                        "op",
                        "text"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "append"
                        },
                        "text": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Text to insert at the very end of the content"
                        }
                      },
                      "required": [
                        "op",
                        "text"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "replace_range"
                        },
                        "from": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Exact text where the range starts (inclusive). Must match exactly once"
                        },
                        "to": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Exact text where the range ends (exclusive, stays in place). Must match exactly once after `from`"
                        },
                        "new_string": {
                          "type": "string",
                          "description": "Text replacing the range. Empty string deletes it"
                        }
                      },
                      "required": [
                        "op",
                        "from",
                        "to",
                        "new_string"
                      ]
                    }
                  ]
                }
              },
              "team": {
                "description": "Team name or ID (required when creating)",
                "type": "string"
              },
              "template": {
                "description": "Template name or ID. Applied on create only. The template fills in the content, fields, and sub-issues server-side. A `description` replaces the template body rather than merging with it, but an empty `description` keeps the template body. Labels merge with the template's own",
                "type": "string"
              },
              "cycle": {
                "description": "Cycle name, number, or ID. Null to remove",
                "type": [
                  "string",
                  "null"
                ]
              },
              "milestone": {
                "description": "Milestone name or ID",
                "type": "string"
              },
              "priority": {
                "description": "0=None, 1=Urgent, 2=High, 3=Medium, 4=Low",
                "type": "number"
              },
              "project": {
                "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug. Null to remove",
                "type": [
                  "string",
                  "null"
                ]
              },
              "state": {
                "description": "State type, name, or ID",
                "type": "string"
              },
              "assignee": {
                "description": "User ID, name, email, or \"me\". Null to remove",
                "type": [
                  "string",
                  "null"
                ]
              },
              "delegate": {
                "description": "Agent name or ID. When the user asks to delegate to \"Linear\" or \"the Linear agent\", this refers to the \"Linear\" app user specifically. Null to remove",
                "type": [
                  "string",
                  "null"
                ]
              },
              "labels": {
                "description": "Label names or IDs as a JSON array of strings (e.g. [\"Bug\", \"Urgent\"]). Replaces the full label set; existing labels not included are removed. Omit to leave labels unchanged. Cannot be combined with addLabels/removeLabels; prefer those for incremental changes",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "addLabels": {
                "description": "Label names or IDs as a JSON array of strings (e.g. [\"Bug\", \"Urgent\"]) to add. Append-only; existing labels are never removed. Cannot be combined with a team change",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "removeLabels": {
                "description": "Label names or IDs as a JSON array of strings (e.g. [\"Bug\", \"Urgent\"]) to remove. Only valid when updating an existing issue. Cannot be combined with a team change",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "dueDate": {
                "description": "Due date (ISO format). On update, pass null to remove the due date",
                "type": [
                  "string",
                  "null"
                ]
              },
              "slaBreachesAt": {
                "description": "ISO-8601 timestamp when the SLA will breach. On update, pass null to remove the SLA",
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "slaType": {
                "description": "SLA day counting type: \"all\" or \"onlyBusinessDays\". Only use with slaBreachesAt; null means unset",
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "all",
                      "onlyBusinessDays"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "parentId": {
                "description": "Parent issue ID or identifier (e.g., LIN-123). Null to remove",
                "type": [
                  "string",
                  "null"
                ]
              },
              "estimate": {
                "description": "Issue estimate value. On create, pass null or omit for no estimate. On update, pass null to clear the estimate; omitting leaves it unchanged. 0 is a real estimate only on teams that allow zero estimates.",
                "type": [
                  "number",
                  "null"
                ]
              },
              "links": {
                "description": "Link attachments to add [{url, title}]. Append-only; existing links are never removed",
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "title": {
                      "type": "string",
                      "minLength": 1
                    }
                  },
                  "required": [
                    "url",
                    "title"
                  ]
                }
              },
              "setReleases": {
                "description": "Replace all releases on the issue with these. Cannot be combined with addReleases/removeReleases",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "addReleases": {
                "description": "Release IDs or slugs to add. Append-only; existing releases are never removed",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "removeReleases": {
                "description": "Release IDs or slugs to remove. Only valid when updating an existing issue",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "blocks": {
                "description": "Issue IDs/identifiers this blocks. Append-only; existing relations are never removed",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "blockedBy": {
                "description": "Issue IDs/identifiers blocking this. Append-only; existing relations are never removed",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "relatedTo": {
                "description": "Related issue IDs/identifiers. Append-only; existing relations are never removed",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "duplicateOf": {
                "description": "Duplicate of issue ID/identifier. Null to remove",
                "type": [
                  "string",
                  "null"
                ]
              },
              "removeBlocks": {
                "description": "Issue IDs/identifiers to stop blocking",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "removeBlockedBy": {
                "description": "Issue IDs/identifiers to remove as blockers of this issue",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "removeRelatedTo": {
                "description": "Related issue IDs/identifiers to remove",
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "list_issue_statuses",
          "title": "List issue statuses",
          "description": "List available issue statuses in a Linear team",
          "inputSchema": {
            "type": "object",
            "properties": {
              "team": {
                "type": "string",
                "description": "Team name or ID"
              }
            },
            "required": [
              "team"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "get_issue_status",
          "title": "Get issue status",
          "description": "Retrieve detailed information about an issue status in Linear by name or ID",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Status ID"
              },
              "name": {
                "type": "string",
                "description": "Status name"
              },
              "team": {
                "type": "string",
                "description": "Team name or ID"
              }
            },
            "required": [
              "id",
              "name",
              "team"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "list_issue_labels",
          "title": "List issue labels",
          "description": "List available issue labels in a Linear workspace or team. A retired label carries `retiredAt` and cannot be applied to new issues.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "limit": {
                "default": 50,
                "description": "Max results (default 50, max 250)",
                "type": "number",
                "maximum": 250
              },
              "cursor": {
                "description": "Next page cursor",
                "type": "string"
              },
              "orderBy": {
                "default": "updatedAt",
                "description": "Sort: createdAt | updatedAt",
                "type": "string",
                "enum": [
                  "createdAt",
                  "updatedAt"
                ]
              },
              "name": {
                "description": "Filter by name",
                "type": "string"
              },
              "team": {
                "description": "Team name or ID",
                "type": "string"
              },
              "includeArchived": {
                "default": false,
                "description": "Include archived items",
                "type": "boolean"
              },
              "includeGroups": {
                "default": false,
                "description": "Include label groups in the results, marked with `isGroup`. A group cannot be applied directly; retiring or restoring one cascades to its child labels",
                "type": "boolean"
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "save_issue_label",
          "title": "Save issue label",
          "description": "Create or update a Linear issue label. If `id` is provided, updates the existing label; otherwise creates a new one. When creating, `name` is required.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "description": "Label name or ID. If provided, updates the existing label",
                "type": "string"
              },
              "name": {
                "description": "Label name (required when creating)",
                "type": "string"
              },
              "description": {
                "description": "Label description. Null to clear it",
                "type": [
                  "string",
                  "null"
                ]
              },
              "color": {
                "description": "Hex color code",
                "type": "string"
              },
              "teamId": {
                "description": "Team UUID (omit for workspace label). When updating, only disambiguates `id` by name; a label's team cannot be changed",
                "type": "string"
              },
              "parent": {
                "description": "Parent label group name or ID. Null to remove from its group",
                "type": [
                  "string",
                  "null"
                ]
              },
              "isGroup": {
                "description": "Whether the label is a group",
                "type": "boolean"
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "create_issue_label",
          "title": "Create issue label (deprecated)",
          "description": "Create a new Linear issue label. Deprecated: use `save_issue_label`, which can also update labels.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "description": "Label name"
              },
              "description": {
                "description": "Label description",
                "type": "string"
              },
              "color": {
                "description": "Hex color code",
                "type": "string"
              },
              "teamId": {
                "description": "Team UUID (omit for workspace label)",
                "type": "string"
              },
              "parent": {
                "description": "Parent label group name or ID",
                "type": "string"
              },
              "isGroup": {
                "default": false,
                "description": "Whether the label is a group",
                "type": "boolean"
              }
            },
            "required": [
              "name"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "retire_issue_label",
          "title": "Retire issue label",
          "description": "Retire a Linear issue label so it cannot be applied to new issues. The label stays visible on issues that already have it. Retiring a label group also retires its child labels. Undo with `restore_issue_label`.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Label or label group ID"
              }
            },
            "required": [
              "id"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "restore_issue_label",
          "title": "Restore issue label",
          "description": "Restore a retired Linear issue label, making it available for use on issues again. Restoring a label group also restores every child label, including any that were retired separately.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Label or label group ID"
              }
            },
            "required": [
              "id"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "list_projects",
          "title": "List projects",
          "description": "List projects in the user's Linear workspace",
          "inputSchema": {
            "type": "object",
            "properties": {
              "limit": {
                "default": 50,
                "description": "Max results (default 50, max 50)",
                "type": "number",
                "maximum": 50
              },
              "cursor": {
                "description": "Next page cursor",
                "type": "string"
              },
              "orderBy": {
                "default": "updatedAt",
                "description": "Sort: createdAt | updatedAt",
                "type": "string",
                "enum": [
                  "createdAt",
                  "updatedAt"
                ]
              },
              "query": {
                "description": "Search project name",
                "type": "string"
              },
              "state": {
                "description": "State type, name, or ID",
                "type": "string"
              },
              "initiative": {
                "description": "Initiative name, ID, identifier (e.g., I-123), or slug",
                "type": "string"
              },
              "team": {
                "description": "Team name or ID",
                "type": "string"
              },
              "member": {
                "description": "User ID, name, email, or \"me\"",
                "type": "string"
              },
              "label": {
                "description": "Label name or ID",
                "type": "string"
              },
              "createdAt": {
                "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
                "type": "string"
              },
              "updatedAt": {
                "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
                "type": "string"
              },
              "includeMilestones": {
                "default": false,
                "description": "Include milestones",
                "type": "boolean"
              },
              "includeMembers": {
                "default": false,
                "description": "Include project members",
                "type": "boolean"
              },
              "includeArchived": {
                "default": false,
                "description": "Include archived items",
                "type": "boolean"
              },
              "fields": {
                "description": "Fields to include in each result. `id` is always included. Omit or pass an empty array for the default response.",
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "id",
                    "uuid",
                    "name",
                    "summary",
                    "description",
                    "url",
                    "trashed",
                    "createdAt",
                    "updatedAt",
                    "startedAt",
                    "completedAt",
                    "canceledAt",
                    "startDate",
                    "startDateResolution",
                    "targetDate",
                    "targetDateResolution",
                    "priority",
                    "sortOrder",
                    "labels",
                    "initiatives",
                    "lead",
                    "leadTeam",
                    "status",
                    "teams",
                    "members",
                    "milestones"
                  ]
                }
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "get_project",
          "title": "Get project",
          "description": "Retrieve details of a specific project in Linear",
          "inputSchema": {
            "type": "object",
            "properties": {
              "query": {
                "type": "string",
                "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug"
              },
              "includeCustomerNeeds": {
                "default": false,
                "description": "Include one page of customer needs attached directly to the project",
                "type": "boolean"
              },
              "customerNeedsLimit": {
                "default": 10,
                "description": "Customer needs per page when includeCustomerNeeds is true (default 10, max 50)",
                "type": "integer",
                "minimum": 1,
                "maximum": 50
              },
              "customerNeedsCursor": {
                "description": "Next customer-needs page: pass customerNeedsPageInfo.endCursor with includeCustomerNeeds true",
                "type": "string"
              },
              "includeMilestones": {
                "default": false,
                "description": "Include milestones",
                "type": "boolean"
              },
              "includeMembers": {
                "default": false,
                "description": "Include project members",
                "type": "boolean"
              },
              "includeResources": {
                "default": false,
                "description": "Include resources (documents, links, attachments)",
                "type": "boolean"
              }
            },
            "required": [
              "query"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "save_project",
          "title": "Save project",
          "description": "Create or update a Linear project. If `id` is provided, updates the existing project; otherwise creates a new one. When creating, `name` and at least one team (via `addTeams` or `setTeams`) are required. Pass `template` to create the project from a project template. To change parts of the description without resending all of it, pass `patch` instead of `description`. `state` resolves against the project statuses of the lead team, so pass `leadTeam` when creating a multi-team project whose teams use different statuses.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug. If provided, updates the existing project",
                "type": "string"
              },
              "name": {
                "description": "Project name (required when creating)",
                "type": "string"
              },
              "template": {
                "description": "Template name or ID. Applied on create only. The template fills in the content, fields, and sub-issues server-side. A `description` replaces the template body rather than merging with it, but an empty `description` keeps the template body. Labels merge with the template's own",
                "type": "string"
              },
              "icon": {
                "description": "Icon name or emoji code (e.g. \"Rocket\" or \":eagle:\"), not a raw Unicode emoji",
                "type": "string"
              },
              "color": {
                "description": "Hex color",
                "type": "string"
              },
              "summary": {
                "description": "Short summary (max 255 chars)",
                "type": "string"
              },
              "description": {
                "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)",
                "type": "string"
              },
              "patch": {
                "description": "Partial edits applied to the current content, in order and atomically (one failing operation aborts the whole save). Every anchor string must match the current content exactly once. Only valid on update, in place of the full content/description field",
                "minItems": 1,
                "maxItems": 50,
                "type": "array",
                "items": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "replace"
                        },
                        "old_string": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Exact text to replace. Must match the current content exactly once"
                        },
                        "new_string": {
                          "type": "string",
                          "description": "Replacement text. Empty string deletes the match"
                        },
                        "replace_all": {
                          "description": "Replace every occurrence instead of requiring a unique match",
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "op",
                        "old_string",
                        "new_string"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "insert_before"
                        },
                        "anchor": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Exact text to insert before. Must match the current content exactly once"
                        },
                        "text": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Text to insert directly before the anchor. Include separators (e.g. \"\\n\\n\")"
                        }
                      },
                      "required": [
                        "op",
                        "anchor",
                        "text"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "insert_after"
                        },
                        "anchor": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Exact text to insert after. Must match the current content exactly once"
                        },
                        "text": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Text to insert directly after the anchor. Include separators (e.g. \"\\n\\n\")"
                        }
                      },
                      "required": [
                        "op",
                        "anchor",
                        "text"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "prepend"
                        },
                        "text": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Text to insert at the very start of the content"
                        }
                      },
                      "required": [
                        "op",
                        "text"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "append"
                        },
                        "text": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Text to insert at the very end of the content"
                        }
                      },
                      "required": [
                        "op",
                        "text"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "replace_range"
                        },
                        "from": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Exact text where the range starts (inclusive). Must match exactly once"
                        },
                        "to": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Exact text where the range ends (exclusive, stays in place). Must match exactly once after `from`"
                        },
                        "new_string": {
                          "type": "string",
                          "description": "Text replacing the range. Empty string deletes it"
                        }
                      },
                      "required": [
                        "op",
                        "from",
                        "to",
                        "new_string"
                      ]
                    }
                  ]
                }
              },
              "state": {
                "description": "Project status name, type, or ID. Names resolve within the lead team's project statuses. If the lead team is unknown, standard labels resolve as status types; custom names require a status ID or leadTeam",
                "type": "string"
              },
              "startDate": {
                "description": "Start date (ISO format). Pair with startDateResolution to indicate precision (e.g. month, quarter)",
                "type": "string"
              },
              "startDateResolution": {
                "description": "Start date resolution",
                "type": "string",
                "enum": [
                  "halfYear",
                  "month",
                  "quarter",
                  "year"
                ]
              },
              "targetDate": {
                "description": "Target date (ISO format). Pair with targetDateResolution to indicate precision (e.g. month, quarter)",
                "type": "string"
              },
              "targetDateResolution": {
                "description": "Target date resolution",
                "type": "string",
                "enum": [
                  "halfYear",
                  "month",
                  "quarter",
                  "year"
                ]
              },
              "priority": {
                "description": "0=None, 1=Urgent, 2=High, 3=Medium, 4=Low",
                "type": "integer",
                "minimum": 0,
                "maximum": 4
              },
              "addTeams": {
                "description": "Team name or ID to add",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "removeTeams": {
                "description": "Team name or ID to remove",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "setTeams": {
                "description": "Replace all teams with these. Cannot combine with addTeams/removeTeams",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "leadTeam": {
                "description": "Team that leads the project. Team name or ID. Overrides the default lead team; added to the project's teams when not among them",
                "type": "string"
              },
              "labels": {
                "description": "Label names or IDs as a JSON array of strings (e.g. [\"Bug\", \"Urgent\"]). Replaces the full label set; existing labels not included are removed. Omit to leave labels unchanged",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "lead": {
                "description": "User ID, name, email, or \"me\". Null to remove, except on create with a template that names a lead",
                "type": [
                  "string",
                  "null"
                ]
              },
              "addInitiatives": {
                "description": "Initiatives to add. Initiative name, ID, identifier (e.g., I-123), or slug",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "removeInitiatives": {
                "description": "Initiatives to remove. Initiative name, ID, identifier (e.g., I-123), or slug",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "setInitiatives": {
                "description": "Replace all initiatives with these. Initiative name, ID, identifier (e.g., I-123), or slug. Cannot combine with addInitiatives/removeInitiatives",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "links": {
                "description": "External resource links to add [{url, title}]. Append-only; existing links are never removed",
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "title": {
                      "type": "string",
                      "minLength": 1
                    }
                  },
                  "required": [
                    "url",
                    "title"
                  ]
                }
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "list_project_labels",
          "title": "List project labels",
          "description": "List available project labels in a Linear workspace or team. Returns workspace labels by default; pass `team` to also include that team's labels. A team-scoped label carries a `team` field; different teams can hold same-named labels, so check it before acting on an ID. A retired label carries `retiredAt` and cannot be applied to new projects.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "limit": {
                "default": 50,
                "description": "Max results (default 50, max 250)",
                "type": "number",
                "maximum": 250
              },
              "cursor": {
                "description": "Next page cursor",
                "type": "string"
              },
              "orderBy": {
                "default": "updatedAt",
                "description": "Sort: createdAt | updatedAt",
                "type": "string",
                "enum": [
                  "createdAt",
                  "updatedAt"
                ]
              },
              "name": {
                "description": "Filter by name",
                "type": "string"
              },
              "team": {
                "description": "Team name or ID",
                "type": "string"
              },
              "includeArchived": {
                "default": false,
                "description": "Include archived items",
                "type": "boolean"
              },
              "includeGroups": {
                "default": false,
                "description": "Include label groups in the results, marked with `isGroup`. A group cannot be applied directly; retiring or restoring one cascades to its child labels",
                "type": "boolean"
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "retire_project_label",
          "title": "Retire project label",
          "description": "Retire a Linear project label so it cannot be applied to new projects. The label stays visible on projects that already have it. Retiring a label group also retires its child labels. Undo with `restore_project_label`.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Label or label group ID"
              }
            },
            "required": [
              "id"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "restore_project_label",
          "title": "Restore project label",
          "description": "Restore a retired Linear project label, making it available for use on projects again. Restoring a label group also restores every child label, including any that were retired separately.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Label or label group ID"
              }
            },
            "required": [
              "id"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "save_project_label",
          "title": "Save project label",
          "description": "Create or update a Linear project label. If `id` is provided, updates the existing label; otherwise creates a new one. When creating, `name` is required.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "description": "Label name or ID. If provided, updates the existing label",
                "type": "string"
              },
              "name": {
                "description": "Label name (required when creating)",
                "type": "string"
              },
              "description": {
                "description": "Label description. Null to clear it",
                "type": [
                  "string",
                  "null"
                ]
              },
              "color": {
                "description": "Hex color code",
                "type": "string"
              },
              "teamId": {
                "description": "Team UUID (omit for workspace label). When updating, only disambiguates `id` by name; a label's team cannot be changed",
                "type": "string"
              },
              "parent": {
                "description": "Parent label group name or ID. Null to remove from its group",
                "type": [
                  "string",
                  "null"
                ]
              },
              "isGroup": {
                "description": "Whether the label is a group",
                "type": "boolean"
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "list_release_pipelines",
          "title": "List release pipelines",
          "description": "List release pipelines in the workspace.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "limit": {
                "default": 50,
                "description": "Max results (default 50, max 250)",
                "type": "number",
                "maximum": 250
              },
              "cursor": {
                "description": "Next page cursor",
                "type": "string"
              },
              "orderBy": {
                "default": "updatedAt",
                "description": "Sort: createdAt | updatedAt",
                "type": "string",
                "enum": [
                  "createdAt",
                  "updatedAt"
                ]
              },
              "query": {
                "description": "Search pipeline name",
                "type": "string"
              },
              "team": {
                "description": "Team name or ID",
                "type": "string"
              },
              "type": {
                "description": "Pipeline type: continuous | scheduled",
                "type": "string",
                "enum": [
                  "continuous",
                  "scheduled"
                ]
              },
              "isProduction": {
                "description": "Filter by production pipeline flag",
                "type": "boolean"
              },
              "includeStages": {
                "default": false,
                "description": "Include each pipeline's stages",
                "type": "boolean"
              },
              "includeTeams": {
                "default": false,
                "description": "Include each pipeline's teams",
                "type": "boolean"
              },
              "createdAt": {
                "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
                "type": "string"
              },
              "updatedAt": {
                "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
                "type": "string"
              },
              "includeArchived": {
                "default": false,
                "description": "Include archived items",
                "type": "boolean"
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "list_releases",
          "title": "List releases",
          "description": "List releases in the workspace, with optional filtering by pipeline, stage, version, and text.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "limit": {
                "default": 50,
                "description": "Max results (default 50, max 250)",
                "type": "number",
                "maximum": 250
              },
              "cursor": {
                "description": "Next page cursor",
                "type": "string"
              },
              "orderBy": {
                "default": "updatedAt",
                "description": "Sort: createdAt | updatedAt",
                "type": "string",
                "enum": [
                  "createdAt",
                  "updatedAt"
                ]
              },
              "query": {
                "description": "Search release name or version",
                "type": "string"
              },
              "pipeline": {
                "description": "Release pipeline ID, slug, or exact name",
                "type": "string"
              },
              "stage": {
                "description": "Release stage ID or exact name",
                "type": "string"
              },
              "stageType": {
                "description": "Filter by stage lifecycle type",
                "type": "string",
                "enum": [
                  "planned",
                  "started",
                  "completed",
                  "canceled"
                ]
              },
              "version": {
                "description": "Exact version match",
                "type": "string"
              },
              "hasReleaseNotes": {
                "description": "Filter to releases that do (true) or do not (false) have release notes",
                "type": "boolean"
              },
              "includeReleaseNotes": {
                "default": false,
                "description": "Include associated release notes",
                "type": "boolean"
              },
              "createdAt": {
                "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
                "type": "string"
              },
              "updatedAt": {
                "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
                "type": "string"
              },
              "includeArchived": {
                "default": false,
                "description": "Include archived items",
                "type": "boolean"
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "get_release",
          "title": "Get release",
          "description": "Retrieve details of a release by ID or slug.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Release ID or slug"
              },
              "includeReleaseNotes": {
                "default": false,
                "description": "Include associated release notes",
                "type": "boolean"
              }
            },
            "required": [
              "id"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "save_release",
          "title": "Save release",
          "description": "Create or update a release. If `id` is provided, updates the existing release; otherwise creates a new one. When creating, `name` and `pipeline` are required. Release status is modeled as the release pipeline stage.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "description": "Release ID or slug to update. Omit to create a new release.",
                "type": "string"
              },
              "name": {
                "description": "Release name (required when creating)",
                "type": "string"
              },
              "description": {
                "description": "Release description",
                "type": "string"
              },
              "version": {
                "description": "Version identifier",
                "type": "string"
              },
              "pipeline": {
                "description": "Release pipeline ID, slug, or exact name (required when creating)",
                "type": "string"
              },
              "stage": {
                "description": "Release stage ID, exact name, or lifecycle type within the release pipeline",
                "type": "string"
              },
              "startDate": {
                "description": "Estimated start date (ISO YYYY-MM-DD, null to remove)",
                "type": [
                  "string",
                  "null"
                ]
              },
              "targetDate": {
                "description": "Estimated completion date (ISO YYYY-MM-DD, null to remove)",
                "type": [
                  "string",
                  "null"
                ]
              },
              "createdAt": {
                "description": "Import/create timestamp (ISO DateTime)",
                "type": "string"
              },
              "startedAt": {
                "description": "Started timestamp (ISO DateTime, null to remove)",
                "type": [
                  "string",
                  "null"
                ]
              },
              "completedAt": {
                "description": "Completed timestamp (ISO DateTime, null to remove)",
                "type": [
                  "string",
                  "null"
                ]
              },
              "commitSha": {
                "description": "Commit SHA associated with the release",
                "type": "string"
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "list_release_notes",
          "title": "List release notes",
          "description": "List release notes in the workspace, optionally filtered by pipeline or covered release.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "limit": {
                "default": 50,
                "description": "Max results (default 50, max 250)",
                "type": "number",
                "maximum": 250
              },
              "cursor": {
                "description": "Next page cursor",
                "type": "string"
              },
              "orderBy": {
                "default": "updatedAt",
                "description": "Sort: createdAt | updatedAt",
                "type": "string",
                "enum": [
                  "createdAt",
                  "updatedAt"
                ]
              },
              "query": {
                "description": "Search release notes title",
                "type": "string"
              },
              "pipeline": {
                "description": "Release pipeline ID, slug, or exact name",
                "type": "string"
              },
              "release": {
                "description": "Release ID or slug",
                "type": "string"
              },
              "includeContent": {
                "default": false,
                "description": "Include markdown release notes content",
                "type": "boolean"
              },
              "includeReleases": {
                "default": false,
                "description": "Include associated releases",
                "type": "boolean"
              },
              "createdAt": {
                "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
                "type": "string"
              },
              "updatedAt": {
                "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
                "type": "string"
              },
              "includeArchived": {
                "default": false,
                "description": "Include archived items",
                "type": "boolean"
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "get_release_note",
          "title": "Get release notes",
          "description": "Retrieve release notes by ID or slug, including markdown content.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Release notes ID or slug"
              },
              "includeReleases": {
                "default": false,
                "description": "Include associated releases",
                "type": "boolean"
              }
            },
            "required": [
              "id"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "save_release_note",
          "title": "Save release notes",
          "description": "Create or update release notes. If `id` is provided, updates the existing release notes; otherwise creates a new one. When creating, `pipeline` and either `releases` or a release range are required. To change parts of the content without resending all of it, pass `patch` instead of `content`.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "description": "Release notes ID or slug to update. Omit to create new release notes.",
                "type": "string"
              },
              "pipeline": {
                "description": "Release pipeline ID, slug, or exact name (required when creating)",
                "type": "string"
              },
              "title": {
                "description": "Release notes title",
                "type": "string"
              },
              "content": {
                "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)",
                "type": "string"
              },
              "patch": {
                "description": "Partial edits applied to the current content, in order and atomically (one failing operation aborts the whole save). Every anchor string must match the current content exactly once. Only valid on update, in place of the full content/description field",
                "minItems": 1,
                "maxItems": 50,
                "type": "array",
                "items": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "replace"
                        },
                        "old_string": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Exact text to replace. Must match the current content exactly once"
                        },
                        "new_string": {
                          "type": "string",
                          "description": "Replacement text. Empty string deletes the match"
                        },
                        "replace_all": {
                          "description": "Replace every occurrence instead of requiring a unique match",
                          "type": "boolean"
                        }
                      },
                      "required": [
                        "op",
                        "old_string",
                        "new_string"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "insert_before"
                        },
                        "anchor": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Exact text to insert before. Must match the current content exactly once"
                        },
                        "text": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Text to insert directly before the anchor. Include separators (e.g. \"\\n\\n\")"
                        }
                      },
                      "required": [
                        "op",
                        "anchor",
                        "text"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "insert_after"
                        },
                        "anchor": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Exact text to insert after. Must match the current content exactly once"
                        },
                        "text": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Text to insert directly after the anchor. Include separators (e.g. \"\\n\\n\")"
                        }
                      },
                      "required": [
                        "op",
                        "anchor",
                        "text"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "prepend"
                        },
                        "text": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Text to insert at the very start of the content"
                        }
                      },
                      "required": [
                        "op",
                        "text"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "append"
                        },
                        "text": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Text to insert at the very end of the content"
                        }
                      },
                      "required": [
                        "op",
                        "text"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "op": {
                          "type": "string",
                          "const": "replace_range"
                        },
                        "from": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Exact text where the range starts (inclusive). Must match exactly once"
                        },
                        "to": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Exact text where the range ends (exclusive, stays in place). Must match exactly once after `from`"
                        },
                        "new_string": {
                          "type": "string",
                          "description": "Text replacing the range. Empty string deletes it"
                        }
                      },
                      "required": [
                        "op",
                        "from",
                        "to",
                        "new_string"
                      ]
                    }
                  ]
                }
              },
              "releases": {
                "description": "Release IDs or slugs to include in the note",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "rangeFromRelease": {
                "description": "Oldest release ID or slug in the note range",
                "type": "string"
              },
              "rangeToRelease": {
                "description": "Newest release ID or slug in the note range",
                "type": "string"
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "get_diff",
          "title": "Get diff",
          "description": "Exact lookup for a Linear diff. Use with review URLs, GitHub PR URLs, Linear full identifiers, UUIDs, or slugs.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "urlOrId": {
                "type": "string",
                "minLength": 1,
                "description": "Linear review URL, diff slug, pull request ID, Linear full identifier, or GitHub PR URL"
              }
            },
            "required": [
              "urlOrId"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "list_diffs",
          "title": "List diffs",
          "description": "List Linear diff pull requests visible to the authenticated user",
          "inputSchema": {
            "type": "object",
            "properties": {
              "limit": {
                "default": 50,
                "description": "Max results (default 50, max 250)",
                "type": "number",
                "maximum": 250
              },
              "cursor": {
                "description": "Next page cursor",
                "type": "string"
              },
              "orderBy": {
                "default": "updatedAt",
                "description": "Sort: createdAt | updatedAt",
                "type": "string",
                "enum": [
                  "createdAt",
                  "updatedAt"
                ]
              },
              "query": {
                "description": "Broad search by title, branch, PR number, or bare slug",
                "type": "string"
              },
              "owner": {
                "description": "Filter returned diffs by repository owner",
                "type": "string"
              },
              "repo": {
                "description": "Filter returned diffs by repository name",
                "type": "string"
              },
              "status": {
                "description": "Filter returned diffs by pull request status",
                "type": "string"
              },
              "author": {
                "description": "Filter by author ID, name, email, or \"me\"",
                "type": "string"
              },
              "reviewer": {
                "description": "Filter by reviewer ID, name, email, or \"me\"",
                "type": "string"
              },
              "reviewState": {
                "description": "Reviewer state; requires reviewer and defaults to pending when reviewer is set",
                "type": "string",
                "enum": [
                  "pending",
                  "approved",
                  "changesRequested",
                  "commented",
                  "dismissed"
                ]
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "get_diff_threads",
          "title": "Get diff threads",
          "description": "Exact lookup for diff threads and the authenticated user's drafts. Use with review URLs, GitHub PR URLs, Linear full identifiers, UUIDs, or slugs.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "urlOrId": {
                "type": "string",
                "minLength": 1,
                "description": "Linear review URL, diff slug, pull request ID, Linear full identifier, or GitHub PR URL"
              },
              "threadId": {
                "description": "Optional Linear comment UUID of any comment in the thread (not its `externalThreadId`); a reply's UUID resolves to its thread root",
                "type": "string"
              },
              "resolved": {
                "description": "Filter returned threads by resolved state",
                "type": "boolean"
              },
              "orderBy": {
                "default": "updatedAt",
                "description": "Sort: createdAt | updatedAt",
                "type": "string",
                "enum": [
                  "createdAt",
                  "updatedAt"
                ]
              }
            },
            "required": [
              "urlOrId"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "save_diff_comment",
          "title": "Save diff comment",
          "description": "Create, reply to, or edit a comment or persisted draft on a Linear diff. Set draft to true to save without submitting. Provide draftId to edit or submit a persisted draft, and commentId only to edit a submitted comment. Submitting an inline draft reuses its saved anchor; submitting a reply draft requires parentId again.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "urlOrId": {
                "description": "Linear review URL, diff slug, pull request ID, Linear full identifier, or GitHub PR URL",
                "type": "string",
                "minLength": 1
              },
              "commentId": {
                "description": "Existing comment ID to edit",
                "type": "string"
              },
              "draftId": {
                "description": "Existing persisted draft ID to edit or submit",
                "type": "string"
              },
              "draft": {
                "default": false,
                "description": "Save as a private persisted draft without submitting",
                "type": "boolean"
              },
              "parentId": {
                "description": "Top-level comment ID to reply to; also required when submitting a persisted reply draft",
                "type": "string"
              },
              "body": {
                "type": "string",
                "minLength": 1,
                "description": "Content as Markdown. Do not escape the string — use literal newlines and special characters, not escape sequences"
              },
              "anchor": {
                "description": "Optional comment anchor copied from a diff thread or built for a file or diff hunk",
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {}
              },
              "anchorContent": {
                "description": "Exact source text of the anchor's end line; stored with an inline draft so it can be re-anchored after the diff receives new revisions",
                "type": "string"
              }
            },
            "required": [
              "body"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "resolve_diff_thread",
          "title": "Resolve diff thread",
          "description": "Resolve or reopen a top-level comment thread on a Linear diff",
          "inputSchema": {
            "type": "object",
            "properties": {
              "threadId": {
                "type": "string",
                "minLength": 1,
                "description": "Top-level diff thread/comment ID"
              },
              "resolved": {
                "default": true,
                "description": "True to resolve the thread; false to reopen it",
                "type": "boolean"
              }
            },
            "required": [
              "threadId"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": true,
            "openWorldHint": true
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "delete_diff_comment",
          "title": "Delete diff comment",
          "description": "Delete a comment or persisted draft from a Linear diff",
          "inputSchema": {
            "type": "object",
            "properties": {
              "commentId": {
                "description": "Submitted diff comment ID to delete",
                "type": "string",
                "minLength": 1
              },
              "draftId": {
                "description": "Persisted diff comment draft ID to delete",
                "type": "string",
                "minLength": 1
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "submit_diff_review",
          "title": "Submit diff review",
          "description": "Approve a Linear diff, request changes, or submit a review comment",
          "inputSchema": {
            "type": "object",
            "properties": {
              "urlOrId": {
                "type": "string",
                "minLength": 1,
                "description": "Linear review URL, diff slug, pull request ID, Linear full identifier, or GitHub PR URL"
              },
              "decision": {
                "type": "string",
                "enum": [
                  "approved",
                  "changesRequested",
                  "commented"
                ],
                "description": "Review decision: approved, changesRequested, or commented"
              },
              "body": {
                "description": "Content as Markdown. Do not escape the string — use literal newlines and special characters, not escape sequences. Required when requesting changes or commenting",
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "urlOrId",
              "decision"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "update_diff",
          "title": "Update diff",
          "description": "Update a Linear diff's title, description, reviewer requests, issue links, or status. Provide at least one update. Combined updates can partially succeed; inspect the result before retrying. Use merge_diff to merge and submit_diff_review to approve or request changes.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "urlOrId": {
                "type": "string",
                "minLength": 1,
                "description": "Linear review URL, diff slug, pull request ID, Linear full identifier, or GitHub PR URL"
              },
              "title": {
                "description": "New diff title",
                "type": "string",
                "minLength": 1
              },
              "description": {
                "description": "New description as Markdown; an empty string clears it",
                "type": "string"
              },
              "addedReviewRequests": {
                "description": "Request or re-request reviews; existing pending requests are unchanged",
                "minItems": 1,
                "maxItems": 25,
                "type": "array",
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "user": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Workspace user ID, name, email, or \"me\""
                        }
                      },
                      "required": [
                        "user"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "externalUserId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                          "description": "External user ID from get_diff reviewer metadata"
                        }
                      },
                      "required": [
                        "externalUserId"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "githubTeamId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                          "description": "GitHub team ID from get_diff reviewer metadata"
                        }
                      },
                      "required": [
                        "githubTeamId"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              },
              "removedReviewRequests": {
                "description": "Withdraw pending review requests; submitted reviews are preserved",
                "minItems": 1,
                "maxItems": 25,
                "type": "array",
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "user": {
                          "type": "string",
                          "minLength": 1,
                          "description": "Workspace user ID, name, email, or \"me\""
                        }
                      },
                      "required": [
                        "user"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "externalUserId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                          "description": "External user ID from get_diff reviewer metadata"
                        }
                      },
                      "required": [
                        "externalUserId"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "githubTeamId": {
                          "type": "string",
                          "format": "uuid",
                          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                          "description": "GitHub team ID from get_diff reviewer metadata"
                        }
                      },
                      "required": [
                        "githubTeamId"
                      ],
                      "additionalProperties": false
                    }
                  ]
                }
              },
              "addedIssueLinks": {
                "description": "Add issue links or change the relationship of an existing link",
                "minItems": 1,
                "maxItems": 25,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "issue": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Linear issue identifier or UUID"
                    },
                    "type": {
                      "type": "string",
                      "enum": [
                        "closes",
                        "contributes",
                        "links",
                        "reopens"
                      ],
                      "description": "Relationship: closes, contributes, links, or reopens"
                    }
                  },
                  "required": [
                    "issue",
                    "type"
                  ],
                  "additionalProperties": false
                }
              },
              "removedIssueLinks": {
                "description": "Linear issue identifiers or UUIDs to unlink",
                "minItems": 1,
                "maxItems": 25,
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1
                }
              },
              "statusAction": {
                "description": "Status transition to perform after metadata is updated",
                "type": "string",
                "enum": [
                  "markReadyForReview",
                  "convertToDraft",
                  "close",
                  "reopen"
                ]
              }
            },
            "required": [
              "urlOrId"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "merge_diff",
          "title": "Merge diff",
          "description": "Merge a Linear diff or add it to the repository's merge queue",
          "inputSchema": {
            "type": "object",
            "properties": {
              "urlOrId": {
                "type": "string",
                "minLength": 1,
                "description": "Linear review URL, diff slug, pull request ID, Linear full identifier, or GitHub PR URL"
              },
              "mergeMethod": {
                "description": "Merge method; omit to use the repository default",
                "type": "string",
                "enum": [
                  "MERGE",
                  "REBASE",
                  "SQUASH"
                ]
              }
            },
            "required": [
              "urlOrId"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "share_issue",
          "title": "Share issue",
          "description": "Share an issue with a workspace user who cannot otherwise access it. Use this tool only when the user explicitly asks to share the issue.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "issue": {
                "type": "string",
                "description": "Issue ID or identifier (e.g., LIN-123). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues"
              },
              "user": {
                "type": "string",
                "description": "User ID, name, email, or \"me\" Must be an email address or UUID."
              }
            },
            "required": [
              "issue",
              "user"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "unshare_issue",
          "title": "Unshare issue",
          "description": "Remove a workspace user's shared access to an issue. Use this tool only when the user explicitly asks to stop sharing the issue.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "issue": {
                "type": "string",
                "description": "Issue ID or identifier (e.g., LIN-123). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues"
              },
              "user": {
                "type": "string",
                "description": "User ID, name, email, or \"me\" Must be an email address or UUID."
              }
            },
            "required": [
              "issue",
              "user"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "list_milestones",
          "title": "List project milestones",
          "description": "List all milestones in a Linear project",
          "inputSchema": {
            "type": "object",
            "properties": {
              "project": {
                "type": "string",
                "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug"
              }
            },
            "required": [
              "project"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "get_milestone",
          "title": "Get milestone",
          "description": "Retrieve details of a specific milestone by ID or name",
          "inputSchema": {
            "type": "object",
            "properties": {
              "project": {
                "type": "string",
                "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug"
              },
              "query": {
                "type": "string",
                "description": "Milestone name or ID"
              }
            },
            "required": [
              "project",
              "query"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "save_milestone",
          "title": "Save milestone",
          "description": "Create or update a milestone in a Linear project. If `id` is provided, updates the existing milestone; otherwise creates a new one. When creating, `name` is required.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "project": {
                "type": "string",
                "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug"
              },
              "id": {
                "description": "Milestone name or ID",
                "type": "string"
              },
              "name": {
                "description": "Milestone name (required when creating)",
                "type": "string"
              },
              "description": {
                "description": "Milestone description",
                "type": "string"
              },
              "targetDate": {
                "description": "Target completion date (ISO format, null to remove)",
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "required": [
              "project"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "get_notifications",
          "title": "Get notifications",
          "description": "Get a page of notifications from the authenticated user's Linear inbox.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "limit": {
                "default": 50,
                "description": "Max results (default 50, max 250)",
                "type": "number",
                "maximum": 250
              },
              "cursor": {
                "description": "Next page cursor",
                "type": "string"
              },
              "unreadOnly": {
                "default": false,
                "description": "Only return unread notifications",
                "type": "boolean"
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "mark_notification",
          "title": "Mark notification",
          "description": "Mark a Linear inbox notification as read or unread, or snooze or unsnooze it.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Notification ID"
              },
              "read": {
                "description": "Whether the notification should be marked as read",
                "type": "boolean"
              },
              "snoozedUntilAt": {
                "description": "ISO-8601 time to snooze until, or null to unsnooze",
                "anyOf": [
                  {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "id"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "list_teams",
          "title": "List teams",
          "description": "List teams in the user's Linear workspace",
          "inputSchema": {
            "type": "object",
            "properties": {
              "limit": {
                "default": 50,
                "description": "Max results (default 50, max 250)",
                "type": "number",
                "maximum": 250
              },
              "cursor": {
                "description": "Next page cursor",
                "type": "string"
              },
              "orderBy": {
                "default": "updatedAt",
                "description": "Sort: createdAt | updatedAt",
                "type": "string",
                "enum": [
                  "createdAt",
                  "updatedAt"
                ]
              },
              "query": {
                "description": "Search query",
                "type": "string"
              },
              "includeArchived": {
                "default": false,
                "description": "Include archived items",
                "type": "boolean"
              },
              "createdAt": {
                "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
                "type": "string"
              },
              "updatedAt": {
                "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
                "type": "string"
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "get_team",
          "title": "Get team",
          "description": "Retrieve details of a specific Linear team",
          "inputSchema": {
            "type": "object",
            "properties": {
              "query": {
                "type": "string",
                "description": "Team UUID, key, or name"
              }
            },
            "required": [
              "query"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "list_templates",
          "title": "List templates",
          "description": "List the Linear issue, project, and document templates available to the authenticated user. Use this to find the template a team expects, then call get_template for its content.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "type": {
                "description": "Filter by template type. Omit to return every type",
                "type": "string",
                "enum": [
                  "issue",
                  "project",
                  "document"
                ]
              },
              "team": {
                "description": "Team name or ID. Returns that team's templates plus workspace-level ones",
                "type": "string"
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "get_template",
          "title": "Get template",
          "description": "Retrieve a Linear template by ID or name: the content it pre-fills, the ids it applies, its sub-issues, and its form fields. Pass the template to save_issue or save_project to apply it. References come back as ids, so read a name with the matching tool when you need one. A form template collects its answers through a form, so applying one here creates an issue with the form unanswered.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Template ID or name"
              }
            },
            "required": [
              "id"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "list_users",
          "title": "List users",
          "description": "Retrieve users in the Linear workspace",
          "inputSchema": {
            "type": "object",
            "properties": {
              "limit": {
                "default": 50,
                "description": "Max results (default 50, max 250)",
                "type": "number",
                "maximum": 250
              },
              "cursor": {
                "description": "Next page cursor",
                "type": "string"
              },
              "orderBy": {
                "default": "updatedAt",
                "description": "Sort: createdAt | updatedAt",
                "type": "string",
                "enum": [
                  "createdAt",
                  "updatedAt"
                ]
              },
              "query": {
                "description": "Filter by name or email",
                "type": "string"
              },
              "team": {
                "description": "Team name or ID",
                "type": "string"
              }
            },
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "get_user",
          "title": "Get user",
          "description": "Retrieve details of a specific Linear user",
          "inputSchema": {
            "type": "object",
            "properties": {
              "query": {
                "type": "string",
                "description": "User ID, name, email, or \"me\""
              }
            },
            "required": [
              "query"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "get_workspace",
          "title": "Get workspace",
          "description": "Retrieve the connected Linear workspace",
          "inputSchema": {
            "type": "object",
            "properties": {}
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "search_documentation",
          "title": "Search documentation",
          "description": "Search Linear's documentation to learn about features and usage",
          "inputSchema": {
            "type": "object",
            "properties": {
              "query": {
                "type": "string",
                "description": "Search query"
              },
              "page": {
                "default": 0,
                "description": "Page number",
                "type": "number"
              }
            },
            "required": [
              "query"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "get_status_updates",
          "title": "Get status updates",
          "description": "List or get project/initiative status updates. Pass `id` to get a specific update, or filter to list.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "limit": {
                "default": 50,
                "description": "Max results (default 50, max 250)",
                "type": "number",
                "maximum": 250
              },
              "cursor": {
                "description": "Next page cursor",
                "type": "string"
              },
              "orderBy": {
                "default": "updatedAt",
                "description": "Sort: createdAt | updatedAt",
                "type": "string",
                "enum": [
                  "createdAt",
                  "updatedAt"
                ]
              },
              "type": {
                "type": "string",
                "enum": [
                  "project",
                  "initiative"
                ],
                "description": "Type of status update"
              },
              "id": {
                "description": "Status update ID - if provided, returns this specific update",
                "type": "string"
              },
              "project": {
                "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug",
                "type": "string"
              },
              "initiative": {
                "description": "Initiative name, ID, identifier (e.g., I-123), or slug",
                "type": "string"
              },
              "user": {
                "description": "User ID, name, email, or \"me\"",
                "type": "string"
              },
              "createdAt": {
                "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
                "type": "string"
              },
              "updatedAt": {
                "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
                "type": "string"
              },
              "includeArchived": {
                "default": false,
                "description": "Include archived items",
                "type": "boolean"
              }
            },
            "required": [
              "type"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "save_status_update",
          "title": "Save status update",
          "description": "Create or update a project/initiative status update. Omit `id` to create, provide `id` to update.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "project",
                  "initiative"
                ],
                "description": "Type of status update"
              },
              "id": {
                "description": "Status update ID - if provided, updates this existing update",
                "type": "string"
              },
              "project": {
                "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug",
                "type": "string"
              },
              "initiative": {
                "description": "Initiative name, ID, identifier (e.g., I-123), or slug",
                "type": "string"
              },
              "body": {
                "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)",
                "type": "string"
              },
              "health": {
                "description": "onTrack | atRisk | offTrack",
                "type": "string",
                "enum": [
                  "onTrack",
                  "atRisk",
                  "offTrack"
                ]
              },
              "isDiffHidden": {
                "description": "Deprecated. Hide diff with previous update (create only)",
                "type": "boolean"
              }
            },
            "required": [
              "type"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        },
        {
          "name": "delete_status_update",
          "title": "Delete status update",
          "description": "Delete (archive) a project or initiative status update.",
          "inputSchema": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "project",
                  "initiative"
                ],
                "description": "Type of status update"
              },
              "id": {
                "type": "string",
                "description": "Status update ID"
              }
            },
            "required": [
              "type",
              "id"
            ],
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "additionalProperties": false
          },
          "annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "_meta": {
            "microsoft/allowedDomains": [
              "linear.app<https://linear.app/>"
            ]
          }
        }
      ],
      "pages": 1,
      "advertised": true,
      "answeredUnadvertised": false,
      "cursorCycle": false,
      "pageLimitHit": false
    },
    "prompts": {
      "items": [],
      "pages": 0,
      "advertised": false,
      "answeredUnadvertised": false,
      "cursorCycle": false,
      "pageLimitHit": false,
      "error": "Method not found"
    },
    "resources": {
      "items": [],
      "pages": 0,
      "advertised": false,
      "answeredUnadvertised": false,
      "cursorCycle": false,
      "pageLimitHit": false,
      "error": "Method not found"
    },
    "resourceTemplates": {
      "items": [],
      "pages": 0,
      "advertised": false,
      "answeredUnadvertised": false,
      "cursorCycle": false,
      "pageLimitHit": false,
      "error": "Method not found"
    }
  }
}
