KosmoKrator

productivity

Plane Lua API for KosmoKrator Agents

Agent-facing Lua documentation and function reference for the Plane KosmoKrator integration.

Lua Namespace

Agents call this integration through app.integrations.plane.*. Use lua_read_doc("integrations.plane") inside KosmoKrator to discover the same reference at runtime.

Call Lua from the Headless CLI

Use kosmo integrations:lua when a shell script, CI job, cron job, or another coding CLI should run a deterministic Plane workflow without starting an interactive agent session.

Inline Lua call
kosmo integrations:lua --eval 'dump(app.integrations.plane.list_workspaces({}))' --json
Read Lua docs headlessly
kosmo integrations:lua --eval 'print(docs.read("plane"))' --json
kosmo integrations:lua --eval 'print(docs.read("plane.list_workspaces"))' --json

Workflow file

Put repeatable logic in a Lua file, then execute it with JSON output for the calling process.

workflow.lua
local plane = app.integrations.plane
local result = plane.list_workspaces({})

dump(result)
Run the workflow
kosmo integrations:lua workflow.lua --json
kosmo integrations:lua workflow.lua --force --json
Namespace note. integrations:lua exposes app.integrations.plane, app.mcp.*, docs.*, json.*, and regex.*. Use app.integrations.plane.default.* or app.integrations.plane.work.* when you configured named credential accounts.

MCP-only Lua

If the script only needs configured MCP servers and does not need Plane, use the narrower mcp:lua command.

MCP Lua command
# Use mcp:lua for MCP-only scripts; use integrations:lua for this integration namespace.
kosmo mcp:lua --eval 'dump(mcp.servers())' --json

Agent-Facing Lua Docs

This is the rendered version of the full Lua documentation exposed to agents when they inspect the integration namespace.

Plane.so — Lua API Reference

If you configure a default workspace_slug, most tools can omit workspace_slug and will use that default automatically. On some self-hosted Plane deployments, user and workspace-list endpoints are limited; this integration falls back to workspace-scoped project access where needed.

list_workspaces

List all Plane.so workspaces the authenticated user belongs to. On self-hosted deployments that do not expose the workspace-list endpoint, this returns the configured default workspace after verifying access.

Parameters

None.

Example

local result = app.integrations.plane.list_workspaces()

for _, ws in ipairs(result.workspaces) do
  print(ws.slug .. " — " .. ws.name)
end

list_projects

List all projects in a workspace.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug (e.g., "my-team")

Example

local result = app.integrations.plane.list_projects({
  workspace_slug = "my-team"
})

for _, proj in ipairs(result.projects) do
  print(proj.identifier .. " — " .. proj.name)
end

list_issues

List issues in a project with optional filters.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID
statestringnoFilter by state UUID
prioritystringnoFilter by priority: urgent, high, medium, low, none
assigneestringnoFilter by assignee UUID
labelsstringnoComma-separated label UUIDs
searchstringnoSearch query for issue name
parentstringnoFilter by parent issue UUID
cyclestringnoFilter by cycle UUID
modulestringnoFilter by module UUID

Example

local result = app.integrations.plane.list_issues({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  priority = "high"
})

for _, issue in ipairs(result.issues) do
  print("#" .. issue.sequence_id .. " " .. issue.name .. " [" .. (issue.priority or "none") .. "]")
end

get_issue

Get detailed information about a single issue.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID
issue_idstringyesIssue UUID

Example

local issue = app.integrations.plane.get_issue({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  issue_id = "xyz-456-ghi"
})

print(issue.name)
print(issue.description_html)
print("Priority: " .. (issue.priority or "none"))

create_issue

Create a new issue in a project.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID
namestringyesIssue title
description_htmlstringnoDescription in HTML
statestringnoState UUID
prioritystringnourgent, high, medium, low, none
assigneesarraynoArray of user UUIDs
labelsarraynoArray of label UUIDs
start_datestringnoStart date (YYYY-MM-DD)
target_datestringnoDue date (YYYY-MM-DD)
parentstringnoParent issue UUID for sub-issues

Example

local issue = app.integrations.plane.create_issue({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  name = "Fix login redirect bug",
  description_html = "<p>Users are redirected to 404 after login.</p>",
  priority = "high",
  target_date = "2026-04-15"
})

print("Created issue #" .. issue.sequence_id .. ": " .. issue.name)

update_issue

Update an existing issue. Only provide fields you want to change.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID
issue_idstringyesIssue UUID
namestringnoNew title
description_htmlstringnoNew description (HTML)
statestringnoNew state UUID
prioritystringnoNew priority
assigneesarraynoNew assignee UUIDs (replaces existing)
labelsarraynoNew label UUIDs (replaces existing)
start_datestringnoNew start date
target_datestringnoNew due date
parentstringnoNew parent issue UUID

Example

local issue = app.integrations.plane.update_issue({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  issue_id = "xyz-456-ghi",
  state = "done-state-uuid",
  priority = "low"
})

print("Updated issue #" .. issue.sequence_id)

delete_issue

Delete an issue permanently.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID
issue_idstringyesIssue UUID

Example

local result = app.integrations.plane.delete_issue({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  issue_id = "xyz-456-ghi"
})

print("Deleted: " .. tostring(result.deleted))

list_cycles

List all cycles in a project.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID

Example

