Skip to content

feat: add epic tools for managing epics#63

Open
jessedijkstra wants to merge 1 commit intomakeplane:canaryfrom
osedudev:feature/epics
Open

feat: add epic tools for managing epics#63
jessedijkstra wants to merge 1 commit intomakeplane:canaryfrom
osedudev:feature/epics

Conversation

@jessedijkstra
Copy link

@jessedijkstra jessedijkstra commented Feb 9, 2026

Summary

  • Add MCP tools for epic management: list_epics, create_epic, update_epic, and retrieve_epic
  • Include integration tests for epic operations (create, list, update, delete, parent relationships)
  • Add mise.toml for uv version pinning (0.9.18)

Test plan

  • Run integration tests with uv run pytest tests/test_integration.py
  • Verify epic tools are registered correctly
  • Test epic CRUD operations against a Plane instance

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Epic management: create, list, retrieve, update, and delete epics; assign work items to epics.
  • Chores

    • Added a new configuration file specifying a development tool version.
  • Tests

    • Extended integration tests to cover epic lifecycle, assignment, listing, deletion, and cleanup.

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

📝 Walkthrough

Walkthrough

Adds Epic management: new plane_mcp/tools/epics.py providing CRUD tool registrations, registers those tools in plane_mcp/tools/__init__.py, adds mise.toml, and extends integration tests to exercise epic workflows.

Changes

Cohort / File(s) Summary
Configuration
mise.toml
New config file with [tools] and uv = "0.9.18".
Tool registration
plane_mcp/tools/__init__.py
Imports and calls register_epic_tools(mcp) to register epic-related tools at startup.
Epic Tools Implementation
plane_mcp/tools/epics.py
New module adding register_epic_tools(mcp) and tool handlers: list_epics, retrieve_epic, create_epic, update_epic, delete_epic; includes helper to resolve epic work item type and priority validation against PriorityEnum.
Integration tests
tests/test_integration.py
Extended integration test to cover epic lifecycle (create, associate, list, delete); updated EXPECTED_TOOLS to include epic tool names and added related prints/logging.

Sequence Diagram(s)

sequenceDiagram
    participant Test as Integration Test
    participant MCP as MCP Server
    participant Client as Plane Client
    participant API as Plane API

    rect rgba(200,200,255,0.5)
    Test->>MCP: register_epic_tools()
    MCP->>MCP: register tool endpoints
    end

    rect rgba(200,255,200,0.5)
    Test->>MCP: create_epic(project_id, payload)
    MCP->>Client: resolve epic work item type
    Client->>API: GET work item types
    API-->>Client: types list
    Client-->>MCP: type ID
    MCP->>Client: create work item (epic)
    Client->>API: POST work item
    API-->>Client: created work item
    Client-->>MCP: Epic object
    MCP-->>Test: return Epic
    end

    rect rgba(255,240,200,0.5)
    Test->>MCP: list_epics(project_id, params)
    MCP->>Client: list work items filtered by epic type
    Client->>API: GET paginated work items
    API-->>Client: paginated epics
    Client-->>MCP: PaginatedEpicResponse
    MCP-->>Test: epic list
    end

    rect rgba(255,200,200,0.5)
    Test->>MCP: delete_epic(project_id, epic_id)
    MCP->>Client: delete work item by ID
    Client->>API: DELETE work item
    API-->>Client: deletion confirmed
    Client-->>MCP: success
    MCP-->>Test: deletion acknowledged
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 I hopped in code to add an epic song,

CRUD carrots lined in tidy rows so long,
From type lookup to create, list, and clear,
I nudged the tests to prove the flow is near,
A tiny hop for tools, a leap for workflow cheer!

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main objective of the pull request: adding epic tools for managing epics in the Plane MCP server.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

No actionable comments were generated in the recent review. 🎉

🧹 Recent nitpick comments
plane_mcp/tools/epics.py (1)

145-153: Double API call: creates via work_items.create, then retrieves via epics.retrieve.

create_epic performs two sequential API calls — one to create the work item and another to retrieve it as an Epic. This is presumably needed because the SDK's work_items.create returns a WorkItem, not an Epic. This is acceptable but worth noting: if the Plane API or SDK later supports creating epics directly (returning an Epic), this can be simplified to a single call.

tests/test_integration.py (1)

126-191: Consider adding lightweight assertions to the epic test steps.

The integration test is purely a smoke test — it verifies that calls don't error but doesn't assert on returned data (e.g., that the created epic's name matches, that list_epics contains the created epic). The existing work-item tests follow the same pattern, so this is consistent, but adding a few assertions (even just assert epic_id in [e['id'] for e in epics]) would increase confidence.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

 _________________________________________________________________________________________________________
< If a system is to serve the creative spirit, it must be entirely comprehensible to a single individual. >
 ---------------------------------------------------------------------------------------------------------
  \
   \   (\__/)
       (•ㅅ•)
       /   づ

✏️ Tip: You can disable in-progress messages and the fortune message in your review settings.

Tip

You can enable review details to help with troubleshooting, context usage and more.

Enable the reviews.review_details setting to include review details such as the model used, the time taken for each step and more in the review comments.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

2 similar comments
@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

 _________________________________________________________________________________________________________
< If a system is to serve the creative spirit, it must be entirely comprehensible to a single individual. >
 ---------------------------------------------------------------------------------------------------------
  \
   \   (\__/)
       (•ㅅ•)
       /   づ

✏️ Tip: You can disable in-progress messages and the fortune message in your review settings.

Tip

You can enable review details to help with troubleshooting, context usage and more.

Enable the reviews.review_details setting to include review details such as the model used, the time taken for each step and more in the review comments.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

 _________________________________________________________________________________________________________
< If a system is to serve the creative spirit, it must be entirely comprehensible to a single individual. >
 ---------------------------------------------------------------------------------------------------------
  \
   \   (\__/)
       (•ㅅ•)
       /   づ

✏️ Tip: You can disable in-progress messages and the fortune message in your review settings.

Tip

You can enable review details to help with troubleshooting, context usage and more.

Enable the reviews.review_details setting to include review details such as the model used, the time taken for each step and more in the review comments.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

📝 Walkthrough

Walkthrough

The PR introduces Epic management tooling to the MCP server by adding a new module with list, create, update, and retrieve functions for epics. These tools are registered in the tools initialization and covered by integration tests. The build dependency manager uv is pinned to version 0.9.18.

Changes

Cohort / File(s) Summary
Configuration & Dependency Management
mise.toml
Added uv tool version pinning (0.9.18).
Epic Tools Registration
plane_mcp/tools/__init__.py
Added import and invocation of register_epic_tools to wire epic tools into the MCP server during initialization.
Epic Tools Implementation
plane_mcp/tools/epics.py
New module providing five exported functions: register_epic_tools, list_epics, create_epic, update_epic, and retrieve_epic. Includes helper function to discover epic work item types, priority validation against PriorityEnum, and API interactions with Plane client.
Integration Tests
tests/test_integration.py
Expanded test flow to cover epic lifecycle operations (create, assign as parent, list, delete). Updated EXPECTED_TOOLS to include list_epics, retrieve_epic, create_epic, and update_epic.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Poem

🐰 With epics now woven in thread,
Our tools multiply, carefully bred,
List, create, update with care,
Plane's API made crystal and fair,
Fresh features hop forward ahead! 🎪

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main change: adding epic tools for managing epics, which is the primary focus of all modifications across the codebase.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

3 similar comments
@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

📝 Walkthrough

Walkthrough

The PR introduces Epic management tooling to the MCP server by adding a new module with list, create, update, and retrieve functions for epics. These tools are registered in the tools initialization and covered by integration tests. The build dependency manager uv is pinned to version 0.9.18.

Changes

Cohort / File(s) Summary
Configuration & Dependency Management
mise.toml
Added uv tool version pinning (0.9.18).
Epic Tools Registration
plane_mcp/tools/__init__.py
Added import and invocation of register_epic_tools to wire epic tools into the MCP server during initialization.
Epic Tools Implementation
plane_mcp/tools/epics.py
New module providing five exported functions: register_epic_tools, list_epics, create_epic, update_epic, and retrieve_epic. Includes helper function to discover epic work item types, priority validation against PriorityEnum, and API interactions with Plane client.
Integration Tests
tests/test_integration.py
Expanded test flow to cover epic lifecycle operations (create, assign as parent, list, delete). Updated EXPECTED_TOOLS to include list_epics, retrieve_epic, create_epic, and update_epic.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Poem

🐰 With epics now woven in thread,
Our tools multiply, carefully bred,
List, create, update with care,
Plane's API made crystal and fair,
Fresh features hop forward ahead! 🎪

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main change: adding epic tools for managing epics, which is the primary focus of all modifications across the codebase.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

📝 Walkthrough

Walkthrough

The PR introduces Epic management tooling to the MCP server by adding a new module with list, create, update, and retrieve functions for epics. These tools are registered in the tools initialization and covered by integration tests. The build dependency manager uv is pinned to version 0.9.18.

Changes

Cohort / File(s) Summary
Configuration & Dependency Management
mise.toml
Added uv tool version pinning (0.9.18).
Epic Tools Registration
plane_mcp/tools/__init__.py
Added import and invocation of register_epic_tools to wire epic tools into the MCP server during initialization.
Epic Tools Implementation
plane_mcp/tools/epics.py
New module providing five exported functions: register_epic_tools, list_epics, create_epic, update_epic, and retrieve_epic. Includes helper function to discover epic work item types, priority validation against PriorityEnum, and API interactions with Plane client.
Integration Tests
tests/test_integration.py
Expanded test flow to cover epic lifecycle operations (create, assign as parent, list, delete). Updated EXPECTED_TOOLS to include list_epics, retrieve_epic, create_epic, and update_epic.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Poem

🐰 With epics now woven in thread,
Our tools multiply, carefully bred,
List, create, update with care,
Plane's API made crystal and fair,
Fresh features hop forward ahead! 🎪

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main change: adding epic tools for managing epics, which is the primary focus of all modifications across the codebase.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

📝 Walkthrough

Walkthrough

The PR introduces Epic management tooling to the MCP server by adding a new module with list, create, update, and retrieve functions for epics. These tools are registered in the tools initialization and covered by integration tests. The build dependency manager uv is pinned to version 0.9.18.

Changes

Cohort / File(s) Summary
Configuration & Dependency Management
mise.toml
Added uv tool version pinning (0.9.18).
Epic Tools Registration
plane_mcp/tools/__init__.py
Added import and invocation of register_epic_tools to wire epic tools into the MCP server during initialization.
Epic Tools Implementation
plane_mcp/tools/epics.py
New module providing five exported functions: register_epic_tools, list_epics, create_epic, update_epic, and retrieve_epic. Includes helper function to discover epic work item types, priority validation against PriorityEnum, and API interactions with Plane client.
Integration Tests
tests/test_integration.py
Expanded test flow to cover epic lifecycle operations (create, assign as parent, list, delete). Updated EXPECTED_TOOLS to include list_epics, retrieve_epic, create_epic, and update_epic.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Poem

🐰 With epics now woven in thread,
Our tools multiply, carefully bred,
List, create, update with care,
Plane's API made crystal and fair,
Fresh features hop forward ahead! 🎪

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main change: adding epic tools for managing epics, which is the primary focus of all modifications across the codebase.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🤖 Fix all issues with AI agents
In `@plane_mcp/tools/epics.py`:
- Around line 37-52: Docstrings for list_epics, create_epic, update_epic, and
retrieve_epic contain parameters (workspace_slug, expand, fields, order_by,
external_id, external_source) that are not in those functions' signatures;
update each function's docstring to exactly match its actual parameters and
return description used by the MCP/LLM layer (remove all phantom parameters or
add them only if you also add them to the function signature). Specifically,
edit the docstrings in functions named list_epics, create_epic, update_epic, and
retrieve_epic so the Args section lists only the real parameters present in
their definitions and remove any references to workspace_slug, expand, fields,
order_by, external_id, and external_source unless you also implement those as
real parameters.
- Line 242: The docstring contains a grammar issue: change the text "Retrieve a
epic by ID." to "Retrieve an epic by ID." in the function/class docstring where
that exact string appears (search for the literal "Retrieve a epic by ID." to
locate the docstring to update).
- Line 171: The function's return type annotation is incorrect: it currently
declares WorkItem but actually returns an Epic from client.epics.retrieve(...);
change the function's signature to return Epic (matching create_epic and
retrieve_epic) and update any type imports if necessary so Epic is available in
the module; ensure the docstring/typed usages that expect WorkItem are adjusted
to Epic where this function (which calls client.epics.retrieve) is referenced.
- Around line 118-121: The code currently silently coerces invalid priority
values to None (see the validated_priority assignment using PriorityEnum) which
masks user errors; update both create_epic and update_epic to validate the
incoming priority and raise a ValueError listing allowed values when the
provided priority is not one of get_args(PriorityEnum) instead of assigning
None—use the existing PriorityEnum and get_args(PriorityEnum) to build the error
message so callers/LLM receive actionable feedback.
- Line 114: Check the result of _get_epic_work_item_type_id() before passing it
to CreateWorkItem: if _get_epic_work_item_type_id() returns None, do not call
CreateWorkItem with a None type_id—either raise a clear exception (e.g.,
ValueError with context), log an informative error and return/abort, or fall
back to an explicit default type id. Update the code around the
work_item_type_id variable so CreateWorkItem is only invoked when
work_item_type_id is non-None, and include a descriptive message that references
the workspace and intent to create an epic to aid debugging.

