{
  "server": "linear",
  "url": "https://mcp.linear.app/mcp",
  "date": "2026-10-06",
  "protocolVersion": "2026-07-28",
  "serverInfo": {
    "name": "Linear MCP",
    "title": "Linear",
    "version": "1.0.0",
    "websiteUrl": "https://linear.app",
    "icons": [
      {
        "src": "https://static.linear.app/integrations/mcp/icon.svg",
        "mimeType": "image/svg+xml"
      }
    ]
  },
  "listChangedDeclared": false,
  "toolCount": 59,
  "outputSchemaCoveragePct": 0,
  "tools": [
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "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 \u003c \"$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 \u003c \"$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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "base64Content": {
            "description": "Deprecated base64-encoded file content to upload",
            "type": "string"
          },
          "contentType": {
            "description": "MIME type for the upload (e.g., 'image/png', 'application/pdf')",
            "type": "string"
          },
          "filename": {
            "description": "Filename for the upload (e.g., 'screenshot.png')",
            "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"
          },
          "sha256": {
            "description": "Expected SHA-256 hex digest of the decoded file bytes.",
            "pattern": "^[a-fA-F0-9]{64}$",
            "type": "string"
          },
          "size": {
            "description": "Optional expected decoded file size in bytes. Rejects the upload if it does not match.",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          },
          "subtitle": {
            "description": "Optional subtitle for the attachment",
            "type": "string"
          },
          "title": {
            "description": "Optional title for the attachment",
            "type": "string"
          }
        },
        "required": [
          "issue",
          "base64Content",
          "filename",
          "contentType",
          "sha256"
        ],
        "type": "object"
      },
      "name": "create_attachment",
      "title": "Create attachment (deprecated)"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "assetUrl": {
            "description": "Linear upload assetUrl returned by prepare_attachment_upload",
            "format": "uri",
            "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"
          },
          "subtitle": {
            "description": "Optional attachment subtitle",
            "type": "string"
          },
          "title": {
            "description": "Attachment title. Defaults to filename or asset URL",
            "type": "string"
          }
        },
        "required": [
          "issue",
          "assetUrl"
        ],
        "type": "object"
      },
      "name": "create_attachment_from_upload",
      "title": "Create attachment from upload"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Create a new Linear issue label. Deprecated: use `save_issue_label`, which can also update labels.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "color": {
            "description": "Hex color code",
            "type": "string"
          },
          "description": {
            "description": "Label description",
            "type": "string"
          },
          "isGroup": {
            "default": false,
            "description": "Whether the label is a group",
            "type": "boolean"
          },
          "name": {
            "description": "Label name",
            "type": "string"
          },
          "parent": {
            "description": "Parent label group name or ID",
            "type": "string"
          },
          "teamId": {
            "description": "Team UUID (omit for workspace label)",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "name": "create_issue_label",
      "title": "Create issue label (deprecated)"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Delete an attachment by ID",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "Attachment ID",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "delete_attachment",
      "title": "Delete attachment"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "Comment ID",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "delete_comment",
      "title": "Delete comment"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Delete (archive) a project or initiative status update.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "Status update ID",
            "type": "string"
          },
          "type": {
            "description": "Type of status update",
            "enum": [
              "project",
              "initiative"
            ],
            "type": "string"
          }
        },
        "required": [
          "type",
          "id"
        ],
        "type": "object"
      },
      "name": "delete_status_update",
      "title": "Delete status update"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "markdown": {
            "description": "Markdown content containing image references (e.g., issue description, comment body)",
            "type": "string"
          }
        },
        "required": [
          "markdown"
        ],
        "type": "object"
      },
      "name": "extract_images",
      "title": "Extract images"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Retrieve a Linear Agent skill by ID, including its full markdown instructions.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "Agent skill ID",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "get_agent_skill",
      "title": "Get agent skill"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "format": {
            "description": "Response format. Defaults to content.",
            "enum": [
              "content",
              "url"
            ],
            "type": "string"
          },
          "id": {
            "description": "Attachment ID",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "get_attachment",
      "title": "Get attachment"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Retrieve a Linear document by ID or slug",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "Document ID or slug",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "get_document",
      "title": "Get document"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "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. A nonempty fields selection overrides the include options; request optional fields directly in fields.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "fields": {
            "description": "Fields to include in each result. Explicitly requested fields with no value return null. `id` is always included. Omit or pass an empty array for the default response.",
            "items": {
              "enum": [
                "id",
                "uuid",
                "title",
                "description",
                "projectMilestone",
                "priority",
                "estimate",
                "url",
                "gitBranchName",
                "createdAt",
                "updatedAt",
                "archivedAt",
                "completedAt",
                "startedAt",
                "canceledAt",
                "startedTriageAt",
                "triagedAt",
                "dueDate",
                "slaStartedAt",
                "slaMediumRiskAt",
                "slaHighRiskAt",
                "slaBreachesAt",
                "slaType",
                "status",
                "statusType",
                "labels",
                "triageIntel",
                "createdBy",
                "createdById",
                "assignee",
                "assigneeId",
                "delegate",
                "delegateId",
                "project",
                "projectId",
                "parentId",
                "team",
                "teamId",
                "cycleId",
                "attachments",
                "documents",
                "stateHistory",
                "relations",
                "customerNeeds",
                "releases"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "id": {
            "description": "Issue ID or identifier (e.g., LIN-123). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues",
            "type": "string"
          },
          "includeCustomerNeeds": {
            "default": false,
            "description": "Include associated customer needs",
            "type": "boolean"
          },
          "includeRelations": {
            "default": false,
            "description": "Include blocking/related/duplicate relations",
            "type": "boolean"
          },
          "includeReleases": {
            "default": false,
            "description": "Include associated releases",
            "type": "boolean"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "get_issue",
      "title": "Get issue"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Retrieve detailed information about an issue status in Linear by name or ID",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "Status ID",
            "type": "string"
          },
          "name": {
            "description": "Status name",
            "type": "string"
          },
          "team": {
            "description": "Team name or ID",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "team"
        ],
        "type": "object"
      },
      "name": "get_issue_status",
      "title": "Get issue status"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Retrieve details of a specific milestone by ID or name",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "project": {
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug",
            "type": "string"
          },
          "query": {
            "description": "Milestone name or ID",
            "type": "string"
          }
        },
        "required": [
          "project",
          "query"
        ],
        "type": "object"
      },
      "name": "get_milestone",
      "title": "Get milestone"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Get a page of notifications from the authenticated user's Linear inbox.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "maximum": 250,
            "type": "number"
          },
          "unreadOnly": {
            "default": false,
            "description": "Only return unread notifications",
            "type": "boolean"
          }
        },
        "type": "object"
      },
      "name": "get_notifications",
      "title": "Get notifications"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Retrieve details of a specific project in Linear",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "customerNeedsCursor": {
            "description": "Next customer-needs page: pass customerNeedsPageInfo.endCursor with includeCustomerNeeds true",
            "type": "string"
          },
          "customerNeedsLimit": {
            "default": 10,
            "description": "Customer needs per page when includeCustomerNeeds is true (default 10, max 50)",
            "maximum": 50,
            "minimum": 1,
            "type": "integer"
          },
          "includeCustomerNeeds": {
            "default": false,
            "description": "Include one page of customer needs attached directly to the project",
            "type": "boolean"
          },
          "includeMembers": {
            "default": false,
            "description": "Include project members",
            "type": "boolean"
          },
          "includeMilestones": {
            "default": false,
            "description": "Include milestones",
            "type": "boolean"
          },
          "includeResources": {
            "default": false,
            "description": "Include resources (documents, links, attachments)",
            "type": "boolean"
          },
          "query": {
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug",
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "name": "get_project",
      "title": "Get project"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Retrieve details of a release by ID or slug.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "Release ID or slug",
            "type": "string"
          },
          "includeReleaseNotes": {
            "default": false,
            "description": "Include associated release notes",
            "type": "boolean"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "get_release",
      "title": "Get release"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Retrieve release notes by ID or slug, including markdown content.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "Release notes ID or slug",
            "type": "string"
          },
          "includeReleases": {
            "default": false,
            "description": "Include associated releases",
            "type": "boolean"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "get_release_note",
      "title": "Get release notes"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "List or get project/initiative status updates. Pass `id` to get a specific update, or filter to list.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "createdAt": {
            "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "id": {
            "description": "Status update ID - if provided, returns this specific update",
            "type": "string"
          },
          "includeArchived": {
            "default": false,
            "description": "Include archived items",
            "type": "boolean"
          },
          "initiative": {
            "description": "Initiative name, ID, identifier (e.g., I-123), or slug",
            "type": "string"
          },
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "maximum": 250,
            "type": "number"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "enum": [
              "createdAt",
              "updatedAt"
            ],
            "type": "string"
          },
          "project": {
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug",
            "type": "string"
          },
          "type": {
            "description": "Type of status update",
            "enum": [
              "project",
              "initiative"
            ],
            "type": "string"
          },
          "updatedAt": {
            "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "user": {
            "description": "User ID, name, email, or \"me\"",
            "type": "string"
          }
        },
        "required": [
          "type"
        ],
        "type": "object"
      },
      "name": "get_status_updates",
      "title": "Get status updates"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Retrieve details of a specific Linear team",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "query": {
            "description": "Team UUID, key, or name",
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "name": "get_team",
      "title": "Get team"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "Template ID or name",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "get_template",
      "title": "Get template"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Retrieve who is responsible for a team's triage: the person on triage now, what happens when an issue enters triage, and the upcoming shifts of the team's triage rotation. Pass `user` to get only that person's shifts, for example to find when their next triage duty starts, even when it is weeks away.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "limit": {
            "default": 10,
            "description": "Max upcoming shifts to return (default 10, max 50)",
            "maximum": 50,
            "minimum": 1,
            "type": "integer"
          },
          "team": {
            "description": "Team name or ID",
            "type": "string"
          },
          "user": {
            "description": "Only return shifts of this user: User ID, name, email, or \"me\"",
            "type": "string"
          }
        },
        "required": [
          "team"
        ],
        "type": "object"
      },
      "name": "get_triage_responsibility",
      "title": "Get triage responsibility"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Retrieve details of a specific Linear user",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "query": {
            "description": "User ID, name, email, or \"me\"",
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "name": "get_user",
      "title": "Get user"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Retrieve the connected Linear workspace",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "get_workspace",
      "title": "Get workspace"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "List Linear Agent skills available to the authenticated user.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "maximum": 250,
            "type": "number"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "enum": [
              "createdAt",
              "updatedAt"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_agent_skills",
      "title": "List agent skills"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "documentId": {
            "description": "Document ID 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"
          },
          "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"
          },
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "maximum": 250,
            "type": "number"
          },
          "milestoneId": {
            "description": "Milestone UUID (provide exactly one parent). Resolve milestone names via `list_milestones` first.",
            "type": "string"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "enum": [
              "createdAt",
              "updatedAt"
            ],
            "type": "string"
          },
          "projectId": {
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug (provide exactly one parent)",
            "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.",
            "enum": [
              "project",
              "initiative"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_comments",
      "title": "List comments"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Find saved issue, project, and initiative views accessible to the user, including personal, workspace, and team views. Excludes archived views and views scoped to a project or initiative. Returns view metadata, not the records matching its filters.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "maximum": 250,
            "type": "number"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "enum": [
              "createdAt",
              "updatedAt"
            ],
            "type": "string"
          },
          "query": {
            "description": "Search custom view names",
            "type": "string"
          },
          "shared": {
            "description": "True for shared views, false for personal views",
            "type": "boolean"
          },
          "team": {
            "description": "Team name or ID",
            "type": "string"
          },
          "type": {
            "description": "Entity type displayed by the view",
            "enum": [
              "Issue",
              "Project",
              "Initiative"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_custom_views",
      "title": "List custom views"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Retrieve cycles for a specific Linear team",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "teamId": {
            "description": "Team ID",
            "type": "string"
          },
          "type": {
            "description": "Filter: current, previous, next, or all",
            "enum": [
              "current",
              "previous",
              "next"
            ],
            "type": "string"
          }
        },
        "required": [
          "teamId"
        ],
        "type": "object"
      },
      "name": "list_cycles",
      "title": "List cycles"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "List documents in the user's Linear workspace",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "createdAt": {
            "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "creatorId": {
            "description": "Filter by creator ID",
            "type": "string"
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "fields": {
            "description": "Fields to include in each result. Explicitly requested fields with no value return null. `id` is always included. Omit or pass an empty array for the default response.",
            "items": {
              "enum": [
                "id",
                "title",
                "content",
                "url",
                "createdAt",
                "updatedAt",
                "archivedAt",
                "creator",
                "updatedBy",
                "project",
                "initiative",
                "team",
                "issue"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "includeArchived": {
            "default": false,
            "description": "Include archived items",
            "type": "boolean"
          },
          "initiativeId": {
            "description": "Filter by initiative ID, identifier (e.g., 'I-123'), or slug",
            "type": "string"
          },
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "maximum": 250,
            "type": "number"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "enum": [
              "createdAt",
              "updatedAt"
            ],
            "type": "string"
          },
          "projectId": {
            "description": "Filter by project ID, identifier (e.g., 'P-ENG-123'), or slug",
            "type": "string"
          },
          "query": {
            "description": "Search query",
            "type": "string"
          },
          "teamId": {
            "description": "Filter by team ID",
            "type": "string"
          },
          "updatedAt": {
            "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_documents",
      "title": "List documents"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "List available issue labels in a Linear workspace or team. A retired label carries `retiredAt` and cannot be applied to new issues.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "cursor": {
            "description": "Next page cursor",
            "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"
          },
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "maximum": 250,
            "type": "number"
          },
          "name": {
            "description": "Filter by name",
            "type": "string"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "enum": [
              "createdAt",
              "updatedAt"
            ],
            "type": "string"
          },
          "team": {
            "description": "Team name or ID",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_issue_labels",
      "title": "List issue labels"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "List available issue statuses in a Linear team",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "team": {
            "description": "Team name or ID",
            "type": "string"
          }
        },
        "required": [
          "team"
        ],
        "type": "object"
      },
      "name": "list_issue_statuses",
      "title": "List issue statuses"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "List issues in the user's Linear workspace, including active Triage Intelligence suggestions for issues in triage. For issues assigned to me, use \"me\" as the assignee. For issues created by me, use \"me\" as the creator. Use \"null\" for no assignee.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "assignee": {
            "description": "User ID, name, email, or \"me\"",
            "type": [
              "string",
              "null"
            ]
          },
          "createdAt": {
            "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "creator": {
            "description": "User ID, name, email, or \"me\"",
            "type": "string"
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "customView": {
            "description": "Saved view ID, URL, slug, or exact name. Use list_custom_views to discover views. Applies saved filters and scope; other filters narrow the results. Uses list ordering, not saved display settings",
            "minLength": 1,
            "type": "string"
          },
          "cycle": {
            "description": "Cycle name, number, or ID",
            "type": "string"
          },
          "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"
          },
          "fields": {
            "description": "Fields to include in each result. Explicitly requested fields with no value return null. `id` is always included. Omit or pass an empty array for the default response.",
            "items": {
              "enum": [
                "id",
                "uuid",
                "title",
                "description",
                "projectMilestone",
                "priority",
                "estimate",
                "url",
                "gitBranchName",
                "createdAt",
                "updatedAt",
                "archivedAt",
                "completedAt",
                "startedAt",
                "canceledAt",
                "startedTriageAt",
                "triagedAt",
                "dueDate",
                "slaStartedAt",
                "slaMediumRiskAt",
                "slaHighRiskAt",
                "slaBreachesAt",
                "slaType",
                "status",
                "statusType",
                "labels",
                "triageIntel",
                "createdBy",
                "createdById",
                "assignee",
                "assigneeId",
                "delegate",
                "delegateId",
                "project",
                "projectId",
                "parentId",
                "team",
                "teamId",
                "cycleId"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "includeArchived": {
            "default": false,
            "description": "Include archived items",
            "type": "boolean"
          },
          "label": {
            "description": "Label name or ID",
            "type": "string"
          },
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "maximum": 250,
            "type": "number"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "enum": [
              "createdAt",
              "updatedAt"
            ],
            "type": "string"
          },
          "parentId": {
            "description": "Parent issue ID or identifier (e.g., LIN-123)",
            "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",
            "type": "string"
          },
          "query": {
            "description": "Search issue title or description. Cannot be combined with customView",
            "type": "string"
          },
          "release": {
            "description": "Release ID or slug",
            "type": "string"
          },
          "state": {
            "description": "State type, name, or ID",
            "type": "string"
          },
          "team": {
            "description": "Team name or ID",
            "type": "string"
          },
          "triagedAt": {
            "description": "Left triage after: ISO-8601 date/duration (e.g., -P1D). Issues still in triage have no triagedAt; list them with state \"triage\"",
            "type": "string"
          },
          "updatedAt": {
            "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_issues",
      "title": "List issues"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "List all milestones in a Linear project",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "project": {
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug",
            "type": "string"
          }
        },
        "required": [
          "project"
        ],
        "type": "object"
      },
      "name": "list_milestones",
      "title": "List project milestones"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "cursor": {
            "description": "Next page cursor",
            "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"
          },
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "maximum": 250,
            "type": "number"
          },
          "name": {
            "description": "Filter by name",
            "type": "string"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "enum": [
              "createdAt",
              "updatedAt"
            ],
            "type": "string"
          },
          "team": {
            "description": "Team name or ID",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_project_labels",
      "title": "List project labels"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "List projects in the user's Linear workspace",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "createdAt": {
            "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "customView": {
            "description": "Saved view ID, URL, slug, or exact name. Use list_custom_views to discover views. Applies saved filters and scope; other filters narrow the results. Uses list ordering, not saved display settings",
            "minLength": 1,
            "type": "string"
          },
          "fields": {
            "description": "Fields to include in each result. Explicitly requested fields with no value return null. `id` is always included. Omit or pass an empty array for the default response.",
            "items": {
              "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"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "includeArchived": {
            "default": false,
            "description": "Include archived items",
            "type": "boolean"
          },
          "includeMembers": {
            "default": false,
            "description": "Include project members",
            "type": "boolean"
          },
          "includeMilestones": {
            "default": false,
            "description": "Include milestones",
            "type": "boolean"
          },
          "initiative": {
            "description": "Initiative name, ID, identifier (e.g., I-123), or slug",
            "type": "string"
          },
          "label": {
            "description": "Label name or ID",
            "type": "string"
          },
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 50)",
            "maximum": 50,
            "type": "number"
          },
          "member": {
            "description": "User ID, name, email, or \"me\"",
            "type": "string"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "enum": [
              "createdAt",
              "updatedAt"
            ],
            "type": "string"
          },
          "query": {
            "description": "Search project name",
            "type": "string"
          },
          "state": {
            "description": "State type, name, or ID",
            "type": "string"
          },
          "team": {
            "description": "Team name or ID",
            "type": "string"
          },
          "updatedAt": {
            "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_projects",
      "title": "List projects"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "List release notes in the workspace, optionally filtered by pipeline or covered release.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "createdAt": {
            "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "includeArchived": {
            "default": false,
            "description": "Include archived items",
            "type": "boolean"
          },
          "includeContent": {
            "default": false,
            "description": "Include markdown release notes content",
            "type": "boolean"
          },
          "includeReleases": {
            "default": false,
            "description": "Include associated releases",
            "type": "boolean"
          },
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "maximum": 250,
            "type": "number"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "enum": [
              "createdAt",
              "updatedAt"
            ],
            "type": "string"
          },
          "pipeline": {
            "description": "Release pipeline ID, slug, or exact name",
            "type": "string"
          },
          "query": {
            "description": "Search release notes title",
            "type": "string"
          },
          "release": {
            "description": "Release ID or slug",
            "type": "string"
          },
          "updatedAt": {
            "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_release_notes",
      "title": "List release notes"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "List release pipelines in the workspace.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "createdAt": {
            "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "includeArchived": {
            "default": false,
            "description": "Include archived items",
            "type": "boolean"
          },
          "includeStages": {
            "default": false,
            "description": "Include each pipeline's stages",
            "type": "boolean"
          },
          "includeTeams": {
            "default": false,
            "description": "Include each pipeline's teams",
            "type": "boolean"
          },
          "isProduction": {
            "description": "Filter by production pipeline flag",
            "type": "boolean"
          },
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "maximum": 250,
            "type": "number"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "enum": [
              "createdAt",
              "updatedAt"
            ],
            "type": "string"
          },
          "query": {
            "description": "Search pipeline name",
            "type": "string"
          },
          "team": {
            "description": "Team name or ID",
            "type": "string"
          },
          "type": {
            "description": "Pipeline type: continuous | scheduled",
            "enum": [
              "continuous",
              "scheduled"
            ],
            "type": "string"
          },
          "updatedAt": {
            "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_release_pipelines",
      "title": "List release pipelines"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "List releases in the workspace, with optional filtering by pipeline, stage, version, and text.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "createdAt": {
            "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "hasReleaseNotes": {
            "description": "Filter to releases that do (true) or do not (false) have release notes",
            "type": "boolean"
          },
          "includeArchived": {
            "default": false,
            "description": "Include archived items",
            "type": "boolean"
          },
          "includeReleaseNotes": {
            "default": false,
            "description": "Include associated release notes",
            "type": "boolean"
          },
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "maximum": 250,
            "type": "number"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "enum": [
              "createdAt",
              "updatedAt"
            ],
            "type": "string"
          },
          "pipeline": {
            "description": "Release pipeline ID, slug, or exact name",
            "type": "string"
          },
          "query": {
            "description": "Search release name or version",
            "type": "string"
          },
          "stage": {
            "description": "Release stage ID or exact name",
            "type": "string"
          },
          "stageType": {
            "description": "Filter by stage lifecycle type",
            "enum": [
              "planned",
              "started",
              "completed",
              "canceled"
            ],
            "type": "string"
          },
          "updatedAt": {
            "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "version": {
            "description": "Exact version match",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_releases",
      "title": "List releases"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "List teams in the user's Linear workspace",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "createdAt": {
            "description": "Created after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          },
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "includeArchived": {
            "default": false,
            "description": "Include archived items",
            "type": "boolean"
          },
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "maximum": 250,
            "type": "number"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "enum": [
              "createdAt",
              "updatedAt"
            ],
            "type": "string"
          },
          "query": {
            "description": "Search query",
            "type": "string"
          },
          "updatedAt": {
            "description": "Updated after: ISO-8601 date/duration (e.g., -P1D)",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_teams",
      "title": "List teams"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "team": {
            "description": "Team name or ID. Returns that team's templates plus workspace-level ones",
            "type": "string"
          },
          "type": {
            "description": "Filter by template type. Omit to return every type",
            "enum": [
              "issue",
              "project",
              "document"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_templates",
      "title": "List templates"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Retrieve users in the Linear workspace",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "cursor": {
            "description": "Next page cursor",
            "type": "string"
          },
          "limit": {
            "default": 50,
            "description": "Max results (default 50, max 250)",
            "maximum": 250,
            "type": "number"
          },
          "orderBy": {
            "default": "updatedAt",
            "description": "Sort: createdAt | updatedAt",
            "enum": [
              "createdAt",
              "updatedAt"
            ],
            "type": "string"
          },
          "query": {
            "description": "Filter by name or email",
            "type": "string"
          },
          "team": {
            "description": "Team name or ID",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_users",
      "title": "List users"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Mark a Linear inbox notification as read or unread, or snooze or unsnooze it.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "Notification ID",
            "type": "string"
          },
          "read": {
            "description": "Whether the notification should be marked as read",
            "type": "boolean"
          },
          "snoozedUntilAt": {
            "anyOf": [
              {
                "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": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "ISO-8601 time to snooze until, or null to unsnooze"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "mark_notification",
      "title": "Mark notification"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "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  \"\u003cuploadRequest.url\u003e\"",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "contentType": {
            "description": "MIME type, e.g. image/png or application/pdf",
            "type": "string"
          },
          "filename": {
            "description": "Filename for the upload, e.g. screenshot.png",
            "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"
          },
          "size": {
            "description": "Exact file size in bytes. Must be smaller than 2 GB.",
            "exclusiveMinimum": 0,
            "maximum": 9007199254740991,
            "type": "integer"
          },
          "subtitle": {
            "description": "Suggested attachment subtitle for the finalize step",
            "type": "string"
          },
          "title": {
            "description": "Suggested attachment title for the finalize step",
            "type": "string"
          }
        },
        "required": [
          "issue",
          "filename",
          "contentType",
          "size"
        ],
        "type": "object"
      },
      "name": "prepare_attachment_upload",
      "title": "Prepare attachment upload"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "Label or label group ID",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "restore_issue_label",
      "title": "Restore issue label"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "Label or label group ID",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "restore_project_label",
      "title": "Restore project label"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "Label or label group ID",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "retire_issue_label",
      "title": "Retire issue label"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "Label or label group ID",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "retire_project_label",
      "title": "Retire project label"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "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"
          },
          "documentId": {
            "description": "Document ID or slug (provide exactly one parent)",
            "type": "string"
          },
          "id": {
            "description": "Comment ID. If provided, updates the existing comment",
            "type": "string"
          },
          "initiativeId": {
            "description": "Initiative name, ID, identifier (e.g., I-123), or slug (provide exactly one parent)",
            "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"
          },
          "milestoneId": {
            "description": "Milestone UUID (provide exactly one parent). Resolve milestone names via `list_milestones` first.",
            "type": "string"
          },
          "parentId": {
            "description": "Parent comment ID (for replies, only when creating)",
            "type": "string"
          },
          "projectId": {
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug (provide exactly one parent)",
            "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.",
            "enum": [
              "project",
              "initiative"
            ],
            "type": "string"
          }
        },
        "required": [
          "body"
        ],
        "type": "object"
      },
      "name": "save_comment",
      "title": "Save comment"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "color": {
            "description": "Hex color",
            "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"
          },
          "cycle": {
            "description": "Cycle name, number, or ID. When passing a name or number, also pass `team` to disambiguate.",
            "type": "string"
          },
          "icon": {
            "description": "Icon name or emoji code (e.g. \"Rocket\" or \":eagle:\"), not a raw Unicode emoji",
            "type": "string"
          },
          "id": {
            "description": "Document ID or slug to update. Omit to create a new document.",
            "type": "string"
          },
          "initiative": {
            "description": "Initiative name, ID, identifier (e.g., I-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"
          },
          "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",
            "items": {
              "oneOf": [
                {
                  "properties": {
                    "new_string": {
                      "description": "Replacement text. Empty string deletes the match",
                      "type": "string"
                    },
                    "old_string": {
                      "description": "Exact text to replace. Must match the current content exactly once",
                      "minLength": 1,
                      "type": "string"
                    },
                    "op": {
                      "const": "replace",
                      "type": "string"
                    },
                    "replace_all": {
                      "description": "Replace every occurrence instead of requiring a unique match",
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "op",
                    "old_string",
                    "new_string"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "anchor": {
                      "description": "Exact text to insert before. Must match the current content exactly once",
                      "minLength": 1,
                      "type": "string"
                    },
                    "op": {
                      "const": "insert_before",
                      "type": "string"
                    },
                    "text": {
                      "description": "Text to insert directly before the anchor. Include separators (e.g. \"\\n\\n\")",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "op",
                    "anchor",
                    "text"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "anchor": {
                      "description": "Exact text to insert after. Must match the current content exactly once",
                      "minLength": 1,
                      "type": "string"
                    },
                    "op": {
                      "const": "insert_after",
                      "type": "string"
                    },
                    "text": {
                      "description": "Text to insert directly after the anchor. Include separators (e.g. \"\\n\\n\")",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "op",
                    "anchor",
                    "text"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "op": {
                      "const": "prepend",
                      "type": "string"
                    },
                    "text": {
                      "description": "Text to insert at the very start of the content",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "op",
                    "text"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "op": {
                      "const": "append",
                      "type": "string"
                    },
                    "text": {
                      "description": "Text to insert at the very end of the content",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "op",
                    "text"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "from": {
                      "description": "Exact text where the range starts (inclusive). Must match exactly once",
                      "minLength": 1,
                      "type": "string"
                    },
                    "new_string": {
                      "description": "Text replacing the range. Empty string deletes it",
                      "type": "string"
                    },
                    "op": {
                      "const": "replace_range",
                      "type": "string"
                    },
                    "to": {
                      "description": "Exact text where the range ends (exclusive, stays in place). Must match exactly once after `from`",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "op",
                    "from",
                    "to",
                    "new_string"
                  ],
                  "type": "object"
                }
              ]
            },
            "maxItems": 50,
            "minItems": 1,
            "type": "array"
          },
          "project": {
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug",
            "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"
          },
          "title": {
            "description": "Document title (required when creating)",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "save_document",
      "title": "Save document"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "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",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "addReleases": {
            "description": "Release IDs or slugs to add. Append-only; existing releases are never removed",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "assignee": {
            "description": "User ID, name, email, or \"me\". Null to remove",
            "type": [
              "string",
              "null"
            ]
          },
          "blockedBy": {
            "description": "Issue IDs/identifiers blocking this. Append-only; existing relations are never removed",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "blocks": {
            "description": "Issue IDs/identifiers this blocks. Append-only; existing relations are never removed",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "cycle": {
            "description": "Cycle name, number, or ID. 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"
            ]
          },
          "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"
          },
          "dueDate": {
            "description": "Due date (ISO format). On update, pass null to remove the due date",
            "type": [
              "string",
              "null"
            ]
          },
          "duplicateOf": {
            "description": "Duplicate of issue ID/identifier. 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"
            ]
          },
          "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"
          },
          "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",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "links": {
            "description": "Link attachments to add [{url, title}]. Append-only; existing links are never removed",
            "items": {
              "properties": {
                "title": {
                  "minLength": 1,
                  "type": "string"
                },
                "url": {
                  "format": "uri",
                  "type": "string"
                }
              },
              "required": [
                "url",
                "title"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "milestone": {
            "description": "Milestone name or ID",
            "type": "string"
          },
          "parentId": {
            "description": "Parent issue ID or identifier (e.g., LIN-123). Null to remove",
            "type": [
              "string",
              "null"
            ]
          },
          "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",
            "items": {
              "oneOf": [
                {
                  "properties": {
                    "new_string": {
                      "description": "Replacement text. Empty string deletes the match",
                      "type": "string"
                    },
                    "old_string": {
                      "description": "Exact text to replace. Must match the current content exactly once",
                      "minLength": 1,
                      "type": "string"
                    },
                    "op": {
                      "const": "replace",
                      "type": "string"
                    },
                    "replace_all": {
                      "description": "Replace every occurrence instead of requiring a unique match",
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "op",
                    "old_string",
                    "new_string"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "anchor": {
                      "description": "Exact text to insert before. Must match the current content exactly once",
                      "minLength": 1,
                      "type": "string"
                    },
                    "op": {
                      "const": "insert_before",
                      "type": "string"
                    },
                    "text": {
                      "description": "Text to insert directly before the anchor. Include separators (e.g. \"\\n\\n\")",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "op",
                    "anchor",
                    "text"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "anchor": {
                      "description": "Exact text to insert after. Must match the current content exactly once",
                      "minLength": 1,
                      "type": "string"
                    },
                    "op": {
                      "const": "insert_after",
                      "type": "string"
                    },
                    "text": {
                      "description": "Text to insert directly after the anchor. Include separators (e.g. \"\\n\\n\")",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "op",
                    "anchor",
                    "text"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "op": {
                      "const": "prepend",
                      "type": "string"
                    },
                    "text": {
                      "description": "Text to insert at the very start of the content",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "op",
                    "text"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "op": {
                      "const": "append",
                      "type": "string"
                    },
                    "text": {
                      "description": "Text to insert at the very end of the content",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "op",
                    "text"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "from": {
                      "description": "Exact text where the range starts (inclusive). Must match exactly once",
                      "minLength": 1,
                      "type": "string"
                    },
                    "new_string": {
                      "description": "Text replacing the range. Empty string deletes it",
                      "type": "string"
                    },
                    "op": {
                      "const": "replace_range",
                      "type": "string"
                    },
                    "to": {
                      "description": "Exact text where the range ends (exclusive, stays in place). Must match exactly once after `from`",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "op",
                    "from",
                    "to",
                    "new_string"
                  ],
                  "type": "object"
                }
              ]
            },
            "maxItems": 50,
            "minItems": 1,
            "type": "array"
          },
          "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"
            ]
          },
          "relatedTo": {
            "description": "Related issue IDs/identifiers. Append-only; existing relations are never removed",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "removeBlockedBy": {
            "description": "Issue IDs/identifiers to remove as blockers of this issue",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "removeBlocks": {
            "description": "Issue IDs/identifiers to stop blocking",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "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",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "removeRelatedTo": {
            "description": "Related issue IDs/identifiers to remove",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "removeReleases": {
            "description": "Release IDs or slugs to remove. Only valid when updating an existing issue",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "setReleases": {
            "description": "Replace all releases on the issue with these. Cannot be combined with addReleases/removeReleases",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "slaBreachesAt": {
            "anyOf": [
              {
                "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": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "ISO-8601 timestamp when the SLA will breach. On update, pass null to remove the SLA"
          },
          "slaType": {
            "anyOf": [
              {
                "enum": [
                  "all",
                  "onlyBusinessDays"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "SLA day counting type: \"all\" or \"onlyBusinessDays\". Only use with slaBreachesAt; null means unset"
          },
          "state": {
            "description": "State type, name, or ID",
            "type": "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"
          },
          "title": {
            "description": "Issue title (required when creating, unless template is set)",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "save_issue",
      "title": "Save issue"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "color": {
            "description": "Hex color code",
            "type": "string"
          },
          "description": {
            "description": "Label description. Null to clear it",
            "type": [
              "string",
              "null"
            ]
          },
          "groupType": {
            "description": "Selection mode for label groups. Defaults to singleSelect when creating; omit to keep it unchanged when updating",
            "enum": [
              "singleSelect",
              "multiSelect"
            ],
            "type": "string"
          },
          "id": {
            "description": "Label name or ID. If provided, updates the existing label",
            "type": "string"
          },
          "isGroup": {
            "description": "Whether the label is a group",
            "type": "boolean"
          },
          "name": {
            "description": "Label name (required when creating)",
            "type": "string"
          },
          "parent": {
            "description": "Parent label group name or ID. Null to remove from its group",
            "type": [
              "string",
              "null"
            ]
          },
          "teamId": {
            "description": "Team UUID (omit for workspace label). When updating, only disambiguates `id` by name; a label's team cannot be changed",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "save_issue_label",
      "title": "Save issue label"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "description": {
            "description": "Milestone description",
            "type": "string"
          },
          "id": {
            "description": "Milestone name or ID",
            "type": "string"
          },
          "name": {
            "description": "Milestone name (required when creating)",
            "type": "string"
          },
          "project": {
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug",
            "type": "string"
          },
          "targetDate": {
            "description": "Target completion date (ISO format, null to remove)",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "project"
        ],
        "type": "object"
      },
      "name": "save_milestone",
      "title": "Save milestone"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "addInitiatives": {
            "description": "Initiatives to add. Initiative name, ID, identifier (e.g., I-123), or slug",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "addTeams": {
            "description": "Team name or ID to add",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "color": {
            "description": "Hex color",
            "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"
          },
          "icon": {
            "description": "Icon name or emoji code (e.g. \"Rocket\" or \":eagle:\"), not a raw Unicode emoji",
            "type": "string"
          },
          "id": {
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug. If provided, updates the existing project",
            "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",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "lead": {
            "description": "User ID, name, email, or \"me\". Null to remove, except on create with a template that names a lead",
            "type": [
              "string",
              "null"
            ]
          },
          "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"
          },
          "links": {
            "description": "External resource links to add [{url, title}]. Append-only; existing links are never removed",
            "items": {
              "properties": {
                "title": {
                  "minLength": 1,
                  "type": "string"
                },
                "url": {
                  "format": "uri",
                  "type": "string"
                }
              },
              "required": [
                "url",
                "title"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "name": {
            "description": "Project name (required when creating)",
            "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",
            "items": {
              "oneOf": [
                {
                  "properties": {
                    "new_string": {
                      "description": "Replacement text. Empty string deletes the match",
                      "type": "string"
                    },
                    "old_string": {
                      "description": "Exact text to replace. Must match the current content exactly once",
                      "minLength": 1,
                      "type": "string"
                    },
                    "op": {
                      "const": "replace",
                      "type": "string"
                    },
                    "replace_all": {
                      "description": "Replace every occurrence instead of requiring a unique match",
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "op",
                    "old_string",
                    "new_string"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "anchor": {
                      "description": "Exact text to insert before. Must match the current content exactly once",
                      "minLength": 1,
                      "type": "string"
                    },
                    "op": {
                      "const": "insert_before",
                      "type": "string"
                    },
                    "text": {
                      "description": "Text to insert directly before the anchor. Include separators (e.g. \"\\n\\n\")",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "op",
                    "anchor",
                    "text"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "anchor": {
                      "description": "Exact text to insert after. Must match the current content exactly once",
                      "minLength": 1,
                      "type": "string"
                    },
                    "op": {
                      "const": "insert_after",
                      "type": "string"
                    },
                    "text": {
                      "description": "Text to insert directly after the anchor. Include separators (e.g. \"\\n\\n\")",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "op",
                    "anchor",
                    "text"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "op": {
                      "const": "prepend",
                      "type": "string"
                    },
                    "text": {
                      "description": "Text to insert at the very start of the content",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "op",
                    "text"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "op": {
                      "const": "append",
                      "type": "string"
                    },
                    "text": {
                      "description": "Text to insert at the very end of the content",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "op",
                    "text"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "from": {
                      "description": "Exact text where the range starts (inclusive). Must match exactly once",
                      "minLength": 1,
                      "type": "string"
                    },
                    "new_string": {
                      "description": "Text replacing the range. Empty string deletes it",
                      "type": "string"
                    },
                    "op": {
                      "const": "replace_range",
                      "type": "string"
                    },
                    "to": {
                      "description": "Exact text where the range ends (exclusive, stays in place). Must match exactly once after `from`",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "op",
                    "from",
                    "to",
                    "new_string"
                  ],
                  "type": "object"
                }
              ]
            },
            "maxItems": 50,
            "minItems": 1,
            "type": "array"
          },
          "priority": {
            "description": "0=None, 1=Urgent, 2=High, 3=Medium, 4=Low",
            "maximum": 4,
            "minimum": 0,
            "type": "integer"
          },
          "removeInitiatives": {
            "description": "Initiatives to remove. Initiative name, ID, identifier (e.g., I-123), or slug",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "removeTeams": {
            "description": "Team name or ID to remove",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "setInitiatives": {
            "description": "Replace all initiatives with these. Initiative name, ID, identifier (e.g., I-123), or slug. Cannot combine with addInitiatives/removeInitiatives",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "setTeams": {
            "description": "Replace all teams with these. Cannot combine with addTeams/removeTeams",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "startDate": {
            "description": "Start date (ISO format). Pair with startDateResolution to indicate precision (e.g. month, quarter)",
            "type": "string"
          },
          "startDateResolution": {
            "description": "Start date resolution",
            "enum": [
              "halfYear",
              "month",
              "quarter",
              "year"
            ],
            "type": "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"
          },
          "summary": {
            "description": "Short summary (max 255 chars)",
            "type": "string"
          },
          "targetDate": {
            "description": "Target date (ISO format). Pair with targetDateResolution to indicate precision (e.g. month, quarter)",
            "type": "string"
          },
          "targetDateResolution": {
            "description": "Target date resolution",
            "enum": [
              "halfYear",
              "month",
              "quarter",
              "year"
            ],
            "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"
          }
        },
        "type": "object"
      },
      "name": "save_project",
      "title": "Save project"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "color": {
            "description": "Hex color code",
            "type": "string"
          },
          "description": {
            "description": "Label description. Null to clear it",
            "type": [
              "string",
              "null"
            ]
          },
          "id": {
            "description": "Label name or ID. If provided, updates the existing label",
            "type": "string"
          },
          "isGroup": {
            "description": "Whether the label is a group",
            "type": "boolean"
          },
          "name": {
            "description": "Label name (required when creating)",
            "type": "string"
          },
          "parent": {
            "description": "Parent label group name or ID. Null to remove from its group",
            "type": [
              "string",
              "null"
            ]
          },
          "teamId": {
            "description": "Team UUID (omit for workspace label). When updating, only disambiguates `id` by name; a label's team cannot be changed",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "save_project_label",
      "title": "Save project label"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "commitSha": {
            "description": "Commit SHA associated with the release",
            "type": "string"
          },
          "completedAt": {
            "description": "Completed timestamp (ISO DateTime, null to remove)",
            "type": [
              "string",
              "null"
            ]
          },
          "createdAt": {
            "description": "Import/create timestamp (ISO DateTime)",
            "type": "string"
          },
          "description": {
            "description": "Release description",
            "type": "string"
          },
          "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"
          },
          "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"
            ]
          },
          "startedAt": {
            "description": "Started timestamp (ISO DateTime, null to remove)",
            "type": [
              "string",
              "null"
            ]
          },
          "targetDate": {
            "description": "Estimated completion date (ISO YYYY-MM-DD, null to remove)",
            "type": [
              "string",
              "null"
            ]
          },
          "version": {
            "description": "Version identifier",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "save_release",
      "title": "Save release"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "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"
          },
          "id": {
            "description": "Release notes ID or slug to update. Omit to create new release notes.",
            "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",
            "items": {
              "oneOf": [
                {
                  "properties": {
                    "new_string": {
                      "description": "Replacement text. Empty string deletes the match",
                      "type": "string"
                    },
                    "old_string": {
                      "description": "Exact text to replace. Must match the current content exactly once",
                      "minLength": 1,
                      "type": "string"
                    },
                    "op": {
                      "const": "replace",
                      "type": "string"
                    },
                    "replace_all": {
                      "description": "Replace every occurrence instead of requiring a unique match",
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "op",
                    "old_string",
                    "new_string"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "anchor": {
                      "description": "Exact text to insert before. Must match the current content exactly once",
                      "minLength": 1,
                      "type": "string"
                    },
                    "op": {
                      "const": "insert_before",
                      "type": "string"
                    },
                    "text": {
                      "description": "Text to insert directly before the anchor. Include separators (e.g. \"\\n\\n\")",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "op",
                    "anchor",
                    "text"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "anchor": {
                      "description": "Exact text to insert after. Must match the current content exactly once",
                      "minLength": 1,
                      "type": "string"
                    },
                    "op": {
                      "const": "insert_after",
                      "type": "string"
                    },
                    "text": {
                      "description": "Text to insert directly after the anchor. Include separators (e.g. \"\\n\\n\")",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "op",
                    "anchor",
                    "text"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "op": {
                      "const": "prepend",
                      "type": "string"
                    },
                    "text": {
                      "description": "Text to insert at the very start of the content",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "op",
                    "text"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "op": {
                      "const": "append",
                      "type": "string"
                    },
                    "text": {
                      "description": "Text to insert at the very end of the content",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "op",
                    "text"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "from": {
                      "description": "Exact text where the range starts (inclusive). Must match exactly once",
                      "minLength": 1,
                      "type": "string"
                    },
                    "new_string": {
                      "description": "Text replacing the range. Empty string deletes it",
                      "type": "string"
                    },
                    "op": {
                      "const": "replace_range",
                      "type": "string"
                    },
                    "to": {
                      "description": "Exact text where the range ends (exclusive, stays in place). Must match exactly once after `from`",
                      "minLength": 1,
                      "type": "string"
                    }
                  },
                  "required": [
                    "op",
                    "from",
                    "to",
                    "new_string"
                  ],
                  "type": "object"
                }
              ]
            },
            "maxItems": 50,
            "minItems": 1,
            "type": "array"
          },
          "pipeline": {
            "description": "Release pipeline ID, slug, or exact name (required when creating)",
            "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"
          },
          "releases": {
            "description": "Release IDs or slugs to include in the note",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "title": {
            "description": "Release notes title",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "save_release_note",
      "title": "Save release notes"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Create or update a project/initiative status update. Omit `id` to create, provide `id` to update.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "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",
            "enum": [
              "onTrack",
              "atRisk",
              "offTrack"
            ],
            "type": "string"
          },
          "id": {
            "description": "Status update ID - if provided, updates this existing update",
            "type": "string"
          },
          "initiative": {
            "description": "Initiative name, ID, identifier (e.g., I-123), or slug",
            "type": "string"
          },
          "isDiffHidden": {
            "description": "Deprecated. Hide diff with previous update (create only)",
            "type": "boolean"
          },
          "project": {
            "description": "Project name, ID, identifier (e.g., P-ENG-123), or slug",
            "type": "string"
          },
          "type": {
            "description": "Type of status update",
            "enum": [
              "project",
              "initiative"
            ],
            "type": "string"
          }
        },
        "required": [
          "type"
        ],
        "type": "object"
      },
      "name": "save_status_update",
      "title": "Save status update"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Search Linear's documentation to learn about features and usage",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "page": {
            "default": 0,
            "description": "Page number",
            "type": "number"
          },
          "query": {
            "description": "Search query",
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "name": "search_documentation",
      "title": "Search documentation"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "issue": {
            "description": "Issue ID or identifier (e.g., LIN-123). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues",
            "type": "string"
          },
          "user": {
            "description": "User ID, name, email, or \"me\" Must be an email address or UUID.",
            "type": "string"
          }
        },
        "required": [
          "issue",
          "user"
        ],
        "type": "object"
      },
      "name": "share_issue",
      "title": "Share issue"
    },
    {
      "_meta": {
        "microsoft/allowedDomains": [
          "linear.app\u003chttps://linear.app/\u003e"
        ]
      },
      "annotations": {
        "destructiveHint": true,
        "idempotentHint": false,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "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": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false,
        "properties": {
          "issue": {
            "description": "Issue ID or identifier (e.g., LIN-123). P-prefixed identifiers (e.g., P-ENG-123) are projects, not issues",
            "type": "string"
          },
          "user": {
            "description": "User ID, name, email, or \"me\" Must be an email address or UUID.",
            "type": "string"
          }
        },
        "required": [
          "issue",
          "user"
        ],
        "type": "object"
      },
      "name": "unshare_issue",
      "title": "Unshare issue"
    }
  ]
}