local result = app.integrations.plane.list_cycles({
  workspace_slug = "my-team",
  project_id = "abc-123-def"
})

for _, cycle in ipairs(result.cycles) do
  print(cycle.name .. " (" .. (cycle.start_date or "?") .. " → " .. (cycle.end_date or "?") .. ")")
end

add_issue_to_cycle

Add an issue to a cycle.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID
cycle_idstringyesCycle UUID
issue_idstringyesIssue UUID

Example

local result = app.integrations.plane.add_issue_to_cycle({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  cycle_id = "cycle-uuid-here",
  issue_id = "issue-uuid-here"
})

print("Added to cycle: " .. tostring(result.added))

list_modules

List all modules in a project.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID

Example

local result = app.integrations.plane.list_modules({
  workspace_slug = "my-team",
  project_id = "abc-123-def"
})

for _, mod in ipairs(result.modules) do
  print(mod.name .. " — status: " .. (mod.status or "none"))
end

add_issue_to_module

Add an issue to a module.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID
module_idstringyesModule UUID
issue_idstringyesIssue UUID

Example

local result = app.integrations.plane.add_issue_to_module({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  module_id = "module-uuid-here",
  issue_id = "issue-uuid-here"
})

print("Added to module: " .. tostring(result.added))

list_members

List members of a workspace or project.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringnoProject UUID (if omitted, lists workspace members)

Example

-- List workspace members
local result = app.integrations.plane.list_members({
  workspace_slug = "my-team"
})

-- List project members only
local result = app.integrations.plane.list_members({
  workspace_slug = "my-team",
  project_id = "abc-123-def"
})

for _, member in ipairs(result.members) do
  print(member.display_name .. " <" .. (member.email or "") .. "> — " .. (member.role or ""))
end


list_states

List workflow states in a project. Use state UUIDs when creating or updating issues.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID

Example

local result = app.integrations.plane.list_states({
  workspace_slug = "my-team",
  project_id = "abc-123-def"
})

for _, state in ipairs(result.states) do
  print(state.name .. " [" .. (state.group or "") .. "] = " .. state.id)
end

list_labels

List labels in a project. Use label UUIDs when creating or updating issues.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID

Example

local result = app.integrations.plane.list_labels({
  workspace_slug = "my-team",
  project_id = "abc-123-def"
})

for _, label in ipairs(result.labels) do
  print(label.name .. " (color: " .. (label.color or "?") .. ") = " .. label.id)
end

create_comment

Add a comment to an issue.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID
issue_idstringyesIssue UUID
comment_htmlstringyesComment content in HTML format

Example

local result = app.integrations.plane.create_comment({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  issue_id = "xyz-456-ghi",
  comment_html = "<p>Investigating — looks like a redirect config issue.</p>"
})

print("Comment created: " .. result.id)

list_comments

List all comments on an issue.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID
issue_idstringyesIssue UUID

Example

local result = app.integrations.plane.list_comments({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  issue_id = "xyz-456-ghi"
})

for _, comment in ipairs(result.comments) do
  print("[" .. (comment.created_at or "") .. "] " .. (comment.comment_html or ""))
end

search_issues

Search issues across all projects in a workspace.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
searchstringyesSearch query
projectstringnoFilter by project UUID
statestringnoFilter by state UUID
prioritystringnoFilter by priority
assigneestringnoFilter by assignee UUID

Example

local result = app.integrations.plane.search_issues({
  workspace_slug = "my-team",
  search = "login bug"
})

for _, issue in ipairs(result.issues) do
  print("#" .. (issue.sequence_id or "?") .. " " .. issue.name)
end

get_project

Get detailed information about a project.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID

Example

local project = app.integrations.plane.get_project({
  workspace_slug = "my-team",
  project_id = "abc-123-def"
})

print(project.name .. " (" .. project.identifier .. ")")
print("Active: " .. tostring(project.is_active))

create_project

Create a new project in a workspace.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
namestringyesProject name
identifierstringyesShort code (max 12 chars, e.g., "PROJ")
descriptionstringnoProject description
cover_imagestringnoCover image URL
project_leadstringnoUUID of project lead
default_assigneestringnoUUID of default assignee

Example

local project = app.integrations.plane.create_project({
  workspace_slug = "my-team",
  name = "Website Redesign",
  identifier = "REDESIGN",
  description = "Full redesign of the marketing website"
})

print("Created project: " .. project.name .. " (" .. project.identifier .. ")")

list_issue_activities

List activity/audit events on an issue.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID
issue_idstringyesIssue UUID

Example

local result = app.integrations.plane.list_issue_activities({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  issue_id = "xyz-456-ghi"
})

for _, act in ipairs(result.activities) do
  print((act.created_at or "") .. " — " .. (act.action or "") .. " " .. (act.field or ""))
end

Attach an external link to an issue.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID
issue_idstringyesIssue UUID
titlestringyesDisplay title for the link
urlstringyesThe URL to link to

Example

local result = app.integrations.plane.create_issue_link({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  issue_id = "xyz-456-ghi",
  title = "Design mockup",
  url = "https://figma.com/file/abc123"
})

print("Link added: " .. result.title)

list_issue_relations

List relations on an issue (blocking, duplicate, etc.).

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID
issue_idstringyesIssue UUID

Relation Types

blocking, blocked_by, duplicate, relates_to, start_before, start_after, finish_before, finish_after

Example

local result = app.integrations.plane.list_issue_relations({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  issue_id = "xyz-456-ghi"
})

for _, rel in ipairs(result.relations) do
  print(rel.relation_type .. " → " .. (rel.related_issue or "?"))
end

get_current_user

Get the currently authenticated Plane.so user. Useful for verifying credentials. On self-hosted deployments where the user endpoint is unavailable, this falls back to a workspace access probe and returns workspace_slug with a synthetic display name.

Parameters

None.

Example

local user = app.integrations.plane.get_current_user()

print(user.display_name .. " <" .. (user.email or "") .. ">")
print("User ID: " .. user.id)

get_cycle

Get details of a specific cycle.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID
cycle_idstringyesCycle UUID

Example

local cycle = app.integrations.plane.get_cycle({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  cycle_id = "cycle-uuid"
})

print(cycle.name .. ": " .. (cycle.start_date or "?") .. " → " .. (cycle.end_date or "?"))
print("Active: " .. tostring(cycle.is_active))

create_cycle

Create a new cycle (sprint) in a project.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID
namestringnoCycle name (e.g., "Sprint 14")
descriptionstringnoCycle description
start_datestringnoStart date (YYYY-MM-DD)
end_datestringnoEnd date (YYYY-MM-DD)

Example

local cycle = app.integrations.plane.create_cycle({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  name = "Sprint 15",
  start_date = "2026-04-14",
  end_date = "2026-04-28"
})

print("Created cycle: " .. (cycle.name or "unnamed"))

get_module

Get details of a specific module.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID
module_idstringyesModule UUID

Example

local mod = app.integrations.plane.get_module({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  module_id = "module-uuid"
})

print(mod.name .. " — status: " .. (mod.status or "none"))

create_module

Create a new module in a project.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID
namestringyesModule name
descriptionstringnoModule description
statusstringnoModule status
start_datestringnoStart date (YYYY-MM-DD)
target_datestringnoTarget date (YYYY-MM-DD)

Example

local mod = app.integrations.plane.create_module({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  name = "Authentication System",
  description = "OAuth2 + SSO integration",
  target_date = "2026-05-01"
})

print("Created module: " .. mod.name)

create_state

Create a workflow state in a project.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID
namestringyesState name (e.g., "In Review")
groupstringyesOne of: backlog, unstarted, started, completed, cancelled
colorstringnoHex color code (e.g., "#FF5733")
descriptionstringnoState description
slugstringnoURL-friendly slug

Example

local state = app.integrations.plane.create_state({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  name = "Ready for QA",
  group = "started",
  color = "#FFA500"
})

print("Created state: " .. state.name .. " [" .. state.group .. "] = " .. state.id)

create_label

Create a label in a project.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID
namestringyesLabel name
colorstringnoHex color code
descriptionstringnoLabel description
parentstringnoParent label UUID for hierarchy

Example

local label = app.integrations.plane.create_label({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  name = "bug",
  color = "#FF0000"
})

print("Created label: " .. label.name .. " = " .. label.id)

archive_project

Archive a project. Hidden from active views but data is retained.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID

Example

local result = app.integrations.plane.archive_project({
  workspace_slug = "my-team",
  project_id = "abc-123-def"
})

print("Archived: " .. tostring(result.archived))

list_pages

List pages in a project. Pages are Notion-like documents.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID

Example

local result = app.integrations.plane.list_pages({
  workspace_slug = "my-team",
  project_id = "abc-123-def"
})

for _, page in ipairs(result.pages) do
  print(page.name .. " (updated: " .. (page.updated_at or "?") .. ")")
end

get_page

Get full content of a page.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID
page_idstringyesPage UUID

Example

local page = app.integrations.plane.get_page({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  page_id = "page-uuid"
})

print(page.name)
print(page.description_html)

create_page

Create a new page in a project.

Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug
project_idstringyesProject UUID
namestringyesPage title
description_htmlstringnoPage content in HTML

Example

local page = app.integrations.plane.create_page({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  name = "API Design Notes",
  description_html = "<h2>Endpoints</h2><p>POST /api/v1/users</p>"
})

print("Created page: " .. page.name .. " = " .. page.id)

Webhooks

The plane_webhook trigger receives Plane.so workspace events. Configure it with a workspace slug and optional project scope.

Trigger Parameters

NameTypeRequiredDescription
workspace_slugstringyesWorkspace slug to listen on
project_idstringnoScope to a specific project

Multi-Account Usage

If you have multiple Plane.so accounts configured, use account-specific namespaces:

-- Default account (always works)
app.integrations.plane.list_workspaces()

-- Explicit default (portable across setups)
app.integrations.plane.default.list_workspaces()

-- Named accounts
app.integrations.plane.self_hosted.list_workspaces()
app.integrations.plane.cloud.list_workspaces()

All functions are identical across accounts — only the credentials differ.

Raw agent markdown
# Plane.so — Lua API Reference

If you configure a default `workspace_slug`, most tools can omit `workspace_slug` and will use that default automatically.
On some self-hosted Plane deployments, user and workspace-list endpoints are limited; this integration falls back to workspace-scoped project access where needed.

## list_workspaces

