About Local Pm
Local Pm is an MCP server published by anaskasmi in the Productivity category: free open source project management tool with a nice kanban UI, and a tool rich MCP for local development, giving your ai model great access to create and manage projects, teams, tasks, task dependencies and more.., it's local, secure, fast, token-usage friendly and docker based for a quick spin and run!.
The repository has 8 stars and 4 forks, with the last commit 10 days ago. Recent commit activity is the strongest signal that reported issues will get attention.
Install
git clone https://github.com/anaskasmi/local-pmThis server has no ConduID identity, so agent calls to it are not receipted. Pin the version you install and review the source before granting it credentials.
Tools (5)
create_projectCreate a new project with name, prefix, icon, color
Parameters not published.
delete_projectDelete a project and optionally all its tickets
Parameters not published.
get_projectGet detailed project information by ID
Parameters not published.
list_projectsList all projects with optional status filter
Parameters not published.
update_projectUpdate project properties
Parameters not published.
Ask AI
Ask AI about Local Pm
Powered by Claude · Grounded in docs
Security checks
Static checks derived from the repository yesterday. Heuristics on the source, not an audit.
- ✓README presentThe repository ships documentation.
- !License declaredNo license file. Legally you have no right to use it in a product.
- ✓Tests presentA test suite exists in the repository.
- ✓Dependencies pinnedA lockfile pins dependency versions.
- ✓No dynamic code executionSource scan found no eval, dynamic Function, or shell execution.
- !Scoped permissionsDoesn't declare a permission scope. Assume it can do anything its process can.
README
Local PM
A lightweight, self-hosted project management tool with a built-in MCP (Model Context Protocol) server that enables AI assistants to manage your projects, tickets, and teams directly.
Features
- Kanban Board - Drag-and-drop ticket management with Todo, In Progress, and Done columns
- Projects - Organize work with customizable projects (icons, colors, prefixes)
- Teams - Assign tickets to teams for better organization
- Tickets - Full-featured tickets with:
- Priority levels (Urgent, High, Medium, Low)
- Due dates
- Shared labels, optionally grouped, reusable across every project
- Subtasks with completion tracking
- Ticket dependencies (blocked by)
- Rich text descriptions
- Comments - Threaded discussion on every ticket, with markdown,
@mentions and resolvable threads - Activity trail - Every field change and comment event recorded with who did it, shown beside the comments
- Attachments - Drop, paste or pick files into a comment; images render inline, everything else becomes a link
- MCP Server - AI-native project management via Model Context Protocol
- Self-Hosted - Your data stays on your machine
- A guided start - A first-project welcome screen and an always-available getting-started guide
- Find work quickly - Search titles or ticket keys from the board, ticket lists, or command palette
- Saved board views - Name a set of filters and return to it later on the same browser
- Recoverable ticket drafts - Restore unfinished new tickets while the browser tab remains open
- Responsive navigation - Visible mobile navigation, keyboard-accessible drawers, and touch-sized controls
- Docker Ready - One command deployment
Screenshots
Kanban Board
Tickets
Projects
Teams
Installation
Using Docker (Recommended)
- Clone the repository:
git clone https://github.com/your-username/local-pm.git
cd local-pm
- Start the containers:
docker-compose up -d
- Access the app at http://localhost:3010
Manual Installation
- Clone the repository and install dependencies:
git clone https://github.com/your-username/local-pm.git
cd local-pm
npm install
- Set up environment variables:
cp .env.example .env
# Edit .env with your MongoDB connection string
- Run the development server:
npm run dev
MCP Server Setup
The MCP (Model Context Protocol) server allows AI assistants like Claude to interact with your project management data directly.
Building the MCP Server
cd mcp-server
npm install
npm run build
Adding to Claude Code (Global)
claude mcp add --scope user local-pm node "/path/to/local-pm/mcp-server/dist/index.js"
Adding to Claude Desktop
Add to your Claude Desktop config (~/.claude/claude_desktop_config.json):
{
"mcpServers": {
"local-pm": {
"command": "node",
"args": ["/path/to/local-pm/mcp-server/dist/index.js"],
"env": {
"LOCAL_PM_URL": "http://localhost:3010"
}
}
}
}
MCP Tools Reference
The MCP server exposes 31 tools for complete project management:
Project Tools
| Tool | Description |
|---|---|
list_projects |
List all projects with optional status filter |
get_project |
Get detailed project information by ID |
create_project |
Create a new project with name, prefix, icon, color |
update_project |
Update project properties |
delete_project |
Delete a project and optionally all its tickets |
Team Tools
| Tool | Description |
|---|---|
list_teams |
List all teams |
get_team |
Get detailed team information by ID |
create_team |
Create a new team |
update_team |
Update team properties |
delete_team |
Delete a team |
Ticket Tools
| Tool | Description |
|---|---|
list_tickets |
List tickets with filters (project, team, status, priority) |
get_ticket |
Get detailed ticket information by ID |
create_ticket |
Create a new ticket with full properties |
update_ticket |
Update ticket properties |
move_ticket |
Move ticket to different status column |
delete_ticket |
Delete a ticket |
Board & Subtask Tools
| Tool | Description |
|---|---|
get_board |
Get full Kanban board grouped by status |
toggle_subtask |
Toggle subtask completion status |
add_subtask |
Add a subtask to a ticket |
Comment Tools
| Tool | Description |
|---|---|
list_comments |
List a ticket's comments, oldest first |
add_comment |
Post a comment, or a reply in an existing thread |
update_comment |
Edit a comment, or resolve/reopen a thread |
delete_comment |
Delete a comment and any replies under it |
Label Tools
| Tool | Description |
|---|---|
list_labels |
List the workspace's shared labels, with their group |
Activity Tools
| Tool | Description |
|---|---|
list_activity |
Read a ticket's change history, including the comment thread |
How MCP Enhances AI Development
What is MCP?
Model Context Protocol (MCP) is an open standard that enables AI assistants to interact with external tools and data sources. Instead of just chatting, AI can take actions in the real world through well-defined tool interfaces.
Benefits for AI-Assisted Development
-
Persistent Task Tracking
- AI can create tickets for features it's implementing
- Track progress across coding sessions
- Never lose context on what was done or what's pending
-
Structured Workflow
- AI breaks down complex features into subtasks
- Sets priorities and due dates
- Manages dependencies between tickets
-
Project Organization
- AI can organize work into logical projects
- Assign tasks to teams
- Maintain a clear overview of all work
-
Seamless Integration
- Works directly in your AI coding workflow
- No context switching to external tools
- AI reads and updates tickets as it works
Example Workflow
You: "Create a project for our new authentication system"
AI: [Creates project AUTH with relevant description]
You: "Break down the login feature into tickets"
AI: [Creates tickets for:
- AUTH-1: Implement login form UI
- AUTH-2: Create authentication API endpoint
- AUTH-3: Add JWT token handling
- AUTH-4: Implement session management
Sets AUTH-2 as blocking AUTH-3 and AUTH-4]
You: "Start working on the login form"
AI: [Moves AUTH-1 to In Progress, implements the feature,
then moves to Done when complete]
Why Local & Self-Hosted?
- Privacy: Your project data stays on your machine
- Speed: No network latency for AI tool calls
- Control: Customize and extend as needed
- Offline: Works without internet connection
Security
Local PM is local-first. Out of the box it is open, which is the right default for a tool bound to loopback on your own machine and the wrong one for anything another host can reach.
Access control
By default the REST and GraphQL APIs are fully open: any client that can reach the port can read and write every ticket, project and team. To require a logged-in user for every operation, set:
LOCAL_PM_REQUIRE_AUTH=true
Bootstrap the first account over REST:
curl -X POST http://localhost:3010/api/users \
-H 'Content-Type: application/json' \
-d '{"email":"you@example.com","password":"a-strong-password","role":"admin"}'
Then authenticate as either a person or an automated caller:
# Person — log in, then send the returned token
curl -X POST http://localhost:3010/api/users/login \
-H 'Content-Type: application/json' \
-d '{"email":"you@example.com","password":"a-strong-password"}'
curl -H "Authorization: JWT <token>" http://localhost:3010/api/tickets
# Automation — issue an API key per caller in the users collection
curl -H "Authorization: users API-Key <key>" http://localhost:3010/api/tickets
Roles: admin (may delete and manage accounts), member (read/write), and
agent (automated callers, which should hold an API key rather than a
password).
Turn the flag on only once every caller holds a credential — the bundled MCP server included — or you will lock out your own automation.
Network exposure
docker compose publishes the app on 127.0.0.1 and gives MongoDB no host
port at all. To expose the app deliberately, set LOCAL_PM_BIND=0.0.0.0 — and
enable LOCAL_PM_REQUIRE_AUTH before you do.
Secrets (PAYLOAD_SECRET, DATABASE_URI) are passed at runtime only, never as
Docker build args, since build args are baked into image layers and readable
through docker history.
Known issue
The Payload admin panel at /admin currently returns 500 (Cannot destructure property 'config' from @payloadcms/ui). This is pre-existing and unrelated to
access control — create the first account over REST as shown above. Everything
else, including the whole REST API, is unaffected.
Testing
npm run typecheck # tsc --noEmit
npm run test # vitest — pure logic (drag math, access rules)
npm run test:e2e # playwright — full browser E2E
npm run verify # all three
E2E tests run against a local mongod, never your working database and never
the cluster in DATABASE_URI. The suite starts its own mongod for the run and
stops it afterwards, so a run needs no database setup, costs no network round
trip per query, cannot be throttled by a shared Atlas tier, and works offline.
The first run on a machine downloads a mongod binary (about 600MB) into
~/.cache/mongodb-binaries. That cache is shared by every checkout and
worktree, so it is paid once, not once per branch.
It is a single-member replica set rather than a standalone server because Payload writes inside transactions, and a standalone mongod cannot serve those.
Everything a run touches is keyed to its port — database (local-pm-e2e-<port>),
mongod port, build directory (.next-e2e-<port>) and artifacts
(test-results-<port>) — and the app port is claimed by scanning upward from
3020 for a free one. Two runs therefore share no resource and neither can stop
the other's database.
Each run starts from an empty database: global-setup clears every collection
before the migrations seed it, so test data cannot accumulate between runs.
To use a mongod you run yourself (a native install, or a compose service), point
E2E_MONGO_URI at it and the suite will not start one:
E2E_MONGO_URI=mongodb://localhost:27017/local-pm npm run test:e2e
| Variable | Default | Use |
|---|---|---|
E2E_PORT |
first free from 3020 | Pin the app port, and with it the database, mongod port, build dir and artifacts |
E2E_PORT_BASE |
3020 |
Where the scan starts |
E2E_PORT_SCAN_LIMIT |
20 |
How many ports the scan tries |
E2E_MONGO_URI |
unset | Use a mongod you already run, instead of a managed one |
E2E_MONGO_PORT |
27018 + the app port's offset |
Pin the managed mongod's port |
E2E_DATABASE_URI |
derived from the local mongod | Point the suite at a specific database |
E2E_KEEP_DATABASE |
unset | Set to true to keep the previous run's data |
MONGOMS_VERSION |
7.0.14 |
The mongod the suite downloads and runs |
MONGOMS_DOWNLOAD_DIR |
~/.cache/mongodb-binaries |
Where that binary is cached |
First run needs browsers:
npx playwright install chromium
Upgrading an existing install
Two data-model changes need a one-off migration. Both are idempotent, so running them twice is safe, and both run automatically against the E2E database.
npm run migrate:statuses # string ticket statuses -> the statuses collection
npm run migrate:labels # inline ticket labels -> the labels collection
migrate:labels creates one shared label per distinct inline label name, keeping
the closest colour from the fixed palette, and rewrites each ticket to reference
them. Labels that differed only in casing or punctuation collapse into one — that
is the point of the change.
Tech Stack
- Frontend: Next.js 15, React, Tailwind CSS
- Backend: Payload CMS 3.0
- Database: MongoDB
- MCP Server: TypeScript, @modelcontextprotocol/sdk
- Testing: Vitest (unit), Playwright (E2E)
Special Thanks
Built with Payload CMS
README fetched from the repository yesterday. The original is authoritative.