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.py → list_projects calls client.projects.list_lite(...)
plane_mcp/tools/workspaces.py → get_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)
- 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.
- 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.
- 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.
Summary
On a self-hosted Plane Community Edition instance,
list_projectsandget_workspace_membersalways fail withHTTP 404: Not Found, even though authentication is valid and every other tool works. The root cause is that these two tools call the*-liteSDK 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 return200.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 thev0.2.11git tag)plane-sdk: 0.2.20stdioX-API-Key(PAT),PLANE_BASE_URL= instance origin (no/apisuffix), validPLANE_WORKSPACE_SLUGReproduction
Call
list_projects(no args) against a self-hosted CE workspace:Same for
get_workspace_members.Meanwhile
retrieve_project,create_work_item,list_work_items, etc. (anything scoped by an explicitproject_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
*-liteSDK methods:plane_mcp/tools/projects.py→list_projectscallsclient.projects.list_lite(...)plane_mcp/tools/workspaces.py→get_workspace_memberscallsclient.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
curlagainst the same instance, same PAT)GET /api/v1/workspaces/{slug}/projects/GET /api/v1/workspaces/{slug}/projects-lite/GET /api/v1/workspaces/{slug}/members/GET /api/v1/workspaces/{slug}/members-lite/So the
-liteendpoints appear to be Cloud/commercial-only; they are absent from Community Edition (including the latest v1.3.1).Expected behavior
list_projectsandget_workspace_membersshould work against a self-hosted Community Edition instance.Suggested fixes (any of)
.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.*-lite, and if the instance returns 404, retry the standard endpoint. Keeps the Cloud optimization while staying CE-compatible.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_iddirectly toretrieve_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.