List all Plane.so workspaces the authenticated user belongs to.
On self-hosted deployments that do not expose the workspace-list endpoint, this returns the configured default workspace after verifying access.

### Parameters

None.

### Example

```lua
local result = app.integrations.plane.list_workspaces()

for _, ws in ipairs(result.workspaces) do
  print(ws.slug .. " — " .. ws.name)
end
```

---

## list_projects

List all projects in a workspace.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug (e.g., `"my-team"`) |

### Example

```lua
local result = app.integrations.plane.list_projects({
  workspace_slug = "my-team"
})

for _, proj in ipairs(result.projects) do
  print(proj.identifier .. " — " .. proj.name)
end
```

---

## list_issues

List issues in a project with optional filters.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |
| `state` | string | no | Filter by state UUID |
| `priority` | string | no | Filter by priority: `urgent`, `high`, `medium`, `low`, `none` |
| `assignee` | string | no | Filter by assignee UUID |
| `labels` | string | no | Comma-separated label UUIDs |
| `search` | string | no | Search query for issue name |
| `parent` | string | no | Filter by parent issue UUID |
| `cycle` | string | no | Filter by cycle UUID |
| `module` | string | no | Filter by module UUID |

### Example

```lua
local result = app.integrations.plane.list_issues({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  priority = "high"
})

for _, issue in ipairs(result.issues) do
  print("#" .. issue.sequence_id .. " " .. issue.name .. " [" .. (issue.priority or "none") .. "]")
end
```

---

## get_issue

Get detailed information about a single issue.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |
| `issue_id` | string | yes | Issue UUID |

### Example

```lua
local issue = app.integrations.plane.get_issue({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  issue_id = "xyz-456-ghi"
})

print(issue.name)
print(issue.description_html)
print("Priority: " .. (issue.priority or "none"))
```

---

## create_issue

Create a new issue in a project.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |
| `name` | string | yes | Issue title |
| `description_html` | string | no | Description in HTML |
| `state` | string | no | State UUID |
| `priority` | string | no | `urgent`, `high`, `medium`, `low`, `none` |
| `assignees` | array | no | Array of user UUIDs |
| `labels` | array | no | Array of label UUIDs |
| `start_date` | string | no | Start date (YYYY-MM-DD) |
| `target_date` | string | no | Due date (YYYY-MM-DD) |
| `parent` | string | no | Parent issue UUID for sub-issues |

### Example

```lua
local issue = app.integrations.plane.create_issue({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  name = "Fix login redirect bug",
  description_html = "<p>Users are redirected to 404 after login.</p>",
  priority = "high",
  target_date = "2026-04-15"
})

print("Created issue #" .. issue.sequence_id .. ": " .. issue.name)
```

---

## update_issue

Update an existing issue. Only provide fields you want to change.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |
| `issue_id` | string | yes | Issue UUID |
| `name` | string | no | New title |
| `description_html` | string | no | New description (HTML) |
| `state` | string | no | New state UUID |
| `priority` | string | no | New priority |
| `assignees` | array | no | New assignee UUIDs (replaces existing) |
| `labels` | array | no | New label UUIDs (replaces existing) |
| `start_date` | string | no | New start date |
| `target_date` | string | no | New due date |
| `parent` | string | no | New parent issue UUID |

### Example

```lua
local issue = app.integrations.plane.update_issue({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  issue_id = "xyz-456-ghi",
  state = "done-state-uuid",
  priority = "low"
})

print("Updated issue #" .. issue.sequence_id)
```

---

## delete_issue

Delete an issue permanently.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |
| `issue_id` | string | yes | Issue UUID |

### Example

```lua
local result = app.integrations.plane.delete_issue({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  issue_id = "xyz-456-ghi"
})

print("Deleted: " .. tostring(result.deleted))
```

---

## list_cycles

List all cycles in a project.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |

### Example

```lua
local result = app.integrations.plane.list_cycles({
  workspace_slug = "my-team",
  project_id = "abc-123-def"
})

for _, cycle in ipairs(result.cycles) do
  print(cycle.name .. " (" .. (cycle.start_date or "?") .. " → " .. (cycle.end_date or "?") .. ")")
end
```

---

## add_issue_to_cycle

Add an issue to a cycle.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |
| `cycle_id` | string | yes | Cycle UUID |
| `issue_id` | string | yes | Issue UUID |

### Example

```lua
local result = app.integrations.plane.add_issue_to_cycle({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  cycle_id = "cycle-uuid-here",
  issue_id = "issue-uuid-here"
})

print("Added to cycle: " .. tostring(result.added))
```

---

## list_modules

List all modules in a project.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |

### Example

```lua
local result = app.integrations.plane.list_modules({
  workspace_slug = "my-team",
  project_id = "abc-123-def"
})

for _, mod in ipairs(result.modules) do
  print(mod.name .. " — status: " .. (mod.status or "none"))
end
```

---

## add_issue_to_module

Add an issue to a module.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |
| `module_id` | string | yes | Module UUID |
| `issue_id` | string | yes | Issue UUID |

### Example

```lua
local result = app.integrations.plane.add_issue_to_module({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  module_id = "module-uuid-here",
  issue_id = "issue-uuid-here"
})

print("Added to module: " .. tostring(result.added))
```

---

## list_members

List members of a workspace or project.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | no | Project UUID (if omitted, lists workspace members) |

### Example

