MCP Project Manager
README.md
# MCP Project Manager
A custom [MCP](https://modelcontextprotocol.io) server exposing project-management tools (`create_task`, `list_tasks`, `update_task`) backed by SQLite. Built as the Day 1 lab for the Chiron AI Engineering onboarding program.
## Tools
| Tool | Required Params | Optional Params |
|------|----------------|-----------------|
| `create_task` | `title`, `priority` (low/medium/high/critical) | `description` |
| `list_tasks` | — | `status` (todo/in_progress/done), `priority` |
| `update_task` | `id`, `status` | — |
## Project Layout
- `server.py` — MCP server definition (tools, handlers) with stdio transport, for local use with Claude Code
- `server_sse.py` — SSE transport wrapper around the same server, for remote/cloud deployment
- `db.py` — async SQLite persistence layer
## Local Development
```bash
uv sync
uv run python server.py # stdio transport (for Claude Code)
uv run python server_sse.py # SSE transport on :8000 (for testing deployment locally)
```
### Use with Claude Code
A `.mcp.json` is included pointing at the local stdio server. Restart Claude Code after cloning, then ask it to create/list/update tasks — it will call the MCP tools directly.
## Deployment (Railway / Render)
The repo includes a `Procfile` (`web: uv run python server_sse.py`) that both platforms understand.
1. Connect this GitHub repo in the Railway or Render dashboard.
2. Set the `DB_PATH` environment variable (e.g. `/data/tasks.db` if using a persistent volume).
3. Deploy. The server listens on `$PORT` (defaults to 8000) and exposes `GET /sse` + `POST /messages/`.
4. Point `.mcp.json` at the deployed URL:
```json
{
"mcpServers": {
"project-manager": {
"type": "sse",
"url": "https://<your-app>.up.railway.app/sse"
}
}
}
```
## Database
SQLite file at `$DB_PATH` (default `tasks.db`, gitignored). Schema:
```sql
CREATE TABLE tasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
description TEXT DEFAULT '',
priority TEXT NOT NULL CHECK(priority IN ('low','medium','high','critical')),
status TEXT NOT NULL DEFAULT 'todo' CHECK(status IN ('todo','in_progress','done')),
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);
```
TDQS
A3.7/5.0
Scored across 3 tools
Disambiguation5/5
Each tool has a clearly distinct purpose: creation, listing, and status update. No overlap or ambiguity.
Naming Consistency5/5
All tool names follow the consistent verb_noun pattern with snake_case, making them predictable and easy to use.
Tool Count4/5
Three tools is a minimal but reasonable set for a task manager. Each tool is essential, though the server could benefit from a few more operations.
Completeness3/5
The server covers create, list, and update status, but misses delete and get details. This is a notable gap for a task management domain.
Maintenance
ActivityInactive
ResponsivenessNo issues