@nekzus/mcp-server 1.19.0-alpha.10 → 1.19.0-alpha.12
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/.tsbuildinfo +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +129 -68
- package/dist/index.js.map +1 -1
- package/dist/src/tools/index.js +1 -1
- package/dist/src/tools/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAGnE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAG3C,eAAO,IAAI,gBAAgB,QAEP,CAAC;AAErB,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEnD;AAkHD,wBAAsB,cAAc,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,GAAQ,EACjB,MAAM,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1D,OAAO,CAAC,GAAG,CAAC,CAyCd;AAGD,eAAO,MAAM,mBAAmB;;;;iBAMvB,CAAC;AAEV,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0C3B,CAAC;AAEV,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsBxB,CAAC;AAEV,eAAO,MAAM,oBAAoB;;;;;;;;;;iBAYxB,CAAC;AAEV,eAAO,MAAM,sBAAsB;;;;iBAIjC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;iBAKjC,CAAC;AAIH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsCzB,CAAC;AAGV,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAyEtE,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAgB9E;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC7C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,cAAc,CAAC,CA2I1B;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC3C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,cAAc,CAAC,CAkK1B;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACzC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,cAAc,CAAC,CAoJ1B;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE;IAC1C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,cAAc,CAAC,CAmJ1B;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACzC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,cAAc,CAAC,CAiJ1B;AAkCD,MAAM,WAAW,kBAAkB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE;QACX,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC/D,CAAC;CACF;AAED,wBAAsB,yBAAyB,CAC9C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,WAAW,UAAQ,GACjB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1053,7 +1053,11 @@ export async function fetchRepoStatsFromDepsDev(owner, repo, ignoreCache = false
|
|
|
1053
1053
|
checks: (data.scorecard.checks || []).map((c) => ({
|
|
1054
1054
|
name: c.name,
|
|
1055
1055
|
score: c.score,
|
|
1056
|
-
reason: c.reason
|
|
1056
|
+
reason: c.reason &&
|
|
1057
|
+
(c.reason.toLowerCase().includes('token missing') ||
|
|
1058
|
+
c.reason.toLowerCase().includes('permissions'))
|
|
1059
|
+
? 'Check requires elevated repository access'
|
|
1060
|
+
: c.reason || 'No details provided',
|
|
1057
1061
|
})),
|
|
1058
1062
|
}
|
|
1059
1063
|
: undefined,
|
|
@@ -1272,9 +1276,25 @@ export async function handleNpmVulnerabilities(args) {
|
|
|
1272
1276
|
// Fetch full details
|
|
1273
1277
|
const richData = await enrichVulnerabilityData(vuln.id, args.ignoreCache);
|
|
1274
1278
|
const finalVuln = richData || vuln; // Fallback to basic if fetch fails
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1279
|
+
let sev = 'Unknown';
|
|
1280
|
+
if (typeof finalVuln.database_specific?.severity === 'string') {
|
|
1281
|
+
sev = finalVuln.database_specific.severity;
|
|
1282
|
+
}
|
|
1283
|
+
else if (Array.isArray(finalVuln.severity) && finalVuln.severity.length > 0) {
|
|
1284
|
+
const first = finalVuln.severity[0];
|
|
1285
|
+
if (typeof first === 'string') {
|
|
1286
|
+
sev = first;
|
|
1287
|
+
}
|
|
1288
|
+
else if (first && typeof first === 'object') {
|
|
1289
|
+
sev = first.score || first.type || 'Unknown';
|
|
1290
|
+
}
|
|
1291
|
+
}
|
|
1292
|
+
else if (typeof finalVuln.severity === 'string') {
|
|
1293
|
+
sev = finalVuln.severity;
|
|
1294
|
+
}
|
|
1295
|
+
else if (typeof finalVuln.ecosystem_specific?.severity === 'string') {
|
|
1296
|
+
sev = finalVuln.ecosystem_specific.severity;
|
|
1297
|
+
}
|
|
1278
1298
|
const refs = finalVuln.references ? finalVuln.references.map((r) => r.url) : [];
|
|
1279
1299
|
const vulnerabilityDetails = {
|
|
1280
1300
|
id: finalVuln.id,
|
|
@@ -2791,6 +2811,16 @@ export async function handleNpmRepoStats(args) {
|
|
|
2791
2811
|
};
|
|
2792
2812
|
return errorData;
|
|
2793
2813
|
}
|
|
2814
|
+
let ghRepoMeta = {};
|
|
2815
|
+
try {
|
|
2816
|
+
const ghResponse = await fetchWithRetry(`https://api.github.com/repos/${owner}/${cleanRepo}`, { headers: { Accept: 'application/vnd.github.v3+json' } }, { maxRetries: 0 });
|
|
2817
|
+
if (ghResponse.ok) {
|
|
2818
|
+
ghRepoMeta = await ghResponse.json();
|
|
2819
|
+
}
|
|
2820
|
+
}
|
|
2821
|
+
catch {
|
|
2822
|
+
// Optional GitHub REST API fallback
|
|
2823
|
+
}
|
|
2794
2824
|
const successResult = {
|
|
2795
2825
|
packageInput: pkgInput,
|
|
2796
2826
|
packageName: name,
|
|
@@ -2798,18 +2828,18 @@ export async function handleNpmRepoStats(args) {
|
|
|
2798
2828
|
error: null,
|
|
2799
2829
|
data: {
|
|
2800
2830
|
githubRepoUrl: `https://github.com/${owner}/${cleanRepo}`,
|
|
2801
|
-
stars: depsDevData.starsCount,
|
|
2802
|
-
forks: depsDevData.forksCount,
|
|
2803
|
-
openIssues: depsDevData.openIssuesCount,
|
|
2804
|
-
watchers: 0,
|
|
2805
|
-
createdAt: null,
|
|
2806
|
-
updatedAt: null,
|
|
2807
|
-
defaultBranch: null,
|
|
2808
|
-
hasWiki: null,
|
|
2809
|
-
topics: [],
|
|
2831
|
+
stars: depsDevData.starsCount || ghRepoMeta.stargazers_count || 0,
|
|
2832
|
+
forks: depsDevData.forksCount || ghRepoMeta.forks_count || 0,
|
|
2833
|
+
openIssues: depsDevData.openIssuesCount || ghRepoMeta.open_issues_count || 0,
|
|
2834
|
+
watchers: ghRepoMeta.subscribers_count || ghRepoMeta.watchers_count || 0,
|
|
2835
|
+
createdAt: ghRepoMeta.created_at || null,
|
|
2836
|
+
updatedAt: ghRepoMeta.pushed_at || ghRepoMeta.updated_at || null,
|
|
2837
|
+
defaultBranch: ghRepoMeta.default_branch || null,
|
|
2838
|
+
hasWiki: typeof ghRepoMeta.has_wiki === 'boolean' ? ghRepoMeta.has_wiki : null,
|
|
2839
|
+
topics: Array.isArray(ghRepoMeta.topics) ? ghRepoMeta.topics : [],
|
|
2810
2840
|
scorecard: depsDevData.scorecard,
|
|
2811
2841
|
},
|
|
2812
|
-
message: 'Repository statistics fetched successfully from deps.dev.',
|
|
2842
|
+
message: 'Repository statistics fetched successfully from deps.dev and GitHub API.',
|
|
2813
2843
|
};
|
|
2814
2844
|
cacheSet(cacheKey, successResult, CACHE_TTL_LONG);
|
|
2815
2845
|
return successResult;
|
|
@@ -3394,17 +3424,16 @@ export async function handleNpmAlternatives(args) {
|
|
|
3394
3424
|
let originalPackageKeywords = [];
|
|
3395
3425
|
let originalPackageDownloads = 0;
|
|
3396
3426
|
try {
|
|
3397
|
-
const
|
|
3398
|
-
if (
|
|
3399
|
-
const
|
|
3400
|
-
|
|
3401
|
-
|
|
3402
|
-
originalPackageKeywords = match.package.keywords;
|
|
3427
|
+
const pkgManifestResponse = await fetchWithRetry(`${NPM_REGISTRY_URL}/${encodeURIComponent(originalPackageName)}/latest`);
|
|
3428
|
+
if (pkgManifestResponse.ok) {
|
|
3429
|
+
const pkgManifest = (await pkgManifestResponse.json());
|
|
3430
|
+
if (Array.isArray(pkgManifest.keywords)) {
|
|
3431
|
+
originalPackageKeywords = pkgManifest.keywords;
|
|
3403
3432
|
}
|
|
3404
3433
|
}
|
|
3405
3434
|
}
|
|
3406
3435
|
catch {
|
|
3407
|
-
// Optional
|
|
3436
|
+
// Optional manifest retrieval failure
|
|
3408
3437
|
}
|
|
3409
3438
|
try {
|
|
3410
3439
|
const dlResponse = await fetchWithRetry(`https://api.npmjs.org/downloads/point/last-month/${originalPackageName}`);
|
|
@@ -3421,57 +3450,89 @@ export async function handleNpmAlternatives(args) {
|
|
|
3421
3450
|
monthlyDownloads: originalPackageDownloads,
|
|
3422
3451
|
keywords: originalPackageKeywords,
|
|
3423
3452
|
};
|
|
3424
|
-
const
|
|
3425
|
-
|
|
3426
|
-
|
|
3427
|
-
|
|
3428
|
-
'
|
|
3429
|
-
'
|
|
3430
|
-
'
|
|
3431
|
-
'
|
|
3432
|
-
'
|
|
3433
|
-
'
|
|
3434
|
-
'
|
|
3435
|
-
'
|
|
3436
|
-
'
|
|
3437
|
-
'
|
|
3438
|
-
|
|
3439
|
-
|
|
3440
|
-
|
|
3441
|
-
|
|
3442
|
-
const selectedKeywords = domainKeywords.length > 0 ? domainKeywords : genericKeywords;
|
|
3443
|
-
let searchQuery = originalPackageName;
|
|
3444
|
-
if (selectedKeywords.length >= 2) {
|
|
3445
|
-
searchQuery = selectedKeywords.slice(0, 3).join(' ');
|
|
3446
|
-
}
|
|
3447
|
-
else if (selectedKeywords.length === 1) {
|
|
3448
|
-
searchQuery = selectedKeywords[0];
|
|
3449
|
-
}
|
|
3450
|
-
const searchResponse = await fetchWithRetry(`${NPM_REGISTRY_URL}/-/v1/search?text=${encodeURIComponent(searchQuery)}&size=30`);
|
|
3451
|
-
if (!searchResponse.ok) {
|
|
3452
|
-
const errorResult = {
|
|
3453
|
-
packageInput: pkgInput,
|
|
3454
|
-
packageName: originalPackageName,
|
|
3455
|
-
status: 'error',
|
|
3456
|
-
error: `Failed to search for alternatives: ${searchResponse.status} ${searchResponse.statusText}`,
|
|
3457
|
-
data: null,
|
|
3458
|
-
message: 'Could not perform search for alternatives.',
|
|
3459
|
-
};
|
|
3460
|
-
return errorResult;
|
|
3461
|
-
}
|
|
3462
|
-
const searchData = (await searchResponse.json());
|
|
3463
|
-
const alternativePackagesRaw = searchData.objects || [];
|
|
3464
|
-
let validAlternativesRaw = alternativePackagesRaw.filter((alt) => isAlternativeCandidate(alt.package.name, alt.package.description || '', originalPackageName));
|
|
3465
|
-
if (validAlternativesRaw.length === 0 && searchQuery !== originalPackageName) {
|
|
3453
|
+
const KNOWN_ALTERNATIVES_MAP = {
|
|
3454
|
+
express: ['fastify', 'koa', 'hono', 'restify', 'nestjs'],
|
|
3455
|
+
lodash: ['ramda', 'remeda', 'radash', 'underscore'],
|
|
3456
|
+
moment: ['dayjs', 'date-fns', 'luxon'],
|
|
3457
|
+
request: ['axios', 'node-fetch', 'got', 'ky', 'superagent'],
|
|
3458
|
+
react: ['preact', 'vue', 'svelte', 'solid-js'],
|
|
3459
|
+
vue: ['react', 'svelte', 'solid-js', 'preact'],
|
|
3460
|
+
jest: ['vitest', 'mocha', 'ava'],
|
|
3461
|
+
axios: ['got', 'ky', 'node-fetch', 'superagent'],
|
|
3462
|
+
chalk: ['kleur', 'colorette', 'picocolors', 'ansis'],
|
|
3463
|
+
commander: ['yargs', 'cac', 'clipanion'],
|
|
3464
|
+
winston: ['pino', 'bunyan', 'loglevel'],
|
|
3465
|
+
mongoose: ['prisma', 'typeorm', 'drizzle-orm', 'sequelize'],
|
|
3466
|
+
webpack: ['vite', 'esbuild', 'rollup', 'parcel', 'turbopack'],
|
|
3467
|
+
};
|
|
3468
|
+
let validAlternativesRaw = [];
|
|
3469
|
+
const knownCandidates = KNOWN_ALTERNATIVES_MAP[originalPackageName.toLowerCase()];
|
|
3470
|
+
if (knownCandidates && knownCandidates.length > 0) {
|
|
3466
3471
|
try {
|
|
3467
|
-
const
|
|
3468
|
-
if (
|
|
3469
|
-
const
|
|
3470
|
-
validAlternativesRaw = (
|
|
3472
|
+
const knownResponse = await fetchWithRetry(`${NPM_REGISTRY_URL}/-/v1/search?text=${encodeURIComponent(knownCandidates.join(' '))}&size=20`);
|
|
3473
|
+
if (knownResponse.ok) {
|
|
3474
|
+
const knownData = (await knownResponse.json());
|
|
3475
|
+
validAlternativesRaw = (knownData.objects || []).filter((alt) => knownCandidates.includes(alt.package.name.toLowerCase()) &&
|
|
3476
|
+
alt.package.name.toLowerCase() !== originalPackageName.toLowerCase());
|
|
3471
3477
|
}
|
|
3472
3478
|
}
|
|
3473
3479
|
catch {
|
|
3474
|
-
//
|
|
3480
|
+
// Known candidate search failure fallback
|
|
3481
|
+
}
|
|
3482
|
+
}
|
|
3483
|
+
if (validAlternativesRaw.length === 0) {
|
|
3484
|
+
const genericKeywords = originalPackageKeywords.filter((kw) => kw.toLowerCase() !== originalPackageName.toLowerCase() &&
|
|
3485
|
+
!kw.toLowerCase().includes(originalPackageName.toLowerCase()) &&
|
|
3486
|
+
kw.length > 2);
|
|
3487
|
+
const domainKeywords = genericKeywords.filter((kw) => ![
|
|
3488
|
+
'mobile',
|
|
3489
|
+
'ionic',
|
|
3490
|
+
'component',
|
|
3491
|
+
'components',
|
|
3492
|
+
'ui',
|
|
3493
|
+
'css',
|
|
3494
|
+
'react',
|
|
3495
|
+
'vue',
|
|
3496
|
+
'angular',
|
|
3497
|
+
'stencil',
|
|
3498
|
+
'storybook',
|
|
3499
|
+
'icon',
|
|
3500
|
+
'icons',
|
|
3501
|
+
].includes(kw.toLowerCase()));
|
|
3502
|
+
const selectedKeywords = domainKeywords.length > 0 ? domainKeywords : genericKeywords;
|
|
3503
|
+
let searchQuery = originalPackageName;
|
|
3504
|
+
if (selectedKeywords.length >= 2) {
|
|
3505
|
+
searchQuery = selectedKeywords.slice(0, 3).join(' ');
|
|
3506
|
+
}
|
|
3507
|
+
else if (selectedKeywords.length === 1) {
|
|
3508
|
+
searchQuery = selectedKeywords[0];
|
|
3509
|
+
}
|
|
3510
|
+
const searchResponse = await fetchWithRetry(`${NPM_REGISTRY_URL}/-/v1/search?text=${encodeURIComponent(searchQuery)}&size=30`);
|
|
3511
|
+
if (!searchResponse.ok) {
|
|
3512
|
+
const errorResult = {
|
|
3513
|
+
packageInput: pkgInput,
|
|
3514
|
+
packageName: originalPackageName,
|
|
3515
|
+
status: 'error',
|
|
3516
|
+
error: `Failed to search for alternatives: ${searchResponse.status} ${searchResponse.statusText}`,
|
|
3517
|
+
data: null,
|
|
3518
|
+
message: 'Could not perform search for alternatives.',
|
|
3519
|
+
};
|
|
3520
|
+
return errorResult;
|
|
3521
|
+
}
|
|
3522
|
+
const searchData = (await searchResponse.json());
|
|
3523
|
+
const alternativePackagesRaw = searchData.objects || [];
|
|
3524
|
+
validAlternativesRaw = alternativePackagesRaw.filter((alt) => isAlternativeCandidate(alt.package.name, alt.package.description || '', originalPackageName));
|
|
3525
|
+
if (validAlternativesRaw.length === 0 && searchQuery !== originalPackageName) {
|
|
3526
|
+
try {
|
|
3527
|
+
const fallbackResponse = await fetchWithRetry(`${NPM_REGISTRY_URL}/-/v1/search?text=${encodeURIComponent(originalPackageName)}&size=30`);
|
|
3528
|
+
if (fallbackResponse.ok) {
|
|
3529
|
+
const fallbackData = (await fallbackResponse.json());
|
|
3530
|
+
validAlternativesRaw = (fallbackData.objects || []).filter((alt) => isAlternativeCandidate(alt.package.name, alt.package.description || '', originalPackageName));
|
|
3531
|
+
}
|
|
3532
|
+
}
|
|
3533
|
+
catch {
|
|
3534
|
+
// Fallback failure
|
|
3535
|
+
}
|
|
3475
3536
|
}
|
|
3476
3537
|
}
|
|
3477
3538
|
if (validAlternativesRaw.length === 0) {
|