Skip to main content
Glama
README.md
# Modern Todo MCP Server with Authentication, Database & Billing

A complete **Model Context Protocol (MCP)** server that demonstrates modern web development practices with authentication, billing, and database integration. Perfect for beginners learning full-stack development!

## What This Project Does

This project creates a **Todo Management System** that you can interact with through **Cursor AI** (or any MCP-compatible client). It includes:

- **Real Authentication** with Kinde
- **Billing System** with free tier limits
- **Database Storage** with Neon PostgreSQL
- **AI Integration** through MCP protocol
- **Web Interface** for authentication

## Key Features

- **5 Free Todos** for new users
- **Upgrade to Paid** for unlimited todos
- **Real Authentication** with Google/social login
- **Database Persistence** with PostgreSQL
- **AI Chat Integration** through Cursor
- **Session Management** with secure cookies

## Architecture Overview

```
┌─────────────────┐    ┌──────────────────┐    ┌─────────────────┐
│   Cursor AI     │    │   MCP Server     │    │  Kinde Auth     │
│   (Your Chat)   │◄──►│   (This Project) │◄──►│   (Authentication)│
└─────────────────┘    └──────────────────┘    └─────────────────┘
                              │
                              ▼
                       ┌──────────────────┐
                       │  Neon Database   │
                       │  (PostgreSQL)    │
                       └──────────────────┘
```

## Prerequisites

Before you start, you'll need:

1. **Node.js** (version 18 or higher)
2. **A Neon Database** account (free)
3. **A Kinde account** (free)
4. **Cursor IDE** (for MCP integration)

## Quick Start Guide

### Step 1: Clone and Install

```bash
# Clone the repository
git clone <your-repo-url>
cd todo-mcp-server

# Install dependencies
npm install
```

### Step 2: Set Up Environment

```bash
# Run the setup script
chmod +x setup.sh
./setup.sh
```

This creates a `.env` file with placeholder values.

### Step 3: Set Up Neon Database (Free)

