auxiliar-mcp 0.6.2 → 0.6.4
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 +1 -1
- package/dist/data/pricing.js +7 -7
- package/dist/data/recommendations.js +10 -10
- package/dist/data/risks.js +7 -7
- package/dist/server.js +2 -2
- package/dist/tools/analytics.d.ts +1 -0
- package/dist/tools/analytics.js +6 -0
- package/dist/tools/pricing.js +20 -5
- package/dist/tools/setup.d.ts +1 -0
- package/dist/tools/setup.js +27 -5
- package/package.json +6 -3
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ MCP server that keeps your AI agent's infrastructure knowledge current.
|
|
|
4
4
|
|
|
5
5
|
Your agent still thinks SendGrid has a free tier. It doesn't (removed March 2025). It recommends Auth.js — which is in maintenance mode. It quotes Neon at $19/month — pricing is now usage-based from $0.
|
|
6
6
|
|
|
7
|
-
**auxiliar-mcp** gives your agent current, Chrome-verified data about
|
|
7
|
+
**auxiliar-mcp** gives your agent current, Chrome-verified data about 74 cloud services across 16 categories.
|
|
8
8
|
|
|
9
9
|
## Install
|
|
10
10
|
|
package/dist/data/pricing.js
CHANGED
|
@@ -15,7 +15,7 @@ export const pricing = {
|
|
|
15
15
|
"Dedicated IP add-on: $30/month (Scale plan only, requires 500+ emails/day)",
|
|
16
16
|
"Overage on Pro/Scale: $0.90 per 1,000 extra emails",
|
|
17
17
|
],
|
|
18
|
-
verified_date: "2026-03-
|
|
18
|
+
verified_date: "2026-03-30",
|
|
19
19
|
source: "Chrome-verified from resend.com/pricing",
|
|
20
20
|
},
|
|
21
21
|
"postmark": {
|
|
@@ -111,7 +111,7 @@ export const pricing = {
|
|
|
111
111
|
"Clerk Billing add-on: 0.7% of billing volume (on top of Stripe's 2.9%+$0.30)",
|
|
112
112
|
"SOC 2 report access requires Business tier ($250/month minimum)",
|
|
113
113
|
],
|
|
114
|
-
verified_date: "2026-03-
|
|
114
|
+
verified_date: "2026-03-30",
|
|
115
115
|
source: "Chrome-verified from clerk.com/pricing",
|
|
116
116
|
},
|
|
117
117
|
"auth0": {
|
|
@@ -215,7 +215,7 @@ export const pricing = {
|
|
|
215
215
|
"Advanced MFA (Phone): $75/month first project, $10/month additional",
|
|
216
216
|
"Custom domain: $10/month per project",
|
|
217
217
|
],
|
|
218
|
-
verified_date: "2026-03-
|
|
218
|
+
verified_date: "2026-03-30",
|
|
219
219
|
source: "Chrome-verified from supabase.com/pricing",
|
|
220
220
|
},
|
|
221
221
|
"neon": {
|
|
@@ -232,7 +232,7 @@ export const pricing = {
|
|
|
232
232
|
"History/restore storage billed separately at $0.20/GB-month",
|
|
233
233
|
"Extra branches beyond plan limit: $1.50/branch-month",
|
|
234
234
|
],
|
|
235
|
-
verified_date: "2026-03-
|
|
235
|
+
verified_date: "2026-03-30",
|
|
236
236
|
source: "Chrome-verified from neon.tech/pricing",
|
|
237
237
|
},
|
|
238
238
|
"planetscale": {
|
|
@@ -267,7 +267,7 @@ export const pricing = {
|
|
|
267
267
|
"Storage overage: $0.75/GB (Developer) down to $0.45/GB (Pro)",
|
|
268
268
|
"Active database overage: $0.20/DB (Developer) down to $0.025/DB (Pro)",
|
|
269
269
|
],
|
|
270
|
-
verified_date: "2026-03-
|
|
270
|
+
verified_date: "2026-03-30",
|
|
271
271
|
source: "Chrome-verified from turso.tech/pricing",
|
|
272
272
|
},
|
|
273
273
|
"aws-rds": {
|
|
@@ -380,7 +380,7 @@ export const pricing = {
|
|
|
380
380
|
"Web Analytics: $1 per 1,000 Deep Analysis checks",
|
|
381
381
|
"Firewall: starting at $0.50 per 1M allowed requests",
|
|
382
382
|
],
|
|
383
|
-
verified_date: "2026-03-
|
|
383
|
+
verified_date: "2026-03-30",
|
|
384
384
|
source: "Chrome-verified from vercel.com/pricing",
|
|
385
385
|
},
|
|
386
386
|
"fly": {
|
|
@@ -420,7 +420,7 @@ export const pricing = {
|
|
|
420
420
|
"Connect (marketplace): 0.25% + $0.25 per active account/month",
|
|
421
421
|
"Stablecoin payments: 1.5%",
|
|
422
422
|
],
|
|
423
|
-
verified_date: "2026-03-
|
|
423
|
+
verified_date: "2026-03-30",
|
|
424
424
|
source: "Chrome-verified from stripe.com/pricing",
|
|
425
425
|
},
|
|
426
426
|
"lemon-squeezy": {
|
|
@@ -7,7 +7,7 @@ export const recommendations = {
|
|
|
7
7
|
choose_if: "Usage-based serverless Postgres with branching, connection pooling, HA, and auth built in. Best for variable workloads.",
|
|
8
8
|
avoid_if: "You want predictable fixed monthly pricing — usage-based can be unpredictable.",
|
|
9
9
|
pricing_model: "usage-based",
|
|
10
|
-
free_tier: "0.5 GB per project, 100 CU-hrs/month, 100 projects",
|
|
10
|
+
free_tier: "0.5 GB per project, 100 CU-hrs/month per project, 100 projects, unlimited team members",
|
|
11
11
|
paid_starts_at: "~$15/mo typical (Launch tier)",
|
|
12
12
|
risks: ["350ms cold starts on free tier", "Usage-based pricing can surprise", "Acquired by Databricks — direction may shift"],
|
|
13
13
|
provision_command: "npx neonctl projects create --name my-project",
|
|
@@ -32,7 +32,7 @@ export const recommendations = {
|
|
|
32
32
|
key_features: ["Postgres", "branching", "connection pooling", "auto-scaling", "read replicas", "point-in-time restore", "Neon Auth"],
|
|
33
33
|
best_for_frameworks: ["nextjs", "sveltekit", "express", "remix", "fastapi", "django", "flask"],
|
|
34
34
|
default_score: 8,
|
|
35
|
-
last_reviewed: "2026-03-
|
|
35
|
+
last_reviewed: "2026-03-30",
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
38
|
slug: "supabase",
|
|
@@ -65,7 +65,7 @@ export const recommendations = {
|
|
|
65
65
|
key_features: ["Postgres", "auth", "storage", "realtime", "edge functions", "Row Level Security", "vector/embeddings"],
|
|
66
66
|
best_for_frameworks: ["nextjs", "sveltekit", "react", "flutter", "fastapi"],
|
|
67
67
|
default_score: 7,
|
|
68
|
-
last_reviewed: "2026-03-
|
|
68
|
+
last_reviewed: "2026-03-30",
|
|
69
69
|
},
|
|
70
70
|
{
|
|
71
71
|
slug: "turso",
|
|
@@ -96,7 +96,7 @@ export const recommendations = {
|
|
|
96
96
|
key_features: ["SQLite/libSQL", "embedded replicas", "zero cold starts", "multi-region", "branching"],
|
|
97
97
|
best_for_frameworks: ["sveltekit", "remix", "astro", "hono"],
|
|
98
98
|
default_score: 6,
|
|
99
|
-
last_reviewed: "2026-03-
|
|
99
|
+
last_reviewed: "2026-03-30",
|
|
100
100
|
},
|
|
101
101
|
{
|
|
102
102
|
slug: "render-postgres",
|
|
@@ -281,7 +281,7 @@ export const recommendations = {
|
|
|
281
281
|
key_features: ["REST API", "SMTP", "React Email", "webhooks", "inbound email", "batch sending", "templates"],
|
|
282
282
|
best_for_frameworks: ["nextjs", "express", "sveltekit", "remix", "fastapi", "django"],
|
|
283
283
|
default_score: 8,
|
|
284
|
-
last_reviewed: "2026-03-
|
|
284
|
+
last_reviewed: "2026-03-30",
|
|
285
285
|
},
|
|
286
286
|
{
|
|
287
287
|
slug: "postmark",
|
|
@@ -464,7 +464,7 @@ export const recommendations = {
|
|
|
464
464
|
choose_if: "Auth in 10 minutes with polished pre-built UI. 50K MRU free. Best for React/Next.js.",
|
|
465
465
|
avoid_if: "Cost-sensitive at scale (100K+ MRU), need EU data residency, or can't accept vendor lock-in.",
|
|
466
466
|
pricing_model: "per-user",
|
|
467
|
-
free_tier: "50,000 MRU",
|
|
467
|
+
free_tier: "50,000 MRU limit per app, 3 dashboard seats, up to 3 social connections",
|
|
468
468
|
paid_starts_at: "$25/mo + $0.02/MRU (Pro)",
|
|
469
469
|
risks: ["US-only data storage (no EU residency)", "$1,025/mo at 100K MRU", "Vendor lock-in"],
|
|
470
470
|
provision_command: "npm install @clerk/nextjs",
|
|
@@ -481,10 +481,10 @@ export const recommendations = {
|
|
|
481
481
|
edge_compatible: true,
|
|
482
482
|
migration_difficulty: "high",
|
|
483
483
|
migration_note: "User data on Clerk's servers. Password hashes may not be exportable. Full auth rewrite needed.",
|
|
484
|
-
key_features: ["pre-built UI", "social OAuth", "MFA", "passkeys", "organizations", "SAML SSO", "webhooks", "user impersonation"],
|
|
484
|
+
key_features: ["pre-built UI", "social OAuth", "MFA", "passkeys", "organizations", "SAML SSO", "webhooks", "user impersonation", "Clerk Billing (0.7% of billing volume)"],
|
|
485
485
|
best_for_frameworks: ["nextjs", "react", "remix", "express"],
|
|
486
486
|
default_score: 7,
|
|
487
|
-
last_reviewed: "2026-03-
|
|
487
|
+
last_reviewed: "2026-03-30",
|
|
488
488
|
},
|
|
489
489
|
{
|
|
490
490
|
slug: "auth0",
|
|
@@ -640,7 +640,7 @@ export const recommendations = {
|
|
|
640
640
|
key_features: ["preview deploys", "edge functions", "Fluid compute", "image optimization", "ISR", "analytics", "KV/blob storage"],
|
|
641
641
|
best_for_frameworks: ["nextjs", "sveltekit", "remix", "astro"],
|
|
642
642
|
default_score: 7,
|
|
643
|
-
last_reviewed: "2026-03-
|
|
643
|
+
last_reviewed: "2026-03-30",
|
|
644
644
|
},
|
|
645
645
|
{
|
|
646
646
|
slug: "railway",
|
|
@@ -764,7 +764,7 @@ export const recommendations = {
|
|
|
764
764
|
key_features: ["card payments", "subscriptions", "invoicing", "Checkout", "Connect (marketplace)", "Tax", "Radar (fraud)", "Terminal"],
|
|
765
765
|
best_for_frameworks: ["nextjs", "express", "sveltekit", "rails", "django", "fastapi", "flask"],
|
|
766
766
|
default_score: 9,
|
|
767
|
-
last_reviewed: "2026-03-
|
|
767
|
+
last_reviewed: "2026-03-30",
|
|
768
768
|
},
|
|
769
769
|
{
|
|
770
770
|
slug: "lemon-squeezy",
|
package/dist/data/risks.js
CHANGED
|
@@ -76,7 +76,7 @@ export const risks = {
|
|
|
76
76
|
{ severity: "LOW", title: "Bundle size", detail: "Clerk's React SDK adds ~50KB to your client bundle. Acceptable for most apps, but worth noting for performance-sensitive projects." },
|
|
77
77
|
],
|
|
78
78
|
recent_changes: [],
|
|
79
|
-
verified_date: "2026-03-
|
|
79
|
+
verified_date: "2026-03-30",
|
|
80
80
|
},
|
|
81
81
|
"firebase-auth": {
|
|
82
82
|
provider: "Firebase Auth",
|
|
@@ -138,7 +138,7 @@ export const risks = {
|
|
|
138
138
|
{ severity: "LOW", title: "Branching is powerful but unfamiliar", detail: "Neon's database branching (like git branches for your database) is innovative but requires learning new workflows. Not all ORMs and migration tools handle it smoothly." },
|
|
139
139
|
],
|
|
140
140
|
recent_changes: [],
|
|
141
|
-
verified_date: "2026-03-
|
|
141
|
+
verified_date: "2026-03-30",
|
|
142
142
|
},
|
|
143
143
|
"paddle": {
|
|
144
144
|
provider: "Paddle",
|
|
@@ -232,7 +232,7 @@ export const risks = {
|
|
|
232
232
|
{ severity: "LOW", title: "React Email requires JSX", detail: "The React Email template system is excellent but requires a JSX build step. If you're not using React, use plain HTML templates instead." },
|
|
233
233
|
],
|
|
234
234
|
recent_changes: [],
|
|
235
|
-
verified_date: "2026-03-
|
|
235
|
+
verified_date: "2026-03-30",
|
|
236
236
|
},
|
|
237
237
|
"revenuecat": {
|
|
238
238
|
provider: "RevenueCat",
|
|
@@ -264,7 +264,7 @@ export const risks = {
|
|
|
264
264
|
{ severity: "LOW", title: "Payout delays for new accounts", detail: "New accounts start with 2-7 day rolling payouts. This improves over time but can cause cash flow issues early on." },
|
|
265
265
|
],
|
|
266
266
|
recent_changes: [],
|
|
267
|
-
verified_date: "2026-03-
|
|
267
|
+
verified_date: "2026-03-30",
|
|
268
268
|
},
|
|
269
269
|
"supabase-auth": {
|
|
270
270
|
provider: "Supabase Auth",
|
|
@@ -287,7 +287,7 @@ export const risks = {
|
|
|
287
287
|
{ severity: "LOW", title: "Vendor lock-in despite open source", detail: "While Supabase is open source, self-hosting the full stack (Postgres + Auth + Realtime + Storage + Edge Functions) is complex. Most teams are effectively locked into the managed service." },
|
|
288
288
|
],
|
|
289
289
|
recent_changes: [],
|
|
290
|
-
verified_date: "2026-03-
|
|
290
|
+
verified_date: "2026-03-30",
|
|
291
291
|
},
|
|
292
292
|
"turso": {
|
|
293
293
|
provider: "Turso",
|
|
@@ -298,7 +298,7 @@ export const risks = {
|
|
|
298
298
|
{ severity: "LOW", title: "Younger ecosystem", detail: "Turso and libSQL are newer than PostgreSQL managed services. The ecosystem of tools, tutorials, and community support is smaller." },
|
|
299
299
|
],
|
|
300
300
|
recent_changes: [],
|
|
301
|
-
verified_date: "2026-03-
|
|
301
|
+
verified_date: "2026-03-30",
|
|
302
302
|
},
|
|
303
303
|
"typesense": {
|
|
304
304
|
provider: "Typesense",
|
|
@@ -318,6 +318,6 @@ export const risks = {
|
|
|
318
318
|
{ severity: "LOW", title: "Cold starts on serverless functions", detail: "Serverless functions can have cold starts of 200-500ms. Edge functions are faster but have runtime limitations (no Node.js APIs)." },
|
|
319
319
|
],
|
|
320
320
|
recent_changes: [],
|
|
321
|
-
verified_date: "2026-03-
|
|
321
|
+
verified_date: "2026-03-30",
|
|
322
322
|
},
|
|
323
323
|
};
|
package/dist/server.js
CHANGED
|
@@ -9,11 +9,11 @@ import { getPricing } from "./tools/pricing.js";
|
|
|
9
9
|
import { getRisks } from "./tools/risks.js";
|
|
10
10
|
const server = new McpServer({
|
|
11
11
|
name: "auxiliar",
|
|
12
|
-
version: "0.6.
|
|
12
|
+
version: "0.6.4",
|
|
13
13
|
});
|
|
14
14
|
// Tool: recommend_service
|
|
15
15
|
server.tool("recommend_service", "Get a current, verified recommendation for a cloud service based on your constraints. Returns pricing, risks, provision commands, and alternatives. Data is Chrome-verified from actual service websites (not stale training data).", {
|
|
16
|
-
need: z.
|
|
16
|
+
need: z.string().max(100).describe("What kind of service you need (database, email, auth, deploy, payments, search, cms, storage, monitoring, cache, queues, vector, llm, sms, feature-flags, cron — aliases like 'llm-api', 'file-storage', 'vector-db' also work)"),
|
|
17
17
|
framework: z.string().max(100).optional().describe("Your framework (nextjs, express, sveltekit, etc.)"),
|
|
18
18
|
region: z.string().max(50).optional().describe("Preferred region (us, eu, etc.)"),
|
|
19
19
|
budget: z.enum(["free", "cheap", "moderate", "enterprise"]).optional().describe("Budget constraint"),
|
|
@@ -3,5 +3,6 @@
|
|
|
3
3
|
* Non-blocking — never fails the tool call even if the API is unreachable.
|
|
4
4
|
* No personal data sent — only the query parameters (service names, categories).
|
|
5
5
|
* Rate-limited to 1 ping per tool per 5 seconds.
|
|
6
|
+
* Disabled by setting AUXILIAR_TELEMETRY=off environment variable.
|
|
6
7
|
*/
|
|
7
8
|
export declare function pingApi(tool: string, params: Record<string, any>): Promise<any | null>;
|
package/dist/tools/analytics.js
CHANGED
|
@@ -9,9 +9,15 @@ const MIN_PING_INTERVAL_MS = 5000; // 5 seconds between pings per tool
|
|
|
9
9
|
* Non-blocking — never fails the tool call even if the API is unreachable.
|
|
10
10
|
* No personal data sent — only the query parameters (service names, categories).
|
|
11
11
|
* Rate-limited to 1 ping per tool per 5 seconds.
|
|
12
|
+
* Disabled by setting AUXILIAR_TELEMETRY=off environment variable.
|
|
12
13
|
*/
|
|
13
14
|
export async function pingApi(tool, params) {
|
|
14
15
|
try {
|
|
16
|
+
// Opt-out via environment variable
|
|
17
|
+
const telemetry = process.env.AUXILIAR_TELEMETRY;
|
|
18
|
+
if (telemetry === "off" || telemetry === "false" || telemetry === "0") {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
15
21
|
// Rate limiting
|
|
16
22
|
const now = Date.now();
|
|
17
23
|
if (lastPingTime[tool] && now - lastPingTime[tool] < MIN_PING_INTERVAL_MS) {
|
package/dist/tools/pricing.js
CHANGED
|
@@ -1,14 +1,29 @@
|
|
|
1
1
|
import { pricing } from "../data/pricing.js";
|
|
2
|
+
import { recommendations } from "../data/recommendations.js";
|
|
2
3
|
import { pingApi } from "./analytics.js";
|
|
3
4
|
export async function getPricing(params) {
|
|
4
5
|
// Ping API for analytics (non-blocking)
|
|
5
6
|
pingApi("pricing", { service: params.service }).catch(() => { });
|
|
6
7
|
const slug = params.service.toLowerCase();
|
|
7
8
|
const data = pricing[slug];
|
|
8
|
-
if (
|
|
9
|
-
return
|
|
10
|
-
error: `No pricing data for "${slug}". Check auxiliar.ai for supported services.`,
|
|
11
|
-
};
|
|
9
|
+
if (data) {
|
|
10
|
+
return data;
|
|
12
11
|
}
|
|
13
|
-
|
|
12
|
+
// Fallback: extract basic pricing from recommendations data
|
|
13
|
+
for (const category of Object.values(recommendations)) {
|
|
14
|
+
const svc = category.services?.find((s) => s.slug === slug);
|
|
15
|
+
if (svc) {
|
|
16
|
+
return {
|
|
17
|
+
provider: svc.name,
|
|
18
|
+
pricing_model: svc.pricing_model,
|
|
19
|
+
free_tier: svc.free_tier,
|
|
20
|
+
paid_starts_at: svc.paid_starts_at,
|
|
21
|
+
note: "Basic pricing from recommendation data. Detailed tier breakdown not yet verified for this service.",
|
|
22
|
+
verified_date: svc.last_reviewed,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
error: `No pricing data for "${slug}". Check auxiliar.ai for supported services.`,
|
|
28
|
+
};
|
|
14
29
|
}
|
package/dist/tools/setup.d.ts
CHANGED
package/dist/tools/setup.js
CHANGED
|
@@ -285,10 +285,32 @@ const setupGuides = {
|
|
|
285
285
|
export async function setupService(params) {
|
|
286
286
|
const slug = params.provider.toLowerCase();
|
|
287
287
|
const guideFn = setupGuides[slug];
|
|
288
|
-
if (
|
|
289
|
-
return
|
|
290
|
-
error: `No setup guide for "${slug}". Supported: neon, resend, supabase, vercel, better-auth, clerk, stripe, railway, turso, fly`,
|
|
291
|
-
};
|
|
288
|
+
if (guideFn) {
|
|
289
|
+
return guideFn(params);
|
|
292
290
|
}
|
|
293
|
-
|
|
291
|
+
// Fallback: extract basic setup info from recommendations data
|
|
292
|
+
try {
|
|
293
|
+
const { recommendations } = await import("../data/recommendations.js");
|
|
294
|
+
for (const category of Object.values(recommendations)) {
|
|
295
|
+
const svc = category.services?.find((s) => s.slug === slug);
|
|
296
|
+
if (svc) {
|
|
297
|
+
return {
|
|
298
|
+
error: `No detailed setup guide for "${slug}" yet.`,
|
|
299
|
+
basic_info: {
|
|
300
|
+
provider: svc.name,
|
|
301
|
+
install_command: svc.provision_command || null,
|
|
302
|
+
cli_available: svc.has_cli || false,
|
|
303
|
+
cli_install: svc.cli_install || null,
|
|
304
|
+
mcp_available: svc.has_mcp || false,
|
|
305
|
+
mcp_note: svc.mcp_note || null,
|
|
306
|
+
note: "Basic info from recommendation data. Full setup guide not yet available for this service.",
|
|
307
|
+
},
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
catch { }
|
|
313
|
+
return {
|
|
314
|
+
error: `No setup guide for "${slug}". Detailed guides available for: neon, resend, supabase, vercel, better-auth, clerk, stripe, railway, turso, fly`,
|
|
315
|
+
};
|
|
294
316
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "auxiliar-mcp",
|
|
3
|
-
"version": "0.6.
|
|
4
|
-
"description": "MCP server that keeps your AI agent's infrastructure knowledge current. Chrome-verified pricing, risk flags, compatibility checks, and setup guides for
|
|
3
|
+
"version": "0.6.4",
|
|
4
|
+
"description": "MCP server that keeps your AI agent's infrastructure knowledge current. Chrome-verified pricing, risk flags, compatibility checks, and setup guides for 74 cloud services.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/server.js",
|
|
7
7
|
"bin": {
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
],
|
|
14
14
|
"scripts": {
|
|
15
15
|
"build": "tsc && chmod +x dist/server.js",
|
|
16
|
+
"test": "node --import tsx test.ts",
|
|
16
17
|
"dev": "tsc --watch",
|
|
17
18
|
"start": "node dist/server.js",
|
|
18
19
|
"prepublishOnly": "npm run build"
|
|
@@ -43,10 +44,12 @@
|
|
|
43
44
|
"node": ">=18.0.0"
|
|
44
45
|
},
|
|
45
46
|
"dependencies": {
|
|
46
|
-
"@modelcontextprotocol/sdk": "^1.12.1"
|
|
47
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
48
|
+
"zod": "^4.3.6"
|
|
47
49
|
},
|
|
48
50
|
"devDependencies": {
|
|
49
51
|
"@types/node": "^22.0.0",
|
|
52
|
+
"tsx": "^4.21.0",
|
|
50
53
|
"typescript": "^5.8.0"
|
|
51
54
|
}
|
|
52
55
|
}
|