Mcpp Plan
БесплатноНе проверенPersistent task and step tracker for AI coding agents (mcpp tool module)
Описание
Persistent task and step tracker for AI coding agents (mcpp tool module)
README
A persistent task and step tracker for AI coding agents. Gives Claude Code (or any MCP-compatible agent) the ability to break work into tasks, track steps within each task, and remember exactly where it left off across sessions.
New here? See RAPIDSTART.md — clone, configure, and start using it in under 10 minutes.
Dogfooded daily. This module is developed, maintained, and continuously improved using itself. Every feature gets real-world testing the moment it's built.
Agent-portable. Start a task in one agent, pick it up in another — no context lost. The state lives in the database, not the conversation.
Why
AI agents lose context between sessions. When you resume a conversation, the agent doesn't know what it was doing, which steps are done, or what's next. mcpp-plan solves this by giving agents a structured, persistent task manager backed by SQLite.
The agent talks to it through MCP tools. You talk to the agent in plain English. The agent manages the rest.
How it works
project
└── user (auto-detected from $USER)
└── task (a focus area, like "build login page")
└── step (individual action, like "create user table")
- Tasks are top-level work items (features, bugs, refactors)
- Steps are ordered actions within a task
- One task and one step are active at a time -- the agent always knows what to do next
- State persists in
plan.dbwithin the module directory - Multi-user -- each OS user gets independent task cursors within a shared database
Installation
mcpp-plan is an mcpp tool module. Install it by adding the tool path to your mcpp configuration.
Prerequisites
- Python 3.10+
- SQLite 3 (bundled with Python)
- An MCP-compatible agent (Claude Code, etc.)
Setup
- Clone both repos as siblings:
cd ~/projects
git clone [email protected]:pacmac/mcpp.git
git clone [email protected]:pacmac/mcpp-plan.git
mcpp's default tools.yaml already includes ../mcpp-plan, so no extra configuration is needed if they're side by side.
- Register the MCP server with Claude Code:
claude mcp add mcpp --scope user \
--env MCPP_LOG_LEVEL=error \
--env MCPP_TIMEOUT_SECONDS=30 \
-- python3 ~/projects/mcpp/mcpp.py
Replace ~/projects with your install folder.
- The database is created automatically as
plan.dbin the module directory on first use. No setup required.
Tools
All tools are exposed via MCP with the plan_ prefix.
Task tools
| Tool | Description |
|---|---|
plan_task_new |
Create a task with initial steps; optional area to assign a functional area |
plan_task_list |
List tasks (yours by default, show_all for everyone); optional area to filter |
plan_task_show |
Show a task and its steps |
plan_task_status |
Show active task and progress |
plan_task_switch |
Switch to a different task |
plan_task_complete |
Mark a task as completed |
plan_task_move |
Move a task to a different project (reports attached files to move manually) |
plan_task_rename |
Rename a task's display title (slug unchanged, history preserved) |
plan_step_retitle |
Retitle a step (status/completed_at/order unchanged) |
plan_task_adopt |
Adopt (deep-copy) another user's task into your own list |
plan_task_set_area |
Set or clear the functional area on a task |
plan_task_notes_set |
Set a note on a task (upsert: goal/plan replace by kind, note updates by ID or creates new) |
plan_task_notes_get |
View notes on a task (returns notes with IDs) |
plan_task_notes_delete |
Delete a note from a task by ID |
Area tools
| Tool | Description |
|---|---|
plan_area_new |
Define a functional area for this project (stored in plan.db) |
plan_area_list |
List functional areas defined for this project |
plan_area_rename |
Rename an area; cascades to all tasks assigned to it |
plan_area_delete |
Delete an area (refuses if tasks are still assigned) |
Step tools
| Tool | Description |
|---|---|
plan_step_list |
List steps in a task |
plan_step_show |
Show step details |
plan_step_switch |
Switch to a specific step |
plan_step_done |
Mark a step as complete |
plan_step_new |
Add a step to a task |
plan_step_delete |
Soft-delete a step |
plan_step_reorder |
Reorder steps within a task |
plan_step_notes_set |
Set a note on a step (upsert: updates by ID or creates new) |
plan_step_notes_get |
View notes on a step (returns notes with IDs) |
plan_step_notes_delete |
Delete a note from a step by ID |
User tools
| Tool | Description |
|---|---|
plan_user_show |
Show current user info |
plan_user_set |
Set your display name |
Project tools
| Tool | Description |
|---|---|
plan_project_show |
Show project metadata |
plan_project_list |
List all known projects |
plan_project_set |
Set project name and description (key-gated when web.key is set) |
plan_project_select |
Select active project by ID (hidden from agents, requires web.key) |
plan_project_relink |
Relink an existing project after moving or renaming its workspace |
plan_project_purge |
Permanently delete a project and all its data from the database (exports a markdown backup first) |
File attachment tools
| Tool | Description |
|---|---|
plan_file_attach |
Attach a workspace-relative file to a project, task, or step |
plan_file_detach |
Remove an attachment by ID (does not delete the file) |
plan_file_list |
List attachments for the active project, task, or step, with inline content |
Report tools
| Tool | Description |
|---|---|
plan_project_report |
Generate a project report (.md) with all tasks, goals, plans, and steps |
plan_task_report |
Generate a task report (.md) with goal, plan, steps, and notes |
Reports are written to the workspace directory with date-stamped filenames (e.g. project_report_260215.md, task_report_build-auth_260215.md). Same-day files are overwritten.
Version control
Git operations (checkpoint, commit, push, log, status, diff, file history, file restore) are provided by mcpp-git as dev_* tools. Calling the old plan_* git tool names returns a redirect message pointing to the correct dev_* equivalent.
Web API (project selection)
When mcpp-plan is accessed from a web server (no workspace_dir context), the server needs to explicitly select which project to operate on.
Setup: Add a secret key to config.yaml:
web:
key: "your-secret-key-here"
How it works:
- The web server calls
plan_project_listto show available projects - The user picks a project
- The web server calls
plan_project_selectwith the project ID and key - All subsequent tool calls use that project instead of auto-detecting from workspace
- Pass
project_id: 0to clear the override and revert to auto-detect
Security:
plan_project_selectis hidden from MCP discovery — agents never see it- Both
plan_project_selectandplan_project_setrequire thekeyparameter whenweb.keyis configured plan_project_listis open — agents can list projects but cannot select or modify them- When
web.keyis empty (default), the key gate is inactive andplan_project_setworks without a key
Config tools
| Tool | Description |
|---|---|
plan_config_show |
Show current configuration (merged defaults + overrides) |
Utility
| Tool | Description |
|---|---|
plan_readme |
Display the user-facing README |
Usage
You interact with plan through your agent in natural language. Examples:
"Create a task called build-auth with steps: design schema, implement JWT, add middleware, write tests"
"What am I working on?"
"Mark step 1 as done"
"Switch to step 2"
"Add a note: decided to use refresh tokens"
"Show me all my tasks"
"Switch to the fix-search task"
The agent translates these into MCP tool calls automatically.
Step lifecycle
planned → started → complete
Only one step can be started at a time within a task. When you switch steps, the new one becomes started. Completing a step marks it complete.
Note kinds
Notes have a kind field that classifies their purpose:
| Kind | Purpose | When to use |
|---|---|---|
goal |
What needs to be achieved | Before starting work -- defines the objective |
plan |
How it will be done | Before starting work -- defines the approach |
note |
Observations and updates | During execution -- freeform (default) |
Setting notes
Use _set tools to create or update notes. For goal/plan kinds, the note is upserted by kind (only one goal and one plan per task). For regular notes, pass an id to update or omit to create new:
plan_task_notes_set text="Implement user authentication" kind="goal"
plan_task_notes_set text="Use JWT with refresh tokens" kind="plan"
plan_task_notes_set text="Decided to skip OAuth for now"
Setting goal or plan again replaces the existing one — no duplicates.
Reading notes
Use _get tools to view notes. Notes are returned with IDs so you can update or delete them:
plan_task_notes_get # all notes
plan_task_notes_get kind="goal" # only goal notes
Updating and deleting notes
Pass the note id (returned by _get, _set, show, and switch) to update or delete:
plan_task_notes_set text="Revised note" id=42 # update note 42
plan_task_notes_delete id=42 # delete note 42
Workflow enforcement
By default, tasks require at least one goal and one plan note before steps can be switched or completed. This ensures every task has a clear objective and approach before implementation begins. Disable this in config.yaml:
workflow:
require_goal_and_plan: false
Display
plan_task_show and plan_task_switch display goal and plan notes inline and return all notes with IDs, so the purpose and approach are always visible and notes can be updated in a single follow-up call. plan_step_show and plan_step_switch similarly include step notes with IDs.
Migrated tasks
Tasks that existed before note kinds were introduced have migration placeholder notes ("(migrated — no goal defined)"). These are not displayed in plan_task_show and do not satisfy workflow enforcement. Replace them by adding real goal and plan notes to those tasks.
Task adoption
Use plan_task_adopt to deep-copy another user's task (or clone your own) into your task list. This is useful when multiple agents or users want to work on similar tasks independently, or when you want to fork a task as a starting point.
plan_task_adopt name="build-auth" new_name="build-auth-v2"
What gets copied:
- Task metadata (name, description)
- All steps (with parent references remapped)
- All task-level notes (goal, plan, note)
- All step-level notes
What does not get copied:
- Changelog — a single "Adopted from {user}/{task}" entry is created instead
By default, all step statuses are reset to planned so you start fresh. Pass reset=false to preserve original statuses.
The adopted task becomes active automatically. A new_name is required if a task with the source name already exists in the project.
Database
All state lives in a single SQLite database at plan.db in the module directory, shared across all projects. Each project is identified by its absolute filesystem path. If you move or rename a workspace, call plan_project_relink with exactly one selector (project_id, old_path, or unique name) to update the saved path to the current workspace. If an empty placeholder project was already created at the new path, relinking removes it; if the target path already has tasks or user state, relinking stops with a conflict.
Schema
Core tables:
project-- workspace metadata (name, path, description)users-- OS users with optional display namescontexts-- tasks (name, status, owner, project)tasks-- steps within a task (title, status, ordering)context_state-- active step cursor per taskuser_state-- active task cursor per user per projectuser_prefs-- per-user preferences (active project override for web access)context_notes/task_notes-- typed notes (goal,plan,note)changelog-- audit log of all state changes
Schema migrations are applied automatically via numbered patches in schema_patches/.
Configuration
Global settings live in config.yaml in the module directory (alongside plan.db). The file is optional — all keys have sensible defaults. Settings are organized by section.
workflow:
require_goal_and_plan: true # require goal and plan notes before step progress
allow_reopen_completed: false # allow switching to completed tasks (reopens them)
daily_backup: true # create one backup per day on first use
backup_retain_days: 7 # delete backups older than this many days
enable_steps: true # set false to hide step tools and strip step data
stale_task_days: 0 # nag when a task has no activity for N days (0 = disabled)
web:
key: "" # web API key (empty = disabled, set to enable project selection)
Feature Toggles
Disable features you don't need:
workflow:
enable_steps: false # hide step tools, strip step data from results
When disabled:
- Tools are hidden from MCP discovery (
tools/list) - Direct calls return a clear error:
"Tool 'X' is disabled (enable_Y: false in config.yaml)" - Step data is stripped from task results and display text
Defaults
| Section | Key | Default | Description |
|---|---|---|---|
workflow |
require_goal_and_plan |
true |
Require goal and plan notes before step progress |
workflow |
allow_reopen_completed |
false |
Allow switching to completed tasks (sets them back to active) |
workflow |
daily_backup |
true |
Create one backup per day on first use |
workflow |
backup_retain_days |
7 |
Delete backups older than this many days |
workflow |
enable_steps |
true |
Set false to hide step tools and strip step data |
web |
key |
"" |
Web API key for project selection (empty = disabled) |
attachments |
inline_lines |
100 |
Max lines of an attached file to inline in show output |
Behavior
- Missing file = all defaults
- Missing keys = defaults for those keys
- Unknown keys are preserved in the file but ignored by the system
- Invalid YAML falls back to all defaults
Tools
plan_config_show-- show current settings (merged defaults + overrides)- Config is read-only from MCP — edit
config.yamldirectly to change settings
File Attachments
Attach workspace files (specs, design docs, READMEs) to a project, task, or step as a single source of truth. The file path is stored in the database; content is read from the file at display time — no duplication.
plan_file_attach file_path="specs/feature.md" scope=task label="Feature spec"
plan_file_attach file_path="ARCHITECTURE.md" scope=project
plan_file_attach file_path="steps/step1.md" scope=step kind=plan
plan_file_list # active task's attachments (with inline content)
plan_file_list scope=project
plan_file_detach id=3
Scope
| Scope | Attached to |
|---|---|
task (default) |
Active task (context) |
project |
The current project |
step |
The active step |
Kind
| Kind | Purpose |
|---|---|
ref (default) |
General reference document |
goal |
The file defines what needs to be achieved |
plan |
The file defines how it will be done |
Path rules
- Must be relative to the workspace root (
specs/feature.md, not/home/user/specs/feature.md) - Must not escape the workspace (no
../traversal) - The file does not need to exist at attach time — broken links are flagged with ⚠ on list
Inline display
plan_file_list, plan_project_show, plan_task_show, and plan_step_show inline attached file content up to attachment_inline_lines (default 100). Files longer than that show a truncation notice.
Automated reminders
mcpp-plan injects contextual reminders into tool responses to keep the project clean.
Done-but-not-closed nag
Every tool response checks whether any task in the current project has all steps marked complete but was never closed with plan_task_complete. If found, a warning is appended:
⚠ 2 task(s) have all steps complete but are not closed: `build-auth`, `fix-search`.
Call plan_task_complete for each.
This fires on every call until the tasks are closed. The goal is zero outstanding tasks per project. Suppressed during a plan_task_complete call itself.
Project info nudge
If the current project has no name or description set, a one-time nudge prompts the agent to call plan_project_set. Suppressed once set.
Migration safety
Schema migrations are protected by a multi-layer safety pipeline (backup.py):
- Verified backup --
plan.dbis copied to.backups/plan.db.YYMMDDxand the SHA-256 checksum is verified to match the live DB before proceeding. - Trial migration on a copy -- all patches are applied to a temporary copy of the database first. If the trial fails (SQL error or data loss), the live DB is never touched.
- Row count validation -- after the trial, every table's row count is compared to pre-migration counts. Any decrease aborts the migration.
- Live migration + re-validation -- only after the trial passes are patches applied to the live DB, followed by a second row count validation.
If anything fails at any step, the migration aborts with a clear error message and the path to the backup file. The live database is left untouched.
Backups use letter suffixes (a-z) for multiple backups on the same day. Migration backups are created when patches are applied. Additionally, a daily auto-backup runs on first use each day (configurable via daily_backup), with automatic pruning of backups older than backup_retain_days.
Hints & Tips
Orient the agent on a new project. When starting work on a fresh codebase, have the agent explore it first:
> Discover what this project is about, including its structure,
> and add what you learn to the project notes.
This lets the agent build its own understanding of the codebase -- what's where, how things connect, what conventions are used -- and persist that context for future sessions.
Capture ideas without losing focus. If you spot an unrelated issue or think of something while working on a task, tell the agent to note it and carry on:
> Add a task: "refactor the cache expiry logic" -- then continue
> what you were doing.
This keeps your current flow intact while making sure the thought doesn't get lost.
Let the agent plan first. For complex tasks, have it think before writing code:
> Plan how you'd approach this before writing code.
Use help for discovery. Agents can call the built-in help tool to see what's available — no need to remember tool names:
> What mcpp tools do you have?
Architecture
tool.yaml MCP tool definitions (schema for all plan_* tools)
mcpptool.py MCP entry point -- routes tool calls to Python API
context.py Business logic (create/switch/complete tasks and steps)
config.py Global configuration (config.yaml loading + defaults)
db.py SQLite connection, schema management, user/project helpers
backup.py Migration safety pipeline (verified backup, trial-on-copy, row validation)
schema.sql Base schema
schema_patches/ Incremental migrations (patch-4.sql through patch-11.sql)
Entry points
execute(tool_name, arguments, context)-- called by the MCP host for every tool invocationget_info(context)-- returns tool metadata and existing task names for autocomplete
How a tool call flows
- MCP host calls
execute("plan_step_done", {"number": 3}, {"workspace_dir": "/my/project"}) mcpptool.pyroutes to_cmd_step_done- Handler builds a command list and calls
_run_plan_cmd _run_plan_cmddynamically importsdb.pyandcontext.py, opens the central DB, and dispatchescontext.pyruns the operation in a transaction- Result dict is returned with structured data and a
displaystring for the user
Inspired By
This project was inspired by Andreas Spiess (GitHub) and his video on AI-assisted coding.
Release Notes
See RELEASE.md for the full version history.
License
Free for personal use, research, education, non-profits, and government. Not permitted for commercial use. See LICENSE for the full text.
Установка Mcpp Plan
У этого сервера нет опубликованного пакета — он собирается из исходников. Открой репозиторий и следуй инструкции в README.
▸ github.com/pacmac/mcpp-planFAQ
Mcpp Plan MCP бесплатный?
Да, Mcpp Plan MCP бесплатный — установка в пару кликов через Unyly без оплаты.
Нужен ли API-ключ для Mcpp Plan?
Нет, Mcpp Plan работает без API-ключей и переменных окружения.
Mcpp Plan — hosted или self-hosted?
Self-hosted: сервер запускается локально на твоей машине командой из раздела установки.
Как установить Mcpp Plan в Claude Desktop, Claude Code или Cursor?
Открой Mcpp Plan на unyly.org, выбери вкладку своего клиента (Claude Desktop, Claude Code, Cursor) и нажми Install — конфиг сгенерируется автоматически, без правки JSON.
Похожие MCP
GitHub
PRs, issues, code search, CI status
автор: GitHubFilesystem
Secure file operations with configurable access controls.
Memory
Knowledge graph-based persistent memory system.
Template MCP Server
A CLI tool to create a new Model Context Protocol server project with TypeScript support, dual transport options, and an extensible structure
автор: mcpdotdirectAmap Maps Mcp Server
MCP server for using the AMap Maps API
автор: duxiaohuiSupabase
Database, auth and storage
автор: SupabaseEverything
Reference / test server with prompts, resources, and tools.
Git
Tools to read, search, and manipulate Git repositories.
Sequential Thinking
Dynamic and reflective problem-solving through thought sequences.
Time
Time and timezone conversion capabilities.
Compare Mcpp Plan with
Не уверен что выбрать?
Найди свой стек за 60 секунд
Автор?
Embed-бейдж для README
Похожее
Все в категории development