In `@tests/test_integration.py`:
- Around line 126-127: Several print statements (e.g., the call print(f"Creating
epic...") and other print(...) lines flagged by Ruff F541) use f-strings with no
interpolations; remove the unnecessary f prefix so they are plain string
literals. Locate the plain print calls in tests/test_integration.py (the
print(f"...") instances around the epic/work item creation and the other flagged
lines) and change them from f"..." to "..." for each occurrence.
- Around line 163-164: The test assumes extract_result(epics_result) returns a
paginated dict with a "results" key but list_epics actually returns a flat
list[Epic]; update the test to treat epics as a list (e.g., iterate epics or
access epic['id'] directly) or change extract_result to wrap the list in
{"results": ...}; specifically, modify the test lines using epics['results'] to
use epics (the list returned by list_epics) or adjust extract_result so that
when given a list it returns {"results": list} and keep references to list_epics
and extract_result to locate the code.
🧹 Nitpick comments (1)
plane_mcp/tools/epics.py (1)

20-29: _get_epic_work_item_type_id creates its own client context, causing a redundant call.

create_epic calls _get_epic_work_item_type_id() (line 114) which invokes get_plane_client_context(), and then immediately calls it again (line 116). Consider refactoring the helper to accept the client and workspace_slug as parameters, or returning them alongside the type ID.

Comment on lines 37 to 52
"""
List all epics in a project.

Args:
workspace_slug: The workspace slug identifier
project_id: UUID of the project
cursor: Pagination cursor for getting next set of results
per_page: Number of results per page (1-100)
expand: Comma-separated list of related fields to expand in response
fields: Comma-separated list of fields to include in response
order_by: Field to order results by. Prefix with '-' for descending order
external_id: External system identifier for filtering or lookup
external_source: External system source name for filtering or lookup

Returns:
List of WorkItem objects
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Docstring lists parameters not present in the function signature.

The docstring references workspace_slug, expand, fields, order_by, external_id, and external_source, but none of these are actual parameters of list_epics. Since these docstrings serve as tool descriptions for the MCP/LLM layer, phantom parameters will confuse the model. The same issue applies to the docstrings of create_epic (line 93), update_epic (line 176), and retrieve_epic (line 245) which all list workspace_slug.

🤖 Prompt for AI Agents
In `@plane_mcp/tools/epics.py` around lines 37 - 52, Docstrings for list_epics,
create_epic, update_epic, and retrieve_epic contain parameters (workspace_slug,
expand, fields, order_by, external_id, external_source) that are not in those
functions' signatures; update each function's docstring to exactly match its
actual parameters and return description used by the MCP/LLM layer (remove all
phantom parameters or add them only if you also add them to the function
signature). Specifically, edit the docstrings in functions named list_epics,
create_epic, update_epic, and retrieve_epic so the Args section lists only the
real parameters present in their definitions and remove any references to
workspace_slug, expand, fields, order_by, external_id, and external_source
unless you also implement those as real parameters.

Comment on lines +118 to +121
# Validate priority against allowed literal values
validated_priority: PriorityEnum | None = (
priority if priority in get_args(PriorityEnum) else None # type: ignore[assignment]
)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Silent coercion of invalid priority to None can mask user errors.

If a caller passes priority="critical" (an invalid value), it silently becomes None rather than surfacing the mistake. This same pattern is duplicated in update_epic (lines 200-203). Consider raising a ValueError with the allowed values so the LLM/user gets actionable feedback.

Proposed fix (apply similarly in update_epic)
-        validated_priority: PriorityEnum | None = (
-            priority if priority in get_args(PriorityEnum) else None  # type: ignore[assignment]
-        )
+        valid_priorities = get_args(PriorityEnum)
+        if priority is not None and priority not in valid_priorities:
+            raise ValueError(f"Invalid priority '{priority}'. Must be one of: {valid_priorities}")
+        validated_priority: PriorityEnum | None = priority  # type: ignore[assignment]
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# Validate priority against allowed literal values
validated_priority: PriorityEnum | None = (
priority if priority in get_args(PriorityEnum) else None # type: ignore[assignment]
)
# Validate priority against allowed literal values
valid_priorities = get_args(PriorityEnum)
if priority is not None and priority not in valid_priorities:
raise ValueError(f"Invalid priority '{priority}'. Must be one of: {valid_priorities}")
validated_priority: PriorityEnum | None = priority # type: ignore[assignment]
🤖 Prompt for AI Agents
In `@plane_mcp/tools/epics.py` around lines 118 - 121, The code currently silently
coerces invalid priority values to None (see the validated_priority assignment
using PriorityEnum) which masks user errors; update both create_epic and
update_epic to validate the incoming priority and raise a ValueError listing
allowed values when the provided priority is not one of get_args(PriorityEnum)
instead of assigning None—use the existing PriorityEnum and
get_args(PriorityEnum) to build the error message so callers/LLM receive
actionable feedback.

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Caution

Review failed

Failed to post review comments

📝 Walkthrough

Walkthrough

The PR introduces Epic management tooling to the MCP server by adding a new module with list, create, update, and retrieve functions for epics. These tools are registered in the tools initialization and covered by integration tests. The build dependency manager uv is pinned to version 0.9.18.

Changes

Cohort / File(s) Summary
Configuration & Dependency Management
mise.toml
Added uv tool version pinning (0.9.18).
Epic Tools Registration
plane_mcp/tools/__init__.py
Added import and invocation of register_epic_tools to wire epic tools into the MCP server during initialization.
Epic Tools Implementation
plane_mcp/tools/epics.py
New module providing five exported functions: register_epic_tools, list_epics, create_epic, update_epic, and retrieve_epic. Includes helper function to discover epic work item types, priority validation against PriorityEnum, and API interactions with Plane client.
Integration Tests
tests/test_integration.py
Expanded test flow to cover epic lifecycle operations (create, assign as parent, list, delete). Updated EXPECTED_TOOLS to include list_epics, retrieve_epic, create_epic, and update_epic.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Poem

🐰 With epics now woven in thread,
Our tools multiply, carefully bred,
List, create, update with care,
Plane's API made crystal and fair,
Fresh features hop forward ahead! 🎪

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main change: adding epic tools for managing epics, which is the primary focus of all modifications across the codebase.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

3 similar comments
@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Caution

Review failed

Failed to post review comments

📝 Walkthrough

Walkthrough

The PR introduces Epic management tooling to the MCP server by adding a new module with list, create, update, and retrieve functions for epics. These tools are registered in the tools initialization and covered by integration tests. The build dependency manager uv is pinned to version 0.9.18.

Changes

Cohort / File(s) Summary
Configuration & Dependency Management
mise.toml
Added uv tool version pinning (0.9.18).
Epic Tools Registration
plane_mcp/tools/__init__.py
Added import and invocation of register_epic_tools to wire epic tools into the MCP server during initialization.
Epic Tools Implementation
plane_mcp/tools/epics.py
New module providing five exported functions: register_epic_tools, list_epics, create_epic, update_epic, and retrieve_epic. Includes helper function to discover epic work item types, priority validation against PriorityEnum, and API interactions with Plane client.
Integration Tests
tests/test_integration.py
Expanded test flow to cover epic lifecycle operations (create, assign as parent, list, delete). Updated EXPECTED_TOOLS to include list_epics, retrieve_epic, create_epic, and update_epic.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Poem

🐰 With epics now woven in thread,
Our tools multiply, carefully bred,
List, create, update with care,
Plane's API made crystal and fair,
Fresh features hop forward ahead! 🎪

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main change: adding epic tools for managing epics, which is the primary focus of all modifications across the codebase.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Caution

Review failed

Failed to post review comments

📝 Walkthrough

Walkthrough

The PR introduces Epic management tooling to the MCP server by adding a new module with list, create, update, and retrieve functions for epics. These tools are registered in the tools initialization and covered by integration tests. The build dependency manager uv is pinned to version 0.9.18.

Changes

Cohort / File(s) Summary
Configuration & Dependency Management
mise.toml
Added uv tool version pinning (0.9.18).
Epic Tools Registration
plane_mcp/tools/__init__.py
Added import and invocation of register_epic_tools to wire epic tools into the MCP server during initialization.
Epic Tools Implementation
plane_mcp/tools/epics.py
New module providing five exported functions: register_epic_tools, list_epics, create_epic, update_epic, and retrieve_epic. Includes helper function to discover epic work item types, priority validation against PriorityEnum, and API interactions with Plane client.
Integration Tests
tests/test_integration.py
Expanded test flow to cover epic lifecycle operations (create, assign as parent, list, delete). Updated EXPECTED_TOOLS to include list_epics, retrieve_epic, create_epic, and update_epic.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Poem

🐰 With epics now woven in thread,
Our tools multiply, carefully bred,
List, create, update with care,
Plane's API made crystal and fair,
Fresh features hop forward ahead! 🎪

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main change: adding epic tools for managing epics, which is the primary focus of all modifications across the codebase.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Caution

Review failed

Failed to post review comments

📝 Walkthrough

Walkthrough

The PR introduces Epic management tooling to the MCP server by adding a new module with list, create, update, and retrieve functions for epics. These tools are registered in the tools initialization and covered by integration tests. The build dependency manager uv is pinned to version 0.9.18.

Changes

Cohort / File(s) Summary
Configuration & Dependency Management
mise.toml
Added uv tool version pinning (0.9.18).
Epic Tools Registration
plane_mcp/tools/__init__.py
Added import and invocation of register_epic_tools to wire epic tools into the MCP server during initialization.
Epic Tools Implementation
plane_mcp/tools/epics.py
New module providing five exported functions: register_epic_tools, list_epics, create_epic, update_epic, and retrieve_epic. Includes helper function to discover epic work item types, priority validation against PriorityEnum, and API interactions with Plane client.
Integration Tests
tests/test_integration.py
Expanded test flow to cover epic lifecycle operations (create, assign as parent, list, delete). Updated EXPECTED_TOOLS to include list_epics, retrieve_epic, create_epic, and update_epic.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Poem

🐰 With epics now woven in thread,
Our tools multiply, carefully bred,
List, create, update with care,
Plane's API made crystal and fair,
Fresh features hop forward ahead! 🎪

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main change: adding epic tools for managing epics, which is the primary focus of all modifications across the codebase.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: review in progress by coderabbit.ai -->\n\n> [!NOTE]\n> Currently processing new changes in this PR. This may take a few minutes, please wait...\n> \n> \n> \n> ```ascii\n>  ______________________________________________________________________________________________________\n> < Fools ignore complexity. Pragmatists suffer it. Some can avoid it. Geniuses remove it. - Alan Perlis >\n>  ------------------------------------------------------------------------------------------------------\n>   \\\n>    \\   \\\n>         \\ /\\\n>         ( )\n>       .( o ).\n> ```\n> \n> <sub>✏️ Tip: You can disable in-progress messages and the fortune message in your review settings.</sub>\n\n<!-- end of auto-generated comment: review in progress by coderabbit.ai -->\n<!-- usage_tips_start -->\n\n> [!TIP]\n> <details>\n> <summary>CodeRabbit can scan for known vulnerabilities in your dependencies using OSV Scanner.</summary>\n> \n> OSV Scanner will automatically detect and report security vulnerabilities in your project's dependencies. No additional configuration is required.\n> \n> </details>\n\n<!-- usage_tips_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=makeplane/plane-mcp-server&utm_content=63)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:26:52 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"080B:28AB4F:1BDD80:77EA8F:698A0ACB","x-ratelimit-limit":"5950","x-ratelimit-remaining":"5878","x-ratelimit-reset":"1770657610","x-ratelimit-resource":"core","x-ratelimit-used":"72","x-xss-protection":"0"},"data":""}}

3 similar comments
@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: review in progress by coderabbit.ai -->\n\n> [!NOTE]\n> Currently processing new changes in this PR. This may take a few minutes, please wait...\n> \n> \n> \n> ```ascii\n>  ______________________________________________________________________________________________________\n> < Fools ignore complexity. Pragmatists suffer it. Some can avoid it. Geniuses remove it. - Alan Perlis >\n>  ------------------------------------------------------------------------------------------------------\n>   \\\n>    \\   \\\n>         \\ /\\\n>         ( )\n>       .( o ).\n> ```\n> \n> <sub>✏️ Tip: You can disable in-progress messages and the fortune message in your review settings.</sub>\n\n<!-- end of auto-generated comment: review in progress by coderabbit.ai -->\n<!-- usage_tips_start -->\n\n> [!TIP]\n> <details>\n> <summary>CodeRabbit can scan for known vulnerabilities in your dependencies using OSV Scanner.</summary>\n> \n> OSV Scanner will automatically detect and report security vulnerabilities in your project's dependencies. No additional configuration is required.\n> \n> </details>\n\n<!-- usage_tips_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=makeplane/plane-mcp-server&utm_content=63)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:26:52 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"080B:28AB4F:1BDD80:77EA8F:698A0ACB","x-ratelimit-limit":"5950","x-ratelimit-remaining":"5878","x-ratelimit-reset":"1770657610","x-ratelimit-resource":"core","x-ratelimit-used":"72","x-xss-protection":"0"},"data":""}}

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: review in progress by coderabbit.ai -->\n\n> [!NOTE]\n> Currently processing new changes in this PR. This may take a few minutes, please wait...\n> \n> \n> \n> ```ascii\n>  ______________________________________________________________________________________________________\n> < Fools ignore complexity. Pragmatists suffer it. Some can avoid it. Geniuses remove it. - Alan Perlis >\n>  ------------------------------------------------------------------------------------------------------\n>   \\\n>    \\   \\\n>         \\ /\\\n>         ( )\n>       .( o ).\n> ```\n> \n> <sub>✏️ Tip: You can disable in-progress messages and the fortune message in your review settings.</sub>\n\n<!-- end of auto-generated comment: review in progress by coderabbit.ai -->\n<!-- usage_tips_start -->\n\n> [!TIP]\n> <details>\n> <summary>CodeRabbit can scan for known vulnerabilities in your dependencies using OSV Scanner.</summary>\n> \n> OSV Scanner will automatically detect and report security vulnerabilities in your project's dependencies. No additional configuration is required.\n> \n> </details>\n\n<!-- usage_tips_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=makeplane/plane-mcp-server&utm_content=63)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:26:52 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"080B:28AB4F:1BDD80:77EA8F:698A0ACB","x-ratelimit-limit":"5950","x-ratelimit-remaining":"5878","x-ratelimit-reset":"1770657610","x-ratelimit-resource":"core","x-ratelimit-used":"72","x-xss-protection":"0"},"data":""}}

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: review in progress by coderabbit.ai -->\n\n> [!NOTE]\n> Currently processing new changes in this PR. This may take a few minutes, please wait...\n> \n> \n> \n> ```ascii\n>  ______________________________________________________________________________________________________\n> < Fools ignore complexity. Pragmatists suffer it. Some can avoid it. Geniuses remove it. - Alan Perlis >\n>  ------------------------------------------------------------------------------------------------------\n>   \\\n>    \\   \\\n>         \\ /\\\n>         ( )\n>       .( o ).\n> ```\n> \n> <sub>✏️ Tip: You can disable in-progress messages and the fortune message in your review settings.</sub>\n\n<!-- end of auto-generated comment: review in progress by coderabbit.ai -->\n<!-- usage_tips_start -->\n\n> [!TIP]\n> <details>\n> <summary>CodeRabbit can scan for known vulnerabilities in your dependencies using OSV Scanner.</summary>\n> \n> OSV Scanner will automatically detect and report security vulnerabilities in your project's dependencies. No additional configuration is required.\n> \n> </details>\n\n<!-- usage_tips_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=makeplane/plane-mcp-server&utm_content=63)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:26:52 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"080B:28AB4F:1BDD80:77EA8F:698A0ACB","x-ratelimit-limit":"5950","x-ratelimit-remaining":"5878","x-ratelimit-reset":"1770657610","x-ratelimit-resource":"core","x-ratelimit-used":"72","x-xss-protection":"0"},"data":""}}

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nThe pull request introduces Epic management functionality to the Plane MCP server by adding a new dedicated tools module with CRUD operations, registering these operations through the MCP framework, and extending integration tests to validate epic workflows.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Configuration & Setup** <br> `mise.toml`, `plane_mcp/tools/__init__.py`|Added mise.toml specifying uv version 0.9.18; imported and registered epic tools in the tools module initialization.|\n|**Epic Tools Implementation** <br> `plane_mcp/tools/epics.py`|Introduced comprehensive epic management module with register_epic_tools entry point and CRUD operations: list_epics, create_epic, retrieve_epic, update_epic, and delete_epic. Includes internal helper to resolve epic work item type ID and priority validation against PriorityEnum.|\n|**Integration Tests** <br> `tests/test_integration.py`|Extended integration test workflow to create, list, update, and delete epics; added assertions for epic-related tools; updated test sequence and logging to cover epic operations alongside existing work item management.|\n\n## Sequence Diagram(s)\n\n```mermaid\nsequenceDiagram\n    participant Test as Integration Test\n    participant MCP as MCP Server\n    participant Client as Plane Client\n    participant API as Plane API\n\n    Test->>MCP: register_epic_tools()\n    MCP->>MCP: Register epic tool endpoints\n\n    Test->>MCP: create_epic(project_id, ...)\n    MCP->>Client: Get epic work item type ID\n    Client->>API: Query work item types\n    API-->>Client: Return type ID\n    MCP->>Client: Create work item with epic type\n    Client->>API: POST create work item\n    API-->>Client: Return created epic\n    Client-->>MCP: Epic object\n    MCP-->>Test: Epic created\n\n    Test->>MCP: list_epics(project_id)\n    MCP->>Client: List epics for project\n    Client->>API: GET paginated epics\n    API-->>Client: Return epic list\n    Client-->>MCP: PaginatedEpicResponse\n    MCP-->>Test: Epic list\n\n    Test->>MCP: update_epic(project_id, epic_id, ...)\n    MCP->>Client: Update work item\n    Client->>API: PATCH update work item\n    API-->>Client: Updated epic\n    Client-->>MCP: Epic object\n    MCP-->>Test: Epic updated\n\n    Test->>MCP: delete_epic(project_id, epic_id)\n    MCP->>Client: Delete epic by work item ID\n    Client->>API: DELETE work item\n    API-->>Client: Deletion confirmed\n    Client-->>MCP: Success\n    MCP-->>Test: Epic deleted\n```\n\n## Estimated code review effort\n\n🎯 3 (Moderate) | ⏱️ ~20 minutes\n\n## Poem\n\n> 🐰 *Epics now dance in Plane's grand hall,*  \n> *With CRUD operations answering the call,*  \n> *From creation's spark to deletion's grace,*  \n> *Our tools hop through each management space!*  \n> *Work items organized, priorities aligned—*  \n> *A feature-packed feature, refined and refined!* ✨\n\n</details>\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 3</summary>\n\n<details>\n<summary>✅ Passed checks (3 passed)</summary>\n\n|     Check name     | Status   | Explanation                                                                                                |\n| :----------------: | :------- | :--------------------------------------------------------------------------------------------------------- |\n|  Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                |\n|     Title check    | ✅ Passed | The title clearly and concisely describes the main change: adding epic management tools to the MCP server. |\n| Docstring Coverage | ✅ Passed | No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=makeplane/plane-mcp-server&utm_content=63)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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= -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:30:23 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"0866:2ED26A:1183513:4B9C548:698A0B9E","x-ratelimit-limit":"5950","x-ratelimit-remaining":"5856","x-ratelimit-reset":"1770657610","x-ratelimit-resource":"core","x-ratelimit-used":"94","x-xss-protection":"0"},"data":""}}

2 similar comments
@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nThe pull request introduces Epic management functionality to the Plane MCP server by adding a new dedicated tools module with CRUD operations, registering these operations through the MCP framework, and extending integration tests to validate epic workflows.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Configuration & Setup** <br> `mise.toml`, `plane_mcp/tools/__init__.py`|Added mise.toml specifying uv version 0.9.18; imported and registered epic tools in the tools module initialization.|\n|**Epic Tools Implementation** <br> `plane_mcp/tools/epics.py`|Introduced comprehensive epic management module with register_epic_tools entry point and CRUD operations: list_epics, create_epic, retrieve_epic, update_epic, and delete_epic. Includes internal helper to resolve epic work item type ID and priority validation against PriorityEnum.|\n|**Integration Tests** <br> `tests/test_integration.py`|Extended integration test workflow to create, list, update, and delete epics; added assertions for epic-related tools; updated test sequence and logging to cover epic operations alongside existing work item management.|\n\n## Sequence Diagram(s)\n\n```mermaid\nsequenceDiagram\n    participant Test as Integration Test\n    participant MCP as MCP Server\n    participant Client as Plane Client\n    participant API as Plane API\n\n    Test->>MCP: register_epic_tools()\n    MCP->>MCP: Register epic tool endpoints\n\n    Test->>MCP: create_epic(project_id, ...)\n    MCP->>Client: Get epic work item type ID\n    Client->>API: Query work item types\n    API-->>Client: Return type ID\n    MCP->>Client: Create work item with epic type\n    Client->>API: POST create work item\n    API-->>Client: Return created epic\n    Client-->>MCP: Epic object\n    MCP-->>Test: Epic created\n\n    Test->>MCP: list_epics(project_id)\n    MCP->>Client: List epics for project\n    Client->>API: GET paginated epics\n    API-->>Client: Return epic list\n    Client-->>MCP: PaginatedEpicResponse\n    MCP-->>Test: Epic list\n\n    Test->>MCP: update_epic(project_id, epic_id, ...)\n    MCP->>Client: Update work item\n    Client->>API: PATCH update work item\n    API-->>Client: Updated epic\n    Client-->>MCP: Epic object\n    MCP-->>Test: Epic updated\n\n    Test->>MCP: delete_epic(project_id, epic_id)\n    MCP->>Client: Delete epic by work item ID\n    Client->>API: DELETE work item\n    API-->>Client: Deletion confirmed\n    Client-->>MCP: Success\n    MCP-->>Test: Epic deleted\n```\n\n## Estimated code review effort\n\n🎯 3 (Moderate) | ⏱️ ~20 minutes\n\n## Poem\n\n> 🐰 *Epics now dance in Plane's grand hall,*  \n> *With CRUD operations answering the call,*  \n> *From creation's spark to deletion's grace,*  \n> *Our tools hop through each management space!*  \n> *Work items organized, priorities aligned—*  \n> *A feature-packed feature, refined and refined!* ✨\n\n</details>\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 3</summary>\n\n<details>\n<summary>✅ Passed checks (3 passed)</summary>\n\n|     Check name     | Status   | Explanation                                                                                                |\n| :----------------: | :------- | :--------------------------------------------------------------------------------------------------------- |\n|  Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                |\n|     Title check    | ✅ Passed | The title clearly and concisely describes the main change: adding epic management tools to the MCP server. |\n| Docstring Coverage | ✅ Passed | No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=makeplane/plane-mcp-server&utm_content=63)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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= -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:30:23 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"0866:2ED26A:1183513:4B9C548:698A0B9E","x-ratelimit-limit":"5950","x-ratelimit-remaining":"5856","x-ratelimit-reset":"1770657610","x-ratelimit-resource":"core","x-ratelimit-used":"94","x-xss-protection":"0"},"data":""}}

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nThe pull request introduces Epic management functionality to the Plane MCP server by adding a new dedicated tools module with CRUD operations, registering these operations through the MCP framework, and extending integration tests to validate epic workflows.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Configuration & Setup** <br> `mise.toml`, `plane_mcp/tools/__init__.py`|Added mise.toml specifying uv version 0.9.18; imported and registered epic tools in the tools module initialization.|\n|**Epic Tools Implementation** <br> `plane_mcp/tools/epics.py`|Introduced comprehensive epic management module with register_epic_tools entry point and CRUD operations: list_epics, create_epic, retrieve_epic, update_epic, and delete_epic. Includes internal helper to resolve epic work item type ID and priority validation against PriorityEnum.|\n|**Integration Tests** <br> `tests/test_integration.py`|Extended integration test workflow to create, list, update, and delete epics; added assertions for epic-related tools; updated test sequence and logging to cover epic operations alongside existing work item management.|\n\n## Sequence Diagram(s)\n\n```mermaid\nsequenceDiagram\n    participant Test as Integration Test\n    participant MCP as MCP Server\n    participant Client as Plane Client\n    participant API as Plane API\n\n    Test->>MCP: register_epic_tools()\n    MCP->>MCP: Register epic tool endpoints\n\n    Test->>MCP: create_epic(project_id, ...)\n    MCP->>Client: Get epic work item type ID\n    Client->>API: Query work item types\n    API-->>Client: Return type ID\n    MCP->>Client: Create work item with epic type\n    Client->>API: POST create work item\n    API-->>Client: Return created epic\n    Client-->>MCP: Epic object\n    MCP-->>Test: Epic created\n\n    Test->>MCP: list_epics(project_id)\n    MCP->>Client: List epics for project\n    Client->>API: GET paginated epics\n    API-->>Client: Return epic list\n    Client-->>MCP: PaginatedEpicResponse\n    MCP-->>Test: Epic list\n\n    Test->>MCP: update_epic(project_id, epic_id, ...)\n    MCP->>Client: Update work item\n    Client->>API: PATCH update work item\n    API-->>Client: Updated epic\n    Client-->>MCP: Epic object\n    MCP-->>Test: Epic updated\n\n    Test->>MCP: delete_epic(project_id, epic_id)\n    MCP->>Client: Delete epic by work item ID\n    Client->>API: DELETE work item\n    API-->>Client: Deletion confirmed\n    Client-->>MCP: Success\n    MCP-->>Test: Epic deleted\n```\n\n## Estimated code review effort\n\n🎯 3 (Moderate) | ⏱️ ~20 minutes\n\n## Poem\n\n> 🐰 *Epics now dance in Plane's grand hall,*  \n> *With CRUD operations answering the call,*  \n> *From creation's spark to deletion's grace,*  \n> *Our tools hop through each management space!*  \n> *Work items organized, priorities aligned—*  \n> *A feature-packed feature, refined and refined!* ✨\n\n</details>\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 3</summary>\n\n<details>\n<summary>✅ Passed checks (3 passed)</summary>\n\n|     Check name     | Status   | Explanation                                                                                                |\n| :----------------: | :------- | :--------------------------------------------------------------------------------------------------------- |\n|  Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                |\n|     Title check    | ✅ Passed | The title clearly and concisely describes the main change: adding epic management tools to the MCP server. |\n| Docstring Coverage | ✅ Passed | No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=makeplane/plane-mcp-server&utm_content=63)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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= -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:30:23 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"0866:2ED26A:1183513:4B9C548:698A0B9E","x-ratelimit-limit":"5950","x-ratelimit-remaining":"5856","x-ratelimit-reset":"1770657610","x-ratelimit-resource":"core","x-ratelimit-used":"94","x-xss-protection":"0"},"data":""}}

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@tests/test_integration.py`:
- Around line 312-317: The EXPECTED_TOOLS list in tests/test_integration.py is
missing the registered "delete_epic" tool; update the EXPECTED_TOOLS constant to
include "delete_epic" so test_tools_availability verifies it. Locate the
EXPECTED_TOOLS list (the array containing
"list_epics","retrieve_epic","create_epic","update_epic") and add the string
"delete_epic" to that list to match the registration in epics.py and the
integration flow that exercises delete_epic.
🧹 Nitpick comments (1)
plane_mcp/tools/epics.py (1)

20-29: Redundant get_plane_client_context() call — _get_epic_work_item_type_id creates its own context.

_get_epic_work_item_type_id() (line 22) and create_epic (line 116) each independently call get_plane_client_context(). This doubles the auth/context resolution work. Consider passing the client and workspace slug into the helper instead.

Proposed refactor
-    def _get_epic_work_item_type_id() -> str | None:
+    def _get_epic_work_item_type_id(client, workspace_slug: str) -> str | None:
         """Helper function to get the work item type ID for epics."""
-        client, workspace_slug = get_plane_client_context()
         response = client.work_item_types.list(workspace_slug=workspace_slug, project_id="")

Then in create_epic:

+        client, workspace_slug = get_plane_client_context()
+        work_item_type_id = _get_epic_work_item_type_id(client, workspace_slug)
-        work_item_type_id = _get_epic_work_item_type_id()
-
-        client, workspace_slug = get_plane_client_context()

Also applies to: 114-116

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: failure by coderabbit.ai -->\n\n> [!CAUTION]\n> ## Review failed\n> \n> Failed to post review comments\n\n<!-- end of auto-generated comment: failure by coderabbit.ai -->\n\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nThe pull request introduces Epic management functionality to the Plane MCP server by adding a new dedicated tools module with CRUD operations, registering these operations through the MCP framework, and extending integration tests to validate epic workflows.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Configuration & Setup** <br> `mise.toml`, `plane_mcp/tools/__init__.py`|Added mise.toml specifying uv version 0.9.18; imported and registered epic tools in the tools module initialization.|\n|**Epic Tools Implementation** <br> `plane_mcp/tools/epics.py`|Introduced comprehensive epic management module with register_epic_tools entry point and CRUD operations: list_epics, create_epic, retrieve_epic, update_epic, and delete_epic. Includes internal helper to resolve epic work item type ID and priority validation against PriorityEnum.|\n|**Integration Tests** <br> `tests/test_integration.py`|Extended integration test workflow to create, list, update, and delete epics; added assertions for epic-related tools; updated test sequence and logging to cover epic operations alongside existing work item management.|\n\n## Sequence Diagram(s)\n\n```mermaid\nsequenceDiagram\n    participant Test as Integration Test\n    participant MCP as MCP Server\n    participant Client as Plane Client\n    participant API as Plane API\n\n    Test->>MCP: register_epic_tools()\n    MCP->>MCP: Register epic tool endpoints\n\n    Test->>MCP: create_epic(project_id, ...)\n    MCP->>Client: Get epic work item type ID\n    Client->>API: Query work item types\n    API-->>Client: Return type ID\n    MCP->>Client: Create work item with epic type\n    Client->>API: POST create work item\n    API-->>Client: Return created epic\n    Client-->>MCP: Epic object\n    MCP-->>Test: Epic created\n\n    Test->>MCP: list_epics(project_id)\n    MCP->>Client: List epics for project\n    Client->>API: GET paginated epics\n    API-->>Client: Return epic list\n    Client-->>MCP: PaginatedEpicResponse\n    MCP-->>Test: Epic list\n\n    Test->>MCP: update_epic(project_id, epic_id, ...)\n    MCP->>Client: Update work item\n    Client->>API: PATCH update work item\n    API-->>Client: Updated epic\n    Client-->>MCP: Epic object\n    MCP-->>Test: Epic updated\n\n    Test->>MCP: delete_epic(project_id, epic_id)\n    MCP->>Client: Delete epic by work item ID\n    Client->>API: DELETE work item\n    API-->>Client: Deletion confirmed\n    Client-->>MCP: Success\n    MCP-->>Test: Epic deleted\n```\n\n## Estimated code review effort\n\n🎯 3 (Moderate) | ⏱️ ~20 minutes\n\n## Poem\n\n> 🐰 *Epics now dance in Plane's grand hall,*  \n> *With CRUD operations answering the call,*  \n> *From creation's spark to deletion's grace,*  \n> *Our tools hop through each management space!*  \n> *Work items organized, priorities aligned—*  \n> *A feature-packed feature, refined and refined!* ✨\n\n</details>\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 3</summary>\n\n<details>\n<summary>✅ Passed checks (3 passed)</summary>\n\n|     Check name     | Status   | Explanation                                                                                                |\n| :----------------: | :------- | :--------------------------------------------------------------------------------------------------------- |\n|  Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                |\n|     Title check    | ✅ Passed | The title clearly and concisely describes the main change: adding epic management tools to the MCP server. |\n| Docstring Coverage | ✅ Passed | No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=makeplane/plane-mcp-server&utm_content=63)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:31:35 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"A012:3D3B66:1084758:4713140:698A0BE6","x-ratelimit-limit":"5950","x-ratelimit-remaining":"5846","x-ratelimit-reset":"1770657610","x-ratelimit-resource":"core","x-ratelimit-used":"104","x-xss-protection":"0"},"data":""}}

3 similar comments
@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: failure by coderabbit.ai -->\n\n> [!CAUTION]\n> ## Review failed\n> \n> Failed to post review comments\n\n<!-- end of auto-generated comment: failure by coderabbit.ai -->\n\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nThe pull request introduces Epic management functionality to the Plane MCP server by adding a new dedicated tools module with CRUD operations, registering these operations through the MCP framework, and extending integration tests to validate epic workflows.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Configuration & Setup** <br> `mise.toml`, `plane_mcp/tools/__init__.py`|Added mise.toml specifying uv version 0.9.18; imported and registered epic tools in the tools module initialization.|\n|**Epic Tools Implementation** <br> `plane_mcp/tools/epics.py`|Introduced comprehensive epic management module with register_epic_tools entry point and CRUD operations: list_epics, create_epic, retrieve_epic, update_epic, and delete_epic. Includes internal helper to resolve epic work item type ID and priority validation against PriorityEnum.|\n|**Integration Tests** <br> `tests/test_integration.py`|Extended integration test workflow to create, list, update, and delete epics; added assertions for epic-related tools; updated test sequence and logging to cover epic operations alongside existing work item management.|\n\n## Sequence Diagram(s)\n\n```mermaid\nsequenceDiagram\n    participant Test as Integration Test\n    participant MCP as MCP Server\n    participant Client as Plane Client\n    participant API as Plane API\n\n    Test->>MCP: register_epic_tools()\n    MCP->>MCP: Register epic tool endpoints\n\n    Test->>MCP: create_epic(project_id, ...)\n    MCP->>Client: Get epic work item type ID\n    Client->>API: Query work item types\n    API-->>Client: Return type ID\n    MCP->>Client: Create work item with epic type\n    Client->>API: POST create work item\n    API-->>Client: Return created epic\n    Client-->>MCP: Epic object\n    MCP-->>Test: Epic created\n\n    Test->>MCP: list_epics(project_id)\n    MCP->>Client: List epics for project\n    Client->>API: GET paginated epics\n    API-->>Client: Return epic list\n    Client-->>MCP: PaginatedEpicResponse\n    MCP-->>Test: Epic list\n\n    Test->>MCP: update_epic(project_id, epic_id, ...)\n    MCP->>Client: Update work item\n    Client->>API: PATCH update work item\n    API-->>Client: Updated epic\n    Client-->>MCP: Epic object\n    MCP-->>Test: Epic updated\n\n    Test->>MCP: delete_epic(project_id, epic_id)\n    MCP->>Client: Delete epic by work item ID\n    Client->>API: DELETE work item\n    API-->>Client: Deletion confirmed\n    Client-->>MCP: Success\n    MCP-->>Test: Epic deleted\n```\n\n## Estimated code review effort\n\n🎯 3 (Moderate) | ⏱️ ~20 minutes\n\n## Poem\n\n> 🐰 *Epics now dance in Plane's grand hall,*  \n> *With CRUD operations answering the call,*  \n> *From creation's spark to deletion's grace,*  \n> *Our tools hop through each management space!*  \n> *Work items organized, priorities aligned—*  \n> *A feature-packed feature, refined and refined!* ✨\n\n</details>\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 3</summary>\n\n<details>\n<summary>✅ Passed checks (3 passed)</summary>\n\n|     Check name     | Status   | Explanation                                                                                                |\n| :----------------: | :------- | :--------------------------------------------------------------------------------------------------------- |\n|  Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                |\n|     Title check    | ✅ Passed | The title clearly and concisely describes the main change: adding epic management tools to the MCP server. |\n| Docstring Coverage | ✅ Passed | No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=makeplane/plane-mcp-server&utm_content=63)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:31:35 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"A012:3D3B66:1084758:4713140:698A0BE6","x-ratelimit-limit":"5950","x-ratelimit-remaining":"5846","x-ratelimit-reset":"1770657610","x-ratelimit-resource":"core","x-ratelimit-used":"104","x-xss-protection":"0"},"data":""}}

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: failure by coderabbit.ai -->\n\n> [!CAUTION]\n> ## Review failed\n> \n> Failed to post review comments\n\n<!-- end of auto-generated comment: failure by coderabbit.ai -->\n\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nThe pull request introduces Epic management functionality to the Plane MCP server by adding a new dedicated tools module with CRUD operations, registering these operations through the MCP framework, and extending integration tests to validate epic workflows.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Configuration & Setup** <br> `mise.toml`, `plane_mcp/tools/__init__.py`|Added mise.toml specifying uv version 0.9.18; imported and registered epic tools in the tools module initialization.|\n|**Epic Tools Implementation** <br> `plane_mcp/tools/epics.py`|Introduced comprehensive epic management module with register_epic_tools entry point and CRUD operations: list_epics, create_epic, retrieve_epic, update_epic, and delete_epic. Includes internal helper to resolve epic work item type ID and priority validation against PriorityEnum.|\n|**Integration Tests** <br> `tests/test_integration.py`|Extended integration test workflow to create, list, update, and delete epics; added assertions for epic-related tools; updated test sequence and logging to cover epic operations alongside existing work item management.|\n\n## Sequence Diagram(s)\n\n```mermaid\nsequenceDiagram\n    participant Test as Integration Test\n    participant MCP as MCP Server\n    participant Client as Plane Client\n    participant API as Plane API\n\n    Test->>MCP: register_epic_tools()\n    MCP->>MCP: Register epic tool endpoints\n\n    Test->>MCP: create_epic(project_id, ...)\n    MCP->>Client: Get epic work item type ID\n    Client->>API: Query work item types\n    API-->>Client: Return type ID\n    MCP->>Client: Create work item with epic type\n    Client->>API: POST create work item\n    API-->>Client: Return created epic\n    Client-->>MCP: Epic object\n    MCP-->>Test: Epic created\n\n    Test->>MCP: list_epics(project_id)\n    MCP->>Client: List epics for project\n    Client->>API: GET paginated epics\n    API-->>Client: Return epic list\n    Client-->>MCP: PaginatedEpicResponse\n    MCP-->>Test: Epic list\n\n    Test->>MCP: update_epic(project_id, epic_id, ...)\n    MCP->>Client: Update work item\n    Client->>API: PATCH update work item\n    API-->>Client: Updated epic\n    Client-->>MCP: Epic object\n    MCP-->>Test: Epic updated\n\n    Test->>MCP: delete_epic(project_id, epic_id)\n    MCP->>Client: Delete epic by work item ID\n    Client->>API: DELETE work item\n    API-->>Client: Deletion confirmed\n    Client-->>MCP: Success\n    MCP-->>Test: Epic deleted\n```\n\n## Estimated code review effort\n\n🎯 3 (Moderate) | ⏱️ ~20 minutes\n\n## Poem\n\n> 🐰 *Epics now dance in Plane's grand hall,*  \n> *With CRUD operations answering the call,*  \n> *From creation's spark to deletion's grace,*  \n> *Our tools hop through each management space!*  \n> *Work items organized, priorities aligned—*  \n> *A feature-packed feature, refined and refined!* ✨\n\n</details>\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 3</summary>\n\n<details>\n<summary>✅ Passed checks (3 passed)</summary>\n\n|     Check name     | Status   | Explanation                                                                                                |\n| :----------------: | :------- | :--------------------------------------------------------------------------------------------------------- |\n|  Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                |\n|     Title check    | ✅ Passed | The title clearly and concisely describes the main change: adding epic management tools to the MCP server. |\n| Docstring Coverage | ✅ Passed | No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=makeplane/plane-mcp-server&utm_content=63)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:31:35 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"A012:3D3B66:1084758:4713140:698A0BE6","x-ratelimit-limit":"5950","x-ratelimit-remaining":"5846","x-ratelimit-reset":"1770657610","x-ratelimit-resource":"core","x-ratelimit-used":"104","x-xss-protection":"0"},"data":""}}

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: failure by coderabbit.ai -->\n\n> [!CAUTION]\n> ## Review failed\n> \n> Failed to post review comments\n\n<!-- end of auto-generated comment: failure by coderabbit.ai -->\n\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nThe pull request introduces Epic management functionality to the Plane MCP server by adding a new dedicated tools module with CRUD operations, registering these operations through the MCP framework, and extending integration tests to validate epic workflows.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Configuration & Setup** <br> `mise.toml`, `plane_mcp/tools/__init__.py`|Added mise.toml specifying uv version 0.9.18; imported and registered epic tools in the tools module initialization.|\n|**Epic Tools Implementation** <br> `plane_mcp/tools/epics.py`|Introduced comprehensive epic management module with register_epic_tools entry point and CRUD operations: list_epics, create_epic, retrieve_epic, update_epic, and delete_epic. Includes internal helper to resolve epic work item type ID and priority validation against PriorityEnum.|\n|**Integration Tests** <br> `tests/test_integration.py`|Extended integration test workflow to create, list, update, and delete epics; added assertions for epic-related tools; updated test sequence and logging to cover epic operations alongside existing work item management.|\n\n## Sequence Diagram(s)\n\n```mermaid\nsequenceDiagram\n    participant Test as Integration Test\n    participant MCP as MCP Server\n    participant Client as Plane Client\n    participant API as Plane API\n\n    Test->>MCP: register_epic_tools()\n    MCP->>MCP: Register epic tool endpoints\n\n    Test->>MCP: create_epic(project_id, ...)\n    MCP->>Client: Get epic work item type ID\n    Client->>API: Query work item types\n    API-->>Client: Return type ID\n    MCP->>Client: Create work item with epic type\n    Client->>API: POST create work item\n    API-->>Client: Return created epic\n    Client-->>MCP: Epic object\n    MCP-->>Test: Epic created\n\n    Test->>MCP: list_epics(project_id)\n    MCP->>Client: List epics for project\n    Client->>API: GET paginated epics\n    API-->>Client: Return epic list\n    Client-->>MCP: PaginatedEpicResponse\n    MCP-->>Test: Epic list\n\n    Test->>MCP: update_epic(project_id, epic_id, ...)\n    MCP->>Client: Update work item\n    Client->>API: PATCH update work item\n    API-->>Client: Updated epic\n    Client-->>MCP: Epic object\n    MCP-->>Test: Epic updated\n\n    Test->>MCP: delete_epic(project_id, epic_id)\n    MCP->>Client: Delete epic by work item ID\n    Client->>API: DELETE work item\n    API-->>Client: Deletion confirmed\n    Client-->>MCP: Success\n    MCP-->>Test: Epic deleted\n```\n\n## Estimated code review effort\n\n🎯 3 (Moderate) | ⏱️ ~20 minutes\n\n## Poem\n\n> 🐰 *Epics now dance in Plane's grand hall,*  \n> *With CRUD operations answering the call,*  \n> *From creation's spark to deletion's grace,*  \n> *Our tools hop through each management space!*  \n> *Work items organized, priorities aligned—*  \n> *A feature-packed feature, refined and refined!* ✨\n\n</details>\n\n<!-- walkthrough_end -->\n\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 3</summary>\n\n<details>\n<summary>✅ Passed checks (3 passed)</summary>\n\n|     Check name     | Status   | Explanation                                                                                                |\n| :----------------: | :------- | :--------------------------------------------------------------------------------------------------------- |\n|  Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                |\n|     Title check    | ✅ Passed | The title clearly and concisely describes the main change: adding epic management tools to the MCP server. |\n| Docstring Coverage | ✅ Passed | No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=makeplane/plane-mcp-server&utm_content=63)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:31:35 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"A012:3D3B66:1084758:4713140:698A0BE6","x-ratelimit-limit":"5950","x-ratelimit-remaining":"5846","x-ratelimit-reset":"1770657610","x-ratelimit-resource":"core","x-ratelimit-used":"104","x-xss-protection":"0"},"data":""}}

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: rate limited by coderabbit.ai -->\n\n> [!WARNING]\n> ## Rate limit exceeded\n> \n> `@jessedijkstra` has exceeded the limit for the number of commits that can be reviewed per hour. Please wait **18 minutes and 13 seconds** before requesting another review.\n> \n> <details>\n> <summary>⌛ How to resolve this issue?</summary>\n> \n> After the wait time has elapsed, a review can be triggered using the `@coderabbitai review` command as a PR comment. Alternatively, push new commits to this PR.\n> \n> We recommend that you space out your commits to avoid hitting the rate limit.\n> \n> </details>\n> \n> \n> <details>\n> <summary>🚦 How do rate limits work?</summary>\n> \n> CodeRabbit enforces hourly rate limits for each developer per organization.\n> \n> Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.\n> \n> Please see our [FAQ](https://docs.coderabbit.ai/faq) for further information.\n> \n> </details>\n> \n> \n\n<!-- end of auto-generated comment: rate limited by coderabbit.ai -->\n\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nThe pull request introduces Epic management functionality to the Plane MCP server by adding a new dedicated tools module with CRUD operations, registering these operations through the MCP framework, and extending integration tests to validate epic workflows.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Configuration & Setup** <br> `mise.toml`, `plane_mcp/tools/__init__.py`|Added mise.toml specifying uv version 0.9.18; imported and registered epic tools in the tools module initialization.|\n|**Epic Tools Implementation** <br> `plane_mcp/tools/epics.py`|Introduced comprehensive epic management module with register_epic_tools entry point and CRUD operations: list_epics, create_epic, retrieve_epic, update_epic, and delete_epic. Includes internal helper to resolve epic work item type ID and priority validation against PriorityEnum.|\n|**Integration Tests** <br> `tests/test_integration.py`|Extended integration test workflow to create, list, update, and delete epics; added assertions for epic-related tools; updated test sequence and logging to cover epic operations alongside existing work item management.|\n\n## Sequence Diagram(s)\n\n```mermaid\nsequenceDiagram\n    participant Test as Integration Test\n    participant MCP as MCP Server\n    participant Client as Plane Client\n    participant API as Plane API\n\n    Test->>MCP: register_epic_tools()\n    MCP->>MCP: Register epic tool endpoints\n\n    Test->>MCP: create_epic(project_id, ...)\n    MCP->>Client: Get epic work item type ID\n    Client->>API: Query work item types\n    API-->>Client: Return type ID\n    MCP->>Client: Create work item with epic type\n    Client->>API: POST create work item\n    API-->>Client: Return created epic\n    Client-->>MCP: Epic object\n    MCP-->>Test: Epic created\n\n    Test->>MCP: list_epics(project_id)\n    MCP->>Client: List epics for project\n    Client->>API: GET paginated epics\n    API-->>Client: Return epic list\n    Client-->>MCP: PaginatedEpicResponse\n    MCP-->>Test: Epic list\n\n    Test->>MCP: update_epic(project_id, epic_id, ...)\n    MCP->>Client: Update work item\n    Client->>API: PATCH update work item\n    API-->>Client: Updated epic\n    Client-->>MCP: Epic object\n    MCP-->>Test: Epic updated\n\n    Test->>MCP: delete_epic(project_id, epic_id)\n    MCP->>Client: Delete epic by work item ID\n    Client->>API: DELETE work item\n    API-->>Client: Deletion confirmed\n    Client-->>MCP: Success\n    MCP-->>Test: Epic deleted\n```\n\n## Estimated code review effort\n\n🎯 3 (Moderate) | ⏱️ ~20 minutes\n\n## Poem\n\n> 🐰 *Epics now dance in Plane's grand hall,*  \n> *With CRUD operations answering the call,*  \n> *From creation's spark to deletion's grace,*  \n> *Our tools hop through each management space!*  \n> *Work items organized, priorities aligned—*  \n> *A feature-packed feature, refined and refined!* ✨\n\n</details>\n\n<!-- walkthrough_end -->\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 3</summary>\n\n<details>\n<summary>✅ Passed checks (3 passed)</summary>\n\n|     Check name     | Status   | Explanation                                                                                                |\n| :----------------: | :------- | :--------------------------------------------------------------------------------------------------------- |\n|  Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                |\n|     Title check    | ✅ Passed | The title clearly and concisely describes the main change: adding epic management tools to the MCP server. |\n| Docstring Coverage | ✅ Passed | No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=makeplane/plane-mcp-server&utm_content=63)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:32:44 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"A02E:1A85:127AA87:4FEE4A1:698A0C2B","x-ratelimit-limit":"5950","x-ratelimit-remaining":"5832","x-ratelimit-reset":"1770657610","x-ratelimit-resource":"core","x-ratelimit-used":"118","x-xss-protection":"0"},"data":""}}

2 similar comments
@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: rate limited by coderabbit.ai -->\n\n> [!WARNING]\n> ## Rate limit exceeded\n> \n> `@jessedijkstra` has exceeded the limit for the number of commits that can be reviewed per hour. Please wait **18 minutes and 13 seconds** before requesting another review.\n> \n> <details>\n> <summary>⌛ How to resolve this issue?</summary>\n> \n> After the wait time has elapsed, a review can be triggered using the `@coderabbitai review` command as a PR comment. Alternatively, push new commits to this PR.\n> \n> We recommend that you space out your commits to avoid hitting the rate limit.\n> \n> </details>\n> \n> \n> <details>\n> <summary>🚦 How do rate limits work?</summary>\n> \n> CodeRabbit enforces hourly rate limits for each developer per organization.\n> \n> Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.\n> \n> Please see our [FAQ](https://docs.coderabbit.ai/faq) for further information.\n> \n> </details>\n> \n> \n\n<!-- end of auto-generated comment: rate limited by coderabbit.ai -->\n\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nThe pull request introduces Epic management functionality to the Plane MCP server by adding a new dedicated tools module with CRUD operations, registering these operations through the MCP framework, and extending integration tests to validate epic workflows.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Configuration & Setup** <br> `mise.toml`, `plane_mcp/tools/__init__.py`|Added mise.toml specifying uv version 0.9.18; imported and registered epic tools in the tools module initialization.|\n|**Epic Tools Implementation** <br> `plane_mcp/tools/epics.py`|Introduced comprehensive epic management module with register_epic_tools entry point and CRUD operations: list_epics, create_epic, retrieve_epic, update_epic, and delete_epic. Includes internal helper to resolve epic work item type ID and priority validation against PriorityEnum.|\n|**Integration Tests** <br> `tests/test_integration.py`|Extended integration test workflow to create, list, update, and delete epics; added assertions for epic-related tools; updated test sequence and logging to cover epic operations alongside existing work item management.|\n\n## Sequence Diagram(s)\n\n```mermaid\nsequenceDiagram\n    participant Test as Integration Test\n    participant MCP as MCP Server\n    participant Client as Plane Client\n    participant API as Plane API\n\n    Test->>MCP: register_epic_tools()\n    MCP->>MCP: Register epic tool endpoints\n\n    Test->>MCP: create_epic(project_id, ...)\n    MCP->>Client: Get epic work item type ID\n    Client->>API: Query work item types\n    API-->>Client: Return type ID\n    MCP->>Client: Create work item with epic type\n    Client->>API: POST create work item\n    API-->>Client: Return created epic\n    Client-->>MCP: Epic object\n    MCP-->>Test: Epic created\n\n    Test->>MCP: list_epics(project_id)\n    MCP->>Client: List epics for project\n    Client->>API: GET paginated epics\n    API-->>Client: Return epic list\n    Client-->>MCP: PaginatedEpicResponse\n    MCP-->>Test: Epic list\n\n    Test->>MCP: update_epic(project_id, epic_id, ...)\n    MCP->>Client: Update work item\n    Client->>API: PATCH update work item\n    API-->>Client: Updated epic\n    Client-->>MCP: Epic object\n    MCP-->>Test: Epic updated\n\n    Test->>MCP: delete_epic(project_id, epic_id)\n    MCP->>Client: Delete epic by work item ID\n    Client->>API: DELETE work item\n    API-->>Client: Deletion confirmed\n    Client-->>MCP: Success\n    MCP-->>Test: Epic deleted\n```\n\n## Estimated code review effort\n\n🎯 3 (Moderate) | ⏱️ ~20 minutes\n\n## Poem\n\n> 🐰 *Epics now dance in Plane's grand hall,*  \n> *With CRUD operations answering the call,*  \n> *From creation's spark to deletion's grace,*  \n> *Our tools hop through each management space!*  \n> *Work items organized, priorities aligned—*  \n> *A feature-packed feature, refined and refined!* ✨\n\n</details>\n\n<!-- walkthrough_end -->\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 3</summary>\n\n<details>\n<summary>✅ Passed checks (3 passed)</summary>\n\n|     Check name     | Status   | Explanation                                                                                                |\n| :----------------: | :------- | :--------------------------------------------------------------------------------------------------------- |\n|  Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                |\n|     Title check    | ✅ Passed | The title clearly and concisely describes the main change: adding epic management tools to the MCP server. |\n| Docstring Coverage | ✅ Passed | No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=makeplane/plane-mcp-server&utm_content=63)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- DwQgtGAEAqAWCWBnSTIEMB26CuAXA9mAOYCmGJATmriQCaQDG+Ats2bgFyQAOFk+AIwBWJBrngA3EsgEBPRvlqU0AgfFwA6NPEgQAfACgjoCEYDEZyAAUASpETZWaCrKPR1AGxJcAZiWpcaLT0JNzwDJAE+B7IPvh8zJhoRPAYRJCh4YgGAHKOApRcAGwAzAYAqjYAMlywuLjciBwA9M0puLDYAhpMzM2JANahHpgkzdwj5GDMDNxgiJRSFOPYHh7NpRULFFwiiAu08EIDiLhUBgDK+NgUDCSQAlQYDLC+/rg3Y5kM2dDOpLgHk8XlwGEkXJdcNRsE1+NwyAYAMIUd50dCcSAAJgADJiimBcQSAJzQACMRQ4OI42KKAC0jBdHIkXPwfIxYJhSE0DFAAILBSAAWURVki+GisXiGTCEUSGGSJDYGAxHiQuAA+t9EAAaRgo6gkTUy3XYbi0A1G8K6lFneAkKSWhgaHmQACSzw82CUKGVJCIVHE+CwNFOyCYS1S6W+cOUgYwyAAFAx9TRdarTiazQbdUovKmeM52JAUSM44gEI0AJTOvkC5hIEgaAjMDxinipSDYCSQJaIeBBtvYjREjSkgAczoM0GkgImmEgCfTNHoHdslY4Lps2CwqRo/uo/eDM+QAHd1LBIAADLvF7c8WQhwGPxDNR/q3d+gOHjTcWSXmuQAAapQ8A+PI0ZRDE6AosWfpqpQaJMBQKJiB4sgAdOpzSuEkCIjY5QACIxl+QbIMk2jxoCaDWJM9ypKcmB3JO/KHHGaCthg+A0D6kBKIgybwNwcZcLYkBsFC5pQj6DCenx6CQKQ5AkVg1C2gIeCHpAqrkJOFi4Sw9aAmw+wKsgDhOBCLruuo8DsQorDqOgwTINGcoKkqT7ilBi5qo6Op6qijqZpJhrfNaJC2vaoUypWuofvucaRMeuqYPQ9YLE2LCtnEfA3mEGAYJGAGMgICwAI7YEWvSGWRArRrmEWaQ43DcPEVEYPQpohT6e7KUloaTvoxjgFAZD0PgbJoHghCKbGiEGewXC8PwwiiOIUgyPITBKFQqjqFoOhDSYUBwKgqDzlNBDEGQc30NVi3FmgJ72EyzjyHICg7SoaiaNouhgIYw2mAY6WNs2HgbgARNDBh6byrrXUpBr0OZzLyBN7KctIRgsWRkDkM9TAYD48BEDcB4DiTXhiQ2mUtgoyoUZG8kANqQYgAC69hrZpZ4dJ23YLJ5kCQ0OI7jpDk7mJYvIeDQynIAQkSwPcSgyc4FPxqyGQAB6tRQy78Hw3BdKqETsDZ2MujkJDPVT9xBEotBcJeoN0x4l4M1CqTMx09wmwIZu8aIIx9ZebNeZznt8xe17dgAvCLYujmOkP/tLQqYKBM6QAAYvA1O8vKaEAF6UEYVSpNImNpHQXAANSYs0BJGAAoqc8CJIb233CiEh2s9JA+DlGJVPgJ4GNDkNGBAYBGHO5DqjM3CvpHzTqu+hUauqP6yFDMNwwjs0BmiqNvdrLxY9kVnMPrhvUQTYrRLBKSnMpgTBGind39rKKv/Ljp1Ts0gD4CgLAeC0SXrMTKEoNBagAu6CQ+Ahj0D9vjW2T9WzUHsFCA2poP5O3kmCNYbY/7wQoIA9mCZl6VkgDHDsZDTiUCAZHFKPh5a6zVL7LyL81QK0nJXcgYYOS12dpARuzdsRtw7l3ea3o+4DwyMPNqXBBR0HgI4SeMMeTAwXoaZeq8JTNHgb+fe09D6I1ui9Cy6M2SX1rtfd0ZxFDYDuHjR+zAXHUz0VAle7NjEykQLvZW2CzwomQK3GUYASzI0wczXc+Blb3CsLRIUIpuYUCWD2Wy8lj44WFKKSCvC36aw0JAAA0iQcCXgPLchdIwgB3wWESmobMLguc0CnAKbQnw24xCaQaZQPGDh1D3AxtGfA8IFboGQAUzBQSrK+goMXSAKsPBTMgOqAEgCTzxAGO+GgzAgGyHhO+WgCZaEVRAtXNBKTRiQF5FYV0bYPD4DBNxNBuyKADBQIcyIJz7jMhQTM7CERUqwQ+Ms5A6hkCugIrqKUOQgx0TZJxQEcRty0AAkuPyCZeD4BEGIM5uoGA3EQPEeOSLyC6imeqbgCpKXItoTaCgdoNryXpSkeUhslzay1CAqU1EUhSCwPiwl7V6A2huFrNBvKMaRJwoIcVsQwHMCSdYZIqRkYKoYDYaQrV4yNhdMmQK3wEwaAtbQk1Bp3EYLCtJWSzNJlsWynaDwtBEydL7EQcg0g0wqBIDEGl+Bdz+RCv5Xg/ZWW4FkDmaQAkhKHn8hFJ01Y3TovgBQLC4TojsrQTquhezfmKn+fCN08KHjYALh6+SyJUQAHU9muj+fS2QryggLhjjwVl8R1DyAkOxeAIV6DkXooCKwPbo2yFbhgRwsVuYdTDCmQ8KUOpJKwCytlNyVYBVidGD6cKAJdQtGasVa1iWgovRajQtDj0hnQFgEgOsuFpFBXQ88cIXUgLdR63UA7VSSWZpG3tMb7CdwLs4NCJLSJnFceIV985yhZhoI275zaS2tvbbQFKLU0K+x3Xekgq7JURWlfh+4hH6AFv7tRTd9p2IATow6U9YDxUXqaUOnpKaVbDMjNTAtMJmZ6silIAAipVFwVgNbMAWVABqNBHR4tY+eoduoOO0FofJ6u1FEDwgYKBHC+75BfJ+aMtVh6XQTqjX21ZqVtLpFSDJL01d/1Ds1ugIgFEsJWZA9O2darBOvpjflIgGhtn/Fk26JZaB+mkVgmhfgKkaL3JknaZUXsn2AkEN7cg9AaMKQinSyBqX2DqiJjQHWErOziFVGXXiLAKJiUUIG2EOrdRSa5dqmUerdOkSI7hFMJBUMDHQ8wXUSGQrDdG7qYTrKoricoLIKTVAZPtc1dyugC3JPSf8uCqbhyAKy1bGgx+RTenPDLNBXucEmEojyzktBAABZeMCPAXODkhagUp6Ebpu40mUzSYiTjgPcexXIepgNoK4h2CgeOSHuELbWeFCLEU1pKPgOrFYciMmgbgbYTPFtWw6r0vsAUQrm/+uKfzrWJS7fijZwWHb7DebZOMwUbXvv5s6w8dkSaBt/Q+kjIn2LNHk5pHwryTxBMgK3ZCUoRG0HsygaFt8zaOQ6GA7ARALyPOeR+KgsWtbgtc4BgcGNgNTo815wESgSa5YyP5hZsMZZy1jEmtsaC1ahzR3yvWbU0RSgDkHC24grZQDUR0RQTknYu1t8U/74RAeIFadwdpnTcDdN0HoSAVKSCew7PbK8PiDH+JMX+IwSKaBcCRfwP2fACBzC8FIVsQfDPKhs967lnxTwIRrqQWgABudVHivH+zAf3OSOm+P3HYCyVqu5SF/coOqxH8qokxMNnM9muoTwIGpmg1IhwJ/YDsmdvpl3CzBzt2iTpPolLx+mT9kJgJZ/yHn8qKWzvM6FT8FhfOhdi5ZAy4KAK4q5hEsYxFG4xwABWSRLRaeHROeAwZ8V8GcTeXqUpUxeAr/eGSxE+FGV6FkDGMHK2EHHqT8dzR8EBSXZXXWGgDqOuF0XkdhZfGnZmHTUQIMegAnMzFKdBQeGUWgmnG/NdbSYFD6IWeDdINBaMW/NBelFEdLDGNBBYImbgotMzDCHdKgziZ6JcFyQJHieQ5TMQQXLSfAIgLHEgTNctSLMg6MVALTegUsZfDsFQkgK5Z4frcFNBKg8rVISqU8D9MXILHdVQrgwtb5QnXUNBEmLNQEHgw5YjdddVM9MQACKwU2HCIpJ9PTKEC/GCXI1KNEJWRzWSGfdfQNWJdmLgHFLUcKETaKK0XdBTe1QjIKMw3wnOVIJBIYKwhYeZXiG4cjag8eLQsZJYdiY7HOJhPHfzAoVlBDNde6ZUMiGCSjRfCXNaYfO1SolwlGGgRoT/OGV3aZJWT3EODWS7cZP3A2APY2LI82dvUPa+KAXPUAoRPvOucRaAooZuTEaRcQWRO6ZrWCfuO1ZRA2VRdRTRKeGeAGIGUaNdDGS6GaG6fA+yDyLgKgZ6M+FkD6HuXaH6A6f6PQIAA= -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:32:44 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"A02E:1A85:127AA87:4FEE4A1:698A0C2B","x-ratelimit-limit":"5950","x-ratelimit-remaining":"5832","x-ratelimit-reset":"1770657610","x-ratelimit-resource":"core","x-ratelimit-used":"118","x-xss-protection":"0"},"data":""}}

@coderabbitai
Copy link

coderabbitai bot commented Feb 9, 2026

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: rate limited by coderabbit.ai -->\n\n> [!WARNING]\n> ## Rate limit exceeded\n> \n> `@jessedijkstra` has exceeded the limit for the number of commits that can be reviewed per hour. Please wait **18 minutes and 13 seconds** before requesting another review.\n> \n> <details>\n> <summary>⌛ How to resolve this issue?</summary>\n> \n> After the wait time has elapsed, a review can be triggered using the `@coderabbitai review` command as a PR comment. Alternatively, push new commits to this PR.\n> \n> We recommend that you space out your commits to avoid hitting the rate limit.\n> \n> </details>\n> \n> \n> <details>\n> <summary>🚦 How do rate limits work?</summary>\n> \n> CodeRabbit enforces hourly rate limits for each developer per organization.\n> \n> Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.\n> \n> Please see our [FAQ](https://docs.coderabbit.ai/faq) for further information.\n> \n> </details>\n> \n> \n\n<!-- end of auto-generated comment: rate limited by coderabbit.ai -->\n\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nThe pull request introduces Epic management functionality to the Plane MCP server by adding a new dedicated tools module with CRUD operations, registering these operations through the MCP framework, and extending integration tests to validate epic workflows.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Configuration & Setup** <br> `mise.toml`, `plane_mcp/tools/__init__.py`|Added mise.toml specifying uv version 0.9.18; imported and registered epic tools in the tools module initialization.|\n|**Epic Tools Implementation** <br> `plane_mcp/tools/epics.py`|Introduced comprehensive epic management module with register_epic_tools entry point and CRUD operations: list_epics, create_epic, retrieve_epic, update_epic, and delete_epic. Includes internal helper to resolve epic work item type ID and priority validation against PriorityEnum.|\n|**Integration Tests** <br> `tests/test_integration.py`|Extended integration test workflow to create, list, update, and delete epics; added assertions for epic-related tools; updated test sequence and logging to cover epic operations alongside existing work item management.|\n\n## Sequence Diagram(s)\n\n```mermaid\nsequenceDiagram\n    participant Test as Integration Test\n    participant MCP as MCP Server\n    participant Client as Plane Client\n    participant API as Plane API\n\n    Test->>MCP: register_epic_tools()\n    MCP->>MCP: Register epic tool endpoints\n\n    Test->>MCP: create_epic(project_id, ...)\n    MCP->>Client: Get epic work item type ID\n    Client->>API: Query work item types\n    API-->>Client: Return type ID\n    MCP->>Client: Create work item with epic type\n    Client->>API: POST create work item\n    API-->>Client: Return created epic\n    Client-->>MCP: Epic object\n    MCP-->>Test: Epic created\n\n    Test->>MCP: list_epics(project_id)\n    MCP->>Client: List epics for project\n    Client->>API: GET paginated epics\n    API-->>Client: Return epic list\n    Client-->>MCP: PaginatedEpicResponse\n    MCP-->>Test: Epic list\n\n    Test->>MCP: update_epic(project_id, epic_id, ...)\n    MCP->>Client: Update work item\n    Client->>API: PATCH update work item\n    API-->>Client: Updated epic\n    Client-->>MCP: Epic object\n    MCP-->>Test: Epic updated\n\n    Test->>MCP: delete_epic(project_id, epic_id)\n    MCP->>Client: Delete epic by work item ID\n    Client->>API: DELETE work item\n    API-->>Client: Deletion confirmed\n    Client-->>MCP: Success\n    MCP-->>Test: Epic deleted\n```\n\n## Estimated code review effort\n\n🎯 3 (Moderate) | ⏱️ ~20 minutes\n\n## Poem\n\n> 🐰 *Epics now dance in Plane's grand hall,*  \n> *With CRUD operations answering the call,*  \n> *From creation's spark to deletion's grace,*  \n> *Our tools hop through each management space!*  \n> *Work items organized, priorities aligned—*  \n> *A feature-packed feature, refined and refined!* ✨\n\n</details>\n\n<!-- walkthrough_end -->\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 3</summary>\n\n<details>\n<summary>✅ Passed checks (3 passed)</summary>\n\n|     Check name     | Status   | Explanation                                                                                                |\n| :----------------: | :------- | :--------------------------------------------------------------------------------------------------------- |\n|  Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                |\n|     Title check    | ✅ Passed | The title clearly and concisely describes the main change: adding epic management tools to the MCP server. |\n| Docstring Coverage | ✅ Passed | No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=makeplane/plane-mcp-server&utm_content=63)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/makeplane/plane-mcp-server/issues/comments/3872735658","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:32:44 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"A02E:1A85:127AA87:4FEE4A1:698A0C2B","x-ratelimit-limit":"5950","x-ratelimit-remaining":"5832","x-ratelimit-reset":"1770657610","x-ratelimit-resource":"core","x-ratelimit-used":"118","x-xss-protection":"0"},"data":""}}

Add MCP tools for epic management:
- list_epics: List all epics in a project
- create_epic: Create a new epic
- update_epic: Update an existing epic
- retrieve_epic: Retrieve a specific epic by ID

Also includes:
- Integration tests for epic operations
- mise.toml for uv version pinning

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

Add deleting an epic

Update integration tests

Address PR review feedback for epic tools

- Fix docstrings to only list actual function parameters
- Add validation for epic work item type (raise ValueError if not found)
- Add priority validation with actionable error messages
- Fix update_epic return type from WorkItem to Epic
- Fix grammar: "a epic" -> "an epic"
- Refactor _get_epic_work_item_type_id to accept client/workspace params
- Remove unused WorkItem import
- Fix test to handle list_epics returning flat list (not paginated)
- Remove extraneous f-string prefixes in test prints
- Add delete_epic to EXPECTED_TOOLS

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

Fix epics
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant