@perfbase/mcp 1.0.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 (54) hide show
  1. package/README.md +76 -0
  2. package/dist/decoder/decompress.d.ts +25 -0
  3. package/dist/decoder/decompress.d.ts.map +1 -0
  4. package/dist/decoder/decompress.js +79 -0
  5. package/dist/decoder/decompress.js.map +1 -0
  6. package/dist/decoder/trie-walker.d.ts +34 -0
  7. package/dist/decoder/trie-walker.d.ts.map +1 -0
  8. package/dist/decoder/trie-walker.js +159 -0
  9. package/dist/decoder/trie-walker.js.map +1 -0
  10. package/dist/decoder/types.d.ts +188 -0
  11. package/dist/decoder/types.d.ts.map +1 -0
  12. package/dist/decoder/types.js +6 -0
  13. package/dist/decoder/types.js.map +1 -0
  14. package/dist/index.d.ts +9 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +309 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/resources/profile-metadata.d.ts +14 -0
  19. package/dist/resources/profile-metadata.d.ts.map +1 -0
  20. package/dist/resources/profile-metadata.js +41 -0
  21. package/dist/resources/profile-metadata.js.map +1 -0
  22. package/dist/tools/cpu-intensive.d.ts +37 -0
  23. package/dist/tools/cpu-intensive.d.ts.map +1 -0
  24. package/dist/tools/cpu-intensive.js +64 -0
  25. package/dist/tools/cpu-intensive.js.map +1 -0
  26. package/dist/tools/database-queries.d.ts +33 -0
  27. package/dist/tools/database-queries.d.ts.map +1 -0
  28. package/dist/tools/database-queries.js +133 -0
  29. package/dist/tools/database-queries.js.map +1 -0
  30. package/dist/tools/memory-hogs.d.ts +38 -0
  31. package/dist/tools/memory-hogs.d.ts.map +1 -0
  32. package/dist/tools/memory-hogs.js +65 -0
  33. package/dist/tools/memory-hogs.js.map +1 -0
  34. package/dist/tools/most-called.d.ts +36 -0
  35. package/dist/tools/most-called.d.ts.map +1 -0
  36. package/dist/tools/most-called.js +59 -0
  37. package/dist/tools/most-called.js.map +1 -0
  38. package/dist/tools/n-plus-one.d.ts +29 -0
  39. package/dist/tools/n-plus-one.d.ts.map +1 -0
  40. package/dist/tools/n-plus-one.js +137 -0
  41. package/dist/tools/n-plus-one.js.map +1 -0
  42. package/dist/tools/slowest-functions.d.ts +36 -0
  43. package/dist/tools/slowest-functions.d.ts.map +1 -0
  44. package/dist/tools/slowest-functions.js +59 -0
  45. package/dist/tools/slowest-functions.js.map +1 -0
  46. package/dist/tools/summary.d.ts +42 -0
  47. package/dist/tools/summary.d.ts.map +1 -0
  48. package/dist/tools/summary.js +118 -0
  49. package/dist/tools/summary.js.map +1 -0
  50. package/dist/utils/formatting.d.ts +48 -0
  51. package/dist/utils/formatting.d.ts.map +1 -0
  52. package/dist/utils/formatting.js +109 -0
  53. package/dist/utils/formatting.js.map +1 -0
  54. package/package.json +44 -0
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Tool: get_profile_summary
3
+ * Returns overall statistics about the profile
4
+ */
5
+ import { z } from 'zod';
6
+ export declare const summarySchema: z.ZodObject<{
7
+ filePath: z.ZodString;
8
+ }, "strip", z.ZodTypeAny, {
9
+ filePath: string;
10
+ }, {
11
+ filePath: string;
12
+ }>;
13
+ export type SummaryInput = z.infer<typeof summarySchema>;
14
+ export interface ProfileSummary {
15
+ spans: string[];
16
+ totalFunctions: number;
17
+ totalCalls: number;
18
+ totalWallTime: string;
19
+ totalCpuTime: string;
20
+ totalMemoryAllocated: string;
21
+ systemStats?: {
22
+ peakMemory?: string;
23
+ cpuPercent?: number;
24
+ loadAvg1m?: number;
25
+ totalTime?: string;
26
+ };
27
+ attributes?: Record<string, string>;
28
+ topFunctionsByTime: Array<{
29
+ name: string;
30
+ time: string;
31
+ percent: string;
32
+ }>;
33
+ topFunctionsByCalls: Array<{
34
+ name: string;
35
+ calls: number;
36
+ percent: string;
37
+ }>;
38
+ filesReferenced: number;
39
+ }
40
+ export declare function getProfileSummary(input: SummaryInput): Promise<ProfileSummary>;
41
+ export declare function formatSummaryOutput(result: ProfileSummary): string;
42
+ //# sourceMappingURL=summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/tools/summary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,aAAa;;;;;;EAExB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE;QACZ,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,kBAAkB,EAAE,KAAK,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,mBAAmB,EAAE,KAAK,CAAC;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,cAAc,CAAC,CA8DzB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAsDlE"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Tool: get_profile_summary
3
+ * Returns overall statistics about the profile
4
+ */
5
+ import { z } from 'zod';
6
+ import { loadProfile } from '../decoder/decompress.js';
7
+ import { walkTrie, getSpanNames } from '../decoder/trie-walker.js';
8
+ import { formatTime, formatBytes, formatNumber } from '../utils/formatting.js';
9
+ export const summarySchema = z.object({
10
+ filePath: z.string().describe('Path to the PerfBase profile file'),
11
+ });
12
+ export async function getProfileSummary(input) {
13
+ const data = await loadProfile(input.filePath);
14
+ const spans = getSpanNames(data);
15
+ const allFunctions = walkTrie(data);
16
+ // Calculate totals
17
+ const totalCalls = allFunctions.reduce((sum, f) => sum + f.callCount, 0);
18
+ const totalWallTime = allFunctions.reduce((sum, f) => sum + f.totalWallTime, 0);
19
+ const totalCpuTime = allFunctions.reduce((sum, f) => sum + f.totalCpuTime, 0);
20
+ const totalMemory = allFunctions.reduce((sum, f) => sum + f.memoryAllocated, 0);
21
+ // Top 5 by time
22
+ const byTime = [...allFunctions]
23
+ .sort((a, b) => b.totalWallTime - a.totalWallTime)
24
+ .slice(0, 5);
25
+ // Top 5 by calls
26
+ const byCalls = [...allFunctions]
27
+ .sort((a, b) => b.callCount - a.callCount)
28
+ .slice(0, 5);
29
+ // System stats
30
+ const systemStats = data.s
31
+ ? {
32
+ peakMemory: data.s.peak_memory
33
+ ? formatBytes(data.s.peak_memory)
34
+ : undefined,
35
+ cpuPercent: data.s.cpu_percent,
36
+ loadAvg1m: data.s.load_avg_1m,
37
+ totalTime: data.s.total_time_us
38
+ ? formatTime(data.s.total_time_us)
39
+ : undefined,
40
+ }
41
+ : undefined;
42
+ return {
43
+ spans,
44
+ totalFunctions: allFunctions.length,
45
+ totalCalls,
46
+ totalWallTime: formatTime(totalWallTime),
47
+ totalCpuTime: formatTime(totalCpuTime),
48
+ totalMemoryAllocated: formatBytes(totalMemory),
49
+ systemStats,
50
+ attributes: data.a,
51
+ topFunctionsByTime: byTime.map((f) => ({
52
+ name: f.name,
53
+ time: formatTime(f.totalWallTime),
54
+ percent: totalWallTime > 0
55
+ ? `${((f.totalWallTime / totalWallTime) * 100).toFixed(1)}%`
56
+ : '0%',
57
+ })),
58
+ topFunctionsByCalls: byCalls.map((f) => ({
59
+ name: f.name,
60
+ calls: f.callCount,
61
+ percent: totalCalls > 0
62
+ ? `${((f.callCount / totalCalls) * 100).toFixed(1)}%`
63
+ : '0%',
64
+ })),
65
+ filesReferenced: data.f.length,
66
+ };
67
+ }
68
+ export function formatSummaryOutput(result) {
69
+ const lines = [
70
+ `# Profile Summary`,
71
+ ``,
72
+ `## Overview`,
73
+ ``,
74
+ `| Metric | Value |`,
75
+ `|--------|-------|`,
76
+ `| Spans | ${result.spans.join(', ') || 'None'} |`,
77
+ `| Total Functions | ${formatNumber(result.totalFunctions)} |`,
78
+ `| Total Calls | ${formatNumber(result.totalCalls)} |`,
79
+ `| Total Wall Time | ${result.totalWallTime} |`,
80
+ `| Total CPU Time | ${result.totalCpuTime} |`,
81
+ `| Memory Allocated | ${result.totalMemoryAllocated} |`,
82
+ `| Files Referenced | ${result.filesReferenced} |`,
83
+ ``,
84
+ ];
85
+ if (result.systemStats) {
86
+ lines.push(`## System Stats`, ``);
87
+ if (result.systemStats.peakMemory) {
88
+ lines.push(`- **Peak Memory**: ${result.systemStats.peakMemory}`);
89
+ }
90
+ if (result.systemStats.cpuPercent !== undefined) {
91
+ lines.push(`- **CPU Usage**: ${result.systemStats.cpuPercent}%`);
92
+ }
93
+ if (result.systemStats.loadAvg1m !== undefined) {
94
+ lines.push(`- **Load Average (1m)**: ${result.systemStats.loadAvg1m}`);
95
+ }
96
+ if (result.systemStats.totalTime) {
97
+ lines.push(`- **Total Execution Time**: ${result.systemStats.totalTime}`);
98
+ }
99
+ lines.push(``);
100
+ }
101
+ if (result.attributes && Object.keys(result.attributes).length > 0) {
102
+ lines.push(`## Custom Attributes`, ``);
103
+ for (const [key, value] of Object.entries(result.attributes)) {
104
+ lines.push(`- **${key}**: ${value}`);
105
+ }
106
+ lines.push(``);
107
+ }
108
+ lines.push(`## Top 5 Functions by Time`, ``);
109
+ for (const f of result.topFunctionsByTime) {
110
+ lines.push(`- **${f.name}**: ${f.time} (${f.percent})`);
111
+ }
112
+ lines.push(``, `## Top 5 Functions by Call Count`, ``);
113
+ for (const f of result.topFunctionsByCalls) {
114
+ lines.push(`- **${f.name}**: ${formatNumber(f.calls)} calls (${f.percent})`);
115
+ }
116
+ return lines.join('\n');
117
+ }
118
+ //# sourceMappingURL=summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/tools/summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Formatting utilities for human-readable output
3
+ */
4
+ /**
5
+ * Format microseconds to human-readable time
6
+ */
7
+ export declare function formatTime(microseconds: number): string;
8
+ /**
9
+ * Format bytes to human-readable size
10
+ */
11
+ export declare function formatBytes(bytes: number): string;
12
+ /**
13
+ * Format a number with thousand separators
14
+ */
15
+ export declare function formatNumber(num: number): string;
16
+ /**
17
+ * Format percentage
18
+ */
19
+ export declare function formatPercent(value: number, total: number): string;
20
+ /**
21
+ * Truncate a string with ellipsis
22
+ */
23
+ export declare function truncate(str: string, maxLength: number): string;
24
+ /**
25
+ * Format a function location (file:line)
26
+ */
27
+ export declare function formatLocation(file?: string, line?: number): string;
28
+ /**
29
+ * Create a simple ASCII table
30
+ */
31
+ export declare function createTable(headers: string[], rows: string[][], options?: {
32
+ maxWidth?: number;
33
+ }): string;
34
+ /**
35
+ * Format function info for display
36
+ */
37
+ export declare function formatFunctionSummary(info: {
38
+ name: string;
39
+ callPath: string;
40
+ file?: string;
41
+ line?: number;
42
+ callCount: number;
43
+ totalWallTime: number;
44
+ avgWallTime: number;
45
+ totalCpuTime: number;
46
+ memoryAllocated: number;
47
+ }): string;
48
+ //# sourceMappingURL=formatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAQvD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAcjD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGlE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAInE;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,EAAE,EAAE,EAChB,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,MAAM,CAiCR;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,MAAM,CAkBT"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Formatting utilities for human-readable output
3
+ */
4
+ /**
5
+ * Format microseconds to human-readable time
6
+ */
7
+ export function formatTime(microseconds) {
8
+ if (microseconds < 1000) {
9
+ return `${microseconds.toFixed(0)}µs`;
10
+ }
11
+ if (microseconds < 1_000_000) {
12
+ return `${(microseconds / 1000).toFixed(2)}ms`;
13
+ }
14
+ return `${(microseconds / 1_000_000).toFixed(2)}s`;
15
+ }
16
+ /**
17
+ * Format bytes to human-readable size
18
+ */
19
+ export function formatBytes(bytes) {
20
+ const absBytes = Math.abs(bytes);
21
+ const sign = bytes < 0 ? '-' : '';
22
+ if (absBytes < 1024) {
23
+ return `${sign}${absBytes}B`;
24
+ }
25
+ if (absBytes < 1024 * 1024) {
26
+ return `${sign}${(absBytes / 1024).toFixed(2)}KB`;
27
+ }
28
+ if (absBytes < 1024 * 1024 * 1024) {
29
+ return `${sign}${(absBytes / (1024 * 1024)).toFixed(2)}MB`;
30
+ }
31
+ return `${sign}${(absBytes / (1024 * 1024 * 1024)).toFixed(2)}GB`;
32
+ }
33
+ /**
34
+ * Format a number with thousand separators
35
+ */
36
+ export function formatNumber(num) {
37
+ return num.toLocaleString('en-US');
38
+ }
39
+ /**
40
+ * Format percentage
41
+ */
42
+ export function formatPercent(value, total) {
43
+ if (total === 0)
44
+ return '0.00%';
45
+ return `${((value / total) * 100).toFixed(2)}%`;
46
+ }
47
+ /**
48
+ * Truncate a string with ellipsis
49
+ */
50
+ export function truncate(str, maxLength) {
51
+ if (str.length <= maxLength)
52
+ return str;
53
+ return str.slice(0, maxLength - 3) + '...';
54
+ }
55
+ /**
56
+ * Format a function location (file:line)
57
+ */
58
+ export function formatLocation(file, line) {
59
+ if (!file)
60
+ return '';
61
+ if (!line)
62
+ return file;
63
+ return `${file}:${line}`;
64
+ }
65
+ /**
66
+ * Create a simple ASCII table
67
+ */
68
+ export function createTable(headers, rows, options = {}) {
69
+ const maxWidth = options.maxWidth ?? 80;
70
+ // Calculate column widths
71
+ const colWidths = headers.map((h, i) => {
72
+ const maxRowWidth = Math.max(...rows.map((r) => (r[i] ?? '').length));
73
+ return Math.max(h.length, maxRowWidth);
74
+ });
75
+ // Truncate columns to fit
76
+ const totalWidth = colWidths.reduce((a, b) => a + b, 0) + (headers.length - 1) * 3;
77
+ if (totalWidth > maxWidth) {
78
+ // Shrink the longest columns proportionally
79
+ const scale = maxWidth / totalWidth;
80
+ for (let i = 0; i < colWidths.length; i++) {
81
+ colWidths[i] = Math.max(5, Math.floor(colWidths[i] * scale));
82
+ }
83
+ }
84
+ // Build header
85
+ const headerRow = headers
86
+ .map((h, i) => h.padEnd(colWidths[i]).slice(0, colWidths[i]))
87
+ .join(' | ');
88
+ const separator = colWidths.map((w) => '-'.repeat(w)).join('-+-');
89
+ // Build rows
90
+ const dataRows = rows.map((row) => row
91
+ .map((cell, i) => (cell ?? '').padEnd(colWidths[i]).slice(0, colWidths[i]))
92
+ .join(' | '));
93
+ return [headerRow, separator, ...dataRows].join('\n');
94
+ }
95
+ /**
96
+ * Format function info for display
97
+ */
98
+ export function formatFunctionSummary(info) {
99
+ const lines = [
100
+ `**${info.name}**`,
101
+ ` Path: ${info.callPath}`,
102
+ ];
103
+ if (info.file) {
104
+ lines.push(` Location: ${formatLocation(info.file, info.line)}`);
105
+ }
106
+ lines.push(` Calls: ${formatNumber(info.callCount)}`, ` Wall Time: ${formatTime(info.totalWallTime)} total, ${formatTime(info.avgWallTime)} avg`, ` CPU Time: ${formatTime(info.totalCpuTime)} total`, ` Memory: ${formatBytes(info.memoryAllocated)} allocated`);
107
+ return lines.join('\n');
108
+ }
109
+ //# sourceMappingURL=formatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@perfbase/mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for PerfBase profiler analysis",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "perfbase-mcp": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "dev": "tsc --watch",
16
+ "test": "vitest",
17
+ "test:run": "vitest run",
18
+ "start": "node dist/index.js",
19
+ "prepublishOnly": "npm run build"
20
+ },
21
+ "keywords": [
22
+ "mcp",
23
+ "model-context-protocol",
24
+ "profiler",
25
+ "php",
26
+ "performance",
27
+ "perfbase",
28
+ "claude"
29
+ ],
30
+ "license": "MIT",
31
+ "dependencies": {
32
+ "@modelcontextprotocol/sdk": "^1.0.0",
33
+ "@msgpack/msgpack": "^3.0.0",
34
+ "zod": "^3.24.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "^22.0.0",
38
+ "typescript": "^5.7.0",
39
+ "vitest": "^3.0.0"
40
+ },
41
+ "engines": {
42
+ "node": ">=18.0.0"
43
+ }
44
+ }