fastr-mcp-suite 1.1.0 → 1.2.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/dist/skills/fastr-mcp-suite/SKILL.md +273 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "fastr-mcp-suite"
|
|
3
|
+
description: "Install, connect, and operate the Fastr MCP Suite server (fastr-dev-suite) — free, MIT-licensed FluentCart and Lemon Squeezy tools over MCP. Use this skill when wiring the server into Claude Code, Claude Desktop, Cursor, Windsurf, Cline, Zed, or a hosted HTTP client; when deciding which fc_, ls_, or suite_ tool answers a question; or when a tool call fails."
|
|
4
|
+
summary: "Setup and tool guide for the Fastr MCP Suite: install commands for every MCP client, all ten tools and their arguments, and fixes for the failures people actually hit. Every tool is free."
|
|
5
|
+
version: "2.0.0"
|
|
6
|
+
license: "MIT"
|
|
7
|
+
tags:
|
|
8
|
+
- mcp
|
|
9
|
+
- model-context-protocol
|
|
10
|
+
- fluentcart
|
|
11
|
+
- lemonsqueezy
|
|
12
|
+
- developer-tools
|
|
13
|
+
keywords:
|
|
14
|
+
- mcp server
|
|
15
|
+
- fastr-mcp-suite
|
|
16
|
+
- fastr-dev-suite
|
|
17
|
+
- claude code mcp
|
|
18
|
+
- fluentcart tools
|
|
19
|
+
- lemon squeezy tools
|
|
20
|
+
use_cases:
|
|
21
|
+
- Connecting the Fastr MCP Suite to an MCP client
|
|
22
|
+
- Choosing the right fc_ or ls_ tool for a question
|
|
23
|
+
- Running the suite locally, over stdio, or as a hosted HTTP service
|
|
24
|
+
- Diagnosing a failing tool call
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
# Fastr MCP Suite — Setup & Tool Guide
|
|
28
|
+
|
|
29
|
+
The MCP server turns the two knowledge-base skills into **callable tools**, so an agent fetches the one hook, table, or schema it needs instead of loading 239 KB of markdown into context.
|
|
30
|
+
|
|
31
|
+
- **Server name reported to clients:** `fastr-dev-suite`
|
|
32
|
+
- **npm package:** `fastr-mcp-suite` (bin: `fastr-mcp`)
|
|
33
|
+
- **Runtime:** Node.js **22 or newer**
|
|
34
|
+
- **Transports:** `stdio` (local clients), Streamable HTTP (hosted / marketplace)
|
|
35
|
+
- **Tools:** 10 total — all free, all registered for every caller
|
|
36
|
+
- **Licence:** MIT. No key, no account, no quota.
|
|
37
|
+
|
|
38
|
+
> This is a knowledge and verification server. It does not connect to a WordPress database and does not modify a FluentCart store. The one tool that reaches the network is `ls_validate_license`, which calls the Lemon Squeezy licensing API.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 1. Install
|
|
43
|
+
|
|
44
|
+
Pick exactly one path. Do not mix a global install with an `npx` config.
|
|
45
|
+
|
|
46
|
+
### Claude Code (CLI)
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
claude mcp add fastr-suite -- npx -y fastr-mcp-suite
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Claude Desktop, Cursor, Windsurf, Cline, Zed
|
|
53
|
+
|
|
54
|
+
Add to the client's MCP config file (`claude_desktop_config.json`, `.cursor/mcp.json`, `mcp_config.json`, …):
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"mcpServers": {
|
|
59
|
+
"fastr-suite": {
|
|
60
|
+
"command": "npx",
|
|
61
|
+
"args": ["-y", "fastr-mcp-suite"]
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
On Windows, if `npx` is not on the client's PATH, use `"command": "cmd"` with `"args": ["/c", "npx", "-y", "fastr-mcp-suite"]`.
|
|
68
|
+
|
|
69
|
+
### From a source checkout
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
cd server
|
|
73
|
+
npm ci
|
|
74
|
+
npm run build # tsc + bundles both card skill folders into dist/skills
|
|
75
|
+
npm run verify # boots the built server; all checks must pass
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
```json
|
|
79
|
+
{
|
|
80
|
+
"mcpServers": {
|
|
81
|
+
"fastr-suite": {
|
|
82
|
+
"command": "node",
|
|
83
|
+
"args": ["/absolute/path/to/server/dist/index.js"]
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Hosted (Streamable HTTP)
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
cd server && npm run build && node dist/http.js # http://0.0.0.0:8080/mcp
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
- `POST /mcp` — MCP endpoint (Streamable HTTP)
|
|
96
|
+
- `GET /health` — liveness probe
|
|
97
|
+
- `PORT` — override the default `8080`
|
|
98
|
+
|
|
99
|
+
No `Authorization` header is required. A gateway in front of the server may authenticate callers for its own purposes, but the server ignores that credential and registers the same ten tools either way.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 2. Confirm the connection before doing real work
|
|
104
|
+
|
|
105
|
+
1. List the tools the client sees. Expect **10**.
|
|
106
|
+
2. Call `suite_get_info` with `{}`. It reports the transport, the tools per card, and the licence.
|
|
107
|
+
3. Call one cheap read tool, e.g. `fc_search_hooks` with `{"query": "order_created"}`.
|
|
108
|
+
|
|
109
|
+
If any of those three fail, fix the connection first — no amount of prompt wording repairs a misconfigured server.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 3. Tool routing
|
|
114
|
+
|
|
115
|
+
| The user asks about | Call |
|
|
116
|
+
| --- | --- |
|
|
117
|
+
| A FluentCart hook name, when it fires, its arguments | `fc_search_hooks` |
|
|
118
|
+
| A `wp_fct_*` table, its columns, the Eloquent model | `fc_get_db_schema` |
|
|
119
|
+
| A FluentCart REST endpoint, model columns, gateway guide, module notes — anything past the four lookups above | `fc_get_reference` |
|
|
120
|
+
| Lemon Squeezy webhook signatures, checkout payloads, subscription states, license endpoints | `ls_search_docs` |
|
|
121
|
+
| The exact JSON:API body for a Lemon Squeezy endpoint | `ls_get_schema` |
|
|
122
|
+
| A Lemon Squeezy guide read in full or by section | `ls_get_reference` |
|
|
123
|
+
| What this server contains and how it is licensed | `suite_get_info` |
|
|
124
|
+
| Generating a full FluentCart gateway class | `fc_generate_payment_gateway_boilerplate` |
|
|
125
|
+
| Checking an HMAC signature against a raw payload | `ls_verify_webhook` |
|
|
126
|
+
| Validating a customer's license key live | `ls_validate_license` |
|
|
127
|
+
|
|
128
|
+
If a tool is not registered, the server is running an old build — reinstall (see §6). Do **not** substitute a hand-written answer and present it as verified.
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## 4. Tools
|
|
133
|
+
|
|
134
|
+
### `fc_search_hooks`
|
|
135
|
+
|
|
136
|
+
```json
|
|
137
|
+
{ "query": "checkout_validate" }
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Searches all action and filter hook references. `query` is a case-insensitive substring matched against hook names and their surrounding lines.
|
|
141
|
+
|
|
142
|
+
Returns up to six matches, each as a headed block with a fenced PHP snippet. Use the exact hook name from the result — FluentCart matches hook names literally, including the `fluent_cart/` prefix.
|
|
143
|
+
|
|
144
|
+
### `fc_get_db_schema`
|
|
145
|
+
|
|
146
|
+
```json
|
|
147
|
+
{ "table": "orders" }
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Returns the schema section for one table: columns, types, keys, and the matching Eloquent model.
|
|
151
|
+
|
|
152
|
+
Well-known tables: `orders`, `customers`, `subscriptions`, `order_items`, `licenses`, `coupons`. An unknown name returns a "not found" message listing those six — re-run with one of them rather than guessing a `wp_fct_` prefix variant.
|
|
153
|
+
|
|
154
|
+
### `fc_get_reference`
|
|
155
|
+
|
|
156
|
+
```json
|
|
157
|
+
{ "file": "rest-api-subscriptions.md", "section": "Void Renewal Invoice" }
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Opens any file under `skills/fluentcart-developer/references/`. Omit **both** arguments to list all 49 files with their size and title; pass `file` alone to read the whole document (capped at 14,000 characters — a truncation note says so); add `section` to pull a single `##`/`###` heading instead.
|
|
161
|
+
|
|
162
|
+
Use it for everything `fc_search_hooks` and `fc_get_db_schema` do not answer: REST endpoints (`rest-api-*.md`), every model's columns (`models-complete-index.md`), the deprecated hook tables (`hooks-complete-index.md`), payment gateways, modules, fees, engineering notes.
|
|
163
|
+
|
|
164
|
+
An unknown file name that matches one real file loosely is resolved for you; anything ambiguous returns the candidate list rather than a guess. Path traversal is rejected, so pass a plain file name.
|
|
165
|
+
|
|
166
|
+
### `fc_generate_payment_gateway_boilerplate`
|
|
167
|
+
|
|
168
|
+
```json
|
|
169
|
+
{
|
|
170
|
+
"gatewaySlug": "quickpay",
|
|
171
|
+
"gatewayTitle": "QuickPay",
|
|
172
|
+
"supportsSubscriptions": false
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
`gatewaySlug` must be lowercase with underscores. Returns a complete PHP gateway: the `fluent_cart/payment_methods` registration, the gateway class, the settings schema, and the webhook listener. It is a starting point — the remote API calls, credentials, and status mapping still need the gateway's own documentation.
|
|
177
|
+
|
|
178
|
+
### `ls_search_docs`
|
|
179
|
+
|
|
180
|
+
```json
|
|
181
|
+
{ "query": "webhook signature", "category": "webhooks" }
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
`category` is one of `webhooks`, `checkouts`, `subscriptions`, `licensing`, `all` (default `all`). Restricting the category is faster and returns tighter snippets.
|
|
185
|
+
|
|
186
|
+
Reach for this first for "how does X work"; reach for `ls_get_schema` when the user needs the exact request body.
|
|
187
|
+
|
|
188
|
+
### `ls_get_schema`
|
|
189
|
+
|
|
190
|
+
```json
|
|
191
|
+
{ "endpoint": "checkouts" }
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
`endpoint` must be one of: `checkouts`, `orders`, `subscriptions`, `license-keys`, `customers`, `products`, `variants`, `webhooks`.
|
|
195
|
+
|
|
196
|
+
Returns the endpoint path, the JSON:API content type, and a payload skeleton with the required relationships. Use it verbatim; Lemon Squeezy rejects bodies with the wrong `type` or a missing `relationships` block.
|
|
197
|
+
|
|
198
|
+
### `ls_get_reference`
|
|
199
|
+
|
|
200
|
+
```json
|
|
201
|
+
{ "file": "webhooks-and-security.md", "section": "Webhook Event Catalog" }
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Same contract as `fc_get_reference`, over the 7 Lemon Squeezy reference files: `developer-guide.md`, `api-reference.md`, `checkouts-and-orders.md`, `subscriptions-lifecycle.md`, `license-keys-and-activation.md`, `webhooks-and-security.md`, `go-live-guide.md`.
|
|
205
|
+
|
|
206
|
+
Omit both arguments to list them; pass `file` for the whole document; add `section` for one heading. Reach for it when `ls_search_docs` returns a snippet that stops short of what the user needs.
|
|
207
|
+
|
|
208
|
+
### `ls_verify_webhook`
|
|
209
|
+
|
|
210
|
+
```json
|
|
211
|
+
{
|
|
212
|
+
"rawBody": "{\"meta\":{\"event_name\":\"order_created\"}}",
|
|
213
|
+
"signatureHeader": "hex-signature-from-x-signature",
|
|
214
|
+
"signingSecret": "your-webhook-signing-secret"
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
Compares an HMAC-SHA256 digest against the header in constant time. `rawBody` must be the **unparsed** request body — a re-serialized object will fail even when the signature is genuine. The secret belongs in an environment variable; never paste it into a conversation that will be stored.
|
|
219
|
+
|
|
220
|
+
### `ls_validate_license`
|
|
221
|
+
|
|
222
|
+
```json
|
|
223
|
+
{ "licenseKey": "XXXX-XXXX-XXXX-XXXX", "instanceId": "optional-instance-id" }
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Calls `https://api.lemonsqueezy.com/v1/licenses/validate` and returns the raw response, including `valid`, `license_key.status`, `meta.product_id`, and `meta.store_id`. Omit `instanceId` to check the key itself; include it to check one activated machine or domain.
|
|
227
|
+
|
|
228
|
+
Results are cached for 60 seconds and bounded to 32 concurrent calls, so repeated checks during one investigation are cheap.
|
|
229
|
+
|
|
230
|
+
### `suite_get_info`
|
|
231
|
+
|
|
232
|
+
```json
|
|
233
|
+
{ "card": "all" }
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
`card` is `all` (default), `fluentcart`, or `lemonsqueezy`. Read-only. Reports the transport this call arrived on, the tool list per card, the licence (MIT), and the price (`free`).
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## 5. Free means free
|
|
241
|
+
|
|
242
|
+
There is no tier, no licence key, no purchase, and no request cap. Every tool above is registered for every client on both transports, including the three that used to sit behind a key (`fc_generate_payment_gateway_boilerplate`, `ls_verify_webhook`, `ls_validate_license`).
|
|
243
|
+
|
|
244
|
+
If a config still carries `PRO_LICENSE_KEY` or `PRO_CARDS` from an older install, delete them — they are ignored, and leaving them behind makes the next reader think a gate exists.
|
|
245
|
+
|
|
246
|
+
The server and these skills are MIT. Fork the repo, run your own copy, and open a pull request for anything you want upstream.
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## 6. Troubleshooting
|
|
251
|
+
|
|
252
|
+
| Symptom | Cause | Fix |
|
|
253
|
+
| --- | --- | --- |
|
|
254
|
+
| A tool is "not found" | An older build predates it, or the client cached an old tool list | Reinstall (`npx -y fastr-mcp-suite`) and restart the client so it re-runs `tools/list` |
|
|
255
|
+
| Client sees zero tools | Wrong command or working directory in the config | Run the exact command from the config in a terminal first |
|
|
256
|
+
| `fc_get_db_schema` says "not found" | Unknown table name | Re-run with `orders`, `customers`, `subscriptions`, `order_items`, `licenses`, or `coupons` |
|
|
257
|
+
| `fc_get_reference` returns a candidate list | The file name matched more than one file | Re-run with one of the names it printed |
|
|
258
|
+
| Reference text looks truncated | The whole-document read is capped at 14,000 characters | Re-run with `section` to pull one heading |
|
|
259
|
+
| `license validation unavailable` | Lemon Squeezy API unreachable or timed out (5 s) | Retry; nothing else in the suite depends on it |
|
|
260
|
+
| `Lemon Squeezy validation concurrency limit reached` | More than 32 validations in flight | Retry in a moment |
|
|
261
|
+
| Server exits immediately under `npx` on Windows | Piped stdin is not a real MCP client session; `npx` swallows stdio | Not a server bug — test through an actual client, or install into a temp dir and spawn `node node_modules/fastr-mcp-suite/dist/index.js` |
|
|
262
|
+
| `Cannot find module` after a global install | Node older than 22, or a stale global cache | `node -v`, then `npm cache clean --force` and reinstall |
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## 7. Rules for the agent
|
|
267
|
+
|
|
268
|
+
1. **Search before answering.** For any FluentCart hook or table, or any Lemon Squeezy endpoint, call the tool first. A remembered answer is not evidence.
|
|
269
|
+
2. **One tool, one question.** Pass a short query, read the snippet, then call again with a tighter term if the result missed.
|
|
270
|
+
3. **Quote hook names and payload skeletons verbatim** from tool output. Do not reformat them.
|
|
271
|
+
4. **Report tool errors as they are.** If a tool returns `isError`, surface the message and the fix — do not paper over it with a guess.
|
|
272
|
+
5. **Keep secrets out of transcripts.** Webhook signing secrets and customer licence keys go in environment variables, not in tool arguments that a chat log will persist.
|
|
273
|
+
6. **Never invent a tool that is missing.** If the client does not list a tool the user asked for, say the installed build is out of date and give the reinstall command.
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fastr-mcp-suite",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "MCP server for FluentCart and Lemon Squeezy developer knowledge: documentation search, schema lookup, webhook signature verification and licence validation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|