Plane MCP Server
공식Plane 공식 MCP 서버는 Plane API와의 통합을 제공하여 Plane 프로젝트, 작업 항목, 사이클 등의 전체 AI 자동화를 가능하게 합니다.
문서
Plane MCP 서버
Plane 통합을 위한 모델 컨텍스트 프로토콜(MCP) 서버입니다. 이 서버는 AI 에이전트를 통해 Plane과 상호 작용하기 위한 도구와 리소스를 제공합니다.
기능
- 🔧 Plane 통합: Plane API 및 서비스와 상호 작용
- 🔌 다중 전송: stdio, SSE, 스트리밍 가능한 HTTP 전송 지원
- 🌐 원격 및 로컬: 로컬 및 원격 서비스로 모두 작동
- 🛠️ 확장 가능: 새로운 도구와 리소스를 쉽게 추가 가능
사용법
서버는 세 가지 전송 방법을 지원합니다. 설치가 필요 없는 uvx 사용을 권장합니다.
요구 사항:
- Python 3.10 이상 (stdio 전송 시,
uvx경유) - Node.js 22 이상 (원격 전송 시,
npx경유)
1. Stdio 전송 (로컬 사용 시)
MCP 클라이언트 구성 (uvx 사용 - 권장):
{
"mcpServers": {
"plane": {
"command": "uvx",
"args": ["plane-mcp-server", "stdio"],
"env": {
"PLANE_API_KEY": "<your-api-key>",
"PLANE_WORKSPACE_SLUG": "<your-workspace-slug>",
"PLANE_BASE_URL": "https://api.plane.so"
}
}
}
}
2. OAuth를 사용한 원격 HTTP 전송
OAuth 인증을 사용하여 호스팅된 Plane MCP 서버에 연결합니다.
URL: https://mcp.plane.so/http/mcp
MCP 클라이언트 구성 (기본 원격 MCP 지원이 없는 Claude Desktop과 같은 도구용):
{
"mcpServers": {
"plane": {
"command": "npx",
"args": ["mcp-remote@latest", "https://mcp.plane.so/http/mcp"]
}
}
}
참고: 원격 서버에 연결할 때 OAuth 인증이 자동으로 처리됩니다.
3. PAT 토큰을 사용한 원격 HTTP 전송
개인 액세스 토큰(PAT)을 사용하여 호스팅된 Plane MCP 서버에 연결합니다.
URL: https://mcp.plane.so/http/api-key/mcp
헤더:
Authorization: Bearer <PAT_TOKEN>X-Workspace-slug: <SLUG>
MCP 클라이언트 구성 (기본 원격 MCP 지원이 없는 Claude Desktop과 같은 도구용):
{
"mcpServers": {
"plane": {
"command": "npx",
"args": ["mcp-remote@latest", "https://mcp.plane.so/http/api-key/mcp"],
"headers": {
"Authorization": "Bearer <PAT_TOKEN>",
"X-Workspace-slug": "<SLUG>"
}
}
}
}
4. SSE 전송 (레거시)
⚠️ 레거시 전송: SSE(Server-Sent Events) 전송은 하위 호환성을 위해 유지됩니다. 새로운 구현은 대신 HTTP 전송(섹션 2 또는 3)을 사용해야 합니다.
Server-Sent Events를 통해 OAuth 인증을 사용하여 호스팅된 Plane MCP 서버에 연결합니다.
URL: https://mcp.plane.so/sse
MCP 클라이언트 구성 (SSE 전송을 지원하는 도구용):
{
"mcpServers": {
"plane": {
"command": "npx",
"args": ["mcp-remote@latest", "https://mcp.plane.so/sse"]
}
}
}
참고: 원격 서버에 연결할 때 OAuth 인증이 자동으로 처리됩니다. 이 전송은 HTTP 전송을 위해 더 이상 사용되지 않습니다.
구성
인증
서버는 환경 변수를 통한 인증이 필요합니다:
PLANE_BASE_URL: Plane API의 기본 URL (기본값:https://api.plane.so) - 선택 사항PLANE_API_KEY: 인증용 API 키 (stdio 전송 시 필수)PLANE_WORKSPACE_SLUG: 워크스페이스 슬러그 식별자 (stdio 전송 시 필수)PLANE_ACCESS_TOKEN: 인증용 액세스 토큰 (API 키 대체)
예시 (stdio 전송용):
export PLANE_BASE_URL="https://api.plane.so"
export PLANE_API_KEY="your-api-key"
export PLANE_WORKSPACE_SLUG="your-workspace-slug"
참고: 원격 HTTP 전송(OAuth 또는 PAT)의 경우 인증은 연결 방법(OAuth 흐름 또는 PAT 헤더)을 통해 처리되며 이러한 환경 변수가 필요하지 않습니다.
OAuth 리디렉션 URI
OAuth HTTP/SSE 전송의 경우 서버는 각 클라이언트의 리디렉션 URI를 허용 목록과 비교하여 검증합니다. 일반적인 MCP 클라이언트(Cursor, VS Code, Claude.ai, ChatGPT 커넥터, localhost)는 기본적으로 허용됩니다.
코드 변경이나 릴리스 없이 새 클라이언트를 온보딩하려면 환경 변수를 통해 추가 패턴을 추가하세요:
PLANE_OAUTH_ALLOWED_REDIRECT_URIS: 내장 허용 목록에 추가되는 쉼표로 구분된 리디렉션 URI 패턴.
export PLANE_OAUTH_ALLOWED_REDIRECT_URIS="https://newclient.com/cb,https://other.app/oauth/*"
패턴은 glob 매칭을 지원합니다(*는 모든 포트, 경로 세그먼트 또는 하위 도메인과 일치). 보안을 위해 호스트는 고정하고 포트/경로만 와일드카드로 지정하세요.
로깅
서버는 구조화된 JSON 로그를 내보냅니다. 각 도구 호출은 도구 이름, 소요 시간, 상태 및 (가능한 경우) 불투명 사용자 ID 및 워크스페이스 슬러그와 함께 기록됩니다.
LOG_USER_INFO:true인 경우 불투명 사용자 ID와 함께 사용자 정보(표시 이름과 같은 PII)를 로그에 포함합니다. 기본값은false이므로 명시적으로 옵트인하지 않는 한 PII가 기록되지 않습니다. OAuth 및 PAT(헤더) HTTP 전송만 표시 이름을 전달하며 stdio는 영향을 받지 않습니다.
export LOG_USER_INFO="true"
사용 가능한 도구
서버는 Plane과 상호 작용하기 위한 포괄적인 도구를 제공합니다. 모든 도구는 유형 안전성과 유효성 검사를 위해 Plane SDK의 Pydantic 모델을 사용합니다.
프로젝트
| 도구 이름 | 설명 |
|---|---|
list_projects | 선택적 페이지 매김 및 필터링을 사용하여 워크스페이스의 모든 프로젝트 나열 |
create_project | 이름, 식별자 및 선택적 구성으로 새 프로젝트 생성 |
retrieve_project | ID로 프로젝트 검색 |
update_project | 부분 데이터로 프로젝트 업데이트 |
delete_project | ID로 프로젝트 삭제 |
get_project_worklog_summary | 프로젝트의 작업 로그 요약 가져오기 |
get_project_members | 프로젝트의 모든 멤버 가져오기 |
update_project_features | 프로젝트의 기능 구성 업데이트 |
작업 항목
| 도구 이름 | 설명 |
|---|---|
list_work_items | 선택적 필터링 및 페이지 매김을 사용하여 프로젝트의 모든 작업 항목 나열 |
create_work_item | 이름, 담당자, 레이블 및 기타 속성으로 새 작업 항목 생성 |
retrieve_work_item | 선택적 필드 확장을 사용하여 ID로 작업 항목 검색 |
retrieve_work_item_by_identifier | 프로젝트 식별자 및 이슈 시퀀스 번호로 작업 항목 검색 |
update_work_item | 부분 데이터로 작업 항목 업데이트 |
delete_work_item | ID로 작업 항목 삭제 |
search_work_items | 쿼리 문자열을 사용하여 워크스페이스 전체에서 작업 항목 검색 |
주기
| 도구 이름 | 설명 |
|---|---|
list_cycles | 프로젝트의 주기 나열 (보관된 항목은 archived=true 설정) |
create_cycle | 이름, 날짜 및 소유자로 새 주기 생성 |
retrieve_cycle | ID로 주기 검색 |
update_cycle | 부분 데이터로 주기 업데이트 |
delete_cycle | ID로 주기 삭제 |
manage_cycle_work_items | 주기에 작업 항목 추가 및/또는 제거 |
list_cycle_work_items | 주기의 작업 항목 나열 |
transfer_cycle_work_items | 한 주기에서 다른 주기로 작업 항목 전송 |
manage_cycle_archive | 주기 보관 또는 보관 해제 |
모듈
| 도구 이름 | 설명 |
|---|---|
list_modules | 프로젝트의 모듈 나열 (보관된 항목은 archived=true 설정) |
create_module | 이름, 날짜, 상태 및 멤버로 새 모듈 생성 |
retrieve_module | ID로 모듈 검색 |
update_module | 부분 데이터로 모듈 업데이트 |
delete_module | ID로 모듈 삭제 |
manage_module_work_items | 모듈에 작업 항목 추가 및/또는 제거 |
list_module_work_items | 모듈의 작업 항목 나열 |
manage_module_archive | 모듈 보관 또는 보관 해제 |
이니셔티브
| 도구 이름 | 설명 |
|---|---|
list_initiatives | 워크스페이스의 모든 이니셔티브 나열 |
create_initiative | 이름, 날짜, 상태 및 리드로 새 이니셔티브 생성 |
retrieve_initiative | ID로 이니셔티브 검색 |
update_initiative | 부분 데이터로 이니셔티브 업데이트 |
delete_initiative | ID로 이니셔티브 삭제 |
접수 작업 항목
| 도구 이름 | 설명 |
|---|---|
list_intake_work_items | 선택적 페이지 매김을 사용하여 프로젝트의 모든 접수 작업 항목 나열 |
create_intake_work_item | 프로젝트에 새 접수 작업 항목 생성 |
retrieve_intake_work_item | 선택적 필드 확장을 사용하여 작업 항목 ID로 접수 작업 항목 검색 |
update_intake_work_item | 부분 데이터로 접수 작업 항목 업데이트 |
delete_intake_work_item | 작업 항목 ID로 접수 작업 항목 삭제 |
작업 항목 속성
| 도구 이름 | 설명 |
|---|---|
list_work_item_properties | 작업 항목 유형에 대한 작업 항목 속성 나열 |
create_work_item_property | 유형, 설정 및 유효성 검사 규칙으로 새 작업 항목 속성 생성 |
retrieve_work_item_property | ID로 작업 항목 속성 검색 |
update_work_item_property | 부분 데이터로 작업 항목 속성 업데이트 |
delete_work_item_property | ID로 작업 항목 속성 삭제 |
마일스톤
| 도구 이름 | 설명 |
|---|---|
list_milestones | 프로젝트의 모든 마일스톤 나열 |
create_milestone | 새 마일스톤 생성 |
retrieve_milestone | ID로 마일스톤 검색 |
update_milestone | ID로 마일스톤 업데이트 |
delete_milestone | ID로 마일스톤 삭제 |
manage_milestone_work_items | 마일스톤에 작업 항목 추가 및/또는 제거 |
list_milestone_work_items | 마일스톤의 작업 항목 나열 |
레이블
| 도구 이름 | 설명 |
|---|---|
list_labels | 프로젝트의 모든 레이블 나열 |
create_label | 새 레이블 생성 |
retrieve_label | ID로 레이블 검색 |
update_label | ID로 레이블 업데이트 |
delete_label | ID로 레이블 삭제 |
상태
| 도구 이름 | 설명 |
|---|---|
list_states | 프로젝트의 모든 상태 나열 |
create_state | 새 상태 생성 |
retrieve_state | ID로 상태 검색 |
update_state | ID로 상태 업데이트 |
delete_state | ID로 상태 삭제 |
작업 항목 댓글
| 도구 이름 | 설명 |
|---|---|
list_work_item_comments | 작업 항목의 댓글 나열 |
retrieve_work_item_comment | 작업 항목의 특정 댓글 검색 |
create_work_item_comment | 작업 항목에 댓글 생성 |
update_work_item_comment | 작업 항목의 댓글 업데이트 |
delete_work_item_comment | 작업 항목의 댓글 삭제 |
작업 항목 링크
| 도구 이름 | 설명 |
|---|---|
list_work_item_links | 작업 항목의 링크 나열 |
retrieve_work_item_link | 작업 항목의 특정 링크 검색 |
create_work_item_link | 작업 항목에 링크 생성 |
update_work_item_link | 작업 항목의 링크 업데이트 |
delete_work_item_link | 작업 항목의 링크 삭제 |
작업 항목 유형
| 도구 이름 | 설명 |
|---|---|
list_work_item_types | 프로젝트의 모든 작업 항목 유형 나열 |
create_work_item_type | 새 작업 항목 유형 생성 |
retrieve_work_item_type | ID로 작업 항목 유형 검색 |
update_work_item_type | ID로 작업 항목 유형 업데이트 |
delete_work_item_type | ID로 작업 항목 유형 삭제 |
import_work_item_types_to_project | 워크스페이스 수준 작업 항목 유형을 프로젝트에 대량 연결 |
resolve_work_item_type | 프로젝트에 대해 명명된 유형을 찾거나 생성하고, 워크스페이스 vs 프로젝트 범위 및 가져오기를 자동 처리 |
작업 항목 관계
| 도구 이름 | 설명 |
|---|---|
list_work_item_relations | 작업 항목의 관계 나열 |
create_work_item_relation | 작업 항목에 대한 관계 생성 |
remove_work_item_relation | 작업 항목에서 관계 제거 |
작업 항목 관계 정의
| 도구 이름 | 설명 |
|---|---|
list_work_item_relation_definitions | 워크스페이스 사용자 정의 관계 정의 나열 |
create_work_item_relation_definition | 워크스페이스 관계 정의 생성 |
update_work_item_relation_definition | 관계 정의 업데이트 |
delete_work_item_relation_definition | 관계 정의 삭제 |
작업 항목 활동
| 도구 이름 | 설명 |
|---|---|
list_work_item_activities | 작업 항목의 활동 나열 |
retrieve_work_item_activity | 작업 항목의 특정 활동 검색 |
작업 로그
| 도구 이름 | 설명 |
|---|---|
list_work_logs | 작업 항목의 작업 로그 나열 |
create_work_log | 작업 항목에 대한 작업 로그 생성 |
update_work_log | 작업 항목의 작업 로그 업데이트 |
delete_work_log | 작업 항목의 작업 로그 삭제 |
페이지
| 도구 이름 | 설명 |
|---|---|
list_pages | 페이지 나열 (워크스페이스, 또는 project_id가 제공된 경우 프로젝트의 페이지) |
retrieve_page | ID로 페이지 검색 (워크스페이스, 또는 project_id이 제공된 경우 프로젝트의 페이지) |
create_page | 워크스페이스 또는 프로젝트 페이지 생성 |
워크스페이스
| 도구 이름 | 설명 |
|---|---|
get_workspace_members | 현재 워크스페이스의 모든 멤버 가져오기 |
get_features | 기능 플래그 가져오기 (워크스페이스, 또는 project_id이 제공된 경우 프로젝트의 플래그) |
update_workspace_features | 현재 워크스페이스의 기능 업데이트 |
사용자
| 도구 이름 | 설명 |
|---|---|
get_me | 현재 인증된 사용자 정보 가져오기 |
총 도구 수: 20개 카테고리에서 100개 이상의 도구
개발
테스트 실행
pytest
코드 포맷팅
black plane_mcp/
ruff check plane_mcp/
라이선스
MIT 라이선스 - 자세한 내용은 LICENSE 파일을 참조하세요.
기여하기
기여는 언제나 환영합니다! Pull Request를 자유롭게 제출해 주세요.
지원 중단 안내
⚠️ Node.js 기반 plane-mcp-server는 지원이 중단되었으며 더 이상 유지보수되지 않습니다.
이 저장소는 Plane MCP 서버의 새로운 Python+FastMCP 기반 구현을 나타냅니다. 이전 Node.js 버전을 사용 중이었다면, 지속적인 지원과 업데이트를 위해 이 Python 기반 버전으로 마이그레이션해 주시기 바랍니다.
새로운 구현이 제공하는 것:
- Pydantic 모델을 통한 향상된 타입 안전성
- FastMCP를 통한 개선된 성능
- 강화된 도구 지원 범위
- 활발한 유지보수 및 개발
마이그레이션 지원이 필요하시면 이 README의 구성 예시를 참조하거나 이슈를 열어 지원을 요청해 주세요.
이전 Node.js 구성 (지원 중단됨):
이전 Node.js 기반 @makeplane/plane-mcp-server를 사용 중이었다면, 구성은 다음과 같았습니다:
{
"mcpServers": {
"plane": {
"command": "npx",
"args": [
"-y",
"@makeplane/plane-mcp-server"
],
"env": {
"PLANE_API_KEY": "<YOUR_API_KEY>",
"PLANE_API_HOST_URL": "<HOST_URL_FOR_SELF_HOSTED>",
"PLANE_WORKSPACE_SLUG": "<YOUR_WORKSPACE_SLUG>"
}
}
}
}
위의 사용법 섹션에 표시된 새로운 Python 기반 구성으로 마이그레이션해 주세요.