@maiife-ai-pub/probe 0.1.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.
Files changed (63) hide show
  1. package/LICENSE +181 -0
  2. package/README.md +140 -0
  3. package/dist/cli/commands/scan.d.ts +3 -0
  4. package/dist/cli/commands/scan.d.ts.map +1 -0
  5. package/dist/cli/commands/scan.js +89 -0
  6. package/dist/cli/commands/scan.js.map +1 -0
  7. package/dist/cli/commands/watch.d.ts +3 -0
  8. package/dist/cli/commands/watch.d.ts.map +1 -0
  9. package/dist/cli/commands/watch.js +35 -0
  10. package/dist/cli/commands/watch.js.map +1 -0
  11. package/dist/cli/index.d.ts +3 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +13 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/core/scanner.d.ts +5 -0
  16. package/dist/core/scanner.d.ts.map +1 -0
  17. package/dist/core/scanner.js +20 -0
  18. package/dist/core/scanner.js.map +1 -0
  19. package/dist/core/scanners/agents.d.ts +3 -0
  20. package/dist/core/scanners/agents.d.ts.map +1 -0
  21. package/dist/core/scanners/agents.js +87 -0
  22. package/dist/core/scanners/agents.js.map +1 -0
  23. package/dist/core/scanners/deps.d.ts +3 -0
  24. package/dist/core/scanners/deps.d.ts.map +1 -0
  25. package/dist/core/scanners/deps.js +50 -0
  26. package/dist/core/scanners/deps.js.map +1 -0
  27. package/dist/core/scanners/ide.d.ts +3 -0
  28. package/dist/core/scanners/ide.d.ts.map +1 -0
  29. package/dist/core/scanners/ide.js +57 -0
  30. package/dist/core/scanners/ide.js.map +1 -0
  31. package/dist/core/scanners/index.d.ts +7 -0
  32. package/dist/core/scanners/index.d.ts.map +1 -0
  33. package/dist/core/scanners/index.js +7 -0
  34. package/dist/core/scanners/index.js.map +1 -0
  35. package/dist/core/scanners/keys.d.ts +3 -0
  36. package/dist/core/scanners/keys.d.ts.map +1 -0
  37. package/dist/core/scanners/keys.js +63 -0
  38. package/dist/core/scanners/keys.js.map +1 -0
  39. package/dist/core/scanners/mcp.d.ts +3 -0
  40. package/dist/core/scanners/mcp.d.ts.map +1 -0
  41. package/dist/core/scanners/mcp.js +94 -0
  42. package/dist/core/scanners/mcp.js.map +1 -0
  43. package/dist/core/scanners/models.d.ts +3 -0
  44. package/dist/core/scanners/models.d.ts.map +1 -0
  45. package/dist/core/scanners/models.js +46 -0
  46. package/dist/core/scanners/models.js.map +1 -0
  47. package/dist/core/types.d.ts +62 -0
  48. package/dist/core/types.d.ts.map +1 -0
  49. package/dist/core/types.js +7 -0
  50. package/dist/core/types.js.map +1 -0
  51. package/dist/index.d.ts +3 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +2 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/mcp/index.d.ts +2 -0
  56. package/dist/mcp/index.d.ts.map +1 -0
  57. package/dist/mcp/index.js +67 -0
  58. package/dist/mcp/index.js.map +1 -0
  59. package/dist/mcp/tools.d.ts +16 -0
  60. package/dist/mcp/tools.d.ts.map +1 -0
  61. package/dist/mcp/tools.js +61 -0
  62. package/dist/mcp/tools.js.map +1 -0
  63. package/package.json +58 -0
