todo-mcp
todo-mcp
TODO.md를 저장소로 사용하는 MCP 서버입니다. 파일을 직접 읽고, 편집하고, diff할 수 있습니다. 쓰기는 바이트 범위 스플라이스(byte-range splice)로 이루어지므로, 파일은 계속 사용자 소유로 남습니다. 손으로 작성한 표, 탭 들여쓰기, 작업 본문 밖의 모든 산문은 절대 다시 직렬화되지 않습니다.
MCP 클라이언트에는 stdio로 말하고, 그 외에는 Streamable HTTP로 말합니다.
크레딧
CalamityAdam/mcp-todo를 기반으로 했으며, 원래 스캐폴드를 제공했습니다. 즉, createTodoMcpServer 팩토리 구조와 Express Streamable HTTP 래퍼, 세션 처리를 제공했습니다.
그 외에는 거의 남은 것이 없습니다. 그 버전은 할 일을 ~/.mcp-todos.json의 JSON blob에 번호가 매겨진 레코드로 저장했고, { id, title, done }을 다루는 세 가지 도구가 있었습니다. 이 버전은 저장소를 마크다운 문서로 바꾸고, 숫자형 ID를 슬러그(slug)로 바꾸고, 상태, 영역, 참조 이동 경로, 날짜가 적힌 로그 기록, 전체 텍스트 검색, 중복 감지를 추가하여 도구 표면을 일곱 개로 늘렸습니다. 두 프로젝트는 더 이상 한 구현을 공유하지 않습니다.
업스트림에는 LICENSE 파일이 없고 package.json에서 ISC 라이선스를 선언하고 있습니다. 이 저장소도 ISC를 이어받습니다.
설치
클론 없이 GitHub에서 바로 실행하세요:
npx github:adrianhardy/todo-mcp변경 사항을 push하고 나면, npx --ignore-existing github:adrianhardy/todo-mcp를 사용해 반영하면 됩니다.
평소에 쓰는 용도라면 한 번 설치하고 잊어버리세요:
npm i -g github:adrianhardy/todo-mcp
todo-mcp어느 쪽이든 설치 시점에 prepare 스크립트가 소스에서 빌드하므로 dist/는 커밋되지 않습니다. Node 20 이상입니다.
사용법
todo-mcp는 기본적으로 HTTP 서버로 시작합니다. 사용자가 터미널에서 실행할 때는 그게 더 실용적이기 때문입니다. 대신 MCP_STDIO=1을 설정하면 stdio로 말합니다. MCP 클라이언트가 하위 프로세스로 실행할 때는 이 방식이 필요합니다.
MCP 클라이언트에서
{
"mcpServers": {
"todo": {
"command": "npx",
"args": ["-y", "github:adrianhardy/todo-mcp"],
"env": { "MCP_STDIO": "1" }
}
}
}글로벌 설치를 사용하면 그 부분은 "command": "todo-mcp"가 되고, env 블록은 그대로입니다.
작업 디렉터리가 어떤 파일을 쓸지 결정합니다. TODO_FILE은 프로세스의 cwd(작업 디렉터리)를 기준으로 해석되고, 기본값은 TODO.md입니다. 그래서 프로젝트 안에서 시작한 클라이언트는 그 프로젝트의 할 일 목록을 편집합니다. 서버가 실제 시작되는 의해 어디서 시작되어도 상관없고 항상 같은 목록을 쓰고 싶다면 TODO_FILE을 절대 경로로 설정하세요.
HTTP로
PORT=8080 TODO_MCP_TOKEN=$(openssl rand -hex 32) todo-mcpPOST /mcp- JSON-RPC 요청GET /mcp- 서버 알림용 SSE 스트림DELETE /mcp- 세션 종료
TODO_MCP_TOKEN을 설정하면 이 세 메서드 모두 Authorization: Bearer <token>이 필요합니다. 설정하지 않은 채로 두면 인증이 꺼지는데, 로컬호스트에서는 허용되고 그 외에서는 아무 데서나 열지 말아야 합니다.
구성
변수 | 기본값 | 의미 |
| TODO.md | cwd 기준으로 확인되는 저장 경로 |
| unset |
|
|
| HTTP 포트 |
| unset | bearer token; unset은 인증 없음 |
.env 파일이 있으면 그 파일을 읽습니다. .env.example 참고하세요.
저장
TODO.md는 그냥 JSON blob이 아니라 저장소 자체입니다. 파일 곧 기록입니다. 사람이 읽을 수 있고, 손으로 편집할 수 있고, git에서 diff할 수 있습니다.
작업 하나는 ## 섹션입니다. 서버가 관리하는 필드는 헤딩 바로 아래 주석 블록에 들어 있고, 그 아래 내용은 사람이 소유한 prose입니다.
## Feature Idea version two: the new widget which tracks things
<!-- todo
id: feature-idea-version-two
area: inventory
status: next
refs: [./src/do_stuff.ts, ClassName.Method, OtherClassName]
created: 2026-08-19
updated: 2026-08-22
-->
**Next step:** close the ledger. ClassName.Method uses 0.25 and it needs 17.2%.
**Already known:** ...
### Log
- 2026-08-22 Slab_Wall_1x3 not started; parade places 24 of those to every 6 of the 3x3.ID는 숫자가 아니라 slug입니다. 그래서 재정렬이나 삭제에도 살아남습니다. 파일의 순서가 곧 순서이기 때문에, 별도의 priority 필드가 없는 겁니다.
쓰기는 byte-range 스플라이스입니다. 수정은 자기 illus가 소유한 구간만 다시 씁니다. 손으로 만든 표, 탭 들여쓰기, 작업 섹션 밖의 어떤 prose도 다시 serialized는 없고, 따라서 다시 포맷되거나 손실될 일이 없습니다. 핸들러는 lock으로 강제 직렬화합니다. 왜냐하면 두 개의 번째가 서로 얽히며 읽기-수정-쓰기를 하면, 이제 않는 시점의 오프셋에 스플라이스하는 게 될 테니까요.
설계
list는 짧게 줄입니다.
list_todos는 한 줄 by index만 반환하고 작업 본문을 반환하지 않습니다.get_todo는 한 섹션 전체를 반환합니다.q나ref가 의도된 경로이고, 목록을 통째로 나열하는 것은 예외적인 경우입니다.캡처에는 필드 하나만.
title만 필수이고, 새 작업의 상태 기본값은captured입니다. 무언가 발견한 사실을 일단 기록할 때 그 자리에서 영역(area)과 다음 단계를 요구하는 그런 인터페이스는 실제로 쓰이지 않습니다. 그러니 처음에 발견 그대로 기록해야 이 파일이 존재할 가치가 (유지됩니다. triage로 나중에captured를open/next/parked/someday로 옮기면 됩니다.
상태 값
상태 | 의미 |
| 가공되지 않은, triage 전 상태. 새 작업의 기본값이며, 필터 없는 목록에서는 숨깁니다 |
| 실제 할 일이고 아직 분명함 |
| 바로 지금 할 일 |
| 의도적으로 미룸. 뒤에 이유가 본문으로 적힌 상태 |
| 언젠가 하면 좋겠음 |
| 끝났음. 기록을 위해 파일에 남겨두고, 필터 없는 목록에서는 숨김 |
도구
list_todos- 한 줄로 줄인 목록;area,status,ref,q,limitget_todo- 작업 하나의 전체 마크다운. 본문 포함add_todo- 작업 하나를 캡처;title만 필요. 가능한 중복도 알려줍니다update_todo- 어떤 필드든 수정; 전달한 것만 그 부분이 다시 쓰는append_note- 작업의 로그에 본문에 날짜가 적힌 불릿 하나 추가set_status- 작업을 분기/triage 단계로 단계로 옮기기remove_todo- 작업과 본문을 삭제합니다.set_status done을 먼저 권장
리소스
todos://list- open 작업들을 한 줄 목록으로 보여줌
아키텍처
src/todo.ts- markdown 저장소: 파싱, byte-range 패치, 쿼리, 중복 제거src/server.ts- MCP 도구 표면. import 시 부작용 없는 순수 팩토리src/http.ts- Streamable HTTP transport, auth, 그리고 세션 mapsrc/cli.ts-todo-mcpbinary. transport를 선택하고 시작
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Manage feature requests, votes, roadmaps, and changelogs from any MCP client.
Create, update, and publish changelog entries on your Patchlog changelog from any MCP client.
Project management MCP for AI agents with safe task reads and writes.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/adrianhardy/todo-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server