Plane
공식Plane 공식 MCP 서버는 Plane API와의 통합을 제공하여 Plane 프로젝트, 작업 항목, 사이클 등의 전체 AI 자동화를 가능하게 합니다.
Plane MCP(으)로 무엇을 할 수 있나요?
- 작업 항목 생성 및 업데이트 — 어시스턴트에게 "로그인 수정"과 같은 작업 항목을 생성하거나
workitem도구를 통해 상태, 우선순위 또는 담당자를 업데이트하도록 요청하세요. - PQL로 작업 항목 쿼리 — Plane의 쿼리 언어를 사용하여
state__group = "started" AND priority = "urgent"와 같은 필터로 작업 항목을 나열, 계산 또는 검색하세요. - 사이클 및 모듈 관리 — 통합 리소스 도구를 통해 사이클 보관, 프로젝트 사이클 나열 또는 기타 사이클/모듈 작업을 수행하세요.
- URL에서 첨부 파일 처리 —
upload_from_url을 통한 SSRF 제어를 위한 프록시 지원과 함께 외부 URL에서 첨부 파일 업로드를 트리거하세요. - PQL 구문 참조 검색 —
get_pql_reference를 호출하여 전체 PQL 구문, 연산자 및 실제 예제를 요청하세요.
문서
Plane MCP 서버
Plane용 Model Context Protocol 서버입니다. AI 에이전트가 프로젝트, 작업 항목, 사이클, 모듈, 릴리스, 고객 등을 읽고 관리할 수 있는 도구를 제공합니다.
FastMCP와 공식 plane-sdk 기반으로 구축되었습니다.
- 30개 도구, Plane 리소스별 1개, 207개 작업 포함
- 로컬 또는 원격 — stdio, streamable HTTP, SSE
- OAuth 또는 API 키 인증
빠른 시작
Plane에서 API 키를 받으세요: 워크스페이스 설정 → API 토큰.
MCP 클라이언트 구성에 다음을 추가하세요:
{
"mcpServers": {
"plane": {
"command": "uvx",
"args": ["plane-mcp-server", "stdio"],
"env": {
"PLANE_API_KEY": "<your-api-key>",
"PLANE_WORKSPACE_SLUG": "<your-workspace-slug>"
}
}
}
}
uvx는 설치 단계가 필요 없습니다. Python 3.10+가 필요합니다.
자체 호스팅 Plane의 경우 "PLANE_BASE_URL": "https://plane.example.com"를 추가하세요.
전송 방식
stdio — 로컬
MCP 클라이언트의 하위 프로세스로 실행됩니다. 위와 같은 구성이 필요하며, PLANE_API_KEY와 PLANE_WORKSPACE_SLUG가 필요합니다.
PLANE_API_KEY=... PLANE_WORKSPACE_SLUG=... uvx plane-mcp-server stdio
OAuth가 포함된 HTTP — 호스팅
https://mcp.plane.so/http/mcp
OAuth 흐름은 연결 시 처리되므로 구성에 자격 증명이 필요 없습니다. 네이티브 원격 MCP를 지원하지 않는 클라이언트는 mcp-remote로 브리지하세요:
{
"mcpServers": {
"plane": {
"command": "npx",
"args": ["mcp-remote@latest", "https://mcp.plane.so/http/mcp"]
}
}
}
Node.js 22+가 필요합니다.
개인 액세스 토큰이 포함된 HTTP — 호스팅
https://mcp.plane.so/http/api-key/mcp
| 헤더 | 값 |
|---|---|
Authorization | Bearer <PAT> |
X-Workspace-slug | <workspace-slug> |
{
"mcpServers": {
"plane": {
"command": "npx",
"args": ["mcp-remote@latest", "https://mcp.plane.so/http/api-key/mcp"],
"headers": {
"Authorization": "Bearer <PAT>",
"X-Workspace-slug": "<workspace-slug>"
}
}
}
}
SSE — 더 이상 사용되지 않음
https://mcp.plane.so/sse는 하위 호환성 목적으로만 유지됩니다. HTTP 전송 방식을 사용하세요.
도구
서버는 리소스별 1개씩 총 30개 도구를 제공합니다. 각 도구는 작업을 선택하는 action 매개변수를 받습니다:
workitem(action="create", project_id=..., name="Fix login")
workitem(action="list", project_id=..., pql='state__group = "started"')
cycle(action="archive", project_id=..., cycle_id=...)
모든 도구의 설명에는 필수 및 선택 매개변수와 함께 해당 작업이 나열되므로, 호출 시 카탈로그가 자체 문서화됩니다.
작업 항목 쿼리
목록, 개수 및 검색은 Plane의 쿼리 언어인 PQL을 지원합니다:
workitem(action="list", project_id=..., pql='state__group = "started" AND priority = "urgent"')
workitem(action="count", pql='assignees__id = "<member id>"', group_by="state_id")
전체 구문, 연산자 및 실제 예제는 get_pql_reference를 호출하세요.
작업별 도구에서 업그레이드
이전 릴리스에서는 API 작업별로 하나의 도구를 제공했습니다. 기존 통합은 계속 작동합니다: 177개 이름 중 169개가 통합 도구로 계속 확인되므로, create_work_item 또는 list_cycles를 호출하는 저장된 프롬프트나 스크립트는 변경할 필요가 없습니다. 더 이상 광고되지 않으며, 제공된 매개변수 이름을 유지합니다(work_item_id, workitem_id 아님).
7개 이름은 매개변수(manage_project_archive(archive=False))로 두 작업 중 하나를 선택했는데, 이는 하나의 도구-작업 쌍으로 재현할 수 없습니다. 호출하면 대체 항목을 알려줍니다. get_pql_reference는 변경되지 않았습니다.
구성
인증
| 변수 | 필수 대상 | 용도 |
|---|---|---|
PLANE_API_KEY | stdio | API 키 |
PLANE_WORKSPACE_SLUG | stdio | 대상 워크스페이스 |
PLANE_BASE_URL | 선택 | Plane API URL (기본값 https://api.plane.so) |
원격 전송 방식은 연결에 자격 증명을 포함합니다 — OAuth 흐름 또는 PAT 헤더 — 따라서 이러한 변수가 필요 없습니다.
첨부 파일 업로드를 위한 아웃바운드 프록시
HTTP_PROXY / HTTPS_PROXY / NO_PROXY (및 소문자 형태)는 URL에서 첨부 파일 업로드 가져오기(upload_from_url)에 적용됩니다. 프록시가 특정 요청에 적용되는 경우, 프록시 — 이 서버가 아님 — 가 해당 요청의 SSRF 제어입니다: 서버는 대상의 확인된 주소를 고정하거나 검증하지 않습니다. 프록시가 대상에 독립적으로 연결하고 확인하기 때문입니다. NO_PROXY 및 프록시 이그레스 정책을 그에 따라 범위를 지정하세요.
서버 자체를 자체 호스팅하는 경우:
| 변수 | 용도 |
|---|---|
PLANE_INTERNAL_BASE_URL | 서버 간 호출을 위한 내부 URL, PLANE_BASE_URL보다 우선 |
REDIS_URL | 단일 연결 URL로 OAuth 토큰 저장 (TLS의 경우 redis:// 또는 rediss://); 호스트/포트보다 우선 |
REDIS_HOST / REDIS_PORT | OAuth 토큰 저장; 메모리로 대체 |
PLANE_OAUTH_PROVIDER_* | OAuth 클라이언트 자격 증명 및 기본 URL |
MCP_PATH_PREFIX | 프록시 뒤에 마운트될 때 HTTP 라우트의 경로 접두사 — /plane는 /plane/http/mcp를 제공 |
OAuth 리디렉션 URI
OAuth 전송 방식은 각 클라이언트의 리디렉션 URI를 허용 목록에 대해 검증합니다. 일반적인 클라이언트(Cursor, VS Code, Claude.ai, ChatGPT 커넥터, localhost)는 기본적으로 허용됩니다.
릴리스 없이 새 클라이언트를 온보딩하려면 패턴을 추가하세요:
export PLANE_OAUTH_ALLOWED_REDIRECT_URIS="https://newclient.com/cb,https://other.app/oauth/*"
*는 모든 포트, 경로 세그먼트 또는 하위 도메인과 일치합니다. 호스트를 고정하고 포트 또는 경로만 와일드카드하세요.
로깅
구조화된 JSON. 각 도구 호출은 이름, 기간, 상태 및 — 가능한 경우 — 불투명한 사용자 ID와 워크스페이스 슬러그를 기록합니다.
export LOG_USER_INFO=false # also log the display name (PII);
export LOG_PAYLOADS=false # keep request payloads out of logs; default true
OAuth 및 PAT 전송 방식만 표시 이름을 전달합니다. stdio는 영향을 받지 않습니다.
개발
git clone https://github.com/makeplane/plane-mcp-server
cd plane-mcp-server
uv pip install -e ".[dev]"
워크스페이스에 대해 서버 실행:
PLANE_API_KEY=... PLANE_WORKSPACE_SLUG=... python -m plane_mcp stdio
python -m plane_mcp http # port 8211
테스트, 포맷, 린트:
pytest # no network or credentials needed
ruff format plane_mcp/ tests/ # line length 120
ruff check plane_mcp/ tests/ # rules E, F, I, UP, B
스위트는 완전히 오프라인으로 실행됩니다 — 모든 리소스의 모든 작업은 각 호출을 실제 plane-sdk 시그니처에 바인딩하는 대역으로 실행됩니다. plane_mcp/tools/README.md 참조.
실시간 통합 테스트는 실행 중인 서버를 가리키지 않으면 건너뜁니다:
export PLANE_TEST_API_KEY=... PLANE_TEST_WORKSPACE_SLUG=...
export PLANE_TEST_MCP_URL=http://localhost:8211 # optional; this is the default
pytest tests/test_integration.py -v
해당 워크스페이스에 실제 데이터를 씁니다.
저장소 구조
| 경로 | 내용 |
|---|---|
plane_mcp/__main__.py | 진입점; argv[1]에서 전송 방식 선택 |
plane_mcp/server.py | 전송 방식별 팩토리 1개 |
plane_mcp/client.py | 자격 증명을 plane-sdk 클라이언트로 확인 |
plane_mcp/auth/ | OAuth 공급자 및 헤더 인증 |
plane_mcp/tools/ | 도구 표면: Plane 리소스별 모듈 1개 |
plane_mcp/toolkit/ | 도구 표면의 공유 빌딩 블록 |
plane_mcp/pql_reference.py | 모델에 제공되는 PQL 구문 참조 |
기여
풀 리퀘스트 환영합니다. 제출 전에 pytest 및 ruff check를 실행하세요. 새 도구는 plane_mcp/tools/README.md에 설명된 불변 조건과 함께 제공되어야 합니다.
CONTRIBUTING.md 및 CODE_OF_CONDUCT.md 참조.
Node.js 서버에서 마이그레이션
@makeplane/plane-mcp-server (Node.js)는 더 이상 사용되지 않으며 유지 관리되지 않습니다. 이 Python 구현이 이를 대체합니다.
| Node.js | Python |
|---|---|
PLANE_API_KEY | PLANE_API_KEY |
PLANE_API_HOST_URL | PLANE_BASE_URL |
PLANE_WORKSPACE_SLUG | PLANE_WORKSPACE_SLUG |
command 및 args를 빠른 시작의 stdio 구성으로 교체하세요.
라이선스
MIT — LICENSE 참조.