1. Go to [neon.tech](https://neon.tech)
2. Create a free account
3. Create a new database
4. Copy your connection string
5. Update your `.env` file:

```env
DATABASE_URL=postgresql://your-connection-string-here
```

### Step 4: Set Up Kinde Authentication (Free)

1. Go to [kinde.com](https://kinde.com)
2. Create a free account
3. Create a new application
4. Copy your credentials
5. Update your `.env` file:

```env
KINDE_ISSUER_URL=https://your-domain.kinde.com
KINDE_CLIENT_ID=your_client_id
KINDE_CLIENT_SECRET=your_client_secret
```

### Step 5: Initialize Database

```bash
# Set up database tables
npm run setup-db
```

### Step 6: Build and Run

```bash
# Build the project
npm run build

# Start the MCP server
npm start
```

## Project Structure

```
mcp-todo-rebuild/
├── src/
│   ├── server.ts              # Main MCP server
│   ├── kinde-auth-server.ts   # Authentication web server
│   └── setup-db.ts           # Database setup script
├── dist/                     # Compiled JavaScript
├── package.json              # Dependencies and scripts
├── tsconfig.json            # TypeScript configuration
├── .env                     # Environment variables (create this)
└── README.md               # This file
```

## How It Works

### 1. **MCP Server** (`src/server.ts`)
- Handles AI chat commands like "create todo", "list todos"
- Manages user authentication and billing
- Connects to database for data persistence

### 2. **Auth Server** (`src/kinde-auth-server.ts`)
- Provides web interface for login/logout
- Handles OAuth flow with Kinde
- Automatically creates user database records

### 3. **Database Setup** (`src/setup-db.ts`)
- Creates necessary database tables
- Sets up indexes for performance
- Initializes user and todo schemas

## How to Use

### 1. Start the Servers

```bash
# Terminal 1: Start MCP server
npm start

# Terminal 2: Start auth server
npm run auth-server
```

### 2. Configure Cursor

Add this to your Cursor MCP configuration (`~/.cursor/mcp.json`):

```json
{
  "mcpServers": {
    "todo-mcp-server": {
      "command": "node",
      "args": ["dist/server.js"],
      "cwd": "/path/to/your/project",
      "env": {
        "DATABASE_URL": "your_database_url",
        "KINDE_ISSUER_URL": "your_kinde_issuer",
        "KINDE_CLIENT_ID": "your_client_id",
        "KINDE_CLIENT_SECRET": "your_client_secret",
        "JWT_SECRET": "your_jwt_secret",
        "NODE_ENV": "development"
      }
    }
  }
}
```

### 3. Use in Cursor Chat

Once configured, you can use these commands in Cursor:

```
login                    # Get authentication URL
save_token: <token>     # Save your login token
list todos              # View your todos
create todo             # Create a new todo
update todo             # Update an existing todo
delete todo             # Delete a todo
logout                  # Log out
```

## Authentication Flow

1. **Type "login"** in Cursor chat
2. **Click the URL** to open authentication page
3. **Login with Google** (or other providers)
4. **Copy your token** from the success page
5. **Use "save_token"** command in Cursor
6. **Start creating todos!**

## Billing System

- **Free Tier**: 5 todos per user
- **Paid Tier**: Unlimited todos (upgrade through Kinde portal)
- **Automatic Tracking**: System tracks usage automatically
- **Upgrade URL**: Provided when limit is reached

## Database Schema

### Users Table
```sql
CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  user_id TEXT UNIQUE NOT NULL,
  name TEXT,
  email TEXT,
  subscription_status TEXT DEFAULT 'free',
  plan TEXT DEFAULT 'free',
  free_todos_used INTEGER DEFAULT 0,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

### Todos Table
```sql
CREATE TABLE todos (
  id SERIAL PRIMARY KEY,
  user_id TEXT NOT NULL,
  title TEXT NOT NULL,
  description TEXT,
  completed BOOLEAN DEFAULT FALSE,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

## Development Commands

```bash
# Development
npm run dev              # Run MCP server in development
npm run auth-server     # Run auth server in development

# Database
npm run setup-db        # Set up database tables

# Production
npm run build           # Build for production
npm start              # Run production server
```

## Configuration

### Environment Variables

Create a `.env` file with these variables:

```env
# Database
DATABASE_URL=postgresql://user:pass@host:port/db

# Kinde Authentication
KINDE_ISSUER_URL=https://your-domain.kinde.com
KINDE_CLIENT_ID=your_client_id
KINDE_CLIENT_SECRET=your_client_secret

# Security
JWT_SECRET=your_secret_key

# Environment
NODE_ENV=development
```

## Troubleshooting

### Common Issues

1. **"No authentication token found"**
   - Make sure you've logged in and saved your token
   - Check that the auth server is running

2. **"Database connection failed"**
   - Verify your DATABASE_URL is correct
   - Make sure you've run `npm run setup-db`

3. **"Kinde authentication failed"**
   - Check your Kinde credentials in `.env`
   - Verify your redirect URLs in Kinde dashboard

4. **"MCP server not found in Cursor"**
   - Restart Cursor after updating `mcp.json`
   - Check that the server is running with `npm start`

### Debug Mode

Run with debug logging:

```bash
DEBUG=* npm run dev
```

## Learning Resources

### What You'll Learn

- **MCP Protocol**: How AI assistants interact with tools
- **OAuth 2.0**: Modern authentication flows
- **PostgreSQL**: Database design and queries
- **TypeScript**: Type-safe JavaScript development
- **Express.js**: Web server development
- **Session Management**: User state persistence

### Key Concepts

1. **Model Context Protocol (MCP)**: Standard for AI tool integration
2. **OAuth Flow**: Secure authentication without passwords
3. **JWT Tokens**: Secure user identification
4. **Database Relations**: User-todo relationships
5. **Billing Integration**: Freemium business models

## Next Steps

Once you understand this project, you can:

1. **Add More Features**: Categories, due dates, sharing
2. **Improve UI**: Better web interface for auth
3. **Add Real Billing**: Stripe integration
4. **Deploy**: Host on Vercel, Railway, or AWS
5. **Scale**: Add caching, load balancing

## Contributing

This is a learning project! Feel free to:

- Report bugs
- Suggest improvements
- Add new features
- Create tutorials

## License

MIT License - feel free to use this for learning and projects!

## Need Help?

If you get stuck:

1. Check the troubleshooting section above
2. Verify all environment variables are set
3. Make sure all services are running
4. Check the console for error messages

Remember: This is a learning project designed to teach modern web development concepts. Take your time, experiment, and don't hesitate to explore the code!

TDQS

B3.2/5.0

Scored across 11 tools

Disambiguation3/5

The todo management tools (create_todo, delete_todo, list_todos, update_todo) are clearly distinct and cover the CRUD operations well. However, there is some ambiguity between get_kinde_billing and get_subscription_status, as both seem to retrieve subscription-related information, and refresh_billing_status overlaps with these. The authentication tools (login, logout, save_token) are distinct from the todo tools but have some functional overlap with each other.

Naming Consistency4/5

Most tools follow a consistent verb_noun pattern (e.g., create_todo, list_todos, update_todo, get_kinde_billing, refresh_billing_status). The main deviation is 'login' and 'logout', which use a single verb without a noun, but this is a common convention for authentication actions. Overall, the naming is predictable and readable with only minor inconsistencies.

Tool Count4/5

With 11 tools, the count is reasonable for a server that combines todo management with authentication and billing features. It's slightly on the higher side but not excessive, as it covers multiple domains (todos, auth, billing) within a coherent scope. The tools are well-distributed across these areas without obvious bloat.

Completeness4/5

For todo management, the server provides complete CRUD coverage (create, list, update, delete). Authentication is covered with login, logout, and token management. Billing features include status retrieval, refresh, and upgrade. A minor gap is the lack of a tool to downgrade or cancel subscriptions, but the core workflows are well-supported.

Maintenance

ActivityInactive
ResponsivenessNo issues