@cognium/mcp-server 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.
- package/CHANGELOG.md +39 -0
- package/LICENSE +21 -0
- package/README.md +107 -0
- package/dist/cache.d.ts +46 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +106 -0
- package/dist/cache.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/catalogs.d.ts +63 -0
- package/dist/resources/catalogs.d.ts.map +1 -0
- package/dist/resources/catalogs.js +92 -0
- package/dist/resources/catalogs.js.map +1 -0
- package/dist/resources/index.d.ts +13 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +94 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/schema.d.ts +81 -0
- package/dist/resources/schema.d.ts.map +1 -0
- package/dist/resources/schema.js +63 -0
- package/dist/resources/schema.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +41 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/attack-surface-summary.d.ts +24 -0
- package/dist/tools/attack-surface-summary.d.ts.map +1 -0
- package/dist/tools/attack-surface-summary.js +116 -0
- package/dist/tools/attack-surface-summary.js.map +1 -0
- package/dist/tools/check-sanitizer.d.ts +29 -0
- package/dist/tools/check-sanitizer.d.ts.map +1 -0
- package/dist/tools/check-sanitizer.js +82 -0
- package/dist/tools/check-sanitizer.js.map +1 -0
- package/dist/tools/describe-sink.d.ts +22 -0
- package/dist/tools/describe-sink.d.ts.map +1 -0
- package/dist/tools/describe-sink.js +47 -0
- package/dist/tools/describe-sink.js.map +1 -0
- package/dist/tools/describe-source.d.ts +27 -0
- package/dist/tools/describe-source.d.ts.map +1 -0
- package/dist/tools/describe-source.js +64 -0
- package/dist/tools/describe-source.js.map +1 -0
- package/dist/tools/explain-finding.d.ts +23 -0
- package/dist/tools/explain-finding.d.ts.map +1 -0
- package/dist/tools/explain-finding.js +65 -0
- package/dist/tools/explain-finding.js.map +1 -0
- package/dist/tools/find-similar.d.ts +34 -0
- package/dist/tools/find-similar.d.ts.map +1 -0
- package/dist/tools/find-similar.js +107 -0
- package/dist/tools/find-similar.js.map +1 -0
- package/dist/tools/list-entry-points.d.ts +22 -0
- package/dist/tools/list-entry-points.d.ts.map +1 -0
- package/dist/tools/list-entry-points.js +71 -0
- package/dist/tools/list-entry-points.js.map +1 -0
- package/dist/tools/list-reachable-sinks.d.ts +33 -0
- package/dist/tools/list-reachable-sinks.d.ts.map +1 -0
- package/dist/tools/list-reachable-sinks.js +116 -0
- package/dist/tools/list-reachable-sinks.js.map +1 -0
- package/dist/tools/refresh.d.ts +21 -0
- package/dist/tools/refresh.d.ts.map +1 -0
- package/dist/tools/refresh.js +39 -0
- package/dist/tools/refresh.js.map +1 -0
- package/dist/tools/scan.d.ts +42 -0
- package/dist/tools/scan.d.ts.map +1 -0
- package/dist/tools/scan.js +197 -0
- package/dist/tools/scan.js.map +1 -0
- package/dist/tools/taint-paths.d.ts +31 -0
- package/dist/tools/taint-paths.d.ts.map +1 -0
- package/dist/tools/taint-paths.js +55 -0
- package/dist/tools/taint-paths.js.map +1 -0
- package/dist/tools/types.d.ts +22 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +17 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/util/files.d.ts +33 -0
- package/dist/util/files.d.ts.map +1 -0
- package/dist/util/files.js +184 -0
- package/dist/util/files.js.map +1 -0
- package/dist/util/serialize.d.ts +29 -0
- package/dist/util/serialize.d.ts.map +1 -0
- package/dist/util/serialize.js +42 -0
- package/dist/util/serialize.js.map +1 -0
- package/dist/util/wasm.d.ts +9 -0
- package/dist/util/wasm.d.ts.map +1 -0
- package/dist/util/wasm.js +37 -0
- package/dist/util/wasm.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File collection + language detection utilities.
|
|
3
|
+
*
|
|
4
|
+
* A small standalone reimplementation so the MCP server does not depend on
|
|
5
|
+
* the CLI package. Mirrors the extension → language mapping from
|
|
6
|
+
* `packages/cli/src/cli.ts`.
|
|
7
|
+
*/
|
|
8
|
+
import { statSync, readdirSync, readFileSync } from 'fs';
|
|
9
|
+
import { extname, join, resolve } from 'path';
|
|
10
|
+
const LANG_MAP = {
|
|
11
|
+
'.java': 'java',
|
|
12
|
+
'.js': 'javascript',
|
|
13
|
+
'.jsx': 'javascript',
|
|
14
|
+
'.mjs': 'javascript',
|
|
15
|
+
'.cjs': 'javascript',
|
|
16
|
+
'.ts': 'typescript',
|
|
17
|
+
'.tsx': 'typescript',
|
|
18
|
+
'.py': 'python',
|
|
19
|
+
'.go': 'go',
|
|
20
|
+
'.rs': 'rust',
|
|
21
|
+
'.sh': 'bash',
|
|
22
|
+
'.bash': 'bash',
|
|
23
|
+
'.html': 'html',
|
|
24
|
+
'.htm': 'html',
|
|
25
|
+
};
|
|
26
|
+
/** Directories skipped during recursive collection. */
|
|
27
|
+
const SKIP_DIRS = new Set([
|
|
28
|
+
'node_modules',
|
|
29
|
+
'.git',
|
|
30
|
+
'dist',
|
|
31
|
+
'build',
|
|
32
|
+
'coverage',
|
|
33
|
+
'.next',
|
|
34
|
+
'.nuxt',
|
|
35
|
+
'target',
|
|
36
|
+
'__pycache__',
|
|
37
|
+
'.venv',
|
|
38
|
+
'venv',
|
|
39
|
+
'.tox',
|
|
40
|
+
'.pytest_cache',
|
|
41
|
+
]);
|
|
42
|
+
export function detectLanguage(filePath) {
|
|
43
|
+
const ext = extname(filePath).toLowerCase();
|
|
44
|
+
return LANG_MAP[ext] ?? null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Recursively collect source files under `root`. Skips hidden dirs,
|
|
48
|
+
* `node_modules`, build outputs, and language-mismatched files.
|
|
49
|
+
*/
|
|
50
|
+
export function collectFiles(root, opts = {}) {
|
|
51
|
+
const absRoot = resolve(root);
|
|
52
|
+
const out = [];
|
|
53
|
+
const maxFiles = opts.maxFiles ?? 10_000;
|
|
54
|
+
const st = statSync(absRoot);
|
|
55
|
+
if (st.isFile()) {
|
|
56
|
+
const lang = detectLanguage(absRoot);
|
|
57
|
+
if (lang && (!opts.language || lang === opts.language)) {
|
|
58
|
+
out.push({
|
|
59
|
+
filePath: absRoot,
|
|
60
|
+
language: lang,
|
|
61
|
+
code: readFileSync(absRoot, 'utf8'),
|
|
62
|
+
mtimeMs: st.mtimeMs,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
const stack = [absRoot];
|
|
68
|
+
while (stack.length > 0 && out.length < maxFiles) {
|
|
69
|
+
const dir = stack.pop();
|
|
70
|
+
let entries;
|
|
71
|
+
try {
|
|
72
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
for (const entry of entries) {
|
|
78
|
+
if (entry.name.startsWith('.') && entry.name !== '.')
|
|
79
|
+
continue;
|
|
80
|
+
if (SKIP_DIRS.has(entry.name))
|
|
81
|
+
continue;
|
|
82
|
+
const p = join(dir, entry.name);
|
|
83
|
+
if (entry.isDirectory()) {
|
|
84
|
+
stack.push(p);
|
|
85
|
+
}
|
|
86
|
+
else if (entry.isFile()) {
|
|
87
|
+
const lang = detectLanguage(p);
|
|
88
|
+
if (!lang)
|
|
89
|
+
continue;
|
|
90
|
+
if (opts.language && lang !== opts.language)
|
|
91
|
+
continue;
|
|
92
|
+
let stf;
|
|
93
|
+
try {
|
|
94
|
+
stf = statSync(p);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
out.push({
|
|
101
|
+
filePath: p,
|
|
102
|
+
language: lang,
|
|
103
|
+
code: readFileSync(p, 'utf8'),
|
|
104
|
+
mtimeMs: stf.mtimeMs,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// unreadable — skip
|
|
109
|
+
}
|
|
110
|
+
if (out.length >= maxFiles)
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Cheap mtime index used for cache invalidation. Same walking logic as
|
|
119
|
+
* `collectFiles` but skips reading file contents.
|
|
120
|
+
*/
|
|
121
|
+
export function indexMtimes(root, opts = {}) {
|
|
122
|
+
const absRoot = resolve(root);
|
|
123
|
+
const out = new Map();
|
|
124
|
+
const maxFiles = opts.maxFiles ?? 10_000;
|
|
125
|
+
let st;
|
|
126
|
+
try {
|
|
127
|
+
st = statSync(absRoot);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return out;
|
|
131
|
+
}
|
|
132
|
+
if (st.isFile()) {
|
|
133
|
+
if (detectLanguage(absRoot))
|
|
134
|
+
out.set(absRoot, st.mtimeMs);
|
|
135
|
+
return out;
|
|
136
|
+
}
|
|
137
|
+
const stack = [absRoot];
|
|
138
|
+
while (stack.length > 0 && out.size < maxFiles) {
|
|
139
|
+
const dir = stack.pop();
|
|
140
|
+
let entries;
|
|
141
|
+
try {
|
|
142
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
for (const entry of entries) {
|
|
148
|
+
if (entry.name.startsWith('.') && entry.name !== '.')
|
|
149
|
+
continue;
|
|
150
|
+
if (SKIP_DIRS.has(entry.name))
|
|
151
|
+
continue;
|
|
152
|
+
const p = join(dir, entry.name);
|
|
153
|
+
if (entry.isDirectory()) {
|
|
154
|
+
stack.push(p);
|
|
155
|
+
}
|
|
156
|
+
else if (entry.isFile()) {
|
|
157
|
+
const lang = detectLanguage(p);
|
|
158
|
+
if (!lang)
|
|
159
|
+
continue;
|
|
160
|
+
if (opts.language && lang !== opts.language)
|
|
161
|
+
continue;
|
|
162
|
+
try {
|
|
163
|
+
out.set(p, statSync(p).mtimeMs);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// ignore
|
|
167
|
+
}
|
|
168
|
+
if (out.size >= maxFiles)
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return out;
|
|
174
|
+
}
|
|
175
|
+
export function mtimesEqual(a, b) {
|
|
176
|
+
if (a.size !== b.size)
|
|
177
|
+
return false;
|
|
178
|
+
for (const [k, v] of a) {
|
|
179
|
+
if (b.get(k) !== v)
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/util/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Size-bounded serialization helpers.
|
|
3
|
+
*
|
|
4
|
+
* MCP tool responses go into the LLM context window. Every response body
|
|
5
|
+
* must be capped so a large scan doesn't blow the client's context budget
|
|
6
|
+
* or exceed the MCP transport's message size limit.
|
|
7
|
+
*/
|
|
8
|
+
/** Max characters for any single string field surfaced in a tool response. */
|
|
9
|
+
export declare const MAX_STRING_LEN = 2048;
|
|
10
|
+
/** Max entries in an unpaginated `findings[]` before truncation. */
|
|
11
|
+
export declare const MAX_FINDINGS = 500;
|
|
12
|
+
/** Max entries in an unpaginated `taint_paths[]` before truncation. */
|
|
13
|
+
export declare const MAX_TAINT_PATHS = 200;
|
|
14
|
+
/** Max entries in an unpaginated `entry_points[]` before truncation. */
|
|
15
|
+
export declare const MAX_ENTRY_POINTS = 500;
|
|
16
|
+
/** Truncate a string to `MAX_STRING_LEN`, appending a marker. */
|
|
17
|
+
export declare function truncateString(s: string | undefined, max?: number): string | undefined;
|
|
18
|
+
/** Truncate an array, returning both the slice and a truncation marker. */
|
|
19
|
+
export declare function truncateArray<T>(items: T[], max: number): {
|
|
20
|
+
items: T[];
|
|
21
|
+
truncated: boolean;
|
|
22
|
+
totalCount: number;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Compact JSON serialization for MCP `text` content blocks. Uses 2-space
|
|
26
|
+
* indent for LLM readability but keeps arrays inline for large collections.
|
|
27
|
+
*/
|
|
28
|
+
export declare function toJson(value: unknown): string;
|
|
29
|
+
//# sourceMappingURL=serialize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../../src/util/serialize.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,8EAA8E;AAC9E,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,oEAAoE;AACpE,eAAO,MAAM,YAAY,MAAM,CAAC;AAEhC,uEAAuE;AACvE,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,iEAAiE;AACjE,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,SAAiB,GAAG,MAAM,GAAG,SAAS,CAI9F;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG;IACzD,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CASA;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE7C"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Size-bounded serialization helpers.
|
|
3
|
+
*
|
|
4
|
+
* MCP tool responses go into the LLM context window. Every response body
|
|
5
|
+
* must be capped so a large scan doesn't blow the client's context budget
|
|
6
|
+
* or exceed the MCP transport's message size limit.
|
|
7
|
+
*/
|
|
8
|
+
/** Max characters for any single string field surfaced in a tool response. */
|
|
9
|
+
export const MAX_STRING_LEN = 2048;
|
|
10
|
+
/** Max entries in an unpaginated `findings[]` before truncation. */
|
|
11
|
+
export const MAX_FINDINGS = 500;
|
|
12
|
+
/** Max entries in an unpaginated `taint_paths[]` before truncation. */
|
|
13
|
+
export const MAX_TAINT_PATHS = 200;
|
|
14
|
+
/** Max entries in an unpaginated `entry_points[]` before truncation. */
|
|
15
|
+
export const MAX_ENTRY_POINTS = 500;
|
|
16
|
+
/** Truncate a string to `MAX_STRING_LEN`, appending a marker. */
|
|
17
|
+
export function truncateString(s, max = MAX_STRING_LEN) {
|
|
18
|
+
if (s === undefined || s === null)
|
|
19
|
+
return undefined;
|
|
20
|
+
if (s.length <= max)
|
|
21
|
+
return s;
|
|
22
|
+
return s.slice(0, max - 20) + '… [truncated]';
|
|
23
|
+
}
|
|
24
|
+
/** Truncate an array, returning both the slice and a truncation marker. */
|
|
25
|
+
export function truncateArray(items, max) {
|
|
26
|
+
if (items.length <= max) {
|
|
27
|
+
return { items, truncated: false, totalCount: items.length };
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
items: items.slice(0, max),
|
|
31
|
+
truncated: true,
|
|
32
|
+
totalCount: items.length,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Compact JSON serialization for MCP `text` content blocks. Uses 2-space
|
|
37
|
+
* indent for LLM readability but keeps arrays inline for large collections.
|
|
38
|
+
*/
|
|
39
|
+
export function toJson(value) {
|
|
40
|
+
return JSON.stringify(value, null, 2);
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=serialize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../src/util/serialize.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,8EAA8E;AAC9E,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAEnC,oEAAoE;AACpE,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAAC;AAEhC,uEAAuE;AACvE,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC;AAEnC,wEAAwE;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAEpC,iEAAiE;AACjE,MAAM,UAAU,cAAc,CAAC,CAAqB,EAAE,GAAG,GAAG,cAAc;IACxE,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACpD,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,eAAe,CAAC;AAChD,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,aAAa,CAAI,KAAU,EAAE,GAAW;IAKtD,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IAC/D,CAAC;IACD,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QAC1B,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,KAAK,CAAC,MAAM;KACzB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,KAAc;IACnC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WASM initialization for circle-ir in Node.js.
|
|
3
|
+
*
|
|
4
|
+
* Resolves the tree-sitter grammar files from the installed `circle-ir`
|
|
5
|
+
* package via `createRequire` so the server works regardless of npm
|
|
6
|
+
* hoisting layout.
|
|
7
|
+
*/
|
|
8
|
+
export declare function ensureAnalyzer(): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=wasm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm.d.ts","sourceRoot":"","sources":["../../src/util/wasm.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAwBpD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WASM initialization for circle-ir in Node.js.
|
|
3
|
+
*
|
|
4
|
+
* Resolves the tree-sitter grammar files from the installed `circle-ir`
|
|
5
|
+
* package via `createRequire` so the server works regardless of npm
|
|
6
|
+
* hoisting layout.
|
|
7
|
+
*/
|
|
8
|
+
import { createRequire } from 'module';
|
|
9
|
+
import { dirname, join } from 'path';
|
|
10
|
+
import { initAnalyzer, isAnalyzerInitialized } from 'circle-ir';
|
|
11
|
+
let initPromise = null;
|
|
12
|
+
export async function ensureAnalyzer() {
|
|
13
|
+
if (isAnalyzerInitialized())
|
|
14
|
+
return;
|
|
15
|
+
if (initPromise)
|
|
16
|
+
return initPromise;
|
|
17
|
+
initPromise = (async () => {
|
|
18
|
+
const require = createRequire(import.meta.url);
|
|
19
|
+
const circleIrPkg = require.resolve('circle-ir/package.json');
|
|
20
|
+
const wasmBase = join(dirname(circleIrPkg), 'dist', 'wasm') + '/';
|
|
21
|
+
await initAnalyzer({
|
|
22
|
+
wasmPath: wasmBase + 'web-tree-sitter.wasm',
|
|
23
|
+
languagePaths: {
|
|
24
|
+
bash: wasmBase + 'tree-sitter-bash.wasm',
|
|
25
|
+
go: wasmBase + 'tree-sitter-go.wasm',
|
|
26
|
+
java: wasmBase + 'tree-sitter-java.wasm',
|
|
27
|
+
javascript: wasmBase + 'tree-sitter-javascript.wasm',
|
|
28
|
+
typescript: wasmBase + 'tree-sitter-javascript.wasm',
|
|
29
|
+
python: wasmBase + 'tree-sitter-python.wasm',
|
|
30
|
+
rust: wasmBase + 'tree-sitter-rust.wasm',
|
|
31
|
+
html: wasmBase + 'tree-sitter-html.wasm',
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
})();
|
|
35
|
+
return initPromise;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=wasm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm.js","sourceRoot":"","sources":["../../src/util/wasm.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAEhE,IAAI,WAAW,GAAyB,IAAI,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,qBAAqB,EAAE;QAAE,OAAO;IACpC,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IAEpC,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;QACxB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC;QAClE,MAAM,YAAY,CAAC;YACjB,QAAQ,EAAE,QAAQ,GAAG,sBAAsB;YAC3C,aAAa,EAAE;gBACb,IAAI,EAAE,QAAQ,GAAG,uBAAuB;gBACxC,EAAE,EAAE,QAAQ,GAAG,qBAAqB;gBACpC,IAAI,EAAE,QAAQ,GAAG,uBAAuB;gBACxC,UAAU,EAAE,QAAQ,GAAG,6BAA6B;gBACpD,UAAU,EAAE,QAAQ,GAAG,6BAA6B;gBACpD,MAAM,EAAE,QAAQ,GAAG,yBAAyB;gBAC5C,IAAI,EAAE,QAAQ,GAAG,uBAAuB;gBACxC,IAAI,EAAE,QAAQ,GAAG,uBAAuB;aACzC;SACF,CAAC,CAAC;IACL,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cognium/mcp-server",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Model Context Protocol server exposing the circle-ir SAST engine as structured tools for LLM agents (Claude Desktop, Claude Code, Cursor, cognium-ai).",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"bin": {
|
|
9
|
+
"mcp-server-cognium-dev": "dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"README.md",
|
|
20
|
+
"CHANGELOG.md",
|
|
21
|
+
"LICENSE"
|
|
22
|
+
],
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsc && chmod +x dist/index.js",
|
|
25
|
+
"clean": "rm -rf dist *.tsbuildinfo",
|
|
26
|
+
"typecheck": "tsc --noEmit",
|
|
27
|
+
"test": "vitest run",
|
|
28
|
+
"test:watch": "vitest",
|
|
29
|
+
"prepublishOnly": "npm run build && npm test"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"mcp",
|
|
33
|
+
"model-context-protocol",
|
|
34
|
+
"sast",
|
|
35
|
+
"security",
|
|
36
|
+
"static-analysis",
|
|
37
|
+
"taint-analysis",
|
|
38
|
+
"circle-ir",
|
|
39
|
+
"cognium",
|
|
40
|
+
"llm-tools",
|
|
41
|
+
"claude"
|
|
42
|
+
],
|
|
43
|
+
"author": {
|
|
44
|
+
"name": "Cognium Labs",
|
|
45
|
+
"url": "https://cognium.dev"
|
|
46
|
+
},
|
|
47
|
+
"license": "MIT",
|
|
48
|
+
"repository": {
|
|
49
|
+
"type": "git",
|
|
50
|
+
"url": "git+https://github.com/cogniumhq/cognium-dev.git",
|
|
51
|
+
"directory": "packages/mcp-server"
|
|
52
|
+
},
|
|
53
|
+
"homepage": "https://github.com/cogniumhq/cognium-dev/tree/main/packages/mcp-server#readme",
|
|
54
|
+
"bugs": {
|
|
55
|
+
"url": "https://github.com/cogniumhq/cognium-dev/issues"
|
|
56
|
+
},
|
|
57
|
+
"engines": {
|
|
58
|
+
"node": ">=20.19.0"
|
|
59
|
+
},
|
|
60
|
+
"publishConfig": {
|
|
61
|
+
"access": "public",
|
|
62
|
+
"registry": "https://registry.npmjs.org/"
|
|
63
|
+
},
|
|
64
|
+
"dependencies": {
|
|
65
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
66
|
+
"circle-ir": "4.9.9",
|
|
67
|
+
"yaml": "^2.8.3",
|
|
68
|
+
"zod": "^3.23.8"
|
|
69
|
+
},
|
|
70
|
+
"devDependencies": {
|
|
71
|
+
"@types/node": "^25.5.0",
|
|
72
|
+
"typescript": "^6.0.2",
|
|
73
|
+
"vitest": "^4.1.2"
|
|
74
|
+
}
|
|
75
|
+
}
|