```lua
-- List workspace members
local result = app.integrations.plane.list_members({
  workspace_slug = "my-team"
})

-- List project members only
local result = app.integrations.plane.list_members({
  workspace_slug = "my-team",
  project_id = "abc-123-def"
})

for _, member in ipairs(result.members) do
  print(member.display_name .. " <" .. (member.email or "") .. "> — " .. (member.role or ""))
end
```

---

---

## list_states

List workflow states in a project. Use state UUIDs when creating or updating issues.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |

### Example

```lua
local result = app.integrations.plane.list_states({
  workspace_slug = "my-team",
  project_id = "abc-123-def"
})

for _, state in ipairs(result.states) do
  print(state.name .. " [" .. (state.group or "") .. "] = " .. state.id)
end
```

---

## list_labels

List labels in a project. Use label UUIDs when creating or updating issues.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |

### Example

```lua
local result = app.integrations.plane.list_labels({
  workspace_slug = "my-team",
  project_id = "abc-123-def"
})

for _, label in ipairs(result.labels) do
  print(label.name .. " (color: " .. (label.color or "?") .. ") = " .. label.id)
end
```

---

## create_comment

Add a comment to an issue.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |
| `issue_id` | string | yes | Issue UUID |
| `comment_html` | string | yes | Comment content in HTML format |

### Example

```lua
local result = app.integrations.plane.create_comment({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  issue_id = "xyz-456-ghi",
  comment_html = "<p>Investigating — looks like a redirect config issue.</p>"
})

print("Comment created: " .. result.id)
```

---

## list_comments

List all comments on an issue.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |
| `issue_id` | string | yes | Issue UUID |

### Example

```lua
local result = app.integrations.plane.list_comments({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  issue_id = "xyz-456-ghi"
})

for _, comment in ipairs(result.comments) do
  print("[" .. (comment.created_at or "") .. "] " .. (comment.comment_html or ""))
end
```

---

## search_issues

Search issues across all projects in a workspace.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `search` | string | yes | Search query |
| `project` | string | no | Filter by project UUID |
| `state` | string | no | Filter by state UUID |
| `priority` | string | no | Filter by priority |
| `assignee` | string | no | Filter by assignee UUID |

### Example

```lua
local result = app.integrations.plane.search_issues({
  workspace_slug = "my-team",
  search = "login bug"
})

for _, issue in ipairs(result.issues) do
  print("#" .. (issue.sequence_id or "?") .. " " .. issue.name)
end
```

---

## get_project

Get detailed information about a project.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |

### Example

```lua
local project = app.integrations.plane.get_project({
  workspace_slug = "my-team",
  project_id = "abc-123-def"
})

print(project.name .. " (" .. project.identifier .. ")")
print("Active: " .. tostring(project.is_active))
```

---

## create_project

Create a new project in a workspace.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `name` | string | yes | Project name |
| `identifier` | string | yes | Short code (max 12 chars, e.g., `"PROJ"`) |
| `description` | string | no | Project description |
| `cover_image` | string | no | Cover image URL |
| `project_lead` | string | no | UUID of project lead |
| `default_assignee` | string | no | UUID of default assignee |

### Example

```lua
local project = app.integrations.plane.create_project({
  workspace_slug = "my-team",
  name = "Website Redesign",
  identifier = "REDESIGN",
  description = "Full redesign of the marketing website"
})

print("Created project: " .. project.name .. " (" .. project.identifier .. ")")
```

---

## list_issue_activities

List activity/audit events on an issue.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |
| `issue_id` | string | yes | Issue UUID |

### Example

```lua
local result = app.integrations.plane.list_issue_activities({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  issue_id = "xyz-456-ghi"
})

for _, act in ipairs(result.activities) do
  print((act.created_at or "") .. " — " .. (act.action or "") .. " " .. (act.field or ""))
end
```

---

## create_issue_link

Attach an external link to an issue.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |
| `issue_id` | string | yes | Issue UUID |
| `title` | string | yes | Display title for the link |
| `url` | string | yes | The URL to link to |

### Example

```lua
local result = app.integrations.plane.create_issue_link({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  issue_id = "xyz-456-ghi",
  title = "Design mockup",
  url = "https://figma.com/file/abc123"
})

print("Link added: " .. result.title)
```

---

## list_issue_relations

List relations on an issue (blocking, duplicate, etc.).

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |
| `issue_id` | string | yes | Issue UUID |

### Relation Types

`blocking`, `blocked_by`, `duplicate`, `relates_to`, `start_before`, `start_after`, `finish_before`, `finish_after`

### Example

```lua
local result = app.integrations.plane.list_issue_relations({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  issue_id = "xyz-456-ghi"
})

for _, rel in ipairs(result.relations) do
  print(rel.relation_type .. " → " .. (rel.related_issue or "?"))
end
```

---

## get_current_user

Get the currently authenticated Plane.so user. Useful for verifying credentials.
On self-hosted deployments where the user endpoint is unavailable, this falls back to a workspace access probe and returns `workspace_slug` with a synthetic display name.

### Parameters

None.

### Example

```lua
local user = app.integrations.plane.get_current_user()

print(user.display_name .. " <" .. (user.email or "") .. ">")
print("User ID: " .. user.id)
```

---

## get_cycle

Get details of a specific cycle.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |
| `cycle_id` | string | yes | Cycle UUID |

