makeplane / makeplane/plane-mcp-server
404 on work_items / milestones tools against self-hosted Plane v1.0.0 — SDK calls /work-items/ but instance exposes /issues/
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 325
- Forks
- 178
- Avg merge
- 1d 12h
- Merged PRs (30d)
- 2
Description
Summary
When using plane-mcp-server v0.2.8 against a self-hosted Plane Community Edition v1.0.0 instance (image artifacts.plane.so/makeplane/plane-backend:v1.0.0), every work_items / milestones tool returns HTTP 404 because the underlying plane-sdk calls /work-items/ and /milestones/ endpoints that don't exist on the v1.0.0 API surface — which still exposes the canonical /issues/ and (no) /milestones/.
Affected endpoints (404)
create_work_item,list_work_items(project + workspace scope)retrieve_work_item,update_work_item,delete_work_itemcreate_milestone,list_milestonesget_workspace_features
Endpoints that DO work (legacy paths preserved)
create_project,list_projectscreate_state,list_statescreate_label,list_labelscreate_module,list_moduleslist_cyclesget_workspace_members
Reproduction
- Self-host Plane CE v1.0.0 (Docker images
artifacts.plane.so/makeplane/plane-{backend,frontend,proxy,admin,space,live}:v1.0.0) - Generate an API key (
plane_api_xxx…) - Configure
plane-mcp-serverv0.2.8 withPLANE_API_KEY+PLANE_WORKSPACE_SLUG+PLANE_BASE_URL - Call any work_item tool → 404
- Verify directly with curl:
# 200 ✓ — what Plane v1.0.0 exposes
curl -H "X-Api-Key: $PLANE_API_KEY" \
"$PLANE_BASE_URL/api/v1/workspaces/$SLUG/projects/$PID/issues/"
# 404 ✗ — what the SDK calls
curl -H "X-Api-Key: $PLANE_API_KEY" \
"$PLANE_BASE_URL/api/v1/workspaces/$SLUG/projects/$PID/work-items/"
Root cause (SDK source)
plane-sdk/plane/api/work_items/base.py:45 and following construct URLs like:
/workspaces/{slug}/projects/{pid}/work-items
/workspaces/{slug}/work-items/search
/workspaces/{slug}/work-items/advanced-search
These match the renamed UI endpoints in Plane Cloud / newer versions, but the publicly exposed REST API of Plane v1.0.0 CE still uses /issues/ (and does not expose milestones at all via REST).
Suggested fix
Either:
- Add a version-detection branch in
plane-sdkthat falls back to/issues/when API returns 404 on/work-items/, or - Document a compat env flag (
PLANE_USE_LEGACY_ISSUES_ENDPOINT=1) for self-hosted v1.0.0 instances, or - Pin the SDK URL pattern based on the Plane server version (which is queryable at
/)
Workaround currently in production
Internal REST helper bypassing the MCP for work-items, hitting /issues/ directly:
https://github.com/healdigital/Paperclip/blob/main/companies/heal-sarl/scripts/plane-rest-helper.sh
(used to bootstrap 4 production projects with 44 work items today, all created successfully)
Environment
- Plane CE: v1.0.0 (self-hosted on Coolify)
- plane-mcp-server: v0.2.8 (via uvx)
- plane-sdk: v0.2.6
- Client: Claude Code (Anthropic Agent SDK)
- Date: 2026-05-18
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in plane-sdk/plane/api/work_items/base.py at line 45 and reproduce the mismatch with the documented curl requests against a Plane CE v1.0.0 instance. Completion should cover the affected work-item calls using the exposed /issues/ paths and define an explicit outcome for milestones, which v1.0.0 does not expose, while preserving compatibility with newer paths.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- docker, python
- Domain
- api, backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 52/100