LeadClaw MCP
by no39pikko
README.md
# LeadClaw MCP (demo)
Demo MCP server for **LeadClaw** — a service for booking confirmed sales appointments through Claude. Human freelance SDRs handle the outbound; AI handles matching, quality, billing, and reporting. Customers pay only per BANT-qualified meeting that lands on their calendar.
This server is the **showcase implementation** used for the demo video and concept pitch. It returns realistic fake data so Claude Desktop calls feel live without any real SDR plumbing behind them yet.
---
## What this demo proves
In Claude Desktop you can say:
> Book 3 sales appointments next Tuesday in Dallas with AI startup CEOs. Budget $450.
…and Claude will:
1. Call `book_appointments` on this server.
2. Get back a `request_id` and an ETA.
3. Poll `check_status` (immediately or later) and see appointments populate.
4. Pull full BANT briefings with `get_appointment_details`.
Nothing real happens on the SDR side — but the customer experience is identical to what the real product will feel like.
---
## Tools exposed
| Tool | Purpose |
|---|---|
| `book_appointments` | Submit a request for N confirmed appointments. Returns a `request_id`. |
| `check_status` | Poll a request; returns confirmed appointments so far and current phase. |
| `get_appointment_details` | Full briefing for one appointment: contact, company, BANT, SDR notes, meeting link. |
### Status progression (demo simulation)
Status advances based on wall-clock time since the request was created — no background workers needed:
| Elapsed | Phase | Confirmed |
|---|---|---|
| 0–5s | `processing` | 0 |
| 5–15s | `matching` | 0 |
| 15s | `in_progress` | 1 |
| +30s each | `in_progress` | +1 |
| All seats filled | `completed` | N |
So a 3-seat request is fully `completed` ~75 seconds after `book_appointments`. Tunable in [src/tools/status.ts](src/tools/status.ts).
---
## Setup
Requirements: Node.js 18+ (this repo was developed against Node 24).
```bash
npm install
npm run build
```
The compiled server entrypoint is `dist/index.js`. Data persists to `data/store.json` (auto-created).
### Connect to Claude Desktop
Edit your Claude Desktop config file:
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
```json
{
"mcpServers": {
"leadclaw": {
"command": "node",
"args": ["C:\\absolute\\path\\to\\leadclaw-mcp\\dist\\index.js"]
}
}
}
```
Replace the path with the absolute path to your built `dist/index.js`. On macOS/Linux use forward slashes.
Restart Claude Desktop. The three LeadClaw tools should appear in the tool list.
### Quick smoke test (without Claude Desktop)
```bash
node dist/index.js
```
Then paste the following on stdin (one JSON object per line):
```json
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"smoke","version":"1.0"}}}
{"jsonrpc":"2.0","method":"notifications/initialized"}
{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}
```
You should see three tools advertised.
---
## Project layout
```
leadclaw-mcp/
├── src/
│ ├── index.ts MCP server entrypoint (stdio transport)
│ ├── tools/
│ │ ├── book.ts book_appointments
│ │ ├── status.ts check_status (time-based phase simulation)
│ │ └── details.ts get_appointment_details
│ ├── mock/
│ │ ├── companies.ts fake AI/SaaS company pool
│ │ ├── people.ts fake names + default role pool
│ │ └── generator.ts appointment + BANT + meeting-time synthesis
│ └── db/
│ └── store.ts JSON file persistence
├── data/
│ └── store.json auto-generated on first request (gitignored)
└── dist/ build output
```
---
## Demo recording flow
1. Restart Claude Desktop with the MCP config in place.
2. In a fresh chat, paste:
> Book 3 sales appointments next Tuesday in Dallas with AI startup CEOs. Budget $450.
3. Claude calls `book_appointments` → you see the tool call card.
4. Ask: *"check status"* → Claude calls `check_status`. First call (within ~15s) shows processing/matching; wait ~75s and call again to see all 3 confirmed.
5. Optional: *"give me the full briefing on the first one"* → Claude calls `get_appointment_details`.
For the 30-second video cut, edit out the wait between calls.
---
## What's intentionally *not* in this build
- Real SDR matching / phone integration
- Stripe / billing
- OAuth (stdio is local-only)
- Web dashboard
- Anthropic Connectors Directory submission
These come after the concept lands.
TDQS
A4.2/5.0
Scored across 3 tools
Disambiguation5/5
Each tool serves a distinct purpose: booking appointments, checking status, and retrieving details. There is no ambiguity between them.
Naming Consistency5/5
All tools follow the verb_noun pattern with snake_case (book_appointments, check_status, get_appointment_details), providing a predictable naming scheme.
Tool Count4/5
Three tools is slightly minimal for the domain but covers the core workflow of booking, tracking, and reviewing appointments. It is reasonable for the service's scope.
Completeness4/5
The tool set covers the primary lifecycle (book, monitor, view details). Minor gaps like cancellation or rescheduling exist but are not critical for the stated purpose.
Maintenance
ActivityInactive
ResponsivenessNo issues