### Example

```lua
local cycle = app.integrations.plane.get_cycle({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  cycle_id = "cycle-uuid"
})

print(cycle.name .. ": " .. (cycle.start_date or "?") .. " → " .. (cycle.end_date or "?"))
print("Active: " .. tostring(cycle.is_active))
```

---

## create_cycle

Create a new cycle (sprint) in a project.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |
| `name` | string | no | Cycle name (e.g., `"Sprint 14"`) |
| `description` | string | no | Cycle description |
| `start_date` | string | no | Start date (YYYY-MM-DD) |
| `end_date` | string | no | End date (YYYY-MM-DD) |

### Example

```lua
local cycle = app.integrations.plane.create_cycle({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  name = "Sprint 15",
  start_date = "2026-04-14",
  end_date = "2026-04-28"
})

print("Created cycle: " .. (cycle.name or "unnamed"))
```

---

## get_module

Get details of a specific module.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |
| `module_id` | string | yes | Module UUID |

### Example

```lua
local mod = app.integrations.plane.get_module({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  module_id = "module-uuid"
})

print(mod.name .. " — status: " .. (mod.status or "none"))
```

---

## create_module

Create a new module in a project.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |
| `name` | string | yes | Module name |
| `description` | string | no | Module description |
| `status` | string | no | Module status |
| `start_date` | string | no | Start date (YYYY-MM-DD) |
| `target_date` | string | no | Target date (YYYY-MM-DD) |

### Example

```lua
local mod = app.integrations.plane.create_module({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  name = "Authentication System",
  description = "OAuth2 + SSO integration",
  target_date = "2026-05-01"
})

print("Created module: " .. mod.name)
```

---

## create_state

Create a workflow state in a project.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |
| `name` | string | yes | State name (e.g., `"In Review"`) |
| `group` | string | yes | One of: `backlog`, `unstarted`, `started`, `completed`, `cancelled` |
| `color` | string | no | Hex color code (e.g., `"#FF5733"`) |
| `description` | string | no | State description |
| `slug` | string | no | URL-friendly slug |

### Example

```lua
local state = app.integrations.plane.create_state({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  name = "Ready for QA",
  group = "started",
  color = "#FFA500"
})

print("Created state: " .. state.name .. " [" .. state.group .. "] = " .. state.id)
```

---

## create_label

Create a label in a project.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |
| `name` | string | yes | Label name |
| `color` | string | no | Hex color code |
| `description` | string | no | Label description |
| `parent` | string | no | Parent label UUID for hierarchy |

### Example

```lua
local label = app.integrations.plane.create_label({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  name = "bug",
  color = "#FF0000"
})

print("Created label: " .. label.name .. " = " .. label.id)
```

---

## archive_project

Archive a project. Hidden from active views but data is retained.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |

### Example

```lua
local result = app.integrations.plane.archive_project({
  workspace_slug = "my-team",
  project_id = "abc-123-def"
})

print("Archived: " .. tostring(result.archived))
```

---

## list_pages

List pages in a project. Pages are Notion-like documents.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |

### Example

```lua
local result = app.integrations.plane.list_pages({
  workspace_slug = "my-team",
  project_id = "abc-123-def"
})

for _, page in ipairs(result.pages) do
  print(page.name .. " (updated: " .. (page.updated_at or "?") .. ")")
end
```

---

## get_page

Get full content of a page.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |
| `page_id` | string | yes | Page UUID |

### Example

```lua
local page = app.integrations.plane.get_page({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  page_id = "page-uuid"
})

print(page.name)
print(page.description_html)
```

---

## create_page

Create a new page in a project.

### Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug |
| `project_id` | string | yes | Project UUID |
| `name` | string | yes | Page title |
| `description_html` | string | no | Page content in HTML |

### Example

```lua
local page = app.integrations.plane.create_page({
  workspace_slug = "my-team",
  project_id = "abc-123-def",
  name = "API Design Notes",
  description_html = "<h2>Endpoints</h2><p>POST /api/v1/users</p>"
})

print("Created page: " .. page.name .. " = " .. page.id)
```

---

## Webhooks

The `plane_webhook` trigger receives Plane.so workspace events. Configure it with a workspace slug and optional project scope.

### Trigger Parameters

| Name | Type | Required | Description |
|------|------|----------|-------------|
| `workspace_slug` | string | yes | Workspace slug to listen on |
| `project_id` | string | no | Scope to a specific project |

---

## Multi-Account Usage

If you have multiple Plane.so accounts configured, use account-specific namespaces:

```lua
-- Default account (always works)
app.integrations.plane.list_workspaces()

-- Explicit default (portable across setups)
app.integrations.plane.default.list_workspaces()

-- Named accounts
app.integrations.plane.self_hosted.list_workspaces()
app.integrations.plane.cloud.list_workspaces()
```

All functions are identical across accounts — only the credentials differ.
Metadata-derived Lua example
local result = app.integrations.plane.list_workspaces({})
print(result)

Functions

list_workspaces Read

List all Plane.so workspaces the authenticated user belongs to. Returns workspace slug, name, and owner info. Use the slug to reference workspaces in other tools.

Lua path
app.integrations.plane.list_workspaces
Full name
plane.plane_list_workspaces
ParameterTypeRequiredDescription
No parameters.
list_projects Read

