2026.10.12 일
GSD Task Manager: 내 할 일 목록을 에이전트에게도 열어 주기
오늘의 픽: GSD Task Manager
GSD Task Manager 는 할 일을 긴급한가와 중요한가 두 축의 사분면으로 나눠 정리하는 브라우저 앱에, 에이전트가 같은 목록을 읽고 쓰는 MCP 서버를 붙인 오픈소스 프로덕트다.
오늘의 픽으로 선정한 이유는 에이전트와 할 일 목록을 공유하려면 무엇을 포기해야 하는지를 구조가 그대로 보여 주어서다.

- 출처
- Show HN
- 만든 방식
- TypeScript, Next.js, Dexie, PocketBase, Claude, Cursor Agent
무엇이 다른가
할 일 앱은 사용자가 화면에서 직접 쓰도록 만들어져 있다. 에이전트에게 할 일을 맡기고 싶을 때 가장 흔한 방법은 마크다운 파일 하나를 만들어 에이전트가 고치게 하는 것이다. Show HN 스레드의 첫 댓글에도 같은 말이 있고, todo.txt 는 사용자에게도 로봇에게도 통한다는 답글도 있다. 파일 하나는 간단하지만 구조가 없다. 어느 일이 긴급하고 어느 일이 중요한지는 사용자 머릿속에만 있고, 에이전트가 무엇을 바꿨는지는 바뀐 뒤에야 안다. 사용자가 쓰는 앱과 에이전트가 보는 파일이 따로 논다.
GSD Task Manager 는 사용자가 쓰는 앱을 그대로 두고, 에이전트도 같은 앱에 접근하게 한다. 브라우저 앱은 할 일을 긴급·중요 두 축의 사분면에 놓고, MCP 서버는 같은 목록을 도구 19개로 연다. 읽기 7개, 쓰기 5개, 분석 5개, 시스템 3개이고, 쓰기 5개는 전부 dryRun 을 받아 적용 전에 결과를 미리 보여 준다. 에이전트가 할 일을 만들거나 옮기면 스키마로 검증되고, 사용자는 같은 사분면에서 그것을 본다. 마크다운 파일 대신 검증되는 도구와 사분면이라는 구조를 주는 것이다.
단, 조건이 있다. 사용자와 에이전트가 서로 다른 저장소를 본다. 브라우저 앱은 모든 할 일을 IndexedDB(브라우저 안의 로컬 데이터베이스)에 저장하고 계정도 서버도 없이 작동한다. 화면 머리글에 "Saved locally" 가 붙는 이유다. 반면 MCP 서버는 Node 프로세스라 브라우저의 IndexedDB 에 접근할 수 없고, 선택 사항인 PocketBase(단일 바이너리로 배포하는 백엔드) 동기화 서버에만 접속한다. 설계 기록 ADR 0005 에 이 한계와 검토한 대안이 적혀 있다. 브라우저 확장, WASM 으로 IndexedDB 읽기, localhost 웹소켓 서버를 저울질했고, 세 가지 모두 버리고 stdio 전송의 별도 패키지를 택했다. 이 아이디어로 얻는 것은 사용자가 쓰던 할 일 목록을 에이전트도 같은 도구로 읽고 쓰게 하는 것이다. 단, 로컬 우선을 포기하고 동기화 서버를 운영해야 한다.
어떻게 만들었나
커밋 669개가 2025-10-04 부터 하루 전까지 이어진다. 그중 Co-authored-by 트레일러에 Claude 가 적힌 커밋이 188개이고, 표기는 Claude Opus 4.5 에서 4.6, 4.8, Fable 5.1 로 바뀌어 간다. Cursor Agent 가 17개, Copilot 이 12개, Devin 이 7개다. 저장소 루트에 CLAUDE.md, AGENTS.md, .claude, .codex 디렉토리가 있고, 설계 결정은 ADR 17개로 남아 있다. README 에는 만든 과정이 적혀 있지 않다.
실행해 보니
bun install 에 4.7초, bun dev 로 바로 실행된다. 계정도 키도 없이 할 일 네 개를 만들었고, 새로고침 뒤에도 남아 있었다. 그 사이 브라우저가 보낸 요청 205개는 전부 localhost 였다. 할 일을 표시 없이 적으면 "Eliminate" 칸에 들어가고, 끝에 * 를 붙여야 "Schedule" 칸으로 간다. 빠른 입력의 기본값이 "버릴 것"이라는 뜻이다. MCP 서버는 tsc 로 빌드한 뒤 stdio 로 연결해 도구 목록을 받았다. 19개였고, 설계 기록의 20개와 다르다. list_devices 가 빠졌다. 백엔드 없이 create_task 를 dryRun 으로 부르자 미리보기를 반환했고, get_sync_status 는 healthy false 를 반환했다. 즉 MCP 서버는 실행되지만, 동기화 서버와 OAuth 로그인 없이는 할 일 하나 읽지 못한다. README 의 주장 세 개는 모두 맞았고, 도구 수가 README 에는 19개, ADR 에는 20개로 적힌 것만 다르다. 정적 빌드는 38초, 결과물은 4.3 MB 였다.
connected in 274 ms; tools: 19
create_task dryRun -> DRY RUN - Task would be created (not saved)
get_sync_status -> "healthy": false, "authenticated": false

확인하지 못한 것
PocketBase 를 설치해 실행하고 OAuth 로 로그인한 뒤 MCP 도구로 실제 할 일을 쓰는 경로는 이 환경에서 밟지 못했다. 다음에 볼 곳은 lib/sync/ 의 마지막 쓰기 우선 충돌 처리(ADR 0003)다. 에이전트와 사용자가 같은 할 일을 동시에 고치면 어느 쪽이 남는지 확인할 일이다.
판정
작동한다. 앱은 명령 두 줄로 로컬에서 끝나지만, 에이전트가 같은 목록을 보려면 동기화 서버와 OAuth 로그인이 먼저다. 브라우저에서 사분면으로 우선순위를 나누고 싶고 에이전트 연결은 나중 문제인 경우에 맞는다. 에이전트에게 할 일을 맡기는 것이 목적이라면 마크다운 파일 하나가 더 간단하다. 이 프로덕트가 그보다 나은 선택이 되는 조건은 하나, PocketBase 동기화 서버를 직접 운영할 때다.
시작하기
git clone https://github.com/vscarpenter/gsd-task-manager.gitbun installbun dev
- 필요한 것
- Bun 1.3 · Node.js 22.22 이상 · MCP 서버를 쓰려면 PocketBase 동기화 서버와 Google 또는 GitHub OAuth 로그인
- 비용
- MIT 라이선스, 무료. 동기화는 PocketBase 를 직접 운영해야 하고 저장소의 docker/ 에 구성이 있다. 호스팅판 gsd.vinny.dev 의 가격 표기는 찾지 못했다.
MCP 서버는 npm install --global gsd-mcp-server@1.3.0 뒤 gsd-mcp-server --setup 으로 Claude Desktop 설정 파일을 만든다.
실행해서 확인한 절차다.
다시 보기
7일, 30일, 90일 뒤에 이 프로덕트가 살아 있는지, 무엇이 바뀌었는지, 반응은 어떤지 다시 확인해서 여기에 적는다.