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.
Files changed (253) hide show
  1. package/.claude/skills/admin-guide/SKILL.md +351 -0
  2. package/.claude/skills/buyer-guide/SKILL.md +405 -0
  3. package/.claude/skills/partner-guide/SKILL.md +352 -0
  4. package/.claude/skills/welcome/SKILL.md +351 -0
  5. package/CLAUDE.md +238 -0
  6. package/LICENSE +21 -0
  7. package/README.md +166 -0
  8. package/dist/api-client.d.ts +10 -0
  9. package/dist/api-client.d.ts.map +1 -0
  10. package/dist/api-client.js +64 -0
  11. package/dist/api-client.js.map +1 -0
  12. package/dist/auth-adapter.d.ts +33 -0
  13. package/dist/auth-adapter.d.ts.map +1 -0
  14. package/dist/auth-adapter.js +87 -0
  15. package/dist/auth-adapter.js.map +1 -0
  16. package/dist/bin/iscale-mcp.d.ts +3 -0
  17. package/dist/bin/iscale-mcp.d.ts.map +1 -0
  18. package/dist/bin/iscale-mcp.js +7 -0
  19. package/dist/bin/iscale-mcp.js.map +1 -0
  20. package/dist/build-registry.d.ts +3 -0
  21. package/dist/build-registry.d.ts.map +1 -0
  22. package/dist/build-registry.js +15 -0
  23. package/dist/build-registry.js.map +1 -0
  24. package/dist/index.d.ts +12 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +34 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/register.d.ts +4 -0
  29. package/dist/register.d.ts.map +1 -0
  30. package/dist/register.js +23 -0
  31. package/dist/register.js.map +1 -0
  32. package/dist/registry.d.ts +50 -0
  33. package/dist/registry.d.ts.map +1 -0
  34. package/dist/registry.js +78 -0
  35. package/dist/registry.js.map +1 -0
  36. package/dist/tools/buyers.d.ts +4 -0
  37. package/dist/tools/buyers.d.ts.map +1 -0
  38. package/dist/tools/buyers.js +61 -0
  39. package/dist/tools/buyers.js.map +1 -0
  40. package/dist/tools/campaigns.d.ts +4 -0
  41. package/dist/tools/campaigns.d.ts.map +1 -0
  42. package/dist/tools/campaigns.js +45 -0
  43. package/dist/tools/campaigns.js.map +1 -0
  44. package/dist/tools/compliance.d.ts +4 -0
  45. package/dist/tools/compliance.d.ts.map +1 -0
  46. package/dist/tools/compliance.js +28 -0
  47. package/dist/tools/compliance.js.map +1 -0
  48. package/dist/tools/composite.d.ts +3 -0
  49. package/dist/tools/composite.d.ts.map +1 -0
  50. package/dist/tools/composite.js +337 -0
  51. package/dist/tools/composite.js.map +1 -0
  52. package/dist/tools/contracts.d.ts +4 -0
  53. package/dist/tools/contracts.d.ts.map +1 -0
  54. package/dist/tools/contracts.js +48 -0
  55. package/dist/tools/contracts.js.map +1 -0
  56. package/dist/tools/generated/api-keys.gen.d.ts +3 -0
  57. package/dist/tools/generated/api-keys.gen.d.ts.map +1 -0
  58. package/dist/tools/generated/api-keys.gen.js +49 -0
  59. package/dist/tools/generated/api-keys.gen.js.map +1 -0
  60. package/dist/tools/generated/audit-logs.gen.d.ts +3 -0
  61. package/dist/tools/generated/audit-logs.gen.d.ts.map +1 -0
  62. package/dist/tools/generated/audit-logs.gen.js +59 -0
  63. package/dist/tools/generated/audit-logs.gen.js.map +1 -0
  64. package/dist/tools/generated/auth.gen.d.ts +3 -0
  65. package/dist/tools/generated/auth.gen.d.ts.map +1 -0
  66. package/dist/tools/generated/auth.gen.js +195 -0
  67. package/dist/tools/generated/auth.gen.js.map +1 -0
  68. package/dist/tools/generated/blocked-lists.gen.d.ts +3 -0
  69. package/dist/tools/generated/blocked-lists.gen.d.ts.map +1 -0
  70. package/dist/tools/generated/blocked-lists.gen.js +146 -0
  71. package/dist/tools/generated/blocked-lists.gen.js.map +1 -0
  72. package/dist/tools/generated/buyers.gen.d.ts +3 -0
  73. package/dist/tools/generated/buyers.gen.d.ts.map +1 -0
  74. package/dist/tools/generated/buyers.gen.js +153 -0
  75. package/dist/tools/generated/buyers.gen.js.map +1 -0
  76. package/dist/tools/generated/calls.gen.d.ts +3 -0
  77. package/dist/tools/generated/calls.gen.d.ts.map +1 -0
  78. package/dist/tools/generated/calls.gen.js +106 -0
  79. package/dist/tools/generated/calls.gen.js.map +1 -0
  80. package/dist/tools/generated/campaigns.gen.d.ts +3 -0
  81. package/dist/tools/generated/campaigns.gen.d.ts.map +1 -0
  82. package/dist/tools/generated/campaigns.gen.js +274 -0
  83. package/dist/tools/generated/campaigns.gen.js.map +1 -0
  84. package/dist/tools/generated/catalog.json +7096 -0
  85. package/dist/tools/generated/compliance.gen.d.ts +3 -0
  86. package/dist/tools/generated/compliance.gen.d.ts.map +1 -0
  87. package/dist/tools/generated/compliance.gen.js +119 -0
  88. package/dist/tools/generated/compliance.gen.js.map +1 -0
  89. package/dist/tools/generated/consent.gen.d.ts +3 -0
  90. package/dist/tools/generated/consent.gen.d.ts.map +1 -0
  91. package/dist/tools/generated/consent.gen.js +109 -0
  92. package/dist/tools/generated/consent.gen.js.map +1 -0
  93. package/dist/tools/generated/contacts.gen.d.ts +3 -0
  94. package/dist/tools/generated/contacts.gen.d.ts.map +1 -0
  95. package/dist/tools/generated/contacts.gen.js +88 -0
  96. package/dist/tools/generated/contacts.gen.js.map +1 -0
  97. package/dist/tools/generated/contracts.gen.d.ts +3 -0
  98. package/dist/tools/generated/contracts.gen.d.ts.map +1 -0
  99. package/dist/tools/generated/contracts.gen.js +306 -0
  100. package/dist/tools/generated/contracts.gen.js.map +1 -0
  101. package/dist/tools/generated/delivery-test.gen.d.ts +3 -0
  102. package/dist/tools/generated/delivery-test.gen.d.ts.map +1 -0
  103. package/dist/tools/generated/delivery-test.gen.js +17 -0
  104. package/dist/tools/generated/delivery-test.gen.js.map +1 -0
  105. package/dist/tools/generated/discovery.gen.d.ts +3 -0
  106. package/dist/tools/generated/discovery.gen.d.ts.map +1 -0
  107. package/dist/tools/generated/discovery.gen.js +17 -0
  108. package/dist/tools/generated/discovery.gen.js.map +1 -0
  109. package/dist/tools/generated/disposition-codes.gen.d.ts +3 -0
  110. package/dist/tools/generated/disposition-codes.gen.d.ts.map +1 -0
  111. package/dist/tools/generated/disposition-codes.gen.js +30 -0
  112. package/dist/tools/generated/disposition-codes.gen.js.map +1 -0
  113. package/dist/tools/generated/email-templates.gen.d.ts +3 -0
  114. package/dist/tools/generated/email-templates.gen.d.ts.map +1 -0
  115. package/dist/tools/generated/email-templates.gen.js +108 -0
  116. package/dist/tools/generated/email-templates.gen.js.map +1 -0
  117. package/dist/tools/generated/engagements.gen.d.ts +3 -0
  118. package/dist/tools/generated/engagements.gen.d.ts.map +1 -0
  119. package/dist/tools/generated/engagements.gen.js +208 -0
  120. package/dist/tools/generated/engagements.gen.js.map +1 -0
  121. package/dist/tools/generated/enrollments.gen.d.ts +3 -0
  122. package/dist/tools/generated/enrollments.gen.d.ts.map +1 -0
  123. package/dist/tools/generated/enrollments.gen.js +82 -0
  124. package/dist/tools/generated/enrollments.gen.js.map +1 -0
  125. package/dist/tools/generated/events.gen.d.ts +3 -0
  126. package/dist/tools/generated/events.gen.d.ts.map +1 -0
  127. package/dist/tools/generated/events.gen.js +20 -0
  128. package/dist/tools/generated/events.gen.js.map +1 -0
  129. package/dist/tools/generated/index.d.ts +3 -0
  130. package/dist/tools/generated/index.d.ts.map +1 -0
  131. package/dist/tools/generated/index.js +86 -0
  132. package/dist/tools/generated/index.js.map +1 -0
  133. package/dist/tools/generated/intake-centers.gen.d.ts +3 -0
  134. package/dist/tools/generated/intake-centers.gen.d.ts.map +1 -0
  135. package/dist/tools/generated/intake-centers.gen.js +196 -0
  136. package/dist/tools/generated/intake-centers.gen.js.map +1 -0
  137. package/dist/tools/generated/integrations.gen.d.ts +3 -0
  138. package/dist/tools/generated/integrations.gen.d.ts.map +1 -0
  139. package/dist/tools/generated/integrations.gen.js +290 -0
  140. package/dist/tools/generated/integrations.gen.js.map +1 -0
  141. package/dist/tools/generated/ivr.gen.d.ts +3 -0
  142. package/dist/tools/generated/ivr.gen.d.ts.map +1 -0
  143. package/dist/tools/generated/ivr.gen.js +97 -0
  144. package/dist/tools/generated/ivr.gen.js.map +1 -0
  145. package/dist/tools/generated/leads.gen.d.ts +3 -0
  146. package/dist/tools/generated/leads.gen.d.ts.map +1 -0
  147. package/dist/tools/generated/leads.gen.js +592 -0
  148. package/dist/tools/generated/leads.gen.js.map +1 -0
  149. package/dist/tools/generated/number-pool.gen.d.ts +3 -0
  150. package/dist/tools/generated/number-pool.gen.d.ts.map +1 -0
  151. package/dist/tools/generated/number-pool.gen.js +62 -0
  152. package/dist/tools/generated/number-pool.gen.js.map +1 -0
  153. package/dist/tools/generated/offers.gen.d.ts +3 -0
  154. package/dist/tools/generated/offers.gen.d.ts.map +1 -0
  155. package/dist/tools/generated/offers.gen.js +407 -0
  156. package/dist/tools/generated/offers.gen.js.map +1 -0
  157. package/dist/tools/generated/organizations.gen.d.ts +3 -0
  158. package/dist/tools/generated/organizations.gen.d.ts.map +1 -0
  159. package/dist/tools/generated/organizations.gen.js +161 -0
  160. package/dist/tools/generated/organizations.gen.js.map +1 -0
  161. package/dist/tools/generated/partners.gen.d.ts +3 -0
  162. package/dist/tools/generated/partners.gen.d.ts.map +1 -0
  163. package/dist/tools/generated/partners.gen.js +121 -0
  164. package/dist/tools/generated/partners.gen.js.map +1 -0
  165. package/dist/tools/generated/payouts.gen.d.ts +3 -0
  166. package/dist/tools/generated/payouts.gen.d.ts.map +1 -0
  167. package/dist/tools/generated/payouts.gen.js +92 -0
  168. package/dist/tools/generated/payouts.gen.js.map +1 -0
  169. package/dist/tools/generated/people.gen.d.ts +3 -0
  170. package/dist/tools/generated/people.gen.d.ts.map +1 -0
  171. package/dist/tools/generated/people.gen.js +354 -0
  172. package/dist/tools/generated/people.gen.js.map +1 -0
  173. package/dist/tools/generated/posting-log.gen.d.ts +3 -0
  174. package/dist/tools/generated/posting-log.gen.d.ts.map +1 -0
  175. package/dist/tools/generated/posting-log.gen.js +150 -0
  176. package/dist/tools/generated/posting-log.gen.js.map +1 -0
  177. package/dist/tools/generated/refunds.gen.d.ts +3 -0
  178. package/dist/tools/generated/refunds.gen.d.ts.map +1 -0
  179. package/dist/tools/generated/refunds.gen.js +91 -0
  180. package/dist/tools/generated/refunds.gen.js.map +1 -0
  181. package/dist/tools/generated/reports.gen.d.ts +3 -0
  182. package/dist/tools/generated/reports.gen.d.ts.map +1 -0
  183. package/dist/tools/generated/reports.gen.js +38 -0
  184. package/dist/tools/generated/reports.gen.js.map +1 -0
  185. package/dist/tools/generated/sessions.gen.d.ts +3 -0
  186. package/dist/tools/generated/sessions.gen.d.ts.map +1 -0
  187. package/dist/tools/generated/sessions.gen.js +90 -0
  188. package/dist/tools/generated/sessions.gen.js.map +1 -0
  189. package/dist/tools/generated/settings.gen.d.ts +3 -0
  190. package/dist/tools/generated/settings.gen.d.ts.map +1 -0
  191. package/dist/tools/generated/settings.gen.js +473 -0
  192. package/dist/tools/generated/settings.gen.js.map +1 -0
  193. package/dist/tools/generated/telephony.gen.d.ts +3 -0
  194. package/dist/tools/generated/telephony.gen.d.ts.map +1 -0
  195. package/dist/tools/generated/telephony.gen.js +170 -0
  196. package/dist/tools/generated/telephony.gen.js.map +1 -0
  197. package/dist/tools/generated/tenants.gen.d.ts +3 -0
  198. package/dist/tools/generated/tenants.gen.d.ts.map +1 -0
  199. package/dist/tools/generated/tenants.gen.js +223 -0
  200. package/dist/tools/generated/tenants.gen.js.map +1 -0
  201. package/dist/tools/generated/tracking-numbers.gen.d.ts +3 -0
  202. package/dist/tools/generated/tracking-numbers.gen.d.ts.map +1 -0
  203. package/dist/tools/generated/tracking-numbers.gen.js +131 -0
  204. package/dist/tools/generated/tracking-numbers.gen.js.map +1 -0
  205. package/dist/tools/generated/transactions.gen.d.ts +3 -0
  206. package/dist/tools/generated/transactions.gen.d.ts.map +1 -0
  207. package/dist/tools/generated/transactions.gen.js +62 -0
  208. package/dist/tools/generated/transactions.gen.js.map +1 -0
  209. package/dist/tools/generated/users.gen.d.ts +3 -0
  210. package/dist/tools/generated/users.gen.d.ts.map +1 -0
  211. package/dist/tools/generated/users.gen.js +339 -0
  212. package/dist/tools/generated/users.gen.js.map +1 -0
  213. package/dist/tools/generated/vertical-groups.gen.d.ts +3 -0
  214. package/dist/tools/generated/vertical-groups.gen.d.ts.map +1 -0
  215. package/dist/tools/generated/vertical-groups.gen.js +243 -0
  216. package/dist/tools/generated/vertical-groups.gen.js.map +1 -0
  217. package/dist/tools/generated/verticals.gen.d.ts +3 -0
  218. package/dist/tools/generated/verticals.gen.d.ts.map +1 -0
  219. package/dist/tools/generated/verticals.gen.js +164 -0
  220. package/dist/tools/generated/verticals.gen.js.map +1 -0
  221. package/dist/tools/leads.d.ts +4 -0
  222. package/dist/tools/leads.d.ts.map +1 -0
  223. package/dist/tools/leads.js +69 -0
  224. package/dist/tools/leads.js.map +1 -0
  225. package/dist/tools/offers.d.ts +4 -0
  226. package/dist/tools/offers.d.ts.map +1 -0
  227. package/dist/tools/offers.js +33 -0
  228. package/dist/tools/offers.js.map +1 -0
  229. package/dist/tools/partners.d.ts +4 -0
  230. package/dist/tools/partners.d.ts.map +1 -0
  231. package/dist/tools/partners.js +30 -0
  232. package/dist/tools/partners.js.map +1 -0
  233. package/dist/tools/people.d.ts +4 -0
  234. package/dist/tools/people.d.ts.map +1 -0
  235. package/dist/tools/people.js +42 -0
  236. package/dist/tools/people.js.map +1 -0
  237. package/dist/tools/reports.d.ts +4 -0
  238. package/dist/tools/reports.d.ts.map +1 -0
  239. package/dist/tools/reports.js +67 -0
  240. package/dist/tools/reports.js.map +1 -0
  241. package/dist/tools/ui.d.ts +3 -0
  242. package/dist/tools/ui.d.ts.map +1 -0
  243. package/dist/tools/ui.js +108 -0
  244. package/dist/tools/ui.js.map +1 -0
  245. package/dist/tools/verticals.d.ts +4 -0
  246. package/dist/tools/verticals.d.ts.map +1 -0
  247. package/dist/tools/verticals.js +25 -0
  248. package/dist/tools/verticals.js.map +1 -0
  249. package/dist/types.d.ts +19 -0
  250. package/dist/types.d.ts.map +1 -0
  251. package/dist/types.js +2 -0
  252. package/dist/types.js.map +1 -0
  253. 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
