Skip to main content
Glama
dhruv-vootkuri

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