@getcheddar/cheddar-mcp 1.0.4 → 2.0.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/README.md +51 -160
- package/bin/cheddar-mcp.mjs +5 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -52
- package/dist/index.js.map +1 -1
- package/dist/lib/legacy-client.d.ts +44 -0
- package/dist/lib/legacy-client.d.ts.map +1 -0
- package/dist/lib/legacy-client.js +149 -0
- package/dist/lib/legacy-client.js.map +1 -0
- package/dist/tools/customers.d.ts +2 -2
- package/dist/tools/customers.d.ts.map +1 -1
- package/dist/tools/customers.js +103 -103
- package/dist/tools/customers.js.map +1 -1
- package/dist/tools/plans.d.ts +10 -0
- package/dist/tools/plans.d.ts.map +1 -0
- package/dist/tools/plans.js +26 -0
- package/dist/tools/plans.js.map +1 -0
- package/package.json +8 -7
- package/dist/lib/cheddar-client.d.ts +0 -111
- package/dist/lib/cheddar-client.d.ts.map +0 -1
- package/dist/lib/cheddar-client.js +0 -101
- package/dist/lib/cheddar-client.js.map +0 -1
- package/dist/tools/checkout.d.ts +0 -10
- package/dist/tools/checkout.d.ts.map +0 -1
- package/dist/tools/checkout.js +0 -641
- package/dist/tools/checkout.js.map +0 -1
- package/dist/tools/payment-methods.d.ts +0 -10
- package/dist/tools/payment-methods.d.ts.map +0 -1
- package/dist/tools/payment-methods.js +0 -162
- package/dist/tools/payment-methods.js.map +0 -1
- package/dist/tools/subscriptions.d.ts +0 -10
- package/dist/tools/subscriptions.d.ts.map +0 -1
- package/dist/tools/subscriptions.js +0 -191
- package/dist/tools/subscriptions.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,197 +1,88 @@
|
|
|
1
|
-
# Cheddar MCP Server
|
|
1
|
+
# Cheddar MCP Server (legacy API)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Model Context Protocol server that calls the **legacy Cheddar merchant API** documented at [https://docs.getcheddar.com/](https://docs.getcheddar.com/) using **HTTP Basic** authentication (`Authorization: Basic …`).
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
This package **does not** use `https://api.*` OAuth2 / Bearer REST.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
- **Subscriptions**: View subscription details and manage promotions
|
|
10
|
-
- **Checkout Integration**: Generate hosted checkout URLs and embedded form code
|
|
11
|
-
- **Code Generation**: Produce framework-specific integration code (React, Vue, Next.js, Vanilla JS)
|
|
12
|
-
- **Webhook Handling**: Validate and configure webhook endpoints
|
|
7
|
+
**Package:** `@getcheddar/cheddar-mcp`
|
|
8
|
+
**Version:** 2.0.0
|
|
13
9
|
|
|
14
|
-
##
|
|
10
|
+
## Requirements
|
|
15
11
|
|
|
16
|
-
|
|
12
|
+
- Node.js **18+**
|
|
13
|
+
- A Cheddar **product site** base URL (same host you use for admin/checkout, e.g. `https://yoursubdomain.chargevault.com`)
|
|
14
|
+
- **Product code** (`productCode` in URLs)
|
|
15
|
+
- An **authorized user email** and **password** *or* the product **API key** (“secret key” from Configuration → Settings) as the Basic password ([auth docs](https://docs.getcheddar.com/#authentication))
|
|
17
16
|
|
|
18
|
-
|
|
19
|
-
npx -y @getcheddar/cheddar-mcp
|
|
20
|
-
```
|
|
17
|
+
## Environment variables
|
|
21
18
|
|
|
22
|
-
|
|
19
|
+
| Variable | Required | Description |
|
|
20
|
+
|----------|----------|-------------|
|
|
21
|
+
| `CHEDDAR_BASE_URL` | **Yes** | Origin of your product app, no trailing slash (e.g. `https://cvences.chargevault.com`). |
|
|
22
|
+
| `CHEDDAR_PRODUCT_CODE` | **Yes** | Your product’s `productCode` segment in legacy URLs. |
|
|
23
|
+
| `CHEDDAR_USERNAME` | **Yes** | Email of an API-enabled user on that product. |
|
|
24
|
+
| `CHEDDAR_PASSWORD` | One of | That user’s login password. |
|
|
25
|
+
| `CHEDDAR_PRODUCT_API_KEY` | One of | Product secret key from admin settings; used as Basic **password** if `CHEDDAR_PASSWORD` is unset. |
|
|
26
|
+
| `CHEDDAR_SKIP_PREFLIGHT` | No | If set to `1`, skip startup `GET /xml/plans/get/...` check. |
|
|
27
|
+
|
|
28
|
+
## Install & run
|
|
23
29
|
|
|
24
30
|
```bash
|
|
25
|
-
|
|
26
|
-
|
|
31
|
+
cd packages/cheddar-mcp
|
|
32
|
+
npm install
|
|
33
|
+
npm run build
|
|
27
34
|
```
|
|
28
35
|
|
|
29
|
-
### Option 3: Docker
|
|
30
|
-
|
|
31
|
-
Build the image from this package (there is no guaranteed public image on a registry yet):
|
|
32
|
-
|
|
33
36
|
```bash
|
|
34
|
-
|
|
35
|
-
|
|
37
|
+
export CHEDDAR_BASE_URL=https://your-product-host.example
|
|
38
|
+
export CHEDDAR_PRODUCT_CODE=YOUR_PRODUCT_CODE
|
|
39
|
+
export CHEDDAR_USERNAME=api-user@example.com
|
|
40
|
+
export CHEDDAR_PRODUCT_API_KEY=your_secret_key
|
|
36
41
|
|
|
37
|
-
|
|
38
|
-
-e CHEDDAR_API_URL=https://api.getcheddar.com \
|
|
39
|
-
-e CHEDDAR_ACCESS_TOKEN=your_token \
|
|
40
|
-
cheddar-mcp
|
|
42
|
+
node dist/index.js
|
|
41
43
|
```
|
|
42
44
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
Set the following environment variables:
|
|
46
|
-
|
|
47
|
-
| Variable | Required for API calls | Description |
|
|
48
|
-
| ------------------------- | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
49
|
-
| `CHEDDAR_API_URL` | No | REST API base URL. **Production:** `https://api.getcheddar.com`. If unset, the server defaults to `https://api.chdr.dev`. For local Cheddar docker development, use the API host from your stack (often `http://api.chdrdev.com` or `http://api.chdrdev.com:8888` with hosts file entries). |
|
|
50
|
-
| `CHEDDAR_ACCESS_TOKEN` | **Yes** | OAuth2 access token, sent as `Authorization: Bearer …` on every request. |
|
|
51
|
-
| `CHEDDAR_CLIENT_ID` | No† | OAuth2 client ID (reserved for future automatic token acquisition in this package). |
|
|
52
|
-
| `CHEDDAR_CLIENT_SECRET` | No† | OAuth2 client secret (same as above). |
|
|
53
|
-
|
|
54
|
-
†The process may start if both `CHEDDAR_CLIENT_ID` and `CHEDDAR_CLIENT_SECRET` are set without a token, but **API calls will fail** until `CHEDDAR_ACCESS_TOKEN` is set. Client-credentials exchange is not implemented in the client yet—use a bearer token.
|
|
55
|
-
|
|
56
|
-
### Getting credentials and an access token
|
|
45
|
+
Or with `npx` after publish:
|
|
57
46
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
- **Production:** `POST` [https://login.getcheddar.com/oauth/token](https://login.getcheddar.com/oauth/token)
|
|
63
|
-
- **Headers:** `Content-Type: application/json`
|
|
64
|
-
- **Body (example):**
|
|
47
|
+
```bash
|
|
48
|
+
npx -y @getcheddar/cheddar-mcp
|
|
49
|
+
```
|
|
65
50
|
|
|
66
|
-
|
|
67
|
-
{
|
|
68
|
-
"grant_type": "client_credentials",
|
|
69
|
-
"client_id": "your-client-id",
|
|
70
|
-
"client_secret": "your-client-secret"
|
|
71
|
-
}
|
|
72
|
-
```
|
|
51
|
+
## Tools
|
|
73
52
|
|
|
74
|
-
|
|
75
|
-
|
|
53
|
+
| Tool | Legacy endpoint (conceptually) |
|
|
54
|
+
|------|--------------------------------|
|
|
55
|
+
| `cheddar_customer_get` | `GET /xml/customers/get/productCode/.../code/…` or `/id/…` |
|
|
56
|
+
| `cheddar_customers_search` | `GET /xml/customers/search/productCode/...` (requests `format=json` when supported) |
|
|
57
|
+
| `cheddar_customer_create` | `POST /xml/customers/new/productCode/...` (form body) |
|
|
58
|
+
| `cheddar_customer_update` | `POST /xml/customers/edit/productCode/.../code/...` |
|
|
59
|
+
| `cheddar_plans_get` | `GET /xml/plans/get/productCode/...` (optional `planCode`) |
|
|
76
60
|
|
|
77
|
-
|
|
61
|
+
Responses are returned as **JSON text**: XML from the API is parsed to a plain object where possible.
|
|
78
62
|
|
|
79
|
-
|
|
63
|
+
## Claude Desktop example
|
|
80
64
|
|
|
81
65
|
```json
|
|
82
66
|
{
|
|
83
67
|
"mcpServers": {
|
|
84
68
|
"cheddar": {
|
|
85
|
-
"command": "
|
|
86
|
-
"args": ["
|
|
69
|
+
"command": "node",
|
|
70
|
+
"args": ["/absolute/path/to/cheddar-mcp/dist/index.js"],
|
|
87
71
|
"env": {
|
|
88
|
-
"
|
|
89
|
-
"
|
|
72
|
+
"CHEDDAR_BASE_URL": "https://your-product-host.example",
|
|
73
|
+
"CHEDDAR_PRODUCT_CODE": "YOUR_PRODUCT_CODE",
|
|
74
|
+
"CHEDDAR_USERNAME": "api-user@example.com",
|
|
75
|
+
"CHEDDAR_PRODUCT_API_KEY": "your_secret_key"
|
|
90
76
|
}
|
|
91
77
|
}
|
|
92
78
|
}
|
|
93
79
|
}
|
|
94
80
|
```
|
|
95
81
|
|
|
96
|
-
## Usage with Cursor
|
|
97
|
-
|
|
98
|
-
1. Open Cursor Settings.
|
|
99
|
-
2. Navigate to **Features → MCP**.
|
|
100
|
-
3. Add a new MCP server:
|
|
101
|
-
- **Name:** `cheddar`
|
|
102
|
-
- **Command:** `npx`
|
|
103
|
-
- **Arguments:** `-y`, `@getcheddar/cheddar-mcp`
|
|
104
|
-
- **Environment:** same variables as above (`CHEDDAR_API_URL`, `CHEDDAR_ACCESS_TOKEN`), or rely on a wrapper script that exports them.
|
|
105
|
-
|
|
106
|
-
Prefer defining `env` in the MCP server configuration so the token is not tied to a single terminal session.
|
|
107
|
-
|
|
108
|
-
## Available Tools
|
|
109
|
-
|
|
110
|
-
### Customer Management
|
|
111
|
-
|
|
112
|
-
| Tool | Description |
|
|
113
|
-
| ------------------------- | ----------------------------------- |
|
|
114
|
-
| `cheddar_customer_get` | Retrieve a customer by ID or code |
|
|
115
|
-
| `cheddar_customer_create` | Create a new customer |
|
|
116
|
-
| `cheddar_customer_update` | Update customer information |
|
|
117
|
-
|
|
118
|
-
### Payment Methods
|
|
119
|
-
|
|
120
|
-
| Tool | Description |
|
|
121
|
-
| -------------------------------------------- | ---------------------------------------- |
|
|
122
|
-
| `cheddar_payment_method_get` | Retrieve a payment method by ID |
|
|
123
|
-
| `cheddar_payment_method_get_customer` | Get customer from payment method |
|
|
124
|
-
| `cheddar_payment_method_get_gateway_account` | Get gateway account for payment method |
|
|
125
|
-
| `cheddar_payment_token_create` | Tokenize card data (PCI-compliant) |
|
|
126
|
-
| `cheddar_payment_method_add_to_customer` | Add tokenized payment method to customer |
|
|
127
|
-
|
|
128
|
-
### Subscriptions & Plans
|
|
129
|
-
|
|
130
|
-
| Tool | Description |
|
|
131
|
-
| ----------------------------------------- | ------------------------------------ |
|
|
132
|
-
| `cheddar_subscription_get` | Retrieve subscription by ID |
|
|
133
|
-
| `cheddar_subscription_get_customer` | Get customer from subscription |
|
|
134
|
-
| `cheddar_subscription_get_plan` | Get plan from subscription |
|
|
135
|
-
| `cheddar_subscription_get_payment_method` | Get payment method from subscription |
|
|
136
|
-
| `cheddar_subscription_delete_promotion` | Remove promotion from subscription |
|
|
137
|
-
| `cheddar_plan_get` | Retrieve plan by ID or code |
|
|
138
|
-
| `cheddar_gateway_account_get` | Get gateway account details |
|
|
139
|
-
|
|
140
|
-
### Checkout Integration
|
|
141
|
-
|
|
142
|
-
| Tool | Description |
|
|
143
|
-
| -------------------------------------------- | ------------------------------------ |
|
|
144
|
-
| `cheddar_checkout_generate_hosted_url` | Generate hosted checkout page URL |
|
|
145
|
-
| `cheddar_checkout_generate_embedded_form` | Generate embedded checkout form code |
|
|
146
|
-
| `cheddar_checkout_generate_integration_code` | Generate framework-specific code |
|
|
147
|
-
| `cheddar_checkout_validate_webhook` | Validate webhook signature |
|
|
148
|
-
| `cheddar_checkout_configure_webhook` | Generate webhook handler code |
|
|
149
|
-
|
|
150
|
-
## Example Usage
|
|
151
|
-
|
|
152
|
-
### Get a Customer
|
|
153
|
-
|
|
154
|
-
```
|
|
155
|
-
Use the cheddar_customer_get tool with ID "cust_12345"
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
### Create a Payment Method Token
|
|
159
|
-
|
|
160
|
-
```
|
|
161
|
-
Use the cheddar_payment_token_create tool with:
|
|
162
|
-
- cardNumber: "4111111111111111"
|
|
163
|
-
- expirationDate: "12/25"
|
|
164
|
-
- cvv: "123"
|
|
165
|
-
- cardholderName: "John Doe"
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
### Generate React Integration
|
|
169
|
-
|
|
170
|
-
```
|
|
171
|
-
Use the cheddar_checkout_generate_integration_code tool with:
|
|
172
|
-
- framework: "react"
|
|
173
|
-
- integrationType: "embedded"
|
|
174
|
-
- features: ["card", "subscriptions"]
|
|
175
|
-
- styling: "tailwind"
|
|
176
|
-
```
|
|
177
|
-
|
|
178
82
|
## Development
|
|
179
83
|
|
|
180
84
|
```bash
|
|
181
|
-
# Clone the repository
|
|
182
|
-
git clone https://github.com/chdr/cheddar-ai-tools.git
|
|
183
|
-
cd cheddar-ai-tools/packages/cheddar-mcp
|
|
184
|
-
|
|
185
|
-
# Install dependencies
|
|
186
|
-
npm install
|
|
187
|
-
|
|
188
|
-
# Build
|
|
189
85
|
npm run build
|
|
190
|
-
|
|
191
|
-
# Run in development mode
|
|
192
|
-
npm run dev
|
|
193
|
-
|
|
194
|
-
# Test
|
|
195
86
|
npm test
|
|
196
87
|
```
|
|
197
88
|
|
|
@@ -201,6 +92,6 @@ MIT © Cheddar (chdr)
|
|
|
201
92
|
|
|
202
93
|
## Support
|
|
203
94
|
|
|
204
|
-
- Documentation: https://docs.
|
|
205
|
-
- Support: support@
|
|
95
|
+
- Documentation: https://docs.getcheddar.com
|
|
96
|
+
- Support: support@getcheddar.com
|
|
206
97
|
- Issues: https://github.com/chdr/cheddar-ai-tools/issues
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import "dotenv/config";
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,84 +1,86 @@
|
|
|
1
|
+
import "dotenv/config";
|
|
1
2
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
3
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
4
|
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
4
|
-
import {
|
|
5
|
+
import { LegacyApiError, LegacyCheddarClient } from "./lib/legacy-client.js";
|
|
5
6
|
import { customerTools, handleCustomerTool } from "./tools/customers.js";
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
clientSecret: process.env.CHEDDAR_CLIENT_SECRET || "",
|
|
14
|
-
accessToken: process.env.CHEDDAR_ACCESS_TOKEN || "",
|
|
15
|
-
};
|
|
16
|
-
// Validate required config
|
|
17
|
-
if (!config.accessToken && (!config.clientId || !config.clientSecret)) {
|
|
18
|
-
console.error("Error: CHEDDAR_ACCESS_TOKEN or both CHEDDAR_CLIENT_ID and CHEDDAR_CLIENT_SECRET must be set");
|
|
7
|
+
import { planTools, handlePlanTool } from "./tools/plans.js";
|
|
8
|
+
const baseUrl = (process.env.CHEDDAR_BASE_URL || "").replace(/\/+$/, "");
|
|
9
|
+
const productCode = process.env.CHEDDAR_PRODUCT_CODE || "";
|
|
10
|
+
const username = process.env.CHEDDAR_USERNAME || "";
|
|
11
|
+
const password = process.env.CHEDDAR_PASSWORD || process.env.CHEDDAR_PRODUCT_API_KEY || "";
|
|
12
|
+
if (!baseUrl || !productCode || !username || !password) {
|
|
13
|
+
console.error("Missing config. Set CHEDDAR_BASE_URL, CHEDDAR_PRODUCT_CODE, CHEDDAR_USERNAME, and CHEDDAR_PASSWORD or CHEDDAR_PRODUCT_API_KEY.");
|
|
19
14
|
process.exit(1);
|
|
20
15
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
...checkoutTools,
|
|
29
|
-
];
|
|
30
|
-
// Create MCP server
|
|
16
|
+
const client = new LegacyCheddarClient({
|
|
17
|
+
baseUrl,
|
|
18
|
+
productCode,
|
|
19
|
+
username,
|
|
20
|
+
password,
|
|
21
|
+
});
|
|
22
|
+
const ALL_TOOLS = [...customerTools, ...planTools];
|
|
31
23
|
const server = new Server({
|
|
32
24
|
name: "cheddar-mcp",
|
|
33
|
-
version: "0.
|
|
25
|
+
version: "2.0.0",
|
|
34
26
|
}, {
|
|
35
27
|
capabilities: {
|
|
36
28
|
tools: {},
|
|
37
29
|
},
|
|
38
30
|
});
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
|
|
31
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: ALL_TOOLS }));
|
|
32
|
+
function toolErrorMessage(error) {
|
|
33
|
+
if (error instanceof LegacyApiError) {
|
|
34
|
+
return `Cheddar API error (HTTP ${error.status}). See server logs for details.`;
|
|
35
|
+
}
|
|
36
|
+
if (error instanceof Error) {
|
|
37
|
+
return error.message;
|
|
38
|
+
}
|
|
39
|
+
return String(error);
|
|
40
|
+
}
|
|
46
41
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
47
42
|
const { name, arguments: args } = request.params;
|
|
48
43
|
try {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return await handleCustomerTool(cheddarClient, name, args);
|
|
52
|
-
}
|
|
53
|
-
if (name.startsWith("cheddar_payment_")) {
|
|
54
|
-
return await handlePaymentMethodTool(cheddarClient, name, args);
|
|
44
|
+
if (name.startsWith("cheddar_customer")) {
|
|
45
|
+
return await handleCustomerTool(client, name, args);
|
|
55
46
|
}
|
|
56
|
-
if (name.startsWith("
|
|
57
|
-
return await
|
|
58
|
-
}
|
|
59
|
-
if (name.startsWith("cheddar_checkout_")) {
|
|
60
|
-
return await handleCheckoutTool(cheddarClient, name, args);
|
|
47
|
+
if (name.startsWith("cheddar_plans_")) {
|
|
48
|
+
return await handlePlanTool(client, name, args);
|
|
61
49
|
}
|
|
62
50
|
throw new Error(`Unknown tool: ${name}`);
|
|
63
51
|
}
|
|
64
52
|
catch (error) {
|
|
65
|
-
|
|
53
|
+
if (error instanceof LegacyApiError) {
|
|
54
|
+
console.error("[cheddar-mcp] LegacyApiError body:", typeof error.body === "string" ? error.body.slice(0, 4000) : JSON.stringify(error.body).slice(0, 4000));
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
console.error("[cheddar-mcp] Tool error:", error);
|
|
58
|
+
}
|
|
66
59
|
return {
|
|
67
|
-
content: [
|
|
68
|
-
{
|
|
69
|
-
type: "text",
|
|
70
|
-
text: `Error: ${errorMessage}`,
|
|
71
|
-
},
|
|
72
|
-
],
|
|
60
|
+
content: [{ type: "text", text: `Error: ${toolErrorMessage(error)}` }],
|
|
73
61
|
isError: true,
|
|
74
62
|
};
|
|
75
63
|
}
|
|
76
64
|
});
|
|
77
|
-
// Start server
|
|
78
65
|
async function main() {
|
|
66
|
+
if (!process.env.CHEDDAR_SKIP_PREFLIGHT) {
|
|
67
|
+
try {
|
|
68
|
+
await client.ping();
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
72
|
+
console.error(`Cheddar legacy API preflight failed: ${msg}`);
|
|
73
|
+
if (err instanceof LegacyApiError) {
|
|
74
|
+
console.error("[cheddar-mcp] Preflight response body:", typeof err.body === "string"
|
|
75
|
+
? err.body.slice(0, 4000)
|
|
76
|
+
: JSON.stringify(err.body).slice(0, 4000));
|
|
77
|
+
}
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
79
81
|
const transport = new StdioServerTransport();
|
|
80
82
|
await server.connect(transport);
|
|
81
|
-
console.error("Cheddar MCP
|
|
83
|
+
console.error("Cheddar MCP (legacy HTTP Basic) running on stdio");
|
|
82
84
|
}
|
|
83
85
|
main().catch((error) => {
|
|
84
86
|
console.error("Fatal error:", error);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAEvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export interface LegacyCheddarConfig {
|
|
2
|
+
/** Product site origin, e.g. https://yoursubdomain.chargevault.com (no trailing slash) */
|
|
3
|
+
baseUrl: string;
|
|
4
|
+
productCode: string;
|
|
5
|
+
/** HTTP Basic username (authorized user email) */
|
|
6
|
+
username: string;
|
|
7
|
+
/** HTTP Basic password (user password or product API key) */
|
|
8
|
+
password: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class LegacyCheddarClient {
|
|
11
|
+
private readonly base;
|
|
12
|
+
private readonly productCode;
|
|
13
|
+
private readonly auth;
|
|
14
|
+
constructor(cfg: LegacyCheddarConfig);
|
|
15
|
+
private parseBody;
|
|
16
|
+
/**
|
|
17
|
+
* GET legacy XML (or JSON if the endpoint supports `format=json`).
|
|
18
|
+
*/
|
|
19
|
+
get(pathWithLeadingSlash: string, query?: Record<string, string>): Promise<unknown>;
|
|
20
|
+
/**
|
|
21
|
+
* POST `application/x-www-form-urlencoded` (legacy API style).
|
|
22
|
+
*/
|
|
23
|
+
postForm(pathWithLeadingSlash: string, fields: Record<string, string>): Promise<unknown>;
|
|
24
|
+
ping(): Promise<unknown>;
|
|
25
|
+
getCustomer(by: "code" | "id", value: string): Promise<unknown>;
|
|
26
|
+
searchCustomers(params: Record<string, string>): Promise<unknown>;
|
|
27
|
+
getPlans(planCode?: string): Promise<unknown>;
|
|
28
|
+
/**
|
|
29
|
+
* Flat object keys become form keys; nested objects use bracket notation (subscription[planCode]).
|
|
30
|
+
*/
|
|
31
|
+
createCustomer(fields: Record<string, unknown>): Promise<unknown>;
|
|
32
|
+
updateCustomer(customerCode: string, fields: Record<string, unknown>): Promise<unknown>;
|
|
33
|
+
}
|
|
34
|
+
export declare class LegacyApiError extends Error {
|
|
35
|
+
readonly status: number;
|
|
36
|
+
readonly body: unknown;
|
|
37
|
+
constructor(status: number, body: unknown);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Flattens `{ firstName: "a", subscription: { planCode: "FREE" } }` into
|
|
41
|
+
* `firstName`, `subscription[planCode]` for legacy form posts.
|
|
42
|
+
*/
|
|
43
|
+
export declare function flattenFormFields(obj: Record<string, unknown>, prefix?: string): Record<string, string>;
|
|
44
|
+
//# sourceMappingURL=legacy-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-client.d.ts","sourceRoot":"","sources":["../../src/lib/legacy-client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,0FAA0F;IAC1F,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAgBD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;gBAElB,GAAG,EAAE,mBAAmB;YAMtB,SAAS;IAiBvB;;OAEG;IACG,GAAG,CAAC,oBAAoB,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBzF;;OAEG;IACG,QAAQ,CAAC,oBAAoB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBxF,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAIxB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/D,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAOjE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASnD;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAKjE,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;CAO9F;AAED,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;gBAEX,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO;CAM1C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,MAAM,SAAK,GACV,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkBxB"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { XMLParser } from "fast-xml-parser";
|
|
2
|
+
function trimSlash(s) {
|
|
3
|
+
return s.replace(/\/+$/, "");
|
|
4
|
+
}
|
|
5
|
+
function basicAuthHeader(username, password) {
|
|
6
|
+
const token = Buffer.from(`${username}:${password}`, "utf8").toString("base64");
|
|
7
|
+
return `Basic ${token}`;
|
|
8
|
+
}
|
|
9
|
+
const xmlParser = new XMLParser({
|
|
10
|
+
ignoreAttributes: false,
|
|
11
|
+
attributeNamePrefix: "@_",
|
|
12
|
+
});
|
|
13
|
+
export class LegacyCheddarClient {
|
|
14
|
+
base;
|
|
15
|
+
productCode;
|
|
16
|
+
auth;
|
|
17
|
+
constructor(cfg) {
|
|
18
|
+
this.base = trimSlash(cfg.baseUrl);
|
|
19
|
+
this.productCode = encodeURIComponent(cfg.productCode);
|
|
20
|
+
this.auth = basicAuthHeader(cfg.username, cfg.password);
|
|
21
|
+
}
|
|
22
|
+
async parseBody(res) {
|
|
23
|
+
const text = await res.text();
|
|
24
|
+
const ct = res.headers.get("content-type") || "";
|
|
25
|
+
if (ct.includes("json") || (text.startsWith("{") && text.endsWith("}"))) {
|
|
26
|
+
try {
|
|
27
|
+
return JSON.parse(text);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
/* fall through */
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
return xmlParser.parse(text);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return { _raw: text };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* GET legacy XML (or JSON if the endpoint supports `format=json`).
|
|
42
|
+
*/
|
|
43
|
+
async get(pathWithLeadingSlash, query) {
|
|
44
|
+
const q = new URLSearchParams(query);
|
|
45
|
+
const qs = q.toString();
|
|
46
|
+
const url = `${this.base}${pathWithLeadingSlash}${qs ? `?${qs}` : ""}`;
|
|
47
|
+
const res = await fetch(url, {
|
|
48
|
+
method: "GET",
|
|
49
|
+
headers: {
|
|
50
|
+
Authorization: this.auth,
|
|
51
|
+
Accept: "application/xml, application/json;q=0.9, text/xml;q=0.8, */*;q=0.1",
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
const body = await this.parseBody(res);
|
|
55
|
+
if (!res.ok) {
|
|
56
|
+
throw new LegacyApiError(res.status, body);
|
|
57
|
+
}
|
|
58
|
+
return body;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* POST `application/x-www-form-urlencoded` (legacy API style).
|
|
62
|
+
*/
|
|
63
|
+
async postForm(pathWithLeadingSlash, fields) {
|
|
64
|
+
const url = `${this.base}${pathWithLeadingSlash}`;
|
|
65
|
+
const body = new URLSearchParams(fields);
|
|
66
|
+
const res = await fetch(url, {
|
|
67
|
+
method: "POST",
|
|
68
|
+
headers: {
|
|
69
|
+
Authorization: this.auth,
|
|
70
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
71
|
+
Accept: "application/xml, application/json;q=0.9, text/xml;q=0.8, */*;q=0.1",
|
|
72
|
+
},
|
|
73
|
+
body,
|
|
74
|
+
});
|
|
75
|
+
const parsed = await this.parseBody(res);
|
|
76
|
+
if (!res.ok) {
|
|
77
|
+
throw new LegacyApiError(res.status, parsed);
|
|
78
|
+
}
|
|
79
|
+
return parsed;
|
|
80
|
+
}
|
|
81
|
+
async ping() {
|
|
82
|
+
return this.get(`/xml/plans/get/productCode/${this.productCode}`);
|
|
83
|
+
}
|
|
84
|
+
async getCustomer(by, value) {
|
|
85
|
+
const v = encodeURIComponent(value);
|
|
86
|
+
return this.get(`/xml/customers/get/productCode/${this.productCode}/${by}/${v}`);
|
|
87
|
+
}
|
|
88
|
+
async searchCustomers(params) {
|
|
89
|
+
return this.get(`/xml/customers/search/productCode/${this.productCode}`, {
|
|
90
|
+
...params,
|
|
91
|
+
format: "json",
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
async getPlans(planCode) {
|
|
95
|
+
if (planCode) {
|
|
96
|
+
return this.get(`/xml/plans/get/productCode/${this.productCode}/code/${encodeURIComponent(planCode)}`);
|
|
97
|
+
}
|
|
98
|
+
return this.get(`/xml/plans/get/productCode/${this.productCode}`);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Flat object keys become form keys; nested objects use bracket notation (subscription[planCode]).
|
|
102
|
+
*/
|
|
103
|
+
async createCustomer(fields) {
|
|
104
|
+
const flat = flattenFormFields(fields);
|
|
105
|
+
return this.postForm(`/xml/customers/new/productCode/${this.productCode}`, flat);
|
|
106
|
+
}
|
|
107
|
+
async updateCustomer(customerCode, fields) {
|
|
108
|
+
const flat = flattenFormFields(fields);
|
|
109
|
+
return this.postForm(`/xml/customers/edit/productCode/${this.productCode}/code/${encodeURIComponent(customerCode)}`, flat);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
export class LegacyApiError extends Error {
|
|
113
|
+
status;
|
|
114
|
+
body;
|
|
115
|
+
constructor(status, body) {
|
|
116
|
+
super(`Cheddar legacy API request failed (HTTP ${status}).`);
|
|
117
|
+
this.name = "LegacyApiError";
|
|
118
|
+
this.status = status;
|
|
119
|
+
this.body = body;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Flattens `{ firstName: "a", subscription: { planCode: "FREE" } }` into
|
|
124
|
+
* `firstName`, `subscription[planCode]` for legacy form posts.
|
|
125
|
+
*/
|
|
126
|
+
export function flattenFormFields(obj, prefix = "") {
|
|
127
|
+
const out = {};
|
|
128
|
+
for (const [k, val] of Object.entries(obj)) {
|
|
129
|
+
if (val === undefined || val === null)
|
|
130
|
+
continue;
|
|
131
|
+
const key = prefix ? `${prefix}[${k}]` : k;
|
|
132
|
+
if (typeof val === "object" && !Array.isArray(val)) {
|
|
133
|
+
Object.assign(out, flattenFormFields(val, key));
|
|
134
|
+
}
|
|
135
|
+
else if (Array.isArray(val)) {
|
|
136
|
+
val.forEach((item, i) => {
|
|
137
|
+
out[`${key}[${i}]`] = String(item);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
else if (typeof val === "boolean") {
|
|
141
|
+
out[key] = val ? "1" : "0";
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
out[key] = String(val);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return out;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=legacy-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-client.js","sourceRoot":"","sources":["../../src/lib/legacy-client.ts"],"names":[],"mappings":"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"}
|