+ [![Built with AI](https://img.shields.io/badge/Built%20with-AI-blue)](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":"AAEA,MAAM,OAAO,SAAS;IACZ,OAAO,CAAQ;IACf,MAAM,CAAQ;IAEtB,YAAY,MAAuB;QACjC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QAChD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,GAAG,CAAc,IAAY,EAAE,MAA+B;QAClE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAA;QAC7C,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE;oBAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAC3E,CAAC;QACH,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;YACtC,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;gBACxC,QAAQ,EAAE,kBAAkB;aAC7B;SACF,CAAC,CAAA;QACF,IAAI,CAAC;YACH,OAAO,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,EAAE,EAAE,CAAA;QAC7F,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAc,IAAY,EAAE,IAAc;QAClD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;YAChD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;gBACxC,cAAc,EAAE,kBAAkB;gBAClC,QAAQ,EAAE,kBAAkB;aAC7B;YACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAA;QACF,IAAI,CAAC;YACH,OAAO,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,EAAE,EAAE,CAAA;QAC7F,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAc,IAAY,EAAE,IAAc;QACnD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;YAChD,MAAM,EAAE,OAAO;YACf,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;gBACxC,cAAc,EAAE,kBAAkB;gBAClC,QAAQ,EAAE,kBAAkB;aAC7B;YACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAA;QACF,IAAI,CAAC;YACH,OAAO,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,EAAE,EAAE,CAAA;QAC7F,CAAC;IACH,CAAC;CACF"}
@@ -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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=iscale-mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iscale-mcp.d.ts","sourceRoot":"","sources":["../../src/bin/iscale-mcp.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import { startServer } from '../index.js';
3
+ startServer().catch((error) => {
4
+ console.error('Fatal error:', error);
5
+ process.exit(1);
6
+ });
7
+ //# sourceMappingURL=iscale-mcp.js.map
@@ -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"}
@@ -0,0 +1,3 @@
1
+ import { ToolRegistry } from './registry.js';
2
+ export declare function buildRegistry(): ToolRegistry;
3
+ //# sourceMappingURL=build-registry.d.ts.map