@sigildev/sigil 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 (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +246 -0
  3. package/dist/analyzers/ast/python.d.ts +14 -0
  4. package/dist/analyzers/ast/python.d.ts.map +1 -0
  5. package/dist/analyzers/ast/python.js +15 -0
  6. package/dist/analyzers/ast/python.js.map +1 -0
  7. package/dist/analyzers/ast/taint.d.ts +45 -0
  8. package/dist/analyzers/ast/taint.d.ts.map +1 -0
  9. package/dist/analyzers/ast/taint.js +32 -0
  10. package/dist/analyzers/ast/taint.js.map +1 -0
  11. package/dist/analyzers/ast/typescript.d.ts +15 -0
  12. package/dist/analyzers/ast/typescript.d.ts.map +1 -0
  13. package/dist/analyzers/ast/typescript.js +16 -0
  14. package/dist/analyzers/ast/typescript.js.map +1 -0
  15. package/dist/analyzers/deps.d.ts +13 -0
  16. package/dist/analyzers/deps.d.ts.map +1 -0
  17. package/dist/analyzers/deps.js +14 -0
  18. package/dist/analyzers/deps.js.map +1 -0
  19. package/dist/analyzers/pattern.d.ts +12 -0
  20. package/dist/analyzers/pattern.d.ts.map +1 -0
  21. package/dist/analyzers/pattern.js +13 -0
  22. package/dist/analyzers/pattern.js.map +1 -0
  23. package/dist/analyzers/types.d.ts +111 -0
  24. package/dist/analyzers/types.d.ts.map +1 -0
  25. package/dist/analyzers/types.js +3 -0
  26. package/dist/analyzers/types.js.map +1 -0
  27. package/dist/discovery/config-parser.d.ts +7 -0
  28. package/dist/discovery/config-parser.d.ts.map +1 -0
  29. package/dist/discovery/config-parser.js +23 -0
  30. package/dist/discovery/config-parser.js.map +1 -0
  31. package/dist/discovery/files.d.ts +6 -0
  32. package/dist/discovery/files.d.ts.map +1 -0
  33. package/dist/discovery/files.js +43 -0
  34. package/dist/discovery/files.js.map +1 -0
  35. package/dist/discovery/manifest.d.ts +6 -0
  36. package/dist/discovery/manifest.d.ts.map +1 -0
  37. package/dist/discovery/manifest.js +82 -0
  38. package/dist/discovery/manifest.js.map +1 -0
  39. package/dist/index.d.ts +3 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +60 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/reporters/json.d.ts +3 -0
  44. package/dist/reporters/json.d.ts.map +1 -0
  45. package/dist/reporters/json.js +4 -0
  46. package/dist/reporters/json.js.map +1 -0
  47. package/dist/reporters/sarif.d.ts +3 -0
  48. package/dist/reporters/sarif.d.ts.map +1 -0
  49. package/dist/reporters/sarif.js +57 -0
  50. package/dist/reporters/sarif.js.map +1 -0
  51. package/dist/reporters/text.d.ts +7 -0
  52. package/dist/reporters/text.d.ts.map +1 -0
  53. package/dist/reporters/text.js +89 -0
  54. package/dist/reporters/text.js.map +1 -0
  55. package/dist/rules/auth.d.ts +4 -0
  56. package/dist/rules/auth.d.ts.map +1 -0
  57. package/dist/rules/auth.js +88 -0
  58. package/dist/rules/auth.js.map +1 -0
  59. package/dist/rules/config.d.ts +5 -0
  60. package/dist/rules/config.d.ts.map +1 -0
  61. package/dist/rules/config.js +123 -0
  62. package/dist/rules/config.js.map +1 -0
  63. package/dist/rules/data.d.ts +4 -0
  64. package/dist/rules/data.d.ts.map +1 -0
  65. package/dist/rules/data.js +79 -0
  66. package/dist/rules/data.js.map +1 -0
  67. package/dist/rules/deps.d.ts +3 -0
  68. package/dist/rules/deps.d.ts.map +1 -0
  69. package/dist/rules/deps.js +68 -0
  70. package/dist/rules/deps.js.map +1 -0
  71. package/dist/rules/description.d.ts +3 -0
  72. package/dist/rules/description.d.ts.map +1 -0
  73. package/dist/rules/description.js +91 -0
  74. package/dist/rules/description.js.map +1 -0
  75. package/dist/rules/index.d.ts +3 -0
  76. package/dist/rules/index.d.ts.map +1 -0
  77. package/dist/rules/index.js +154 -0
  78. package/dist/rules/index.js.map +1 -0
  79. package/dist/rules/injection.d.ts +5 -0
  80. package/dist/rules/injection.d.ts.map +1 -0
  81. package/dist/rules/injection.js +213 -0
  82. package/dist/rules/injection.js.map +1 -0
  83. package/dist/rules/permissions.d.ts +5 -0
  84. package/dist/rules/permissions.d.ts.map +1 -0
  85. package/dist/rules/permissions.js +170 -0
  86. package/dist/rules/permissions.js.map +1 -0
  87. package/dist/rules/validation.d.ts +3 -0
  88. package/dist/rules/validation.d.ts.map +1 -0
  89. package/dist/rules/validation.js +67 -0
  90. package/dist/rules/validation.js.map +1 -0
  91. package/dist/scanner.d.ts +9 -0
  92. package/dist/scanner.d.ts.map +1 -0
  93. package/dist/scanner.js +149 -0
  94. package/dist/scanner.js.map +1 -0
  95. package/dist/scoring.d.ts +3 -0
  96. package/dist/scoring.d.ts.map +1 -0
  97. package/dist/scoring.js +35 -0
  98. package/dist/scoring.js.map +1 -0
  99. package/package.json +57 -0
@@ -0,0 +1,149 @@
1
+ import { resolve } from "node:path";
2
+ import { readFile, stat } from "node:fs/promises";
3
+ import { computeScore } from "./scoring.js";
4
+ import { discoverFiles } from "./discovery/files.js";
5
+ import { parseManifest } from "./discovery/manifest.js";
6
+ import { parseConfig } from "./discovery/config-parser.js";
7
+ import { rules } from "./rules/index.js";
8
+ import { detectVulnerableDeps } from "./rules/deps.js";
9
+ const PKG_VERSION = "0.1.0";
10
+ const SEVERITY_ORDER = {
11
+ critical: 0,
12
+ high: 1,
13
+ medium: 2,
14
+ low: 3,
15
+ };
16
+ export async function scan(target, options = {}) {
17
+ const start = Date.now();
18
+ const rootDir = resolve(target);
19
+ // ─── Layer 1: Discovery ───
20
+ const targetStat = await stat(rootDir);
21
+ const isConfigFile = !targetStat.isDirectory() &&
22
+ (target.endsWith(".json") || target.endsWith(".mcp.json"));
23
+ const configEntries = isConfigFile ? await parseConfig(rootDir) : undefined;
24
+ const manifest = await parseManifest(rootDir);
25
+ const language = await detectLanguage(rootDir);
26
+ const sourceFiles = await discoverFiles(rootDir, language);
27
+ // Read all source files into memory
28
+ const sources = new Map();
29
+ for (const file of sourceFiles) {
30
+ const fullPath = resolve(rootDir, file);
31
+ try {
32
+ const content = await readFile(fullPath, "utf-8");
33
+ sources.set(file, content);
34
+ }
35
+ catch {
36
+ // Skip unreadable files
37
+ }
38
+ }
39
+ // Discover MCP server primitives from source
40
+ const server = await discoverServer(sources);
41
+ const context = {
42
+ rootDir,
43
+ language,
44
+ sourceFiles,
45
+ sources,
46
+ server,
47
+ manifest,
48
+ configEntries,
49
+ };
50
+ // ─── Layer 2: Analysis ───
51
+ const ignoreSet = new Set(options.ignoreRules ?? []);
52
+ const minSev = options.minSeverity ?? "low";
53
+ const minSevOrder = SEVERITY_ORDER[minSev];
54
+ let findings = [];
55
+ for (const rule of rules) {
56
+ if (ignoreSet.has(rule.id))
57
+ continue;
58
+ if (SEVERITY_ORDER[rule.severity] > minSevOrder)
59
+ continue;
60
+ try {
61
+ const ruleFindings = rule.detect(context);
62
+ findings.push(...ruleFindings);
63
+ }
64
+ catch {
65
+ // Rule failed — skip silently (don't crash the scan)
66
+ }
67
+ }
68
+ // Run async dependency checker separately
69
+ try {
70
+ if (!ignoreSet.has("MCS-DEP-001")) {
71
+ const depFindings = await detectVulnerableDeps(context);
72
+ for (const f of depFindings) {
73
+ if (SEVERITY_ORDER[f.severity] > minSevOrder)
74
+ continue;
75
+ findings.push(f);
76
+ }
77
+ }
78
+ }
79
+ catch {
80
+ // Network errors shouldn't crash the scan
81
+ }
82
+ // Sort: critical first, then by file/line
83
+ findings.sort((a, b) => {
84
+ const sevDiff = SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity];
85
+ if (sevDiff !== 0)
86
+ return sevDiff;
87
+ const fileDiff = a.location.file.localeCompare(b.location.file);
88
+ if (fileDiff !== 0)
89
+ return fileDiff;
90
+ return a.location.startLine - b.location.startLine;
91
+ });
92
+ // ─── Layer 3: Reporting ───
93
+ const score = computeScore(findings);
94
+ const duration = Date.now() - start;
95
+ return {
96
+ scanner: { name: "sigil", version: PKG_VERSION },
97
+ target: {
98
+ path: target,
99
+ name: manifest?.name,
100
+ version: manifest?.version,
101
+ language,
102
+ },
103
+ server,
104
+ findings,
105
+ score,
106
+ timestamp: new Date().toISOString(),
107
+ duration,
108
+ };
109
+ }
110
+ async function detectLanguage(rootDir) {
111
+ try {
112
+ await stat(resolve(rootDir, "package.json"));
113
+ return "typescript";
114
+ }
115
+ catch {
116
+ // not TS
117
+ }
118
+ try {
119
+ await stat(resolve(rootDir, "pyproject.toml"));
120
+ return "python";
121
+ }
122
+ catch {
123
+ // not Python
124
+ }
125
+ try {
126
+ await stat(resolve(rootDir, "requirements.txt"));
127
+ return "python";
128
+ }
129
+ catch {
130
+ // not Python
131
+ }
132
+ try {
133
+ await stat(resolve(rootDir, "setup.py"));
134
+ return "python";
135
+ }
136
+ catch {
137
+ // not Python
138
+ }
139
+ return "unknown";
140
+ }
141
+ async function discoverServer(_sources) {
142
+ // TODO: Parse AST to extract tool/resource/prompt registrations
143
+ return {
144
+ tools: [],
145
+ resources: [],
146
+ prompts: [],
147
+ };
148
+ }
149
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Finding, Score } from "./analyzers/types.js";
2
+ export declare function computeScore(findings: Finding[]): Score;
3
+ //# sourceMappingURL=scoring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../src/scoring.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAA+B,MAAM,sBAAsB,CAAC;AASxF,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAWvD"}
@@ -0,0 +1,35 @@
1
+ const PENALTIES = {
2
+ critical: 25,
3
+ high: 15,
4
+ medium: 5,
5
+ low: 2,
6
+ };
7
+ export function computeScore(findings) {
8
+ let totalPenalty = 0;
9
+ for (const finding of findings) {
10
+ totalPenalty += PENALTIES[finding.severity];
11
+ }
12
+ const value = Math.max(0, 100 - totalPenalty);
13
+ const grade = computeGrade(value);
14
+ const label = computeLabel(value);
15
+ return { value, grade, label };
16
+ }
17
+ function computeGrade(score) {
18
+ if (score >= 90)
19
+ return "A";
20
+ if (score >= 70)
21
+ return "B";
22
+ if (score >= 50)
23
+ return "C";
24
+ if (score >= 30)
25
+ return "D";
26
+ return "F";
27
+ }
28
+ function computeLabel(score) {
29
+ if (score >= 70)
30
+ return "PASS";
31
+ if (score >= 50)
32
+ return "WARN";
33
+ return "FAIL";
34
+ }
35
+ //# sourceMappingURL=scoring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoring.js","sourceRoot":"","sources":["../src/scoring.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAA6B;IAC1C,QAAQ,EAAE,EAAE;IACZ,IAAI,EAAE,EAAE;IACR,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;CACP,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,QAAmB;IAC9C,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,YAAY,IAAI,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,YAAY,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAElC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC;IAC5B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC;IAC5B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC;IAC5B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC;IAC5B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IAC/B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IAC/B,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@sigildev/sigil",
3
+ "version": "0.1.0",
4
+ "description": "Security scanner for MCP (Model Context Protocol) servers — static analysis, trust scoring, and vulnerability detection",
5
+ "type": "module",
6
+ "bin": {
7
+ "sigil": "dist/index.js"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/sigil-security/sigil.git"
12
+ },
13
+ "main": "./dist/scanner.js",
14
+ "types": "./dist/scanner.d.ts",
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "dev": "tsx src/index.ts",
21
+ "test": "vitest run",
22
+ "test:watch": "vitest",
23
+ "lint": "tsc --noEmit",
24
+ "prepublishOnly": "npm run build"
25
+ },
26
+ "keywords": [
27
+ "mcp",
28
+ "security",
29
+ "scanner",
30
+ "model-context-protocol",
31
+ "static-analysis",
32
+ "sigil",
33
+ "trust-score",
34
+ "vulnerability",
35
+ "ai-safety"
36
+ ],
37
+ "license": "MIT",
38
+ "dependencies": {
39
+ "chalk": "^5.4.1",
40
+ "commander": "^13.1.0",
41
+ "fast-glob": "^3.3.3",
42
+ "semver": "^7.7.1",
43
+ "tree-sitter": "^0.22.4",
44
+ "tree-sitter-python": "^0.23.6",
45
+ "typescript": "^5.7.3",
46
+ "yaml": "^2.7.0"
47
+ },
48
+ "devDependencies": {
49
+ "@types/node": "^22.12.0",
50
+ "@types/semver": "^7.5.8",
51
+ "tsx": "^4.19.0",
52
+ "vitest": "^3.0.0"
53
+ },
54
+ "engines": {
55
+ "node": ">=20"
56
+ }
57
+ }