Skip to main content
Glama
akshayark97

task-mcp-learning

by akshayark97
README.md
# Task Manager — MCP Server + Next.js

A small but complete example that demonstrates **every core Model Context Protocol
(MCP) concept**, wired to a Next.js web app that shares the same data.

An AI client (e.g. Claude Desktop) talks to the MCP server to read and change tasks;
the Next.js UI shows those same tasks and updates live.

```
┌────────────────┐   MCP (stdio / JSON-RPC)   ┌───────────────────────┐
│  AI client     │ ─────────────────────────► │  mcp-server/server.ts │
│ (Claude etc.)  │   tools · resources ·      │  Resources / Tools /  │
└────────────────┘   prompts                  │  Prompts / Transport  │
                                              └──────────┬────────────┘
                                                         │  reads/writes
                                                         ▼
                                              ┌───────────────────────┐
┌────────────────┐    HTTP / REST             │   lib/store.ts        │
│  Web browser   │ ─────────────────────────► │   data/tasks.json     │
│ (Next.js UI)   │   /api/tasks               │  (shared file store)  │
└────────────────┘                            └───────────────────────┘
```

## MCP concepts demonstrated

| Concept       | Where                  | Examples                                                                     |
| ------------- | ---------------------- | ---------------------------------------------------------------------------- |
| **Resources** | `mcp-server/server.ts` | `tasks://all`, `tasks://stats`, `tasks://{id}` (templated)                    |
| **Tools**     | `mcp-server/server.ts` | `create_task`, `update_task`, `complete_task`, `delete_task`, `search_tasks` |
| **Prompts**   | `mcp-server/server.ts` | `summarize_tasks`, `daily_plan` (parameterized)                              |
| **Transport** | `mcp-server/server.ts` | stdio (Claude Desktop compatible)                                            |

## Project structure

```
lib/store.ts                # Shared, file-backed task store (single source of truth)
mcp-server/server.ts        # The MCP server: resources + tools + prompts + stdio
mcp-server/smoke-test.ts    # End-to-end MCP client test (uses the official SDK Client)
app/page.tsx                # Task manager web UI
app/api/tasks/route.ts      # REST: GET (list/search) + POST (create)
app/api/tasks/[id]/route.ts # REST: GET / PATCH / DELETE one task
claude_desktop_config.json  # Example config to connect Claude Desktop
```

## Run it

### 1. The web app

```bash
npm run dev
# open http://localhost:3000
```

### 2. The MCP server (standalone)

```bash
npm run mcp            # runs the server over stdio
npm run mcp:inspect    # opens the MCP Inspector UI to click through tools/resources/prompts
```

### 3. End-to-end smoke test

```bash
npx tsx mcp-server/smoke-test.ts
```

Exercises the full MCP surface: lists tools/resources/templates/prompts, calls a
tool, reads resources, and fetches a prompt.

## Connect to Claude Desktop

Add the `mcpServers` block from `claude_desktop_config.json` to your Claude Desktop
config (macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`),
adjusting `cwd` to this project's absolute path. Restart Claude Desktop, then ask it
to "create a task" or "summarize my tasks" — the changes appear in the web UI too.

## How the two sides stay in sync

Both the MCP server process and the Next.js API import the same `lib/store.ts`, which
persists to `data/tasks.json`. Anything the AI does through MCP is immediately visible
in the browser (the UI polls every 3s), and vice-versa — verified across separate
processes.