auxiliar-mcp 0.7.0 → 0.7.1
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/data/event-sources.d.ts +47 -0
- package/dist/data/event-sources.js +126 -0
- package/dist/data/risks.js +5 -2
- package/dist/tools/recommend.d.ts +6 -0
- package/dist/tools/recommend.js +40 -0
- package/package.json +4 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event-source feed URLs for the service-event scanner (Phase 1 pilot).
|
|
3
|
+
*
|
|
4
|
+
* One entry per pilot service. Each service lists zero-or-more
|
|
5
|
+
* machine-readable feeds we monitor daily. Source types:
|
|
6
|
+
*
|
|
7
|
+
* - "status": Statuspage.io (or equivalent) incident/history RSS
|
|
8
|
+
* - "changelog": Vendor product changelog RSS/Atom
|
|
9
|
+
* - "security": Vendor security-bulletin RSS/Atom (rare but prized)
|
|
10
|
+
* - "releases": GitHub releases Atom (OSS projects)
|
|
11
|
+
*
|
|
12
|
+
* Phase 1 scope is detector-only — URLs here are data for the Python
|
|
13
|
+
* scanner (`src/auxiliar/scanner/`) to fetch daily. The config is
|
|
14
|
+
* intentionally versioned in-repo (not auto-discovered) so changes are
|
|
15
|
+
* reviewable and a noisy feed can be dropped with a single commit.
|
|
16
|
+
*
|
|
17
|
+
* Verification status: URLs below are the ones we expect each vendor
|
|
18
|
+
* publishes; they MUST be smoke-tested by the detector's first
|
|
19
|
+
* production run and any 404s/parse errors logged. A failing fetch is
|
|
20
|
+
* NOT a false positive — it's a missing positive, tracked separately in
|
|
21
|
+
* the scanner summary.
|
|
22
|
+
*
|
|
23
|
+
* Adding a service: add an entry, redeploy, wait 24h, confirm the
|
|
24
|
+
* source shows up in the next scanner-report.md. Removing is cheap
|
|
25
|
+
* (delete the entry; cursor rows become orphans and can be cleaned up
|
|
26
|
+
* later).
|
|
27
|
+
*
|
|
28
|
+
* This file is written by humans, read by the Python scanner via the
|
|
29
|
+
* build step (`scripts/build-service-api.py` will export it as JSON for
|
|
30
|
+
* Python — Phase 1 scanner reads the JSON snapshot so we don't need a
|
|
31
|
+
* TS runtime in the Lambda).
|
|
32
|
+
*/
|
|
33
|
+
export type EventSourceType = "status" | "changelog" | "security" | "releases";
|
|
34
|
+
export interface EventSource {
|
|
35
|
+
type: EventSourceType;
|
|
36
|
+
url: string;
|
|
37
|
+
/** Human-readable note about the feed — why we picked it, caveats. */
|
|
38
|
+
note?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface ServiceEventSources {
|
|
41
|
+
/** Slug matching content/service/<slug>.md and mcp/src/data/risks.ts keys. */
|
|
42
|
+
slug: string;
|
|
43
|
+
/** Human-readable service name. */
|
|
44
|
+
name: string;
|
|
45
|
+
sources: EventSource[];
|
|
46
|
+
}
|
|
47
|
+
export declare const eventSources: ServiceEventSources[];
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event-source feed URLs for the service-event scanner (Phase 1 pilot).
|
|
3
|
+
*
|
|
4
|
+
* One entry per pilot service. Each service lists zero-or-more
|
|
5
|
+
* machine-readable feeds we monitor daily. Source types:
|
|
6
|
+
*
|
|
7
|
+
* - "status": Statuspage.io (or equivalent) incident/history RSS
|
|
8
|
+
* - "changelog": Vendor product changelog RSS/Atom
|
|
9
|
+
* - "security": Vendor security-bulletin RSS/Atom (rare but prized)
|
|
10
|
+
* - "releases": GitHub releases Atom (OSS projects)
|
|
11
|
+
*
|
|
12
|
+
* Phase 1 scope is detector-only — URLs here are data for the Python
|
|
13
|
+
* scanner (`src/auxiliar/scanner/`) to fetch daily. The config is
|
|
14
|
+
* intentionally versioned in-repo (not auto-discovered) so changes are
|
|
15
|
+
* reviewable and a noisy feed can be dropped with a single commit.
|
|
16
|
+
*
|
|
17
|
+
* Verification status: URLs below are the ones we expect each vendor
|
|
18
|
+
* publishes; they MUST be smoke-tested by the detector's first
|
|
19
|
+
* production run and any 404s/parse errors logged. A failing fetch is
|
|
20
|
+
* NOT a false positive — it's a missing positive, tracked separately in
|
|
21
|
+
* the scanner summary.
|
|
22
|
+
*
|
|
23
|
+
* Adding a service: add an entry, redeploy, wait 24h, confirm the
|
|
24
|
+
* source shows up in the next scanner-report.md. Removing is cheap
|
|
25
|
+
* (delete the entry; cursor rows become orphans and can be cleaned up
|
|
26
|
+
* later).
|
|
27
|
+
*
|
|
28
|
+
* This file is written by humans, read by the Python scanner via the
|
|
29
|
+
* build step (`scripts/build-service-api.py` will export it as JSON for
|
|
30
|
+
* Python — Phase 1 scanner reads the JSON snapshot so we don't need a
|
|
31
|
+
* TS runtime in the Lambda).
|
|
32
|
+
*/
|
|
33
|
+
export const eventSources = [
|
|
34
|
+
{
|
|
35
|
+
slug: "vercel",
|
|
36
|
+
name: "Vercel",
|
|
37
|
+
sources: [
|
|
38
|
+
{ type: "status", url: "https://www.vercel-status.com/history.rss" },
|
|
39
|
+
{ type: "changelog", url: "https://vercel.com/changelog/feed.xml" },
|
|
40
|
+
{
|
|
41
|
+
type: "security",
|
|
42
|
+
url: "https://vercel.com/kb/bulletin",
|
|
43
|
+
note: "Ground-truth fixture source (April 2026 incident). HTML page, not RSS — detector polls with low-frequency hash comparison.",
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
slug: "stripe",
|
|
49
|
+
name: "Stripe",
|
|
50
|
+
sources: [
|
|
51
|
+
{ type: "status", url: "https://status.stripe.com/history.rss" },
|
|
52
|
+
{ type: "changelog", url: "https://stripe.com/blog/feed.rss" },
|
|
53
|
+
],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
slug: "supabase",
|
|
57
|
+
name: "Supabase",
|
|
58
|
+
sources: [
|
|
59
|
+
{ type: "status", url: "https://status.supabase.com/history.rss" },
|
|
60
|
+
{ type: "changelog", url: "https://supabase.com/changelog/feed.xml" },
|
|
61
|
+
],
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
slug: "neon",
|
|
65
|
+
name: "Neon",
|
|
66
|
+
sources: [
|
|
67
|
+
{ type: "status", url: "https://neonstatus.com/history.rss" },
|
|
68
|
+
{ type: "changelog", url: "https://neon.tech/changelog/feed.xml" },
|
|
69
|
+
],
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
slug: "clerk",
|
|
73
|
+
name: "Clerk",
|
|
74
|
+
sources: [
|
|
75
|
+
{ type: "status", url: "https://status.clerk.com/history.rss" },
|
|
76
|
+
{ type: "changelog", url: "https://clerk.com/changelog/feed.xml" },
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
slug: "auth0",
|
|
81
|
+
name: "Auth0",
|
|
82
|
+
sources: [
|
|
83
|
+
{ type: "status", url: "https://status.auth0.com/history.rss" },
|
|
84
|
+
{
|
|
85
|
+
type: "security",
|
|
86
|
+
url: "https://auth0.com/docs/secure/security-bulletins/rss",
|
|
87
|
+
note: "Auth0 maintains a dedicated security-bulletin feed — historically reliable.",
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
slug: "railway",
|
|
93
|
+
name: "Railway",
|
|
94
|
+
sources: [
|
|
95
|
+
{ type: "status", url: "https://status.railway.com/history.rss" },
|
|
96
|
+
{ type: "changelog", url: "https://blog.railway.com/feed.xml" },
|
|
97
|
+
],
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
slug: "render",
|
|
101
|
+
name: "Render",
|
|
102
|
+
sources: [
|
|
103
|
+
{ type: "status", url: "https://status.render.com/history.rss" },
|
|
104
|
+
{ type: "changelog", url: "https://render.com/changelog/rss.xml" },
|
|
105
|
+
],
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
slug: "resend",
|
|
109
|
+
name: "Resend",
|
|
110
|
+
sources: [
|
|
111
|
+
{ type: "status", url: "https://resend-status.com/history.rss" },
|
|
112
|
+
{ type: "changelog", url: "https://resend.com/changelog/feed.xml" },
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
slug: "authjs",
|
|
117
|
+
name: "Auth.js",
|
|
118
|
+
sources: [
|
|
119
|
+
{
|
|
120
|
+
type: "releases",
|
|
121
|
+
url: "https://github.com/nextauthjs/next-auth/releases.atom",
|
|
122
|
+
note: "OSS project — GitHub releases is the only structured feed. CVEs land here as security-labelled releases.",
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
},
|
|
126
|
+
];
|
package/dist/data/risks.js
CHANGED
|
@@ -312,12 +312,15 @@ export const risks = {
|
|
|
312
312
|
"vercel": {
|
|
313
313
|
provider: "Vercel",
|
|
314
314
|
risks: [
|
|
315
|
+
{ severity: "CRITICAL", title: "Active security incident (April 2026)", detail: "Vercel disclosed on 2026-04-19 that a compromise of Context.ai (a third-party AI tool used by a Vercel employee) was escalated to their internal systems via the employee's Google Workspace. A limited subset of customers had credentials compromised; environment variables not marked 'sensitive' on affected accounts may have been accessed. Vercel recommends rotating non-sensitive env vars as a priority, enabling the 'sensitive env vars' feature, reviewing recent deployments, and rotating Deployment Protection tokens. Investigation ongoing; services remain operational. Full advisory: https://vercel.com/kb/bulletin/vercel-april-2026-security-incident" },
|
|
315
316
|
{ severity: "HIGH", title: "Bandwidth overage shock", detail: "Vercel charges starting at $0.15/GB for bandwidth beyond your plan's included usage. The Pro plan includes $20 of usage credit, but a viral post or product launch can still generate surprise charges. " },
|
|
316
317
|
{ severity: "MEDIUM", title: "Hobby tier is non-commercial", detail: "The free Hobby plan explicitly prohibits commercial use. Any revenue-generating app needs the $20/month Pro plan." },
|
|
317
318
|
{ severity: "MEDIUM", title: "Framework lock-in", detail: "Advanced features (ISR, edge middleware, image optimization) are deeply integrated with Next.js. Migrating to another platform means losing these optimizations." },
|
|
318
319
|
{ 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
320
|
],
|
|
320
|
-
recent_changes: [
|
|
321
|
-
|
|
321
|
+
recent_changes: [
|
|
322
|
+
{ date: "2026-04-19", change: "Security incident disclosed — Context.ai supply-chain compromise pivoted into Vercel internal systems via employee Google Workspace. Limited-subset customer credentials affected. See: https://vercel.com/kb/bulletin/vercel-april-2026-security-incident" },
|
|
323
|
+
],
|
|
324
|
+
verified_date: "2026-04-20",
|
|
322
325
|
},
|
|
323
326
|
};
|
|
@@ -30,6 +30,12 @@ interface Recommendation {
|
|
|
30
30
|
reason: string;
|
|
31
31
|
trade_off: string;
|
|
32
32
|
}>;
|
|
33
|
+
community: {
|
|
34
|
+
total_reports: number;
|
|
35
|
+
success_rate: string;
|
|
36
|
+
avg_integration_time: string | null;
|
|
37
|
+
recommendation_rate: string | null;
|
|
38
|
+
} | null;
|
|
33
39
|
data_source: string;
|
|
34
40
|
}
|
|
35
41
|
export declare function recommendService(params: RecommendParams): Promise<Recommendation>;
|
package/dist/tools/recommend.js
CHANGED
|
@@ -72,12 +72,46 @@ export async function recommendService(params) {
|
|
|
72
72
|
mcp_install: null,
|
|
73
73
|
mcp_note: null,
|
|
74
74
|
alternatives: [],
|
|
75
|
+
community: null,
|
|
75
76
|
data_source: "auxiliar.ai bundled data",
|
|
76
77
|
};
|
|
77
78
|
}
|
|
79
|
+
// Fetch community feedback for all services in this category (non-blocking, best-effort)
|
|
80
|
+
const communityStats = {};
|
|
81
|
+
try {
|
|
82
|
+
const feedbackPromises = category.services.map(async (svc) => {
|
|
83
|
+
try {
|
|
84
|
+
const resp = await fetch(`https://auxiliar.ai/api/feedback?service=${svc.slug}`, { signal: AbortSignal.timeout(3000) });
|
|
85
|
+
const data = await resp.json();
|
|
86
|
+
if (data.stats)
|
|
87
|
+
communityStats[svc.slug] = data.stats;
|
|
88
|
+
}
|
|
89
|
+
catch { }
|
|
90
|
+
});
|
|
91
|
+
await Promise.all(feedbackPromises);
|
|
92
|
+
}
|
|
93
|
+
catch { }
|
|
78
94
|
// Score each service based on constraints
|
|
79
95
|
const scored = category.services.map((svc) => {
|
|
80
96
|
let score = svc.default_score || 5;
|
|
97
|
+
// Community feedback boost/penalty
|
|
98
|
+
// Verified reports have 1.5x weight, anonymous reports have 1.0x weight
|
|
99
|
+
const feedback = communityStats[svc.slug];
|
|
100
|
+
if (feedback) {
|
|
101
|
+
const verifiedReports = feedback.verified_reports || 0;
|
|
102
|
+
const anonymousReports = feedback.total_reports - verifiedReports;
|
|
103
|
+
const weightedReports = anonymousReports * 1.0 + verifiedReports * 1.5;
|
|
104
|
+
const successRate = feedback.total_reports > 0 ? (feedback.outcomes.success / feedback.total_reports) : 0;
|
|
105
|
+
if (weightedReports >= 3 && successRate >= 0.8)
|
|
106
|
+
score += 2;
|
|
107
|
+
if (weightedReports >= 3 && successRate < 0.5)
|
|
108
|
+
score -= 3;
|
|
109
|
+
if (weightedReports >= 5)
|
|
110
|
+
score += 1; // bonus for well-tested services
|
|
111
|
+
// Extra boost for verified credibility
|
|
112
|
+
if (verifiedReports >= 2 && successRate >= 0.8)
|
|
113
|
+
score += 1;
|
|
114
|
+
}
|
|
81
115
|
// Budget filter
|
|
82
116
|
if (params.budget === "free" && svc.has_free_tier)
|
|
83
117
|
score += 3;
|
|
@@ -269,6 +303,12 @@ export async function recommendService(params) {
|
|
|
269
303
|
reason: a.choose_if,
|
|
270
304
|
trade_off: a.avoid_if,
|
|
271
305
|
})),
|
|
306
|
+
community: communityStats[top.slug] ? {
|
|
307
|
+
total_reports: communityStats[top.slug].total_reports,
|
|
308
|
+
success_rate: communityStats[top.slug].success_rate,
|
|
309
|
+
avg_integration_time: communityStats[top.slug].avg_integration_time,
|
|
310
|
+
recommendation_rate: communityStats[top.slug].recommendation_rate,
|
|
311
|
+
} : null,
|
|
272
312
|
data_source: `auxiliar.ai bundled data, last updated ${top.last_reviewed}`,
|
|
273
313
|
};
|
|
274
314
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "auxiliar-mcp",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.1",
|
|
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",
|
|
@@ -20,11 +20,14 @@
|
|
|
20
20
|
},
|
|
21
21
|
"keywords": [
|
|
22
22
|
"mcp",
|
|
23
|
+
"mcp-server",
|
|
23
24
|
"model-context-protocol",
|
|
24
25
|
"ai-agent",
|
|
25
26
|
"claude-code",
|
|
26
27
|
"cursor",
|
|
28
|
+
"windsurf",
|
|
27
29
|
"cloud-services",
|
|
30
|
+
"pricing",
|
|
28
31
|
"developer-tools",
|
|
29
32
|
"neon",
|
|
30
33
|
"resend",
|