phpstan-mcp-mx 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/dist/tools.js ADDED
@@ -0,0 +1,237 @@
1
+ import { z } from 'zod';
2
+ import { BaselineError, renderBaseline, summariseBaseline } from './baseline.js';
3
+ import { PhpstanError, analyse } from './phpstan.js';
4
+ import { DEFAULT_LIMIT, MAX_LIMIT, buildReport, renderReport } from './report.js';
5
+ import { ProjectError, discoverProjects, resolveProject, resolveWithin } from './project.js';
6
+ import { ROOTS_ENV_VAR } from './roots.js';
7
+ /**
8
+ * Nullable veld als `anyOf` in plaats van `type: [..., "null"]`. Zod's `.nullable()`
9
+ * levert de array-vorm op; die is geldig JSON Schema, maar meerdere MCP-clients
10
+ * lezen `type` als één string en laten de constraint dan vallen of weigeren de tool.
11
+ *
12
+ * Let op de `z.literal(null)`: zod vouwt zowel `.nullable()` als een union met
13
+ * `z.null()` terug naar diezelfde array-vorm. Alleen de literal levert echt `anyOf`
14
+ * op (met een overbodige maar onschadelijke `const: null` erbij).
15
+ */
16
+ function nullable(schema) {
17
+ return z.union([schema, z.literal(null)]);
18
+ }
19
+ const projectArgument = z
20
+ .string()
21
+ .describe('Absoluut pad naar de projectroot, zoals list_projects het teruggeeft');
22
+ const analysisShape = {
23
+ project: z.string(),
24
+ totals: z.object({ fileErrors: z.number(), generalErrors: z.number() }),
25
+ generalErrors: z
26
+ .array(z.string())
27
+ .describe('Fouten die niet aan een bestand hangen, zoals een crash of configuratiefout'),
28
+ summary: z
29
+ .object({
30
+ filesWithFindings: z.number(),
31
+ byFile: z.array(z.object({ file: z.string(), count: z.number() })),
32
+ byIdentifier: z.array(z.object({ identifier: z.string(), count: z.number() })),
33
+ })
34
+ .describe('Tellingen over álle bevindingen, ook die buiten deze pagina vallen'),
35
+ findings: z.array(z.object({
36
+ file: z.string().describe('Pad relatief aan de projectroot'),
37
+ line: nullable(z.number()),
38
+ message: z.string(),
39
+ identifier: nullable(z.string()),
40
+ tip: nullable(z.string()),
41
+ })),
42
+ page: z
43
+ .object({
44
+ offset: z.number(),
45
+ limit: z.number(),
46
+ returned: z.number(),
47
+ total: z.number(),
48
+ hasMore: z.boolean(),
49
+ })
50
+ .describe('Welk deel van de bevindingen dit antwoord bevat'),
51
+ };
52
+ const windowShape = {
53
+ offset: z.number().int().min(0).optional().describe('Sla de eerste N bevindingen over'),
54
+ limit: z
55
+ .number()
56
+ .int()
57
+ .min(1)
58
+ .max(MAX_LIMIT)
59
+ .optional()
60
+ .describe(`Hoeveel bevindingen dit antwoord bevat (standaard ${String(DEFAULT_LIMIT)})`),
61
+ };
62
+ /** Hangt alle tools aan de server. */
63
+ export function registerTools(server, roots) {
64
+ registerListProjects(server, roots);
65
+ registerAnalyseProject(server, roots);
66
+ registerAnalyseFile(server, roots);
67
+ registerBaselineSummary(server, roots);
68
+ }
69
+ function registerBaselineSummary(server, roots) {
70
+ server.registerTool('baseline_summary', {
71
+ title: 'Baseline samenvatten',
72
+ description: 'Leest de phpstan-baseline*.neon van een project en telt wat er genegeerd wordt, ' +
73
+ 'per identifier en per bestand. Draait geen analyse. Let op: wat hier in staat is ' +
74
+ 'precies wat analyse_project NIET meldt — een project dat zijn baseline includet, ' +
75
+ 'rapporteert alleen de fouten die er nieuw bij komen.',
76
+ inputSchema: { project: projectArgument },
77
+ outputSchema: {
78
+ project: z.string(),
79
+ files: z.array(z.object({ file: z.string(), entries: z.number(), errors: z.number() })),
80
+ totals: z.object({ entries: z.number(), errors: z.number() }),
81
+ byIdentifier: z.array(z.object({ identifier: z.string(), count: z.number() })),
82
+ byPath: z.array(z.object({ path: z.string(), count: z.number() })),
83
+ },
84
+ annotations: readOnly(),
85
+ }, ({ project }) => {
86
+ try {
87
+ const summary = summariseBaseline(resolveProject(project, roots));
88
+ return {
89
+ content: [{ type: 'text', text: renderBaseline(summary) }],
90
+ structuredContent: { ...summary },
91
+ };
92
+ }
93
+ catch (error) {
94
+ return toFailure(error);
95
+ }
96
+ });
97
+ }
98
+ function registerListProjects(server, roots) {
99
+ server.registerTool('list_projects', {
100
+ title: 'PHP-projecten opsommen',
101
+ description: 'Somt de PHP-projecten op die deze server mag analyseren, met per project of ' +
102
+ 'PHPStan geïnstalleerd is en welk configbestand er ligt. Gebruik het `path` uit ' +
103
+ 'het resultaat als `project`-argument voor de andere tools.',
104
+ inputSchema: {},
105
+ outputSchema: {
106
+ projects: z.array(z.object({
107
+ path: z.string(),
108
+ root: z.string(),
109
+ hasPhpstan: z.boolean(),
110
+ config: nullable(z.string()),
111
+ })),
112
+ problems: z.array(z.object({ root: z.string(), problem: z.string() })),
113
+ },
114
+ annotations: readOnly(),
115
+ }, () => {
116
+ if (roots.length === 0) {
117
+ return failure(`Er zijn geen projectmappen geconfigureerd. Zet ${ROOTS_ENV_VAR} in de ` +
118
+ 'MCP-serverconfiguratie op de absolute paden die geanalyseerd mogen worden, ' +
119
+ 'gescheiden door een dubbele punt.');
120
+ }
121
+ const projects = discoverProjects(roots);
122
+ const problems = roots
123
+ .filter((root) => root.problem !== null)
124
+ .map((root) => ({ root: root.raw, problem: root.problem }));
125
+ return {
126
+ content: [{ type: 'text', text: renderProjects(projects, problems) }],
127
+ structuredContent: { projects, problems },
128
+ };
129
+ });
130
+ }
131
+ function registerAnalyseProject(server, roots) {
132
+ server.registerTool('analyse_project', {
133
+ title: 'Project analyseren',
134
+ description: 'Draait PHPStan over (een deel van) een project en geeft de bevindingen terug. ' +
135
+ 'Zonder `paths` wordt geanalyseerd wat in phpstan.neon staat.',
136
+ inputSchema: {
137
+ project: projectArgument,
138
+ paths: z
139
+ .array(z.string())
140
+ .optional()
141
+ .describe('Paden binnen het project; leeg betekent: volg de configuratie'),
142
+ level: z.string().optional().describe('Level-override, 0 t/m 10 of "max"'),
143
+ memoryLimit: z.string().optional().describe('Bijv. "1G", als PHPStan op de PHP-limiet klapt'),
144
+ timeoutSeconds: z.number().int().positive().max(1800).optional(),
145
+ ...windowShape,
146
+ },
147
+ outputSchema: analysisShape,
148
+ annotations: readOnly(),
149
+ }, async ({ project, paths, level, memoryLimit, timeoutSeconds, offset, limit }) => runAnalysis(roots, project, {
150
+ ...(paths === undefined ? {} : { paths }),
151
+ ...(level === undefined ? {} : { level }),
152
+ ...(memoryLimit === undefined ? {} : { memoryLimit }),
153
+ ...(timeoutSeconds === undefined ? {} : { timeoutMs: timeoutSeconds * 1000 }),
154
+ }, { offset, limit }));
155
+ }
156
+ function registerAnalyseFile(server, roots) {
157
+ server.registerTool('analyse_file', {
158
+ title: 'Bestand of map analyseren',
159
+ description: 'Draait PHPStan over één bestand of map binnen een project. Het pad mag relatief ' +
160
+ 'aan de projectroot zijn of absoluut, maar moet binnen het project liggen.',
161
+ inputSchema: {
162
+ project: projectArgument,
163
+ path: z.string().describe('Bestand of map binnen het project, bijv. "app/Models/User.php"'),
164
+ level: z.string().optional().describe('Level-override, 0 t/m 10 of "max"'),
165
+ memoryLimit: z.string().optional(),
166
+ timeoutSeconds: z.number().int().positive().max(1800).optional(),
167
+ ...windowShape,
168
+ },
169
+ outputSchema: analysisShape,
170
+ annotations: readOnly(),
171
+ }, async ({ project, path, level, memoryLimit, timeoutSeconds, offset, limit }) => {
172
+ try {
173
+ const resolved = resolveProject(project, roots);
174
+ const target = resolveWithin(resolved, path);
175
+ return await runAnalysis(roots, project, {
176
+ paths: [target],
177
+ ...(level === undefined ? {} : { level }),
178
+ ...(memoryLimit === undefined ? {} : { memoryLimit }),
179
+ ...(timeoutSeconds === undefined ? {} : { timeoutMs: timeoutSeconds * 1000 }),
180
+ }, { offset, limit });
181
+ }
182
+ catch (error) {
183
+ return toFailure(error);
184
+ }
185
+ });
186
+ }
187
+ async function runAnalysis(roots, project, options, window) {
188
+ try {
189
+ const resolved = resolveProject(project, roots);
190
+ const result = await analyse(resolved, options);
191
+ const report = buildReport(result, window);
192
+ return {
193
+ content: [{ type: 'text', text: renderReport(report) }],
194
+ structuredContent: { ...report },
195
+ };
196
+ }
197
+ catch (error) {
198
+ return toFailure(error);
199
+ }
200
+ }
201
+ function renderProjects(projects, problems) {
202
+ const lines = [];
203
+ if (projects.length === 0) {
204
+ lines.push('Geen PHP-projecten gevonden onder de geconfigureerde mappen.');
205
+ }
206
+ else {
207
+ lines.push(`${projects.length} project(en):`);
208
+ for (const project of projects) {
209
+ const config = project.config ?? 'geen config';
210
+ const phpstan = project.hasPhpstan ? 'phpstan aanwezig' : 'phpstan NIET geïnstalleerd';
211
+ lines.push(`- ${project.path} (${phpstan}, ${config})`);
212
+ }
213
+ }
214
+ if (problems.length > 0) {
215
+ lines.push('', 'Overgeslagen regels uit de configuratie:');
216
+ for (const problem of problems)
217
+ lines.push(`- ${problem.root}: ${problem.problem}`);
218
+ }
219
+ return lines.join('\n');
220
+ }
221
+ /**
222
+ * Analyseren verandert de broncode niet. PHPStan schrijft wel zijn resultcache weg,
223
+ * maar dat is geen wijziging waar de gebruiker iets van merkt.
224
+ */
225
+ function readOnly() {
226
+ return { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false };
227
+ }
228
+ function toFailure(error) {
229
+ if (error instanceof ProjectError || error instanceof PhpstanError || error instanceof BaselineError) {
230
+ return failure(error.message);
231
+ }
232
+ throw error;
233
+ }
234
+ function failure(text) {
235
+ return { isError: true, content: [{ type: 'text', text }] };
236
+ }
237
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEjF,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7F,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAS3C;;;;;;;;GAQG;AACH,SAAS,QAAQ,CAAsB,MAAS;IAC9C,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,eAAe,GAAG,CAAC;KACtB,MAAM,EAAE;KACR,QAAQ,CAAC,sEAAsE,CAAC,CAAC;AAEpF,MAAM,aAAa,GAAG;IACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACvE,aAAa,EAAE,CAAC;SACb,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,CAAC,6EAA6E,CAAC;IAC1F,OAAO,EAAE,CAAC;SACP,MAAM,CAAC;QACN,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE;QAC7B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAClE,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;KAC/E,CAAC;SACD,QAAQ,CAAC,oEAAoE,CAAC;IACjF,QAAQ,EAAE,CAAC,CAAC,KAAK,CACf,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAC5D,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAChC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC1B,CAAC,CACH;IACD,IAAI,EAAE,CAAC;SACJ,MAAM,CAAC;QACN,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;KACrB,CAAC;SACD,QAAQ,CAAC,iDAAiD,CAAC;CAC/D,CAAC;AAEF,MAAM,WAAW,GAAG;IAClB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IACvF,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,SAAS,CAAC;SACd,QAAQ,EAAE;SACV,QAAQ,CAAC,qDAAqD,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC;CAC3F,CAAC;AAEF,sCAAsC;AACtC,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,KAAa;IAC5D,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpC,sBAAsB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACtC,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACnC,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAiB,EAAE,KAAa;IAC/D,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACT,kFAAkF;YAClF,mFAAmF;YACnF,mFAAmF;YACnF,sDAAsD;QACxD,WAAW,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE;QACzC,YAAY,EAAE;YACZ,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;YACnB,KAAK,EAAE,CAAC,CAAC,KAAK,CACZ,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACxE;YACD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7D,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9E,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SACnE;QACD,WAAW,EAAE,QAAQ,EAAE;KACxB,EACD,CAAC,EAAE,OAAO,EAAE,EAAc,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,iBAAiB,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YAClE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1D,iBAAiB,EAAE,EAAE,GAAG,OAAO,EAAE;aAClC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAiB,EAAE,KAAa;IAC5D,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EACT,8EAA8E;YAC9E,iFAAiF;YACjF,4DAA4D;QAC9D,WAAW,EAAE,EAAE;QACf,YAAY,EAAE;YACZ,QAAQ,EAAE,CAAC,CAAC,KAAK,CACf,CAAC,CAAC,MAAM,CAAC;gBACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;gBAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;gBAChB,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE;gBACvB,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aAC7B,CAAC,CACH;YACD,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SACvE;QACD,WAAW,EAAE,QAAQ,EAAE;KACxB,EACD,GAAe,EAAE;QACf,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,OAAO,CACZ,kDAAkD,aAAa,SAAS;gBACtE,6EAA6E;gBAC7E,mCAAmC,CACtC,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,KAAK;aACnB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;aACvC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAiB,EAAE,CAAC,CAAC,CAAC;QAExE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;YACrE,iBAAiB,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;SAC1C,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAiB,EAAE,KAAa;IAC9D,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,gFAAgF;YAChF,8DAA8D;QAChE,WAAW,EAAE;YACX,OAAO,EAAE,eAAe;YACxB,KAAK,EAAE,CAAC;iBACL,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;iBACjB,QAAQ,EAAE;iBACV,QAAQ,CAAC,+DAA+D,CAAC;YAC5E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YAC1E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;YAC7F,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;YAChE,GAAG,WAAW;SACf;QACD,YAAY,EAAE,aAAa;QAC3B,WAAW,EAAE,QAAQ,EAAE;KACxB,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,EAAuB,EAAE,CACnG,WAAW,CACT,KAAK,EACL,OAAO,EACP;QACE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACzC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACzC,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QACrD,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,cAAc,GAAG,IAAI,EAAE,CAAC;KAC9E,EACD,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB,CACJ,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAiB,EAAE,KAAa;IAC3D,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,2BAA2B;QAClC,WAAW,EACT,kFAAkF;YAClF,2EAA2E;QAC7E,WAAW,EAAE;YACX,OAAO,EAAE,eAAe;YACxB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;YAC3F,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YAC1E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAClC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;YAChE,GAAG,WAAW;SACf;QACD,YAAY,EAAE,aAAa;QAC3B,WAAW,EAAE,QAAQ,EAAE;KACxB,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,EAAuB,EAAE;QAClG,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAE7C,OAAO,MAAM,WAAW,CACtB,KAAK,EACL,OAAO,EACP;gBACE,KAAK,EAAE,CAAC,MAAM,CAAC;gBACf,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;gBACzC,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;gBACrD,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,cAAc,GAAG,IAAI,EAAE,CAAC;aAC9E,EACD,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,KAAa,EACb,OAAe,EACf,OAAuB,EACvB,MAAc;IAEd,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAE3C,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YACvD,iBAAiB,EAAE,EAAE,GAAG,MAAM,EAAE;SACjC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACrB,QAAiF,EACjF,QAAsD;IAEtD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAC7E,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,eAAe,CAAC,CAAC;QAC9C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;YAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,4BAA4B,CAAC;YACvF,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,KAAK,OAAO,KAAK,MAAM,GAAG,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,0CAA0C,CAAC,CAAC;QAC3D,KAAK,MAAM,OAAO,IAAI,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,SAAS,QAAQ;IACf,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;AACpG,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;QACrG,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,KAAK,CAAC;AACd,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC9D,CAAC"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "phpstan-mcp-mx",
3
+ "version": "0.1.0",
4
+ "description": "MCP-server die PHPStan ontsluit als tools, voor meerdere PHP-projecten tegelijk",
5
+ "keywords": [
6
+ "mcp",
7
+ "model-context-protocol",
8
+ "phpstan",
9
+ "php",
10
+ "static-analysis",
11
+ "laravel",
12
+ "larastan"
13
+ ],
14
+ "author": "Martijn Schimmel",
15
+ "license": "MIT",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+ssh://git@codeberg.org/MartijnSchimmel/phpstan-mcp-mx.git"
19
+ },
20
+ "bugs": {
21
+ "url": "https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx/issues"
22
+ },
23
+ "homepage": "https://codeberg.org/MartijnSchimmel/phpstan-mcp-mx",
24
+ "type": "module",
25
+ "bin": {
26
+ "phpstan-mcp-mx": "dist/index.js"
27
+ },
28
+ "files": [
29
+ "dist"
30
+ ],
31
+ "engines": {
32
+ "node": ">=20"
33
+ },
34
+ "scripts": {
35
+ "build": "tsc -p tsconfig.build.json",
36
+ "watch": "tsc --watch",
37
+ "start": "node dist/index.js",
38
+ "inspect": "npm run build && npx @modelcontextprotocol/inspector node dist/index.js",
39
+ "typecheck": "tsc --noEmit",
40
+ "test": "vitest run",
41
+ "test:watch": "vitest",
42
+ "lint": "eslint .",
43
+ "lint:fix": "eslint . --fix",
44
+ "prepublishOnly": "npm run lint && npm run typecheck && npm test && npm run build"
45
+ },
46
+ "dependencies": {
47
+ "@modelcontextprotocol/sdk": "^1.30.0",
48
+ "zod": "^4.5.4"
49
+ },
50
+ "devDependencies": {
51
+ "@eslint/js": "^10.0.1",
52
+ "@types/node": "^24.0.0",
53
+ "eslint": "^10.10.0",
54
+ "eslint-plugin-jsdoc": "^64.3.8",
55
+ "typescript": "^6.0.3",
56
+ "typescript-eslint": "^8.70.0",
57
+ "vitest": "^5.0.0"
58
+ }
59
+ }