List all projects in a Plane.so workspace. Returns project ID, name, identifier, description, and status. Use the project ID to reference projects in other tools.

Lua path
app.integrations.plane.list_projects
Full name
plane.plane_list_projects
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug (e.g., "my-team").
get_project Read

Get detailed information about a Plane.so project, including name, identifier, description, status, dates, and settings.

Lua path
app.integrations.plane.get_project
Full name
plane.plane_get_project
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
create_project Write

Create a new project in a Plane.so workspace. Requires a name and identifier (short code, e.g., "PROJ"). Optionally set description, cover image, project lead, and default assignee.

Lua path
app.integrations.plane.create_project
Full name
plane.plane_create_project
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
name string yes Project name.
identifier string yes Short identifier for the project (e.g., "PROJ", max 12 chars).
description string no Project description.
cover_image string no URL for the project cover image.
project_lead string no UUID of the project lead member.
default_assignee string no UUID of the default assignee for new issues.
archive_project Write

Archive a Plane.so project. Archived projects are hidden from active views but retain all data.

Lua path
app.integrations.plane.archive_project
Full name
plane.plane_archive_project
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID to archive.
list_issues Read

List issues in a Plane.so project. Supports filtering by state, priority, assignee, labels, and more. Returns issue ID, name, sequence ID, state, priority, assignees, labels, start/target dates, and created date.

Lua path
app.integrations.plane.list_issues
Full name
plane.plane_list_issues
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
state string no Filter by state UUID.
priority string no Filter by priority: urgent, high, medium, low, none.
assignee string no Filter by assignee UUID.
labels string no Comma-separated label UUIDs to filter by.
search string no Search query to filter issues by name.
parent string no Filter by parent issue UUID.
cycle string no Filter by cycle UUID.
module string no Filter by module UUID.
search_issues Read

Search issues across all projects in a Plane.so workspace. Provide a search query to find issues by name or description. Optionally filter by project, state, priority, or assignee.

Lua path
app.integrations.plane.search_issues
Full name
plane.plane_search_issues
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
search string yes Search query to find issues.
project string no Filter by project UUID.
state string no Filter by state UUID.
priority string no Filter by priority: urgent, high, medium, low, none.
assignee string no Filter by assignee UUID.
get_issue Read

Get detailed information about a single Plane.so issue, including description, state, priority, assignees, labels, dates, and relations. The issue_id may be a UUID or an issue reference like KOS-55 on Plane deployments that support it.

Lua path
app.integrations.plane.get_issue
Full name
plane.plane_get_issue
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
issue_id string yes The issue UUID or reference (for example KOS-55).
create_issue Write

Create a new issue in a Plane.so project. Requires a title. Optionally set description (HTML), state, priority, assignees, labels, start/target dates, and parent issue.

Lua path
app.integrations.plane.create_issue
Full name
plane.plane_create_issue
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
name string yes Issue title.
description_html string no Issue description in HTML format.
state string no State UUID to set the initial status.
priority string no Priority level: urgent, high, medium, low, none.
assignees array no Array of user UUIDs to assign.
labels array no Array of label UUIDs.
start_date string no Start date (YYYY-MM-DD).
target_date string no Target/due date (YYYY-MM-DD).
parent string no Parent issue UUID for sub-issues.
update_issue Write

Update an existing Plane.so issue. Provide only the fields you want to change — name, description, state, priority, assignees, labels, dates, or parent.

Lua path
app.integrations.plane.update_issue
Full name
plane.plane_update_issue
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
issue_id string yes The issue UUID.
name string no New issue title.
description_html string no New description in HTML format.
state string no New state UUID.
priority string no New priority: urgent, high, medium, low, none.
assignees array no New array of assignee UUIDs (replaces existing).
labels array no New array of label UUIDs (replaces existing).
start_date string no New start date (YYYY-MM-DD).
target_date string no New target/due date (YYYY-MM-DD).
parent string no New parent issue UUID.
delete_issue Write

Delete an issue from a Plane.so project. This action is permanent and cannot be undone.

Lua path
app.integrations.plane.delete_issue
Full name
plane.plane_delete_issue
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
issue_id string yes The issue UUID to delete.
create_comment Write

Add a comment to a Plane.so issue. The comment body should be provided in HTML format.

Lua path
app.integrations.plane.create_comment
Full name
plane.plane_create_comment
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
issue_id string yes The issue UUID.
comment_html string yes Comment content in HTML format.
list_comments Read

List all comments on a Plane.so issue. Returns comment ID, content, author, and timestamps.

Lua path
app.integrations.plane.list_comments
Full name
plane.plane_list_comments
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
issue_id string yes The issue UUID.
list_cycles Read

List all cycles in a Plane.so project. Returns cycle ID, name, start/end dates, and progress info.

Lua path
app.integrations.plane.list_cycles
Full name
plane.plane_list_cycles
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
get_cycle Read

Get detailed information about a Plane.so cycle, including name, description, start/end dates, and status.

Lua path
app.integrations.plane.get_cycle
Full name
plane.plane_get_cycle
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
cycle_id string yes The cycle UUID.
create_cycle Write

Create a new cycle (sprint) in a Plane.so project. Optionally set name, description, and date range.