@@ -0,0 +1,50 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ const AI_SDK_PACKAGES = [
4
+ { name: "ai", category: "vercel-ai-sdk" },
5
+ { name: "@ai-sdk/openai", category: "vercel-ai-sdk" },
6
+ { name: "@ai-sdk/anthropic", category: "vercel-ai-sdk" },
7
+ { name: "litellm", category: "litellm" },
8
+ { name: "openai", category: "openai-sdk" },
9
+ { name: "@anthropic-ai/sdk", category: "anthropic-sdk" },
10
+ { name: "@google/generative-ai", category: "google-ai-sdk" },
11
+ { name: "cohere-ai", category: "cohere-sdk" },
12
+ ];
13
+ const AI_SDK_MAP = new Map(AI_SDK_PACKAGES.map((p) => [p.name, p.category]));
14
+ export function createDepsScanner() {
15
+ return {
16
+ name: "deps",
17
+ async scan(config) {
18
+ if (!config.includeProjectDeps)
19
+ return [];
20
+ const pkgPath = path.join(config.path, "package.json");
21
+ if (!fs.existsSync(pkgPath))
22
+ return [];
23
+ try {
24
+ const raw = fs.readFileSync(pkgPath, "utf-8");
25
+ const pkg = JSON.parse(raw);
26
+ const allDeps = {
27
+ ...(pkg.dependencies ?? {}),
28
+ ...(pkg.devDependencies ?? {}),
29
+ };
30
+ const findings = [];
31
+ for (const [name, version] of Object.entries(allDeps)) {
32
+ const category = AI_SDK_MAP.get(name);
33
+ if (category) {
34
+ findings.push({
35
+ name,
36
+ version: String(version),
37
+ project: config.path,
38
+ category,
39
+ });
40
+ }
41
+ }
42
+ return findings;
43
+ }
44
+ catch {
45
+ return [];
46
+ }
47
+ },
48
+ };
49
+ }
50
+ //# sourceMappingURL=deps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deps.js","sourceRoot":"","sources":["../../../src/core/scanners/deps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,MAAM,eAAe,GAA8C;IACjE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE;IACzC,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,eAAe,EAAE;IACrD,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,eAAe,EAAE;IACxD,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE;IACxC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE;IAC1C,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,eAAe,EAAE;IACxD,EAAE,IAAI,EAAE,uBAAuB,EAAE,QAAQ,EAAE,eAAe,EAAE;IAC5D,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE;CAC9C,CAAC;AAEF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAE7E,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,KAAK,CAAC,IAAI,CAAC,MAAkB;YAC3B,IAAI,CAAC,MAAM,CAAC,kBAAkB;gBAAE,OAAO,EAAE,CAAC;YAE1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,OAAO,EAAE,CAAC;YAEvC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAW,CAAC;gBACxD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5B,MAAM,OAAO,GAA2B;oBACtC,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;oBAC3B,GAAG,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;iBAC/B,CAAC;gBAEF,MAAM,QAAQ,GAAiB,EAAE,CAAC;gBAClC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;oBACtD,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACtC,IAAI,QAAQ,EAAE,CAAC;wBACb,QAAQ,CAAC,IAAI,CAAC;4BACZ,IAAI;4BACJ,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;4BACxB,OAAO,EAAE,MAAM,CAAC,IAAI;4BACpB,QAAQ;yBACT,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBACD,OAAO,QAAQ,CAAC;YAClB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { IDEFinding, Scanner } from "../types.js";
2
+ export declare function createIDEScanner(): Scanner<IDEFinding>;
3
+ //# sourceMappingURL=ide.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ide.d.ts","sourceRoot":"","sources":["../../../src/core/scanners/ide.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAc,MAAM,aAAa,CAAC;AA2BnE,wBAAgB,gBAAgB,IAAI,OAAO,CAAC,UAAU,CAAC,CA6BtD"}
@@ -0,0 +1,57 @@
1
+ import * as fs from "node:fs";
2
+ import * as os from "node:os";
3
+ import * as path from "node:path";
4
+ const EXTENSION_PREFIXES = {
5
+ "github.copilot": "github-copilot",
6
+ "continue.continue": "continue",
7
+ "sourcegraph.cody-ai": "cody",
8
+ "codeium.windsurf": "windsurf",
9
+ };
10
+ function getExtensionDirs(home) {
11
+ return [
12
+ path.join(home, ".vscode", "extensions"),
13
+ path.join(home, ".cursor", "extensions"),
14
+ path.join(home, ".vscode-insiders", "extensions"),
15
+ ];
16
+ }
17
+ function matchExtension(dirName) {
18
+ for (const [prefix, name] of Object.entries(EXTENSION_PREFIXES)) {
19
+ if (dirName.startsWith(prefix + "-")) {
20
+ const version = dirName.slice(prefix.length + 1);
21
+ return { name, version };
22
+ }
23
+ }
24
+ return null;
25
+ }
26
+ export function createIDEScanner() {
27
+ return {
28
+ name: "ide",
29
+ async scan(_config) {
30
+ const home = os.homedir();
31
+ const dirs = getExtensionDirs(home);
32
+ const seen = new Set();
33
+ const findings = [];
34
+ for (const extDir of dirs) {
35
+ if (!fs.existsSync(extDir))
36
+ continue;
37
+ const entries = fs.readdirSync(extDir);
38
+ for (const entry of entries) {
39
+ const match = matchExtension(entry);
40
+ if (!match)
41
+ continue;
42
+ if (seen.has(match.name))
43
+ continue;
44
+ seen.add(match.name);
45
+ findings.push({
46
+ name: match.name,
47
+ version: match.version,
48
+ path: path.join(extDir, entry),
49
+ status: "active",
50
+ });
51
+ }
52
+ }
53
+ return findings;
54
+ },
55
+ };
56
+ }
57
+ //# sourceMappingURL=ide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ide.js","sourceRoot":"","sources":["../../../src/core/scanners/ide.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,MAAM,kBAAkB,GAA2B;IACjD,gBAAgB,EAAE,gBAAgB;IAClC,mBAAmB,EAAE,UAAU;IAC/B,qBAAqB,EAAE,MAAM;IAC7B,kBAAkB,EAAE,UAAU;CAC/B,CAAC;AAEF,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,EAAE,YAAY,CAAC;KAClD,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAChE,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACjD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,IAAI,EAAE,KAAK;QACX,KAAK,CAAC,IAAI,CAAC,OAAmB;YAC5B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAC/B,MAAM,QAAQ,GAAiB,EAAE,CAAC;YAElC,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC;gBAC1B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;oBAAE,SAAS;gBACrC,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAa,CAAC;gBACnD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;oBACpC,IAAI,CAAC,KAAK;wBAAE,SAAS;oBACrB,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;wBAAE,SAAS;oBACnC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACrB,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;wBAC9B,MAAM,EAAE,QAAQ;qBACjB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { createIDEScanner } from "./ide.js";
2
+ export { createMCPScanner } from "./mcp.js";
3
+ export { createAgentsScanner } from "./agents.js";
4
+ export { createKeysScanner } from "./keys.js";
5
+ export { createModelsScanner } from "./models.js";
6
+ export { createDepsScanner } from "./deps.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/scanners/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { createIDEScanner } from "./ide.js";
2
+ export { createMCPScanner } from "./mcp.js";
3
+ export { createAgentsScanner } from "./agents.js";
4
+ export { createKeysScanner } from "./keys.js";
5
+ export { createModelsScanner } from "./models.js";
6
+ export { createDepsScanner } from "./deps.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/scanners/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { APIKeyFinding, Scanner } from "../types.js";
2
+ export declare function createKeysScanner(): Scanner<APIKeyFinding>;
3
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/core/scanners/keys.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAc,MAAM,aAAa,CAAC;AAiCtE,wBAAgB,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC,CAgC1D"}
@@ -0,0 +1,63 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ const ENV_FILES = [".env", ".env.local", ".env.production", ".env.development"];
4
+ const KEY_PATTERNS = [
5
+ { pattern: /^OPENAI_API_KEY$/i, vendor: "openai" },
6
+ { pattern: /^ANTHROPIC_API_KEY$/i, vendor: "anthropic" },
7
+ { pattern: /^COHERE_API_KEY$/i, vendor: "cohere" },
8
+ { pattern: /^(GOOGLE_AI_KEY|GEMINI_API_KEY)$/i, vendor: "google" },
9
+ { pattern: /^MISTRAL_API_KEY$/i, vendor: "mistral" },
10
+ { pattern: /^GROQ_API_KEY$/i, vendor: "groq" },
11
+ { pattern: /^TOGETHER_API_KEY$/i, vendor: "together" },
12
+ ];
13
+ function detectVendor(varName) {
14
+ for (const { pattern, vendor } of KEY_PATTERNS) {
15
+ if (pattern.test(varName))
16
+ return vendor;
17
+ }
18
+ return null;
19
+ }
20
+ function parseEnvFile(content) {
21
+ return content
22
+ .split("\n")
23
+ .map((line) => line.trim())
24
+ .filter((line) => line && !line.startsWith("#"))
25
+ .map((line) => {
26
+ const eqIdx = line.indexOf("=");
27
+ return eqIdx > 0 ? line.slice(0, eqIdx).trim() : "";
28
+ })
29
+ .filter(Boolean);
30
+ }
31
+ export function createKeysScanner() {
32
+ return {
33
+ name: "keys",
34
+ async scan(config) {
35
+ const findings = [];
36
+ for (const envFile of ENV_FILES) {
37
+ const filePath = path.join(config.path, envFile);
38
+ if (!fs.existsSync(filePath))
39
+ continue;
40
+ try {
41
+ const raw = fs.readFileSync(filePath, "utf-8");
42
+ const varNames = parseEnvFile(raw);
43
+ for (const varName of varNames) {
44
+ const vendor = detectVendor(varName);
45
+ if (!vendor)
46
+ continue;
47
+ findings.push({
48
+ vendor,
49
+ location: filePath,
50
+ variable: varName,
51
+ managed: false,
52
+ });
53
+ }
54
+ }
55
+ catch {
56
+ // ignore read errors
57
+ }
58
+ }
59
+ return findings;
60
+ },
61
+ };
62
+ }
63
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/core/scanners/keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { MCPServerFinding, Scanner } from "../types.js";
2
+ export declare function createMCPScanner(): Scanner<MCPServerFinding>;
3
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../src/core/scanners/mcp.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAc,MAAM,aAAa,CAAC;AAuFzE,wBAAgB,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAgB5D"}
@@ -0,0 +1,94 @@
1
+ import * as fs from "node:fs";
2
+ import * as os from "node:os";
3
+ import * as path from "node:path";
4
+ function inferRisk(name, entry) {
5
+ const combined = [name, ...(entry.args ?? [])].join(" ").toLowerCase();
6
+ if (/postgres|mysql|database|sqlite/.test(combined))
7
+ return "high";
8
+ if (/filesystem|file/.test(combined))
9
+ return "medium";
10
+ if (/github|git/.test(combined))
11
+ return "medium";
12
+ return "low";
13
+ }
14
+ function inferPermissions(name, entry) {
15
+ const combined = [name, ...(entry.args ?? [])].join(" ").toLowerCase();
16
+ const perms = ["read"];
17
+ if (/write|create|postgres/.test(combined))
18
+ perms.push("write");
19
+ if (/admin|delete|drop/.test(combined))
20
+ perms.push("admin");
21
+ return perms;
22
+ }
23
+ function getConfigPaths(home, projectPath) {
24
+ const platform = os.platform();
25
+ const paths = [];
26
+ // Claude Desktop
27
+ if (platform === "win32") {
28
+ const appData = process.env.APPDATA ?? path.join(home, "AppData", "Roaming");
29
+ paths.push({
30
+ file: path.join(appData, "Claude", "claude_desktop_config.json"),
31
+ source: "claude-desktop",
32
+ });
33
+ }
34
+ else if (platform === "darwin") {
35
+ paths.push({
36
+ file: path.join(home, "Library", "Application Support", "Claude", "claude_desktop_config.json"),
37
+ source: "claude-desktop",
38
+ });
39
+ }
40
+ else {
41
+ paths.push({
42
+ file: path.join(home, ".config", "Claude", "claude_desktop_config.json"),
43
+ source: "claude-desktop",
44
+ });
45
+ }
46
+ // Cursor
47
+ paths.push({
48
+ file: path.join(home, ".cursor", "mcp.json"),
49
+ source: "cursor",
50
+ });
51
+ // Project .mcp.json
52
+ paths.push({
53
+ file: path.join(projectPath, ".mcp.json"),
54
+ source: "project",
55
+ });
56
+ return paths;
57
+ }
58
+ function parseConfig(file, source) {
59
+ try {
60
+ const raw = fs.readFileSync(file, "utf-8");
61
+ const config = JSON.parse(raw);
62
+ if (!config.mcpServers)
63
+ return [];
64
+ return Object.entries(config.mcpServers).map(([name, entry]) => ({
65
+ name,
66
+ transport: entry.url ? "sse" : "stdio",
67
+ command: entry.command,
68
+ args: entry.args,
69
+ permissions: inferPermissions(name, entry),
70
+ risk: inferRisk(name, entry),
71
+ configSource: source,
72
+ }));
73
+ }
74
+ catch {
75
+ return [];
76
+ }
77
+ }
78
+ export function createMCPScanner() {
79
+ return {
80
+ name: "mcp",
81
+ async scan(config) {
82
+ const home = os.homedir();
83
+ const configPaths = getConfigPaths(home, config.path);
84
+ const findings = [];
85
+ for (const { file, source } of configPaths) {
86
+ if (!fs.existsSync(file))
87
+ continue;
88
+ findings.push(...parseConfig(file, source));
89
+ }
90
+ return findings;
91
+ },
92
+ };
93
+ }
94
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/core/scanners/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { LocalModelFinding, Scanner } from "../types.js";
2
+ export declare function createModelsScanner(): Scanner<LocalModelFinding>;
3
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../src/core/scanners/models.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAc,MAAM,aAAa,CAAC;AA8B1E,wBAAgB,mBAAmB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAuBhE"}
@@ -0,0 +1,46 @@
1
+ import * as net from "node:net";
2
+ const RUNTIMES = [
3
+ { name: "ollama", port: 11434 },
4
+ { name: "vllm", port: 8000 },
5
+ { name: "lmstudio", port: 1234 },
6
+ { name: "localai", port: 8080 },
7
+ ];
8
+ function checkPort(port, timeout = 500) {
9
+ return new Promise((resolve) => {
10
+ const socket = new net.Socket();
11
+ let resolved = false;
12
+ const done = (result) => {
13
+ if (!resolved) {
14
+ resolved = true;
15
+ socket.destroy();
16
+ resolve(result);
17
+ }
18
+ };
19
+ socket.setTimeout(timeout);
20
+ socket.once("connect", () => done(true));
21
+ socket.once("error", () => done(false));
22
+ socket.once("timeout", () => done(false));
23
+ socket.connect(port, "127.0.0.1");
24
+ });
25
+ }
26
+ export function createModelsScanner() {
27
+ return {
28
+ name: "models",
29
+ async scan(_config) {
30
+ const findings = [];
31
+ await Promise.all(RUNTIMES.map(async ({ name, port }) => {
32
+ const open = await checkPort(port);
33
+ if (open) {
34
+ findings.push({
35
+ runtime: name,
36
+ port,
37
+ models: [],
38
+ status: "running",
39
+ });
40
+ }
41
+ }));
42
+ return findings;
43
+ },
44
+ };
45
+ }
46
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/core/scanners/models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAGhC,MAAM,QAAQ,GAA0C;IACtD,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE;IAC/B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE;IAC5B,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE;IAChC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;CAChC,CAAC;AAEF,SAAS,SAAS,CAAC,IAAY,EAAE,OAAO,GAAG,GAAG;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAChC,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,MAAM,IAAI,GAAG,CAAC,MAAe,EAAE,EAAE;YAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,QAAQ,GAAG,IAAI,CAAC;gBAChB,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,KAAK,CAAC,IAAI,CAAC,OAAmB;YAC5B,MAAM,QAAQ,GAAwB,EAAE,CAAC;YAEzC,MAAM,OAAO,CAAC,GAAG,CACf,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;gBACpC,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;gBACnC,IAAI,IAAI,EAAE,CAAC;oBACT,QAAQ,CAAC,IAAI,CAAC;wBACZ,OAAO,EAAE,IAAI;wBACb,IAAI;wBACJ,MAAM,EAAE,EAAE;wBACV,MAAM,EAAE,SAAS;qBAClB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CACH,CAAC;YAEF,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,62 @@
1
+ import type { RiskLevel } from "@maiife/shared";
2
+ export type ScanCategory = "ide" | "mcp" | "agents" | "keys" | "models" | "deps";
3
+ export type ScanScope = "full" | "quick" | "category";
4
+ export interface ScanConfig {
5
+ scope: ScanScope;
6
+ categories: ScanCategory[];
7
+ path: string;
8
+ includeProjectDeps: boolean;
9
+ }
10
+ export interface IDEFinding {
11
+ name: string;
12
+ version: string;
13
+ path: string;
14
+ status: "active" | "disabled" | "unknown";
15
+ }
16
+ export interface MCPServerFinding {
17
+ name: string;
18
+ transport: string;
19
+ command?: string;
20
+ args?: string[];
21
+ permissions: string[];
22
+ risk: RiskLevel;
23
+ configSource: string;
24
+ }
25
+ export interface AgentFinding {
26
+ name: string;
27
+ version: string;
28
+ project: string;
29
+ language: "javascript" | "python" | "unknown";
30
+ }
31
+ export interface APIKeyFinding {
32
+ vendor: string;
33
+ location: string;
34
+ variable: string;
35
+ managed: boolean;
36
+ }
37
+ export interface LocalModelFinding {
38
+ runtime: string;
39
+ port: number;
40
+ models: string[];
41
+ status: "running" | "stopped" | "unknown";
42
+ }
43
+ export interface DepFinding {
44
+ name: string;
45
+ version: string;
46
+ project: string;
47
+ category: string;
48
+ }
49
+ export interface ProbeResult {
50
+ ide: IDEFinding[];
51
+ mcp: MCPServerFinding[];
52
+ agents: AgentFinding[];
53
+ keys: APIKeyFinding[];
54
+ models: LocalModelFinding[];
55
+ deps: DepFinding[];
56
+ }
57
+ export interface Scanner<T> {
58
+ name: ScanCategory;
59
+ scan(config: ScanConfig): Promise<T[]>;
60
+ }
61
+ export declare const DEFAULT_SCAN_CONFIG: ScanConfig;
62
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAW,MAAM,gBAAgB,CAAC;AAEzD,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AACjF,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;AAEtD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC/C;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,UAAU,EAAE,CAAC;IAClB,GAAG,EAAE,gBAAgB,EAAE,CAAC;IACxB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,IAAI,EAAE,UAAU,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,OAAO,CAAC,CAAC;IACxB,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;CACxC;AAED,eAAO,MAAM,mBAAmB,EAAE,UAKjC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export const DEFAULT_SCAN_CONFIG = {
2
+ scope: "full",
3
+ categories: ["ide", "mcp", "agents", "keys", "models", "deps"],
4
+ path: process.cwd(),
5
+ includeProjectDeps: true,
6
+ };
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAuEA,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,KAAK,EAAE,MAAM;IACb,UAAU,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC;IAC9D,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE;IACnB,kBAAkB,EAAE,IAAI;CACzB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { runScan } from "./core/scanner.js";
2
+ export type * from "./core/types.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,mBAAmB,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { runScan } from "./core/scanner.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function startMCPServer(): Promise<void>;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAwEA,wBAAsB,cAAc,kBAGnC"}
@@ -0,0 +1,67 @@
1
+ import * as path from "node:path";
2
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
5
+ import { probeScan } from "./tools.js";
6
+ function sanitizePath(inputPath) {
7
+ if (inputPath.includes(".."))
8
+ throw new Error("Invalid path: directory traversal is not allowed");
9
+ return path.resolve(inputPath);
10
+ }
11
+ const server = new Server({ name: "@maiife/probe", version: "0.1.0" }, { capabilities: { tools: {} } });
12
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
13
+ tools: [
14
+ {
15
+ name: "probe_scan",
16
+ description: "Scan the current environment for AI tools, MCP servers, agent frameworks, API keys, and local models",
17
+ inputSchema: {
18
+ type: "object",
19
+ properties: {
20
+ scope: {
21
+ type: "string",
22
+ enum: ["full", "quick", "category"],
23
+ description: "Scan scope: full=everything, quick=IDE+MCP only, category=specific",
24
+ default: "full",
25
+ },
26
+ categories: {
27
+ type: "string",
28
+ description: "Comma-separated categories: ide,mcp,agents,keys,models,deps",
29
+ },
30
+ path: {
31
+ type: "string",
32
+ description: "Root path to scan (defaults to current directory)",
33
+ },
34
+ includeProjectDeps: {
35
+ type: "boolean",
36
+ description: "Scan package.json/requirements.txt for AI dependencies",
37
+ default: true,
38
+ },
39
+ },
40
+ },
41
+ },
42
+ ],
43
+ }));
44
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
45
+ const { name, arguments: args } = request.params;
46
+ try {
47
+ if (name === "probe_scan") {
48
+ const scanArgs = { ...(args ?? {}) };
49
+ if (typeof scanArgs.path === "string")
50
+ scanArgs.path = sanitizePath(scanArgs.path);
51
+ const result = await probeScan(scanArgs);
52
+ return {
53
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
54
+ };
55
+ }
56
+ throw new Error(`Unknown tool: ${name}`);
57
+ }
58
+ catch (err) {
59
+ const message = err instanceof Error ? err.message : String(err);
60
+ return { content: [{ type: "text", text: `Error: ${message}` }], isError: true };
61
+ }
62
+ });
63
+ export async function startMCPServer() {
64
+ const transport = new StdioServerTransport();
65
+ await server.connect(transport);
66
+ }
67
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { ProbeResult } from "../core/types.js";
2
+ import type { RiskLevel } from "@maiife/shared";
3
+ export declare function probeScan(params: {
4
+ scope?: string;
5
+ categories?: string;
6
+ path?: string;
7
+ includeProjectDeps?: boolean;
8
+ }): Promise<{
9
+ findings: ProbeResult;
10
+ summary: {
11
+ totalFindings: number;
12
+ riskLevel: RiskLevel;
13
+ recommendations: string[];
14
+ };
15
+ }>;
16
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAuC,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACzF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAyChD,wBAAsB,SAAS,CAAC,MAAM,EAAE;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,GAAG,OAAO,CAAC;IACV,QAAQ,EAAE,WAAW,CAAC;IACtB,OAAO,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,SAAS,CAAC;QAAC,eAAe,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACrF,CAAC,CA0BD"}