theleadrouter-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/admin-guide/SKILL.md +351 -0
- package/.claude/skills/buyer-guide/SKILL.md +405 -0
- package/.claude/skills/partner-guide/SKILL.md +352 -0
- package/.claude/skills/welcome/SKILL.md +351 -0
- package/CLAUDE.md +238 -0
- package/LICENSE +21 -0
- package/README.md +166 -0
- package/dist/api-client.d.ts +10 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +64 -0
- package/dist/api-client.js.map +1 -0
- package/dist/auth-adapter.d.ts +33 -0
- package/dist/auth-adapter.d.ts.map +1 -0
- package/dist/auth-adapter.js +87 -0
- package/dist/auth-adapter.js.map +1 -0
- package/dist/bin/iscale-mcp.d.ts +3 -0
- package/dist/bin/iscale-mcp.d.ts.map +1 -0
- package/dist/bin/iscale-mcp.js +7 -0
- package/dist/bin/iscale-mcp.js.map +1 -0
- package/dist/build-registry.d.ts +3 -0
- package/dist/build-registry.d.ts.map +1 -0
- package/dist/build-registry.js +15 -0
- package/dist/build-registry.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/register.d.ts +4 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +23 -0
- package/dist/register.js.map +1 -0
- package/dist/registry.d.ts +50 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +78 -0
- package/dist/registry.js.map +1 -0
- package/dist/tools/buyers.d.ts +4 -0
- package/dist/tools/buyers.d.ts.map +1 -0
- package/dist/tools/buyers.js +61 -0
- package/dist/tools/buyers.js.map +1 -0
- package/dist/tools/campaigns.d.ts +4 -0
- package/dist/tools/campaigns.d.ts.map +1 -0
- package/dist/tools/campaigns.js +45 -0
- package/dist/tools/campaigns.js.map +1 -0
- package/dist/tools/compliance.d.ts +4 -0
- package/dist/tools/compliance.d.ts.map +1 -0
- package/dist/tools/compliance.js +28 -0
- package/dist/tools/compliance.js.map +1 -0
- package/dist/tools/composite.d.ts +3 -0
- package/dist/tools/composite.d.ts.map +1 -0
- package/dist/tools/composite.js +337 -0
- package/dist/tools/composite.js.map +1 -0
- package/dist/tools/contracts.d.ts +4 -0
- package/dist/tools/contracts.d.ts.map +1 -0
- package/dist/tools/contracts.js +48 -0
- package/dist/tools/contracts.js.map +1 -0
- package/dist/tools/generated/api-keys.gen.d.ts +3 -0
- package/dist/tools/generated/api-keys.gen.d.ts.map +1 -0
- package/dist/tools/generated/api-keys.gen.js +49 -0
- package/dist/tools/generated/api-keys.gen.js.map +1 -0
- package/dist/tools/generated/audit-logs.gen.d.ts +3 -0
- package/dist/tools/generated/audit-logs.gen.d.ts.map +1 -0
- package/dist/tools/generated/audit-logs.gen.js +59 -0
- package/dist/tools/generated/audit-logs.gen.js.map +1 -0
- package/dist/tools/generated/auth.gen.d.ts +3 -0
- package/dist/tools/generated/auth.gen.d.ts.map +1 -0
- package/dist/tools/generated/auth.gen.js +195 -0
- package/dist/tools/generated/auth.gen.js.map +1 -0
- package/dist/tools/generated/blocked-lists.gen.d.ts +3 -0
- package/dist/tools/generated/blocked-lists.gen.d.ts.map +1 -0
- package/dist/tools/generated/blocked-lists.gen.js +146 -0
- package/dist/tools/generated/blocked-lists.gen.js.map +1 -0
- package/dist/tools/generated/buyers.gen.d.ts +3 -0
- package/dist/tools/generated/buyers.gen.d.ts.map +1 -0
- package/dist/tools/generated/buyers.gen.js +153 -0
- package/dist/tools/generated/buyers.gen.js.map +1 -0
- package/dist/tools/generated/calls.gen.d.ts +3 -0
- package/dist/tools/generated/calls.gen.d.ts.map +1 -0
- package/dist/tools/generated/calls.gen.js +106 -0
- package/dist/tools/generated/calls.gen.js.map +1 -0
- package/dist/tools/generated/campaigns.gen.d.ts +3 -0
- package/dist/tools/generated/campaigns.gen.d.ts.map +1 -0
- package/dist/tools/generated/campaigns.gen.js +274 -0
- package/dist/tools/generated/campaigns.gen.js.map +1 -0
- package/dist/tools/generated/catalog.json +7096 -0
- package/dist/tools/generated/compliance.gen.d.ts +3 -0
- package/dist/tools/generated/compliance.gen.d.ts.map +1 -0
- package/dist/tools/generated/compliance.gen.js +119 -0
- package/dist/tools/generated/compliance.gen.js.map +1 -0
- package/dist/tools/generated/consent.gen.d.ts +3 -0
- package/dist/tools/generated/consent.gen.d.ts.map +1 -0
- package/dist/tools/generated/consent.gen.js +109 -0
- package/dist/tools/generated/consent.gen.js.map +1 -0
- package/dist/tools/generated/contacts.gen.d.ts +3 -0
- package/dist/tools/generated/contacts.gen.d.ts.map +1 -0
- package/dist/tools/generated/contacts.gen.js +88 -0
- package/dist/tools/generated/contacts.gen.js.map +1 -0
- package/dist/tools/generated/contracts.gen.d.ts +3 -0
- package/dist/tools/generated/contracts.gen.d.ts.map +1 -0
- package/dist/tools/generated/contracts.gen.js +306 -0
- package/dist/tools/generated/contracts.gen.js.map +1 -0
- package/dist/tools/generated/delivery-test.gen.d.ts +3 -0
- package/dist/tools/generated/delivery-test.gen.d.ts.map +1 -0
- package/dist/tools/generated/delivery-test.gen.js +17 -0
- package/dist/tools/generated/delivery-test.gen.js.map +1 -0
- package/dist/tools/generated/discovery.gen.d.ts +3 -0
- package/dist/tools/generated/discovery.gen.d.ts.map +1 -0
- package/dist/tools/generated/discovery.gen.js +17 -0
- package/dist/tools/generated/discovery.gen.js.map +1 -0
- package/dist/tools/generated/disposition-codes.gen.d.ts +3 -0
- package/dist/tools/generated/disposition-codes.gen.d.ts.map +1 -0
- package/dist/tools/generated/disposition-codes.gen.js +30 -0
- package/dist/tools/generated/disposition-codes.gen.js.map +1 -0
- package/dist/tools/generated/email-templates.gen.d.ts +3 -0
- package/dist/tools/generated/email-templates.gen.d.ts.map +1 -0
- package/dist/tools/generated/email-templates.gen.js +108 -0
- package/dist/tools/generated/email-templates.gen.js.map +1 -0
- package/dist/tools/generated/engagements.gen.d.ts +3 -0
- package/dist/tools/generated/engagements.gen.d.ts.map +1 -0
- package/dist/tools/generated/engagements.gen.js +208 -0
- package/dist/tools/generated/engagements.gen.js.map +1 -0
- package/dist/tools/generated/enrollments.gen.d.ts +3 -0
- package/dist/tools/generated/enrollments.gen.d.ts.map +1 -0
- package/dist/tools/generated/enrollments.gen.js +82 -0
- package/dist/tools/generated/enrollments.gen.js.map +1 -0
- package/dist/tools/generated/events.gen.d.ts +3 -0
- package/dist/tools/generated/events.gen.d.ts.map +1 -0
- package/dist/tools/generated/events.gen.js +20 -0
- package/dist/tools/generated/events.gen.js.map +1 -0
- package/dist/tools/generated/index.d.ts +3 -0
- package/dist/tools/generated/index.d.ts.map +1 -0
- package/dist/tools/generated/index.js +86 -0
- package/dist/tools/generated/index.js.map +1 -0
- package/dist/tools/generated/intake-centers.gen.d.ts +3 -0
- package/dist/tools/generated/intake-centers.gen.d.ts.map +1 -0
- package/dist/tools/generated/intake-centers.gen.js +196 -0
- package/dist/tools/generated/intake-centers.gen.js.map +1 -0
- package/dist/tools/generated/integrations.gen.d.ts +3 -0
- package/dist/tools/generated/integrations.gen.d.ts.map +1 -0
- package/dist/tools/generated/integrations.gen.js +290 -0
- package/dist/tools/generated/integrations.gen.js.map +1 -0
- package/dist/tools/generated/ivr.gen.d.ts +3 -0
- package/dist/tools/generated/ivr.gen.d.ts.map +1 -0
- package/dist/tools/generated/ivr.gen.js +97 -0
- package/dist/tools/generated/ivr.gen.js.map +1 -0
- package/dist/tools/generated/leads.gen.d.ts +3 -0
- package/dist/tools/generated/leads.gen.d.ts.map +1 -0
- package/dist/tools/generated/leads.gen.js +592 -0
- package/dist/tools/generated/leads.gen.js.map +1 -0
- package/dist/tools/generated/number-pool.gen.d.ts +3 -0
- package/dist/tools/generated/number-pool.gen.d.ts.map +1 -0
- package/dist/tools/generated/number-pool.gen.js +62 -0
- package/dist/tools/generated/number-pool.gen.js.map +1 -0
- package/dist/tools/generated/offers.gen.d.ts +3 -0
- package/dist/tools/generated/offers.gen.d.ts.map +1 -0
- package/dist/tools/generated/offers.gen.js +407 -0
- package/dist/tools/generated/offers.gen.js.map +1 -0
- package/dist/tools/generated/organizations.gen.d.ts +3 -0
- package/dist/tools/generated/organizations.gen.d.ts.map +1 -0
- package/dist/tools/generated/organizations.gen.js +161 -0
- package/dist/tools/generated/organizations.gen.js.map +1 -0
- package/dist/tools/generated/partners.gen.d.ts +3 -0
- package/dist/tools/generated/partners.gen.d.ts.map +1 -0
- package/dist/tools/generated/partners.gen.js +121 -0
- package/dist/tools/generated/partners.gen.js.map +1 -0
- package/dist/tools/generated/payouts.gen.d.ts +3 -0
- package/dist/tools/generated/payouts.gen.d.ts.map +1 -0
- package/dist/tools/generated/payouts.gen.js +92 -0
- package/dist/tools/generated/payouts.gen.js.map +1 -0
- package/dist/tools/generated/people.gen.d.ts +3 -0
- package/dist/tools/generated/people.gen.d.ts.map +1 -0
- package/dist/tools/generated/people.gen.js +354 -0
- package/dist/tools/generated/people.gen.js.map +1 -0
- package/dist/tools/generated/posting-log.gen.d.ts +3 -0
- package/dist/tools/generated/posting-log.gen.d.ts.map +1 -0
- package/dist/tools/generated/posting-log.gen.js +150 -0
- package/dist/tools/generated/posting-log.gen.js.map +1 -0
- package/dist/tools/generated/refunds.gen.d.ts +3 -0
- package/dist/tools/generated/refunds.gen.d.ts.map +1 -0
- package/dist/tools/generated/refunds.gen.js +91 -0
- package/dist/tools/generated/refunds.gen.js.map +1 -0
- package/dist/tools/generated/reports.gen.d.ts +3 -0
- package/dist/tools/generated/reports.gen.d.ts.map +1 -0
- package/dist/tools/generated/reports.gen.js +38 -0
- package/dist/tools/generated/reports.gen.js.map +1 -0
- package/dist/tools/generated/sessions.gen.d.ts +3 -0
- package/dist/tools/generated/sessions.gen.d.ts.map +1 -0
- package/dist/tools/generated/sessions.gen.js +90 -0
- package/dist/tools/generated/sessions.gen.js.map +1 -0
- package/dist/tools/generated/settings.gen.d.ts +3 -0
- package/dist/tools/generated/settings.gen.d.ts.map +1 -0
- package/dist/tools/generated/settings.gen.js +473 -0
- package/dist/tools/generated/settings.gen.js.map +1 -0
- package/dist/tools/generated/telephony.gen.d.ts +3 -0
- package/dist/tools/generated/telephony.gen.d.ts.map +1 -0
- package/dist/tools/generated/telephony.gen.js +170 -0
- package/dist/tools/generated/telephony.gen.js.map +1 -0
- package/dist/tools/generated/tenants.gen.d.ts +3 -0
- package/dist/tools/generated/tenants.gen.d.ts.map +1 -0
- package/dist/tools/generated/tenants.gen.js +223 -0
- package/dist/tools/generated/tenants.gen.js.map +1 -0
- package/dist/tools/generated/tracking-numbers.gen.d.ts +3 -0
- package/dist/tools/generated/tracking-numbers.gen.d.ts.map +1 -0
- package/dist/tools/generated/tracking-numbers.gen.js +131 -0
- package/dist/tools/generated/tracking-numbers.gen.js.map +1 -0
- package/dist/tools/generated/transactions.gen.d.ts +3 -0
- package/dist/tools/generated/transactions.gen.d.ts.map +1 -0
- package/dist/tools/generated/transactions.gen.js +62 -0
- package/dist/tools/generated/transactions.gen.js.map +1 -0
- package/dist/tools/generated/users.gen.d.ts +3 -0
- package/dist/tools/generated/users.gen.d.ts.map +1 -0
- package/dist/tools/generated/users.gen.js +339 -0
- package/dist/tools/generated/users.gen.js.map +1 -0
- package/dist/tools/generated/vertical-groups.gen.d.ts +3 -0
- package/dist/tools/generated/vertical-groups.gen.d.ts.map +1 -0
- package/dist/tools/generated/vertical-groups.gen.js +243 -0
- package/dist/tools/generated/vertical-groups.gen.js.map +1 -0
- package/dist/tools/generated/verticals.gen.d.ts +3 -0
- package/dist/tools/generated/verticals.gen.d.ts.map +1 -0
- package/dist/tools/generated/verticals.gen.js +164 -0
- package/dist/tools/generated/verticals.gen.js.map +1 -0
- package/dist/tools/leads.d.ts +4 -0
- package/dist/tools/leads.d.ts.map +1 -0
- package/dist/tools/leads.js +69 -0
- package/dist/tools/leads.js.map +1 -0
- package/dist/tools/offers.d.ts +4 -0
- package/dist/tools/offers.d.ts.map +1 -0
- package/dist/tools/offers.js +33 -0
- package/dist/tools/offers.js.map +1 -0
- package/dist/tools/partners.d.ts +4 -0
- package/dist/tools/partners.d.ts.map +1 -0
- package/dist/tools/partners.js +30 -0
- package/dist/tools/partners.js.map +1 -0
- package/dist/tools/people.d.ts +4 -0
- package/dist/tools/people.d.ts.map +1 -0
- package/dist/tools/people.js +42 -0
- package/dist/tools/people.js.map +1 -0
- package/dist/tools/reports.d.ts +4 -0
- package/dist/tools/reports.d.ts.map +1 -0
- package/dist/tools/reports.js +67 -0
- package/dist/tools/reports.js.map +1 -0
- package/dist/tools/ui.d.ts +3 -0
- package/dist/tools/ui.d.ts.map +1 -0
- package/dist/tools/ui.js +108 -0
- package/dist/tools/ui.js.map +1 -0
- package/dist/tools/verticals.d.ts +4 -0
- package/dist/tools/verticals.d.ts.map +1 -0
- package/dist/tools/verticals.js +25 -0
- package/dist/tools/verticals.js.map +1 -0
- package/dist/types.d.ts +19 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +67 -0
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# theLeadRouter — Lead Routing Platform
|
|
2
|
+
|
|
3
|
+
This file teaches Claude Code about the theLeadRouter platform — a B2B lead distribution system that routes leads from partners to buyers through offer-based contracts.
|
|
4
|
+
|
|
5
|
+
## First Time Here?
|
|
6
|
+
|
|
7
|
+
If the user is new to theLeadRouter or says anything like "get started", "I'm new", "help me set up", or "walk me through this" — run the `/welcome` skill. It will detect their role (admin, partner, or buyer) and walk them through setup step by step.
|
|
8
|
+
|
|
9
|
+
## Available Skills
|
|
10
|
+
|
|
11
|
+
| Skill | For | What it does |
|
|
12
|
+
|-------|-----|--------------|
|
|
13
|
+
| `/welcome` | Everyone | First-time setup wizard — detects role, checks MCP, guided walkthrough |
|
|
14
|
+
| `/admin-guide` | Admins | Full platform config reference — entities, routing engine, troubleshooting |
|
|
15
|
+
| `/partner-guide` | Partners | Lead submission, posting specs, campaigns, portal, API integration |
|
|
16
|
+
| `/buyer-guide` | Buyers | Contracts, filters, delivery, dedup, billing, returns, portal |
|
|
17
|
+
|
|
18
|
+
## Core Concepts
|
|
19
|
+
|
|
20
|
+
**Lead routing** = a partner submits a lead, the system evaluates which buyers want it, and delivers it to the winners.
|
|
21
|
+
|
|
22
|
+
### Entity Hierarchy
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
Tenant (organization)
|
|
26
|
+
│
|
|
27
|
+
├── Vertical Group (optional grouping of related verticals)
|
|
28
|
+
│ └── Vertical (lead category — "Solar", "Medicare", etc.)
|
|
29
|
+
│ └── Vertical Fields (custom fields for this lead type)
|
|
30
|
+
│
|
|
31
|
+
├── Partner (lead source — affiliate, publisher)
|
|
32
|
+
│ └── Campaign (program with posting key, pricing, caps)
|
|
33
|
+
│ └── Campaign Fields (extra fields beyond vertical fields)
|
|
34
|
+
│
|
|
35
|
+
├── Buyer (lead purchaser — advertiser, client)
|
|
36
|
+
│ └── Contract (agreement with filters, caps, pricing, delivery)
|
|
37
|
+
│
|
|
38
|
+
├── Offer (distribution hub — connects campaigns to contracts)
|
|
39
|
+
│ ├── Linked Campaigns (which campaigns feed leads in)
|
|
40
|
+
│ ├── Linked Contracts (which buyers are eligible)
|
|
41
|
+
│ └── DQ Contracts (fallback buyers for rejected leads)
|
|
42
|
+
│
|
|
43
|
+
└── Intake Center (buyer's CRM/backend system)
|
|
44
|
+
└── Disposition Mappings (external status codes)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### How Routing Works
|
|
48
|
+
|
|
49
|
+
1. **Partner submits lead** via `POST /api/v1/leads/submit` with campaign's `postingKey` (lr_xxx)
|
|
50
|
+
2. **Campaign identifies the Offer** — which defines distribution rules
|
|
51
|
+
3. **Routing engine evaluates each Contract** linked to the offer:
|
|
52
|
+
- Contract status = active?
|
|
53
|
+
- Buyer status = active?
|
|
54
|
+
- Buyer balance within credit limit?
|
|
55
|
+
- Within contract's operating hours/schedule?
|
|
56
|
+
- Geographic filters match (state/zip)?
|
|
57
|
+
- Demographic filters match (age/gender)?
|
|
58
|
+
- Custom filters match (vertical-specific fields)?
|
|
59
|
+
- Cap limits not exceeded (daily/weekly/monthly)?
|
|
60
|
+
- Dedup check passed (buyer hasn't received this person recently)?
|
|
61
|
+
4. **Winners selected** by distribution rule: highest price, priority rank, weighted random, or round-robin
|
|
62
|
+
5. **Lead delivered** to buyer endpoints
|
|
63
|
+
6. **If all rejected** — DQ contracts evaluated as fallback
|
|
64
|
+
|
|
65
|
+
### Distribution Types
|
|
66
|
+
|
|
67
|
+
| Type | Behavior |
|
|
68
|
+
|------|----------|
|
|
69
|
+
| `exclusive` | One buyer gets the lead (highest bid/priority wins) |
|
|
70
|
+
| `multisell` | All eligible buyers get a copy |
|
|
71
|
+
| `hybrid` | Top N buyers get the lead (configurable via maxSales) |
|
|
72
|
+
|
|
73
|
+
### Distribution Rules
|
|
74
|
+
|
|
75
|
+
| Rule | How winners are picked |
|
|
76
|
+
|------|----------------------|
|
|
77
|
+
| `price` | Highest pricePerLead wins |
|
|
78
|
+
| `priority` | Lowest priority number wins |
|
|
79
|
+
| `weight` | Random selection weighted by contract weight |
|
|
80
|
+
| `round_robin` | Rotate through eligible contracts |
|
|
81
|
+
|
|
82
|
+
## Setup Order
|
|
83
|
+
|
|
84
|
+
Entities must be created in this order (foreign key dependencies):
|
|
85
|
+
|
|
86
|
+
1. Vertical Group (optional)
|
|
87
|
+
2. Vertical (requires: vertical group if grouping)
|
|
88
|
+
3. Vertical Fields (requires: vertical)
|
|
89
|
+
4. Partner (standalone)
|
|
90
|
+
5. Buyer (standalone)
|
|
91
|
+
6. Intake Center (standalone)
|
|
92
|
+
7. Campaign (requires: partner + vertical)
|
|
93
|
+
8. Contract (requires: buyer + vertical)
|
|
94
|
+
9. Offer (requires: vertical)
|
|
95
|
+
10. Link Campaign to Offer
|
|
96
|
+
11. Link Contract to Offer
|
|
97
|
+
|
|
98
|
+
## Key Entities Reference
|
|
99
|
+
|
|
100
|
+
### Verticals
|
|
101
|
+
Lead categories. Every lead belongs to one vertical. Verticals define the field schema.
|
|
102
|
+
- **Admin UI:** Settings > Verticals
|
|
103
|
+
- **Key fields:** name, slug, verticalGroupId (optional), status
|
|
104
|
+
|
|
105
|
+
### Vertical Groups
|
|
106
|
+
Optional grouping of related verticals. Controls dedup and attribution scope.
|
|
107
|
+
- **dedupScope:** `offer` | `vertical` | `group` — how far duplicate detection reaches
|
|
108
|
+
- **attributionScope:** same options — how far attribution tracking reaches
|
|
109
|
+
|
|
110
|
+
### Partners
|
|
111
|
+
Organizations that submit leads (affiliates, publishers).
|
|
112
|
+
- **Admin UI:** Partners (sidebar)
|
|
113
|
+
- **Key fields:** name, email, status (active/paused/inactive), paymentCycle, balance
|
|
114
|
+
|
|
115
|
+
### Campaigns
|
|
116
|
+
A partner's specific lead program. Has its own posting key, pricing, and caps.
|
|
117
|
+
- **Admin UI:** Partners > [Partner] > Campaigns
|
|
118
|
+
- **Key fields:** partnerId, verticalId, postingKey (auto-generated lr_xxx), pricingModel (fixed/revshare), costPerLead, dailyCap/weeklyCap/monthlyCap, status
|
|
119
|
+
|
|
120
|
+
**Three-tier field architecture:**
|
|
121
|
+
1. **Global fields** (always present): firstName, lastName, email, phone, address, city, state, zipCode, dateOfBirth, ipAddress, tcpaConsent
|
|
122
|
+
2. **Vertical fields** (shared across campaigns in a vertical): e.g., utilityBill, homeOwner for Solar
|
|
123
|
+
3. **Campaign fields** (specific to one campaign): additional custom fields
|
|
124
|
+
|
|
125
|
+
**Lead submission:**
|
|
126
|
+
```
|
|
127
|
+
POST /api/v1/leads/submit
|
|
128
|
+
Authorization: Bearer lr_xxx (campaign's postingKey)
|
|
129
|
+
Content-Type: application/json
|
|
130
|
+
|
|
131
|
+
{
|
|
132
|
+
"campaignId": "uuid-or-display-id",
|
|
133
|
+
"firstName": "John",
|
|
134
|
+
"lastName": "Doe",
|
|
135
|
+
"email": "john@example.com",
|
|
136
|
+
"phone": "5551234567",
|
|
137
|
+
"zipCode": "90210",
|
|
138
|
+
"ipAddress": "1.2.3.4",
|
|
139
|
+
"tcpaConsent": true,
|
|
140
|
+
"trustedFormCertUrl": "https://cert.trustedform.com/xxx",
|
|
141
|
+
...verticalFields,
|
|
142
|
+
...campaignFields
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Buyers
|
|
147
|
+
Organizations that purchase leads (advertisers, clients).
|
|
148
|
+
- **Admin UI:** Buyers (sidebar)
|
|
149
|
+
- **Key fields:** name, status, balance, creditLimit, dedupEnabled, dedupFields (default: email+phone), dedupWindowDays (default: 30)
|
|
150
|
+
|
|
151
|
+
### Contracts
|
|
152
|
+
A buyer's agreement to purchase leads. Defines what they want, how many, at what price, and how to deliver.
|
|
153
|
+
- **Admin UI:** Buyers > [Buyer] > Contracts
|
|
154
|
+
|
|
155
|
+
**Pricing:**
|
|
156
|
+
- pricingModel: `fixed` or `ping_post`
|
|
157
|
+
- pricePerLead: amount buyer pays
|
|
158
|
+
- exclusiveMultiplier: price multiplier for exclusive leads
|
|
159
|
+
|
|
160
|
+
**Filters:**
|
|
161
|
+
- geoFilters: `{ "states": ["CA", "TX"], "zipCodes": ["902*"] }`
|
|
162
|
+
- demographicFilters: `{ "minAge": 25, "maxAge": 65 }`
|
|
163
|
+
- customFilters: vertical-specific field requirements
|
|
164
|
+
|
|
165
|
+
**Caps:**
|
|
166
|
+
- Lead count: dailyLeadCap, weeklyLeadCap, monthlyLeadCap
|
|
167
|
+
- Spend: dailySpendCap, weeklySpendCap, monthlySpendCap
|
|
168
|
+
|
|
169
|
+
**Schedule:**
|
|
170
|
+
- scheduleTimezone (default: America/Los_Angeles)
|
|
171
|
+
- scheduleHours: operating hours per day of week
|
|
172
|
+
- Empty scheduleHours = 24/7
|
|
173
|
+
|
|
174
|
+
**Delivery:**
|
|
175
|
+
- deliveryMethodOverride / deliveryUrlOverride
|
|
176
|
+
- deliveryConfig: field mapping, headers
|
|
177
|
+
- intakeCenterId: link to intake center for delivery config
|
|
178
|
+
|
|
179
|
+
### Offers
|
|
180
|
+
The distribution hub. Connects campaigns (sources) to contracts (buyers).
|
|
181
|
+
- **Admin UI:** Offers (sidebar)
|
|
182
|
+
- **Key fields:** verticalId, distributionType, distributionRule, maxSales (for hybrid), visibility (public/private)
|
|
183
|
+
- **Tabs:** Basic Info, Campaigns (link sources), Contracts (link buyers + set weight/priority), DQ Contracts (fallback)
|
|
184
|
+
|
|
185
|
+
### Intake Centers
|
|
186
|
+
A buyer's CRM or backend system for lead delivery.
|
|
187
|
+
- **Admin UI:** Settings > Intake Centers
|
|
188
|
+
- **Key fields:** name, deliveryMethod (http_post/http_get/email), deliveryUrl, authMethod, authKeyName
|
|
189
|
+
- **Disposition mappings:** external status codes from buyer's system mapped to internal dispositions
|
|
190
|
+
- **Program cascades:** buyer's program codes mapped to specific contracts
|
|
191
|
+
|
|
192
|
+
## End-to-End Campaign Setup
|
|
193
|
+
|
|
194
|
+
1. **Create Vertical** (if new lead type) — Settings > Verticals, add fields
|
|
195
|
+
2. **Create Partner** — Partners > Create, set name/email/payment cycle
|
|
196
|
+
3. **Create Campaign** — Partner detail > Add Campaign, set vertical/pricing/caps
|
|
197
|
+
4. **Create Buyer** — Buyers > Create, set name/balance/dedup settings
|
|
198
|
+
5. **Create Intake Center** (if buyer has CRM) — Settings > Intake Centers
|
|
199
|
+
6. **Create Contract** — Buyer detail > Add Contract, set filters/caps/pricing/delivery
|
|
200
|
+
7. **Create Offer** — Offers > Create, set distribution type/rule
|
|
201
|
+
8. **Link Campaign to Offer** — Offer detail > Campaigns tab
|
|
202
|
+
9. **Link Contract to Offer** — Offer detail > Contracts tab, set weight/priority
|
|
203
|
+
10. **Test** — submit a test lead, check routing waterfall in lead detail
|
|
204
|
+
|
|
205
|
+
## Common Gotchas
|
|
206
|
+
|
|
207
|
+
1. **Vertical mismatch** — Campaign, contract, and offer must reference the SAME vertical
|
|
208
|
+
2. **Posting key vs API key** — postingKey (lr_xxx on campaign) is for lead submission, not the same as admin/partner API keys
|
|
209
|
+
3. **Buyer balance** — if balance exceeds creditLimit, contracts are skipped during routing
|
|
210
|
+
4. **Cap resets** — caps reset at midnight in the contract's scheduleTimezone, not UTC
|
|
211
|
+
5. **Inactive cascades** — pausing a buyer pauses all their contracts; pausing an offer can cascade to campaigns
|
|
212
|
+
6. **Dedup is buyer-level** — per-buyer, not global. Two different buyers can both receive the same person
|
|
213
|
+
7. **Offer needs both sides** — an offer with campaigns but no contracts = leads accepted but nowhere to route
|
|
214
|
+
8. **Schedule hours** — empty means 24/7; if set, leads outside hours are rejected (not queued)
|
|
215
|
+
9. **Filter format** — geo filters use state abbreviations ("CA" not "California"), zips support wildcards ("902*")
|
|
216
|
+
10. **DQ contracts are separate** — linked via DQ Contracts tab, not the regular Contracts tab
|
|
217
|
+
|
|
218
|
+
## API Endpoints
|
|
219
|
+
|
|
220
|
+
| Endpoint | Purpose |
|
|
221
|
+
|----------|---------|
|
|
222
|
+
| `POST /api/v1/leads/submit` | Submit a lead (partner API) |
|
|
223
|
+
| `GET /api/v1/campaigns/{id}/posting` | Get posting spec for a campaign |
|
|
224
|
+
| `GET /api/admin/leads` | List leads (admin) |
|
|
225
|
+
| `GET /api/admin/leads/{id}` | Lead detail with routing info |
|
|
226
|
+
| `GET /api/admin/buyers` | List buyers |
|
|
227
|
+
| `GET /api/admin/partners` | List partners |
|
|
228
|
+
| `GET /api/admin/offers` | List offers |
|
|
229
|
+
| `GET /api/admin/contracts` | List contracts |
|
|
230
|
+
| `GET /api/admin/verticals` | List verticals |
|
|
231
|
+
|
|
232
|
+
## Auth
|
|
233
|
+
|
|
234
|
+
- **Admin dashboard:** Session-based (JWT in `lr_session` cookie)
|
|
235
|
+
- **Partner lead submission:** `Authorization: Bearer lr_xxx` (campaign postingKey)
|
|
236
|
+
- **Partner portal API:** Session cookie or partner API key
|
|
237
|
+
- **Buyer portal API:** Session cookie or buyer API key
|
|
238
|
+
- **Admin API:** `Authorization: Bearer lr_xxx` (admin API key)
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 iSCALE LLC
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# theLeadRouter MCP — Claude Code Integration
|
|
2
|
+
|
|
3
|
+
[](https://builtwithai.com)
|
|
4
|
+
|
|
5
|
+
Connect [Claude Code](https://claude.ai/code) to your [theLeadRouter](https://theleadrouter.com) lead routing platform. This repo provides:
|
|
6
|
+
|
|
7
|
+
1. **Role-specific skills** — teach Claude Code how theLeadRouter works from your perspective (admin, partner, or buyer)
|
|
8
|
+
2. **MCP server** — connects Claude Code to your instance via API so it can query leads, manage entities, pull reports, and more
|
|
9
|
+
|
|
10
|
+
**Built by [iSCALE](https://builtwithai.com) — AI-powered tools for lead generation at scale.**
|
|
11
|
+
|
|
12
|
+
## Quick Start
|
|
13
|
+
|
|
14
|
+
### Option 1: Clone this repo (recommended)
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
git clone https://github.com/iscale-llc/theleadrouter-mcp.git
|
|
18
|
+
cd theleadrouter-mcp
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Then open Claude Code in this directory. It automatically loads the `CLAUDE.md` and all skills.
|
|
22
|
+
|
|
23
|
+
Say **"I'm new, help me get started"** or run `/welcome` — Claude Code will detect your role and walk you through setup step by step.
|
|
24
|
+
|
|
25
|
+
### Option 2: Copy just your role's skill
|
|
26
|
+
|
|
27
|
+
Copy only the skill you need into your project's `.claude/skills/` directory:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# For admins (full platform setup & management)
|
|
31
|
+
cp -r .claude/skills/admin-guide /path/to/your/project/.claude/skills/
|
|
32
|
+
|
|
33
|
+
# For partners (lead submission, campaigns, portal)
|
|
34
|
+
cp -r .claude/skills/partner-guide /path/to/your/project/.claude/skills/
|
|
35
|
+
|
|
36
|
+
# For buyers (contracts, filters, delivery, billing)
|
|
37
|
+
cp -r .claude/skills/buyer-guide /path/to/your/project/.claude/skills/
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Skills by Role
|
|
41
|
+
|
|
42
|
+
### Admin Guide (`/admin-guide`)
|
|
43
|
+
|
|
44
|
+
Full platform configuration and management:
|
|
45
|
+
- Entity hierarchy and setup order (verticals → partners → buyers → campaigns → contracts → offers)
|
|
46
|
+
- Routing engine internals — how the system evaluates contracts
|
|
47
|
+
- Distribution patterns (exclusive, multisell, hybrid, ping-post)
|
|
48
|
+
- Intake centers and delivery configuration
|
|
49
|
+
- Troubleshooting routing failures
|
|
50
|
+
- All admin API endpoints
|
|
51
|
+
|
|
52
|
+
### Partner Guide (`/partner-guide`)
|
|
53
|
+
|
|
54
|
+
Lead submission and campaign management:
|
|
55
|
+
- How to submit leads via API (`POST /api/v1/leads/submit`)
|
|
56
|
+
- Posting specs — required fields, sample requests, response formats
|
|
57
|
+
- Common rejection reasons and how to fix them
|
|
58
|
+
- Sessions API for multi-step funnels
|
|
59
|
+
- Co-registration flows
|
|
60
|
+
- Partner portal overview and API endpoints
|
|
61
|
+
- Campaign caps and pricing models
|
|
62
|
+
|
|
63
|
+
### Buyer Guide (`/buyer-guide`)
|
|
64
|
+
|
|
65
|
+
Receiving and managing leads:
|
|
66
|
+
- Contract configuration (filters, caps, pricing, schedule)
|
|
67
|
+
- Delivery setup (HTTP POST/GET, email, CRM integration)
|
|
68
|
+
- Dedup settings and how duplicate prevention works
|
|
69
|
+
- Balance, billing, and credit limits
|
|
70
|
+
- Returns and disposition tracking
|
|
71
|
+
- CPA (cost per acquisition) and conversion postbacks
|
|
72
|
+
- Ping-post auction model
|
|
73
|
+
- Buyer portal and API endpoints
|
|
74
|
+
|
|
75
|
+
## Setting Up the MCP Server
|
|
76
|
+
|
|
77
|
+
The MCP server lets Claude Code interact with your theLeadRouter instance directly — querying leads, managing buyers, pulling reports, etc.
|
|
78
|
+
|
|
79
|
+
### 1. Generate an API key
|
|
80
|
+
|
|
81
|
+
Go to **Settings > API Keys** in your admin dashboard and create an API key. It will start with `lr_`.
|
|
82
|
+
|
|
83
|
+
### 2. Add to your Claude Code config
|
|
84
|
+
|
|
85
|
+
Add the following to your `.mcp.json` file. Replace `lr_your_key_here` with your actual key.
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"mcpServers": {
|
|
90
|
+
"theleadrouter": {
|
|
91
|
+
"command": "npx",
|
|
92
|
+
"args": ["-y", "theleadrouter-mcp@latest"],
|
|
93
|
+
"env": {
|
|
94
|
+
"ISCALE_API_URL": "https://leads.iscale.com",
|
|
95
|
+
"ISCALE_API_KEY": "lr_your_key_here"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 3. Restart Claude Code
|
|
103
|
+
|
|
104
|
+
Close and reopen Claude Code so it picks up the new MCP server config.
|
|
105
|
+
|
|
106
|
+
### 4. Verify the connection
|
|
107
|
+
|
|
108
|
+
Try asking: `"Use search_leads to show me recent leads"`
|
|
109
|
+
|
|
110
|
+
## MCP Server Tools
|
|
111
|
+
|
|
112
|
+
Once connected, Claude Code can use 300+ tools across these categories:
|
|
113
|
+
|
|
114
|
+
| Category | Examples |
|
|
115
|
+
|----------|----------|
|
|
116
|
+
| **Leads** | `search_leads`, `get_lead`, `get_lead_distributions`, `submit_lead` |
|
|
117
|
+
| **Buyers** | `list_buyers`, `get_buyer_balance`, `update_buyer_status` |
|
|
118
|
+
| **Partners** | `list_partners`, `get_partner`, `create_partner` |
|
|
119
|
+
| **Contracts** | `list_contracts`, `create_contract`, `update_contract_status` |
|
|
120
|
+
| **Campaigns** | `list_campaigns`, `get_posting_instructions` |
|
|
121
|
+
| **Offers** | `list_offers`, `link_campaign_to_offer` |
|
|
122
|
+
| **Reports** | `get_report`, `list_transactions`, `list_payouts` |
|
|
123
|
+
| **People (CRM)** | `search_people`, `get_person_timeline` |
|
|
124
|
+
| **Calls & IVR** | `list_calls`, `get_call`, `list_tracking_numbers` |
|
|
125
|
+
| **Compliance** | `check_suppression`, `list_audit_logs` |
|
|
126
|
+
|
|
127
|
+
## Example Prompts
|
|
128
|
+
|
|
129
|
+
### For Admins
|
|
130
|
+
```
|
|
131
|
+
"Set up a new solar vertical with fields for utilityBill and homeOwner"
|
|
132
|
+
"Create a campaign for partner SunLeads on the solar vertical"
|
|
133
|
+
"Why didn't lead L-12345 route to any buyers?"
|
|
134
|
+
"Show me all contracts that are hitting their daily cap"
|
|
135
|
+
"Pull a revenue report for last week grouped by buyer"
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### For Partners
|
|
139
|
+
```
|
|
140
|
+
"Show me the posting spec for campaign C-789"
|
|
141
|
+
"What fields do I need to submit a solar lead?"
|
|
142
|
+
"Why was my last lead rejected?"
|
|
143
|
+
"Show me my leads from today and their statuses"
|
|
144
|
+
"What offers are available for me to enroll in?"
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### For Buyers
|
|
148
|
+
```
|
|
149
|
+
"What's my current balance and credit limit?"
|
|
150
|
+
"Show me all leads I received today"
|
|
151
|
+
"Which of my contracts are paused?"
|
|
152
|
+
"Return lead L-12345 — invalid phone number"
|
|
153
|
+
"How many leads am I getting per day this week?"
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## About
|
|
157
|
+
|
|
158
|
+
theLeadRouter is a B2B lead distribution platform that routes leads from partners to buyers through offer-based contracts. Learn more at [theleadrouter.com](https://theleadrouter.com).
|
|
159
|
+
|
|
160
|
+
Built by [iSCALE](https://builtwithai.com) — browse all our open-source AI tools at [builtwithai.com/open-source](https://builtwithai.com/open-source).
|
|
161
|
+
|
|
162
|
+
## Help & Documentation
|
|
163
|
+
|
|
164
|
+
- **User Manual:** Available in your admin dashboard under Help > User Manual
|
|
165
|
+
- **API Reference:** Help > API Docs
|
|
166
|
+
- **Claude Code tab:** Help > Claude Code (in-app setup instructions)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ApiClientConfig, ApiResponse } from './types.js';
|
|
2
|
+
export declare class ApiClient {
|
|
3
|
+
private baseUrl;
|
|
4
|
+
private apiKey;
|
|
5
|
+
constructor(config: ApiClientConfig);
|
|
6
|
+
get<T = unknown>(path: string, params?: Record<string, string>): Promise<ApiResponse<T>>;
|
|
7
|
+
post<T = unknown>(path: string, body?: unknown): Promise<ApiResponse<T>>;
|
|
8
|
+
patch<T = unknown>(path: string, body?: unknown): Promise<ApiResponse<T>>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE9D,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,MAAM,CAAQ;gBAEV,MAAM,EAAE,eAAe;IAK7B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAoBxF,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAiBxE,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CAgBhF"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export class ApiClient {
|
|
2
|
+
baseUrl;
|
|
3
|
+
apiKey;
|
|
4
|
+
constructor(config) {
|
|
5
|
+
this.baseUrl = config.baseUrl.replace(/\/$/, '');
|
|
6
|
+
this.apiKey = config.apiKey;
|
|
7
|
+
}
|
|
8
|
+
async get(path, params) {
|
|
9
|
+
const url = new URL(`${this.baseUrl}${path}`);
|
|
10
|
+
if (params) {
|
|
11
|
+
for (const [k, v] of Object.entries(params)) {
|
|
12
|
+
if (v !== undefined && v !== null && v !== '')
|
|
13
|
+
url.searchParams.set(k, v);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const res = await fetch(url.toString(), {
|
|
17
|
+
headers: {
|
|
18
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
19
|
+
'Accept': 'application/json',
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
try {
|
|
23
|
+
return await res.json();
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return { error: { code: 'PARSE_ERROR', message: `HTTP ${res.status}: ${res.statusText}` } };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async post(path, body) {
|
|
30
|
+
const res = await fetch(`${this.baseUrl}${path}`, {
|
|
31
|
+
method: 'POST',
|
|
32
|
+
headers: {
|
|
33
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
34
|
+
'Content-Type': 'application/json',
|
|
35
|
+
'Accept': 'application/json',
|
|
36
|
+
},
|
|
37
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
38
|
+
});
|
|
39
|
+
try {
|
|
40
|
+
return await res.json();
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return { error: { code: 'PARSE_ERROR', message: `HTTP ${res.status}: ${res.statusText}` } };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async patch(path, body) {
|
|
47
|
+
const res = await fetch(`${this.baseUrl}${path}`, {
|
|
48
|
+
method: 'PATCH',
|
|
49
|
+
headers: {
|
|
50
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
51
|
+
'Content-Type': 'application/json',
|
|
52
|
+
'Accept': 'application/json',
|
|
53
|
+
},
|
|
54
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
55
|
+
});
|
|
56
|
+
try {
|
|
57
|
+
return await res.json();
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return { error: { code: 'PARSE_ERROR', message: `HTTP ${res.status}: ${res.statusText}` } };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth adapters bridge MCP tool handlers to different auth mechanisms.
|
|
3
|
+
* - SessionAuthAdapter: forwards session cookie (for in-app agent chat)
|
|
4
|
+
* - ApiKeyAuthAdapter: Bearer token (for external MCP consumers)
|
|
5
|
+
*/
|
|
6
|
+
export interface AuthAdapter {
|
|
7
|
+
fetch(path: string, opts?: {
|
|
8
|
+
method?: string;
|
|
9
|
+
body?: unknown;
|
|
10
|
+
params?: Record<string, string>;
|
|
11
|
+
}): Promise<unknown>;
|
|
12
|
+
}
|
|
13
|
+
export declare class SessionAuthAdapter implements AuthAdapter {
|
|
14
|
+
private cookie;
|
|
15
|
+
private baseUrl;
|
|
16
|
+
constructor(cookie: string, baseUrl?: string);
|
|
17
|
+
fetch(path: string, opts?: {
|
|
18
|
+
method?: string;
|
|
19
|
+
body?: unknown;
|
|
20
|
+
params?: Record<string, string>;
|
|
21
|
+
}): Promise<unknown>;
|
|
22
|
+
}
|
|
23
|
+
export declare class ApiKeyAuthAdapter implements AuthAdapter {
|
|
24
|
+
private apiKey;
|
|
25
|
+
private baseUrl;
|
|
26
|
+
constructor(apiKey: string, baseUrl: string);
|
|
27
|
+
fetch(path: string, opts?: {
|
|
28
|
+
method?: string;
|
|
29
|
+
body?: unknown;
|
|
30
|
+
params?: Record<string, string>;
|
|
31
|
+
}): Promise<unknown>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=auth-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-adapter.d.ts","sourceRoot":"","sources":["../src/auth-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QACzB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,IAAI,CAAC,EAAE,OAAO,CAAA;QACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAChC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACrB;AAED,qBAAa,kBAAmB,YAAW,WAAW;IAElD,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;gBADP,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,MAC4E;IAGzF,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CAoCzH;AAED,qBAAa,iBAAkB,YAAW,WAAW;IAEjD,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;gBADP,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM;IAGnB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CAoCzH"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth adapters bridge MCP tool handlers to different auth mechanisms.
|
|
3
|
+
* - SessionAuthAdapter: forwards session cookie (for in-app agent chat)
|
|
4
|
+
* - ApiKeyAuthAdapter: Bearer token (for external MCP consumers)
|
|
5
|
+
*/
|
|
6
|
+
export class SessionAuthAdapter {
|
|
7
|
+
cookie;
|
|
8
|
+
baseUrl;
|
|
9
|
+
constructor(cookie, baseUrl = process.env.ROUTING_API_URL
|
|
10
|
+
|| (process.env.VERCEL_URL ? `https://${process.env.VERCEL_URL}` : 'http://localhost:4005')) {
|
|
11
|
+
this.cookie = cookie;
|
|
12
|
+
this.baseUrl = baseUrl;
|
|
13
|
+
}
|
|
14
|
+
async fetch(path, opts) {
|
|
15
|
+
const url = new URL(path, this.baseUrl);
|
|
16
|
+
if (opts?.params) {
|
|
17
|
+
for (const [key, value] of Object.entries(opts.params)) {
|
|
18
|
+
url.searchParams.set(key, value);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const res = await globalThis.fetch(url.toString(), {
|
|
22
|
+
method: opts?.method || 'GET',
|
|
23
|
+
headers: {
|
|
24
|
+
'Content-Type': 'application/json',
|
|
25
|
+
Cookie: this.cookie,
|
|
26
|
+
},
|
|
27
|
+
body: opts?.body ? JSON.stringify(opts.body) : undefined,
|
|
28
|
+
});
|
|
29
|
+
if (!res.ok) {
|
|
30
|
+
const err = await res.json().catch(() => ({}));
|
|
31
|
+
const apiErr = err.error;
|
|
32
|
+
return {
|
|
33
|
+
error: true,
|
|
34
|
+
code: apiErr?.code || 'UNKNOWN',
|
|
35
|
+
message: apiErr?.message || `Failed (${res.status})`,
|
|
36
|
+
details: apiErr?.details || undefined,
|
|
37
|
+
status: res.status,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// Handle 204 No Content (common for DELETE)
|
|
41
|
+
if (res.status === 204 || res.headers.get('content-length') === '0') {
|
|
42
|
+
return { success: true };
|
|
43
|
+
}
|
|
44
|
+
return res.json();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export class ApiKeyAuthAdapter {
|
|
48
|
+
apiKey;
|
|
49
|
+
baseUrl;
|
|
50
|
+
constructor(apiKey, baseUrl) {
|
|
51
|
+
this.apiKey = apiKey;
|
|
52
|
+
this.baseUrl = baseUrl;
|
|
53
|
+
}
|
|
54
|
+
async fetch(path, opts) {
|
|
55
|
+
const url = new URL(path, this.baseUrl);
|
|
56
|
+
if (opts?.params) {
|
|
57
|
+
for (const [key, value] of Object.entries(opts.params)) {
|
|
58
|
+
url.searchParams.set(key, value);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const res = await globalThis.fetch(url.toString(), {
|
|
62
|
+
method: opts?.method || 'GET',
|
|
63
|
+
headers: {
|
|
64
|
+
'Content-Type': 'application/json',
|
|
65
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
66
|
+
},
|
|
67
|
+
body: opts?.body ? JSON.stringify(opts.body) : undefined,
|
|
68
|
+
});
|
|
69
|
+
if (!res.ok) {
|
|
70
|
+
const err = await res.json().catch(() => ({}));
|
|
71
|
+
const apiErr = err.error;
|
|
72
|
+
return {
|
|
73
|
+
error: true,
|
|
74
|
+
code: apiErr?.code || 'UNKNOWN',
|
|
75
|
+
message: apiErr?.message || `Failed (${res.status})`,
|
|
76
|
+
details: apiErr?.details || undefined,
|
|
77
|
+
status: res.status,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// Handle 204 No Content (common for DELETE)
|
|
81
|
+
if (res.status === 204 || res.headers.get('content-length') === '0') {
|
|
82
|
+
return { success: true };
|
|
83
|
+
}
|
|
84
|
+
return res.json();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=auth-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-adapter.js","sourceRoot":"","sources":["../src/auth-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iscale-mcp.d.ts","sourceRoot":"","sources":["../../src/bin/iscale-mcp.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iscale-mcp.js","sourceRoot":"","sources":["../../src/bin/iscale-mcp.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC5B,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;IACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|