Lua path
app.integrations.plane.create_cycle
Full name
plane.plane_create_cycle
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
name string no Cycle name (e.g., "Sprint 14").
description string no Cycle description.
start_date string no Start date (YYYY-MM-DD).
end_date string no End date (YYYY-MM-DD).
add_issue_cycle Write

Add an existing issue to a Plane.so cycle. The issue will be tracked within the cycle's sprint/iteration.

Lua path
app.integrations.plane.add_issue_cycle
Full name
plane.plane_add_issue_to_cycle
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
cycle_id string yes The cycle UUID.
issue_id string yes The issue UUID to add to the cycle.
list_modules Read

List all modules in a Plane.so project. Modules group related issues together (e.g., "Auth System", "Payment Integration"). Returns module ID, name, description, status, and dates.

Lua path
app.integrations.plane.list_modules
Full name
plane.plane_list_modules
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
get_module Read

Get detailed information about a Plane.so module, including name, description, status, dates, and team.

Lua path
app.integrations.plane.get_module
Full name
plane.plane_get_module
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
module_id string yes The module UUID.
create_module Write

Create a new module in a Plane.so project. Modules group related issues together (e.g., "Auth System", "Payment Integration"). Optionally set description, status, and date range.

Lua path
app.integrations.plane.create_module
Full name
plane.plane_create_module
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
name string yes Module name.
description string no Module description.
status string no Module status (e.g., "planning", "in_progress", "completed").
start_date string no Start date (YYYY-MM-DD).
target_date string no Target date (YYYY-MM-DD).
add_issue_module Write

Add an existing issue to a Plane.so module. Modules group related issues for feature-based organization.

Lua path
app.integrations.plane.add_issue_module
Full name
plane.plane_add_issue_to_module
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
module_id string yes The module UUID.
issue_id string yes The issue UUID to add to the module.
list_states Read

List all workflow states in a Plane.so project. Returns state UUID, name, group (backlog/unstarted/started/completed/cancelled), and color. Use state UUIDs when creating or updating issues.

Lua path
app.integrations.plane.list_states
Full name
plane.plane_list_states
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
create_state Write

Create a new workflow state in a Plane.so project. States represent issue statuses (e.g., "In Review", "Ready for QA"). Requires a name and group (backlog, unstarted, started, completed, cancelled). Optionally set color and description.

Lua path
app.integrations.plane.create_state
Full name
plane.plane_create_state
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
name string yes State name (e.g., "In Review").
group string yes State group: backlog, unstarted, started, completed, cancelled.
color string no Hex color code (e.g., "#FF5733").
description string no State description.
slug string no URL-friendly slug (auto-generated if omitted).
list_labels Read

List all labels in a Plane.so project. Returns label UUID, name, color, and parent label. Use label UUIDs when creating or updating issues.

Lua path
app.integrations.plane.list_labels
Full name
plane.plane_list_labels
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
create_label Write

Create a new label in a Plane.so project. Labels categorize issues (e.g., "bug", "feature", "urgent"). Requires a name. Optionally set color (hex) and description. Supports hierarchical labels via parent UUID.

Lua path
app.integrations.plane.create_label
Full name
plane.plane_create_label
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
name string yes Label name.
color string no Hex color code (e.g., "#FF5733").
description string no Label description.
parent string no Parent label UUID for hierarchical labels.
list_pages Read

List all pages in a Plane.so project. Pages are Notion-like documents for notes, specs, and documentation. Returns page ID, name, description, and ownership info.

Lua path
app.integrations.plane.list_pages
Full name
plane.plane_list_pages
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
get_page Read

Get detailed content of a Plane.so page, including the full HTML description.

Lua path
app.integrations.plane.get_page
Full name
plane.plane_get_page
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
page_id string yes The page UUID.
create_page Write

Create a new page in a Plane.so project. Pages are Notion-like documents for notes, specs, and documentation. Requires a name. Optionally set HTML content.

Lua path
app.integrations.plane.create_page
Full name
plane.plane_create_page
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
name string yes Page title.
description_html string no Page content in HTML format.
list_issue_activities Read

List activity/audit events on a Plane.so issue. Returns changes made to the issue (state changes, assignments, updates, comments) with who made them and when.

Lua path
app.integrations.plane.list_issue_activities
Full name
plane.plane_list_issue_activities
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
issue_id string yes The issue UUID.
list_issue_relations Read

List all relations on a Plane.so issue. Relations describe how issues connect: blocking, blocked_by, duplicate, relates_to, start_before, start_after, finish_before, finish_after.

Lua path
app.integrations.plane.list_issue_relations
Full name
plane.plane_list_issue_relations
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string yes The project UUID.
issue_id string yes The issue UUID.
list_members Read

List members of a Plane.so workspace or project. If project_id is provided, returns project members only; otherwise returns all workspace members. Returns member ID, display name, email, and role.

Lua path
app.integrations.plane.list_members
Full name
plane.plane_list_members
ParameterTypeRequiredDescription
workspace_slug string no The workspace slug.
project_id string no Optional project UUID to list project-specific members.
get_current_user Read

Get the currently authenticated Plane.so user. Returns user ID, display name, email, and avatar. Useful for verifying API credentials and identifying the current user context. On some self-hosted Plane deployments where the user endpoint is unavailable, this falls back to verifying workspace-scoped access.

Lua path
app.integrations.plane.get_current_user
Full name
plane.plane_get_current_user
ParameterTypeRequiredDescription
No parameters.