{
  "application": {
    "universalIdentifier": "6f4e7c2a-3d8e-4a91-b2cf-9e0b8d5f4a2e",
    "displayName": "Linear",
    "description": "Connect Linear to Twenty. Each workspace member connects their own Linear account; logic functions can then create issues and read team data on their behalf.",
    "logoUrl": "public/linear-logomark.svg",
    "aboutDescription": "Connect your Linear account to Twenty to create issues and look up teams straight from your workflows or the AI chat.\n\n## What you can do\n\nOnce installed and connected, two tools become available:\n\n- **Create Linear issue**\n  - From the AI chat, ask something like *\"create a Linear issue in the Engineering team titled 'Fix login bug'\"* and the AI will file it for you.\n  - From a workflow, add it as a step with `teamId` + `title` (and optional `description`).\n\n- **List Linear teams** — discovers the teams in your Linear workspace, useful when you need to pick a `teamId` for the create-issue step.\n\n## Installing\n\n1. Open **Settings → Applications** in your Twenty workspace.\n2. Find **Linear** in the available apps and click **Install**.\n3. Open the app, go to the **Connections** tab, and click **Add connection**.\n4. Choose **Just for me** (your personal Linear account) or **Workspace shared** (a team-managed Linear account anyone in this workspace can act through), then complete the Linear sign-in.\n\nThat's it — you can now use the tools above.",
    "author": "Twenty",
    "category": "Product management",
    "emailSupport": "contact@twenty.com",
    "screenshots": [
      "public/gallery/command-menu-item-1.png",
      "public/gallery/command-menu-item-2.png",
      "public/gallery/command-menu-item-3.png",
      "public/gallery/command-menu-item-4.png"
    ],
    "termsUrl": "https://github.com/twentyhq/twenty?tab=License-1-ov-file#readme",
    "websiteUrl": "https://www.twenty.com",
    "serverVariables": {
      "LINEAR_CLIENT_ID": {
        "description": "OAuth client ID from your Linear OAuth application (linear.app/settings/api/applications).",
        "isSecret": false,
        "isRequired": true
      },
      "LINEAR_CLIENT_SECRET": {
        "description": "OAuth client secret from your Linear OAuth application. Stored encrypted; never exposed in API responses.",
        "isSecret": true,
        "isRequired": true
      }
    },
    "defaultRoleUniversalIdentifier": "b6c33347-e41c-4b90-8a37-7b3c49baa85a",
    "yarnLockChecksum": "ded5f315e47053806dbea38b3da1c9c7",
    "packageJsonChecksum": "44719a61d0ef573dabde0b2d88855e4d"
  },
  "objects": [],
  "fields": [],
  "roles": [
    {
      "universalIdentifier": "b6c33347-e41c-4b90-8a37-7b3c49baa85a",
      "label": "Linear function role",
      "description": "No-op role for Linear logic functions",
      "canReadAllObjectRecords": false,
      "canUpdateAllObjectRecords": false,
      "canSoftDeleteAllObjectRecords": false,
      "canDestroyAllObjectRecords": false,
      "canUpdateAllSettings": false,
      "canBeAssignedToAgents": false,
      "canBeAssignedToUsers": false,
      "canBeAssignedToApiKeys": false,
      "objectPermissions": [],
      "fieldPermissions": [],
      "permissionFlags": []
    }
  ],
  "skills": [],
  "agents": [],
  "connectionProviders": [
    {
      "universalIdentifier": "9c7d1f5e-6a0b-4d44-be0c-3f8b5a9d4e6f",
      "name": "linear",
      "displayName": "Linear",
      "type": "oauth",
      "oauth": {
        "authorizationEndpoint": "https://linear.app/oauth/authorize",
        "tokenEndpoint": "https://api.linear.app/oauth/token",
        "revokeEndpoint": "https://api.linear.app/oauth/revoke",
        "scopes": [
          "read",
          "write"
        ],
        "clientIdVariable": "LINEAR_CLIENT_ID",
        "clientSecretVariable": "LINEAR_CLIENT_SECRET",
        "tokenRequestContentType": "form-urlencoded",
        "usePkce": true
      }
    }
  ],
  "logicFunctions": [
    {
      "universalIdentifier": "01f829c9-1661-41fa-9ee1-b67e64716c2e",
      "name": "create-linear-issue",
      "description": "Create a Linear issue on behalf of the connected user. Requires a teamId (call list-linear-teams to discover one) and a title.",
      "timeoutSeconds": 30,
      "toolTriggerSettings": {
        "inputSchema": {
          "type": "object",
          "properties": {
            "teamId": {
              "type": "string",
              "description": "The Linear team ID to create the issue in. Use list-linear-teams to discover available teams."
            },
            "title": {
              "type": "string",
              "description": "The issue title."
            },
            "description": {
              "type": "string",
              "description": "Optional issue description (Markdown supported)."
            },
            "priority": {
              "type": "integer",
              "description": "Issue priority: 0 = No priority, 1 = Urgent, 2 = High, 3 = Medium, 4 = Low.",
              "minimum": 0,
              "maximum": 4
            },
            "stateId": {
              "type": "string",
              "description": "The workflow state ID for the issue status. Use list-linear-issue-options to discover available states for a team."
            },
            "assigneeId": {
              "type": "string",
              "description": "The user ID to assign the issue to. Use list-linear-issue-options to discover team members."
            },
            "projectId": {
              "type": "string",
              "description": "The project ID to associate the issue with."
            },
            "estimate": {
              "type": "number",
              "description": "The estimate value for the issue. Must match the team estimate scale."
            },
            "labelIds": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Array of label IDs to apply to the issue."
            },
            "cycleId": {
              "type": "string",
              "description": "The cycle ID to add the issue to."
            },
            "dueDate": {
              "type": "string",
              "description": "Due date in YYYY-MM-DD format."
            }
          },
          "required": [
            "teamId",
            "title"
          ]
        }
      },
      "workflowActionTriggerSettings": {
        "label": "Create Linear Issue",
        "inputSchema": [
          {
            "type": "object",
            "properties": {
              "teamId": {
                "type": "string"
              },
              "title": {
                "type": "string"
              },
              "description": {
                "type": "string"
              },
              "priority": {
                "type": "number"
              },
              "stateId": {
                "type": "string"
              },
              "assigneeId": {
                "type": "string"
              },
              "projectId": {
                "type": "string"
              },
              "estimate": {
                "type": "number"
              },
              "labelIds": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "cycleId": {
                "type": "string"
              },
              "dueDate": {
                "type": "string"
              }
            }
          }
        ],
        "outputSchema": [
          {
            "type": "object",
            "properties": {
              "success": {
                "type": "boolean"
              },
              "issue": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "identifier": {
                    "type": "string"
                  },
                  "title": {
                    "type": "string"
                  },
                  "url": {
                    "type": "string"
                  }
                }
              },
              "error": {
                "type": "string"
              }
            }
          }
        ]
      },
      "handlerName": "default.config.handler",
      "sourceHandlerPath": "src/logic-functions/create-linear-issue.ts",
      "builtHandlerPath": "src/logic-functions/create-linear-issue.mjs",
      "builtHandlerChecksum": "29c64cb1a6c8cfe14eb133b5b896529b"
    },
    {
      "universalIdentifier": "15824bbc-9c64-4f97-b45f-d0a44b402bb8",
      "name": "list-linear-teams",
      "description": "Returns the connected user's Linear teams. Useful for picking a teamId to pass to create-linear-issue.",
      "timeoutSeconds": 15,
      "toolTriggerSettings": {
        "inputSchema": {
          "type": "object",
          "properties": {}
        }
      },
      "workflowActionTriggerSettings": {
        "label": "List Linear Teams",
        "inputSchema": [
          {
            "type": "object",
            "properties": {}
          }
        ],
        "outputSchema": [
          {
            "type": "object",
            "properties": {
              "success": {
                "type": "boolean"
              },
              "teams": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    },
                    "key": {
                      "type": "string"
                    }
                  }
                }
              },
              "error": {
                "type": "string"
              }
            }
          }
        ]
      },
      "handlerName": "default.config.handler",
      "sourceHandlerPath": "src/logic-functions/list-linear-teams.ts",
      "builtHandlerPath": "src/logic-functions/list-linear-teams.mjs",
      "builtHandlerChecksum": "163ff835c8205a6811a536552244a05f"
    },
    {
      "universalIdentifier": "a1d4e7b3-5c2f-4a89-9b0e-6f3d8c1a7e5b",
      "name": "list-linear-teams-route",
      "timeoutSeconds": 15,
      "httpRouteTriggerSettings": {
        "path": "/linear/teams",
        "httpMethod": "GET",
        "isAuthRequired": true
      },
      "handlerName": "default.config.handler",
      "sourceHandlerPath": "src/logic-functions/list-linear-teams-route.ts",
      "builtHandlerPath": "src/logic-functions/list-linear-teams-route.mjs",
      "builtHandlerChecksum": "403e0cdc10bab498c9edfc874d2fc345"
    },
    {
      "universalIdentifier": "a3b7e1d9-8c4f-4a26-b5d0-7e9f2c6a8b3d",
      "name": "list-linear-issue-options-route",
      "timeoutSeconds": 15,
      "httpRouteTriggerSettings": {
        "path": "/linear/issue-options",
        "httpMethod": "GET",
        "isAuthRequired": true
      },
      "handlerName": "default.config.handler",
      "sourceHandlerPath": "src/logic-functions/list-linear-issue-options-route.ts",
      "builtHandlerPath": "src/logic-functions/list-linear-issue-options-route.mjs",
      "builtHandlerChecksum": "d699a842ebc55aecb32cec00b5b8a51e"
    },
    {
      "universalIdentifier": "c2b99086-6c1b-43e4-9685-de4ade6bda63",
      "name": "list-linear-issue-options",
      "description": "Returns available options for creating a Linear issue in a specific team: workflow states, members, projects, labels, cycles, and estimation settings. Requires a teamId (call list-linear-teams to discover one).",
      "timeoutSeconds": 15,
      "toolTriggerSettings": {
        "inputSchema": {
          "type": "object",
          "properties": {
            "teamId": {
              "type": "string",
              "description": "The Linear team ID to fetch issue options for. Use list-linear-teams to discover available teams."
            }
          },
          "required": [
            "teamId"
          ]
        }
      },
      "workflowActionTriggerSettings": {
        "label": "List Linear Issue Options",
        "inputSchema": [
          {
            "type": "object",
            "properties": {
              "teamId": {
                "type": "string"
              }
            }
          }
        ],
        "outputSchema": [
          {
            "type": "object",
            "properties": {
              "success": {
                "type": "boolean"
              },
              "options": {
                "type": "object",
                "properties": {
                  "states": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "type": {
                          "type": "string"
                        },
                        "position": {
                          "type": "number"
                        }
                      }
                    }
                  },
                  "members": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "displayName": {
                          "type": "string"
                        }
                      }
                    }
                  },
                  "projects": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        }
                      }
                    }
                  },
                  "labels": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "color": {
                          "type": "string"
                        }
                      }
                    }
                  },
                  "cycles": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "name": {
                          "type": "string"
                        },
                        "number": {
                          "type": "number"
                        },
                        "startsAt": {
                          "type": "string"
                        },
                        "endsAt": {
                          "type": "string"
                        }
                      }
                    }
                  },
                  "estimationType": {
                    "type": "string"
                  },
                  "estimationAllowZero": {
                    "type": "boolean"
                  }
                }
              },
              "error": {
                "type": "string"
              }
            }
          }
        ]
      },
      "handlerName": "default.config.handler",
      "sourceHandlerPath": "src/logic-functions/list-linear-issue-options.ts",
      "builtHandlerPath": "src/logic-functions/list-linear-issue-options.mjs",
      "builtHandlerChecksum": "913bc6d4ffcf102dd62fd7869c376cc0"
    },
    {
      "universalIdentifier": "c8f2a6d1-3b7e-4e09-8d5c-2a9f0b4e6c3d",
      "name": "create-linear-issue-route",
      "timeoutSeconds": 30,
      "httpRouteTriggerSettings": {
        "path": "/linear/issues",
        "httpMethod": "POST",
        "isAuthRequired": true
      },
      "handlerName": "default.config.handler",
      "sourceHandlerPath": "src/logic-functions/create-linear-issue-route.ts",
      "builtHandlerPath": "src/logic-functions/create-linear-issue-route.mjs",
      "builtHandlerChecksum": "dcec0371e90469c114e496e67eac82e0"
    },
    {
      "universalIdentifier": "f5a2d8c1-4b7e-4f93-a6d0-9c3e1b8f5a2d",
      "name": "list-linear-workflow-states-route",
      "timeoutSeconds": 15,
      "httpRouteTriggerSettings": {
        "path": "/linear/workflow-states",
        "httpMethod": "GET",
        "isAuthRequired": true
      },
      "handlerName": "default.config.handler",
      "sourceHandlerPath": "src/logic-functions/list-linear-workflow-states-route.ts",
      "builtHandlerPath": "src/logic-functions/list-linear-workflow-states-route.mjs",
      "builtHandlerChecksum": "ccbb09d5f98814bd360937a98bb7265c"
    }
  ],
  "frontComponents": [
    {
      "universalIdentifier": "d4a1c8e5-7f3b-4d62-a90e-1b5c3f8d2a6e",
      "name": "create-linear-issue-form",
      "description": "Form to create a Linear issue with team, title, description, status, priority, assignee, project, cycle, estimate, labels, and due date.",
      "componentName": "CreateIssueForm",
      "sourceComponentPath": "src/components/create-issue-form.front-component.tsx",
      "builtComponentPath": "src/components/create-issue-form.front-component.mjs",
      "builtComponentChecksum": "e5bfab627507c0a68b86c7f9d5c27c36",
      "isHeadless": false,
      "usesSdkClient": false
    }
  ],
  "publicAssets": [
    {
      "filePath": "public/gallery/command-menu-item-1.png",
      "fileName": "command-menu-item-1.png",
      "fileType": "png",
      "checksum": "b3b35a3427b1a69ffecbe3d605a7a16f"
    },
    {
      "filePath": "public/gallery/command-menu-item-2.png",
      "fileName": "command-menu-item-2.png",
      "fileType": "png",
      "checksum": "6ad01cca1da31e2e7e7fcdeb56f5a583"
    },
    {
      "filePath": "public/gallery/command-menu-item-3.png",
      "fileName": "command-menu-item-3.png",
      "fileType": "png",
      "checksum": "dd5d47ef4a45c5f5f68c666bf4996f5c"
    },
    {
      "filePath": "public/gallery/command-menu-item-4.png",
      "fileName": "command-menu-item-4.png",
      "fileType": "png",
      "checksum": "61c47ed83754f9c6f050fe1810bbc38f"
    },
    {
      "filePath": "public/linear-logomark.svg",
      "fileName": "linear-logomark.svg",
      "fileType": "svg",
      "checksum": "7a0a408325d1b625a7c015b8979752a9"
    }
  ],
  "views": [],
  "navigationMenuItems": [],
  "pageLayouts": [],
  "pageLayoutTabs": [],
  "commandMenuItems": [
    {
      "universalIdentifier": "e7b3d9f2-6a1c-4e85-b4d0-8f2c5a7e3b19",
      "label": "Create Linear issue",
      "shortLabel": "Linear issue",
      "icon": "IconPlaylistAdd",
      "isPinned": false,
      "availabilityType": "GLOBAL",
      "frontComponentUniversalIdentifier": "d4a1c8e5-7f3b-4d62-a90e-1b5c3f8d2a6e"
    }
  ]
}
