Skip to main content
Glama
Rana-X

SF Cleaning Service

by Rana-X
README.md
# IRL - SF Cleaning Service

IRL - A Model Context Protocol (MCP) server for booking cleaning services in San Francisco. Can be deployed locally or to Vercel for remote access.

## Setup

### 1. Install Dependencies
```bash
npm install
```

### 2. Set Up Resend API

1. **Create Resend Account**: Go to https://resend.com and sign up
2. **Get API Key**: 
   - Navigate to your Resend Dashboard
   - Go to "API Keys" section
   - Create a new API key or copy your existing one
   - It will look like: `re_BcASVtoX_Bj4QhZei4xSjyyLr21vhMbVd`

3. **Verify Domain (Required for custom email)**:
   - To send from gwen@irl-concierge.com
   - Go to "Domains" in Resend Dashboard
   - Add domain: irl-concierge.com
   - Follow DNS verification steps (add TXT, MX records)
   - Once verified, you can send from gwen@irl-concierge.com

### 3. Configure Email Credentials
Edit `.env` file with your Resend credentials:
```
RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxx
FROM_EMAIL=gwen@irl-concierge.com
PARTNER_EMAILS=partner1@example.com,partner2@example.com
```

**Note:** You must verify the domain `irl-concierge.com` in Resend before you can send from `gwen@irl-concierge.com`. Until verified, use `onboarding@resend.dev` for testing.

### 4. Configure Claude Desktop

Add to your Claude Desktop configuration file:

**macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
**Windows:** `%APPDATA%\Claude\claude_desktop_config.json`

```json
{
  "mcpServers": {
    "sf-cleaning": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-sf-cleaning/index.js"]
    }
  }
}
```

Replace `/absolute/path/to/mcp-sf-cleaning/index.js` with the actual path to your index.js file.

### 5. Restart Claude Desktop

After configuration, restart Claude Desktop to load the MCP server.

## Vercel Deployment (For Remote Access)

### 1. Install Vercel CLI
```bash
npm install -g vercel
```

### 2. Set Environment Variables
```bash
cd /Users/rana/Downloads/IRL/mcp-sf-cleaning

# Set up Vercel environment variables
vercel env add RESEND_API_KEY
# Enter: re_BcASVtoX_Bj4QhZei4xSjyyLr21vhMbVd

vercel env add FROM_EMAIL  
# Enter: gwen@irl-concierge.com

vercel env add PARTNER_EMAILS
# Enter: ranadaytoday@outlook.com
```

### 3. Deploy to Vercel
```bash
vercel --prod
```

Follow the prompts:
- Set up and deploy? Y
- Which scope? (select your account)
- Link to existing project? N
- Project name? irl
- Directory? ./
- Want to modify settings? N

### 4. Get Your MCP Server URL
After deployment, you'll get a URL like:
```
https://mcp-sf-cleaning.vercel.app
```

### 5. Add to Claude Desktop as Custom Connector

1. Open Claude Desktop
2. Go to Settings → Connectors
3. Click "Add custom connector"
4. Enter:
   - **Name**: SF Cleaning Service
   - **Remote MCP server URL**: `https://mcp-sf-cleaning.vercel.app/api/mcp`
5. Save and restart Claude

### Testing the Remote Server
You can test the API directly:
```bash
# List tools
curl -X POST https://mcp-sf-cleaning.vercel.app/api/mcp \
  -H "Content-Type: application/json" \
  -d '{"method":"tools/list"}'

# Request cleaning (SF address)
curl -X POST https://mcp-sf-cleaning.vercel.app/api/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "method": "tools/call",
    "params": {
      "name": "request_cleaning",
      "arguments": {
        "name": "John Doe",
        "phone": "415-555-1234",
        "address": "123 Market St, SF 94105"
      }
    }
  }'
```

## Test Conversation Examples

### Example 1: San Francisco Address (Accepted)
```
You: Can you book a cleaning service for me?
Claude: I'll help you book a cleaning service. I'll need your name, phone number, and address.

You: Name is John Doe, phone is 415-555-0123, address is 123 Market St, San Francisco, CA 94105
Claude: [Uses request_cleaning tool]
Result: ✅ Sent! John Doe, they'll call 415-555-0123 within 1 hour.
```

### Example 2: Non-SF Address (Rejected)
```
You: Book cleaning for Sarah Smith, 510-555-9876, 456 Broadway, Oakland, CA 94607
Claude: [Uses request_cleaning tool]
Result: Sorry, we only serve San Francisco currently. We're expanding - stay tuned!
```

### Example 3: SF Zip Code Detection
```
You: I need cleaning at 789 Pine Street, 94108. Name: Alice Wong, Phone: 415-555-3456
Claude: [Uses request_cleaning tool]
Result: ✅ Sent! Alice Wong, they'll call 415-555-3456 within 1 hour.
```

## Usage

The server provides one tool:
- `request_cleaning`: Books cleaning service for SF addresses only

### Parameters:
- `name`: Customer name
- `phone`: Contact phone number  
- `address`: Service address (must be in San Francisco)

### Responses:
- **SF Address**: "✅ Sent! [name], they'll call [phone] within 1 hour."
- **Non-SF Address**: "Sorry, we only serve San Francisco currently. We're expanding - stay tuned!"

## How It Works

1. Checks if address contains "sf", "san francisco", or SF zip codes (940xx, 941xx)
2. If in SF: Sends email via Resend API to partners and confirms booking
3. If not in SF: Returns polite rejection message

## Why Resend?

- **Simple API**: Clean, modern email API designed for developers
- **No SMTP hassles**: No need for app passwords or complex SMTP settings
- **Better deliverability**: Built-in SPF, DKIM, and DMARC support
- **Free tier**: 3,000 emails/month free, perfect for small projectsTest auto-deployment

TDQS

B3.1/5.0

Scored across 1 tool

Disambiguation5/5

With only one tool, there is no possibility of ambiguity or overlap between tools. The single tool 'request_cleaning' has a clear, distinct purpose that cannot be confused with any other tool in this set.

Naming Consistency5/5

The naming pattern is trivially consistent since there is only one tool. The tool name 'request_cleaning' follows a clear verb_noun convention, and with no other tools to compare, there is no inconsistency.

Tool Count2/5

A single tool is generally too few for a server's purpose, as it limits functionality and suggests an incomplete or thin surface. For a 'SF Cleaning Service' domain, one might expect additional tools for operations like scheduling, pricing, or status checks, making this count inappropriate for the apparent scope.

Completeness2/5

The tool set is severely incomplete for a cleaning service domain. While 'request_cleaning' covers initiation, there are obvious gaps such as checking service status, modifying or canceling requests, viewing pricing, or managing schedules. This will likely cause agent failures in handling full workflows.