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 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 69 cloud services across 16 categories.
7
+ **auxiliar-mcp** gives your agent current, Chrome-verified data about 74 cloud services across 16 categories.
8
8
 
9
9
  ## Install
10
10
 
@@ -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-27",
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-27",
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-27",
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-27",
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-28",
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-28",
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-27",
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-28",
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-28",
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-28",
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-28",
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-28",
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-28",
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-28",
767
+ last_reviewed: "2026-03-30",
768
768
  },
769
769
  {
770
770
  slug: "lemon-squeezy",
@@ -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-27",
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-27",
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-27",
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-27",
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-27",
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-28",
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-28",
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.1",
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.enum(["database", "email", "auth", "deploy", "payments", "search", "cms", "storage", "monitoring", "cache", "queues", "vector", "llm", "sms", "feature-flags", "cron"]).describe("What kind of service you need"),
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>;
@@ -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) {
@@ -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 (!data) {
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
- return data;
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
  }
@@ -25,5 +25,6 @@ interface SetupResult {
25
25
  }
26
26
  export declare function setupService(params: SetupParams): Promise<SetupResult | {
27
27
  error: string;
28
+ basic_info?: any;
28
29
  }>;
29
30
  export {};
@@ -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 (!guideFn) {
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
- return guideFn(params);
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.2",
4
- "description": "MCP server that keeps your AI agent's infrastructure knowledge current. Chrome-verified pricing, risk flags, compatibility checks, and setup guides for 69 cloud services.",
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
  }