Skip to content

list_projects and get_workspace_members call Cloud-only *-lite endpoints → HTTP 404 on self-hosted Community Edition #188

Description

@DavidPivert

Summary

On a self-hosted Plane Community Edition instance, list_projects and get_workspace_members always fail with HTTP 404: Not Found, even though authentication is valid and every other tool works. The root cause is that these two tools call the *-lite SDK variants, which hit endpoints (/projects-lite/, /members-lite/) that do not exist in Community Edition. The standard, non-lite endpoints (/projects/, /members/) are present and return 200.

This effectively breaks project/member discovery for every self-hosted CE user — which is often the first thing an agent calls before doing anything useful.

Environment

  • plane-mcp-server: v0.2.11 (installed from the v0.2.11 git tag)
  • plane-sdk: 0.2.20
  • Plane instance: Community Edition v1.3.1 (latest CE at time of writing), self-hosted via Docker Compose
  • Transport: stdio
  • Auth: X-API-Key (PAT), PLANE_BASE_URL = instance origin (no /api suffix), valid PLANE_WORKSPACE_SLUG

Reproduction

Call list_projects (no args) against a self-hosted CE workspace:

Error: HTTP 404: Not Found: Page not found.

Same for get_workspace_members.

Meanwhile retrieve_project, create_work_item, list_work_items, etc. (anything scoped by an explicit project_id) all succeed against the same instance with the same credentials — so it is not auth, not the base URL, and not the workspace slug.

Root cause

The two failing tools call the *-lite SDK methods:

  • plane_mcp/tools/projects.pylist_projects calls client.projects.list_lite(...)
  • plane_mcp/tools/workspaces.pyget_workspace_members calls client.workspaces.get_members_lite(...)

In plane-sdk (plane/api/projects.py, plane/api/workspaces.py) those resolve to:

  • list_lite()GET /api/v1/workspaces/{slug}/projects-lite/
  • get_members_lite()GET /api/v1/workspaces/{slug}/members-lite/

The SDK also exposes the non-lite equivalents, which CE serves:

  • list()GET /api/v1/workspaces/{slug}/projects/
  • get_members()GET /api/v1/workspaces/{slug}/members/

Evidence (direct curl against the same instance, same PAT)

Endpoint HTTP
GET /api/v1/workspaces/{slug}/projects/ 200 (returns all projects)
GET /api/v1/workspaces/{slug}/projects-lite/ 404
GET /api/v1/workspaces/{slug}/members/ 200 (returns all members)
GET /api/v1/workspaces/{slug}/members-lite/ 404

So the -lite endpoints appear to be Cloud/commercial-only; they are absent from Community Edition (including the latest v1.3.1).

Expected behavior

list_projects and get_workspace_members should work against a self-hosted Community Edition instance.

Suggested fixes (any of)

  1. Use the non-lite endpoints (.list() / .get_members()) for these tools. The lite responses are only a trimmed field set; the standard endpoints already return a superset and work everywhere.
  2. Fall back to non-lite on 404 — try *-lite, and if the instance returns 404, retry the standard endpoint. Keeps the Cloud optimization while staying CE-compatible.
  3. Make lite opt-in via an env flag (e.g. PLANE_USE_LITE_ENDPOINTS=false), defaulting to the widely-available endpoints.

Option 1 or 2 would be the least surprising for self-hosted users.

Impact

Any self-hosted Community Edition deployment. Project and member listing are discovery primitives — when they 404, agents can't enumerate what exists and tend to dead-end before reaching the tools that do work. A workaround exists (pass a known project_id directly to retrieve_project / create_work_item / list_work_items), but it requires the caller to already know the UUIDs the listing tools are supposed to provide.

Happy to test a patch against a live CE v1.3.1 instance.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions