flutter-devtools-mcp 0.3.1

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 (130) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +208 -0
  3. package/README.zh-CN.md +292 -0
  4. package/dist/index.d.ts +3 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +55 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/services/ai-analysis.d.ts +6 -0
  9. package/dist/services/ai-analysis.d.ts.map +1 -0
  10. package/dist/services/ai-analysis.js +728 -0
  11. package/dist/services/ai-analysis.js.map +1 -0
  12. package/dist/services/collect-progress.d.ts +6 -0
  13. package/dist/services/collect-progress.d.ts.map +1 -0
  14. package/dist/services/collect-progress.js +23 -0
  15. package/dist/services/collect-progress.js.map +1 -0
  16. package/dist/services/cpu-profiler-service.d.ts +42 -0
  17. package/dist/services/cpu-profiler-service.d.ts.map +1 -0
  18. package/dist/services/cpu-profiler-service.js +208 -0
  19. package/dist/services/cpu-profiler-service.js.map +1 -0
  20. package/dist/services/cpu-symbol-filter.d.ts +10 -0
  21. package/dist/services/cpu-symbol-filter.d.ts.map +1 -0
  22. package/dist/services/cpu-symbol-filter.js +90 -0
  23. package/dist/services/cpu-symbol-filter.js.map +1 -0
  24. package/dist/services/http-profile-parser.d.ts +4 -0
  25. package/dist/services/http-profile-parser.d.ts.map +1 -0
  26. package/dist/services/http-profile-parser.js +71 -0
  27. package/dist/services/http-profile-parser.js.map +1 -0
  28. package/dist/services/json-parse-aggregate.d.ts +30 -0
  29. package/dist/services/json-parse-aggregate.d.ts.map +1 -0
  30. package/dist/services/json-parse-aggregate.js +155 -0
  31. package/dist/services/json-parse-aggregate.js.map +1 -0
  32. package/dist/services/network-aggregate.d.ts +50 -0
  33. package/dist/services/network-aggregate.d.ts.map +1 -0
  34. package/dist/services/network-aggregate.js +185 -0
  35. package/dist/services/network-aggregate.js.map +1 -0
  36. package/dist/services/network-capture-service.d.ts +50 -0
  37. package/dist/services/network-capture-service.d.ts.map +1 -0
  38. package/dist/services/network-capture-service.js +187 -0
  39. package/dist/services/network-capture-service.js.map +1 -0
  40. package/dist/services/network-capture.d.ts +2 -0
  41. package/dist/services/network-capture.d.ts.map +1 -0
  42. package/dist/services/network-capture.js +2 -0
  43. package/dist/services/network-capture.js.map +1 -0
  44. package/dist/services/performance-session.d.ts +41 -0
  45. package/dist/services/performance-session.d.ts.map +1 -0
  46. package/dist/services/performance-session.js +697 -0
  47. package/dist/services/performance-session.js.map +1 -0
  48. package/dist/services/performance-thresholds.d.ts +17 -0
  49. package/dist/services/performance-thresholds.d.ts.map +1 -0
  50. package/dist/services/performance-thresholds.js +19 -0
  51. package/dist/services/performance-thresholds.js.map +1 -0
  52. package/dist/services/profiler.d.ts +71 -0
  53. package/dist/services/profiler.d.ts.map +1 -0
  54. package/dist/services/profiler.js +314 -0
  55. package/dist/services/profiler.js.map +1 -0
  56. package/dist/services/rebuild-business-resolver.d.ts +24 -0
  57. package/dist/services/rebuild-business-resolver.d.ts.map +1 -0
  58. package/dist/services/rebuild-business-resolver.js +599 -0
  59. package/dist/services/rebuild-business-resolver.js.map +1 -0
  60. package/dist/services/rebuild-tracker-service.d.ts +45 -0
  61. package/dist/services/rebuild-tracker-service.d.ts.map +1 -0
  62. package/dist/services/rebuild-tracker-service.js +196 -0
  63. package/dist/services/rebuild-tracker-service.js.map +1 -0
  64. package/dist/services/session-types.d.ts +240 -0
  65. package/dist/services/session-types.d.ts.map +1 -0
  66. package/dist/services/session-types.js +180 -0
  67. package/dist/services/session-types.js.map +1 -0
  68. package/dist/services/threshold-alerts.d.ts +49 -0
  69. package/dist/services/threshold-alerts.d.ts.map +1 -0
  70. package/dist/services/threshold-alerts.js +258 -0
  71. package/dist/services/threshold-alerts.js.map +1 -0
  72. package/dist/services/timeline-cpu-parser.d.ts +28 -0
  73. package/dist/services/timeline-cpu-parser.d.ts.map +1 -0
  74. package/dist/services/timeline-cpu-parser.js +174 -0
  75. package/dist/services/timeline-cpu-parser.js.map +1 -0
  76. package/dist/services/timeline-extras.d.ts +61 -0
  77. package/dist/services/timeline-extras.d.ts.map +1 -0
  78. package/dist/services/timeline-extras.js +449 -0
  79. package/dist/services/timeline-extras.js.map +1 -0
  80. package/dist/services/vm-service-client.d.ts +123 -0
  81. package/dist/services/vm-service-client.d.ts.map +1 -0
  82. package/dist/services/vm-service-client.js +418 -0
  83. package/dist/services/vm-service-client.js.map +1 -0
  84. package/dist/tools/connection.d.ts +4 -0
  85. package/dist/tools/connection.d.ts.map +1 -0
  86. package/dist/tools/connection.js +127 -0
  87. package/dist/tools/connection.js.map +1 -0
  88. package/dist/tools/debug-actions.d.ts +4 -0
  89. package/dist/tools/debug-actions.d.ts.map +1 -0
  90. package/dist/tools/debug-actions.js +210 -0
  91. package/dist/tools/debug-actions.js.map +1 -0
  92. package/dist/tools/discover.d.ts +4 -0
  93. package/dist/tools/discover.d.ts.map +1 -0
  94. package/dist/tools/discover.js +183 -0
  95. package/dist/tools/discover.js.map +1 -0
  96. package/dist/tools/memory.d.ts +4 -0
  97. package/dist/tools/memory.d.ts.map +1 -0
  98. package/dist/tools/memory.js +145 -0
  99. package/dist/tools/memory.js.map +1 -0
  100. package/dist/tools/network.d.ts +4 -0
  101. package/dist/tools/network.d.ts.map +1 -0
  102. package/dist/tools/network.js +265 -0
  103. package/dist/tools/network.js.map +1 -0
  104. package/dist/tools/performance-session.d.ts +4 -0
  105. package/dist/tools/performance-session.d.ts.map +1 -0
  106. package/dist/tools/performance-session.js +105 -0
  107. package/dist/tools/performance-session.js.map +1 -0
  108. package/dist/tools/profiling.d.ts +5 -0
  109. package/dist/tools/profiling.d.ts.map +1 -0
  110. package/dist/tools/profiling.js +142 -0
  111. package/dist/tools/profiling.js.map +1 -0
  112. package/dist/tools/rebuild-tracker.d.ts +4 -0
  113. package/dist/tools/rebuild-tracker.d.ts.map +1 -0
  114. package/dist/tools/rebuild-tracker.js +228 -0
  115. package/dist/tools/rebuild-tracker.js.map +1 -0
  116. package/dist/tools/snapshot-diff.d.ts +4 -0
  117. package/dist/tools/snapshot-diff.d.ts.map +1 -0
  118. package/dist/tools/snapshot-diff.js +235 -0
  119. package/dist/tools/snapshot-diff.js.map +1 -0
  120. package/dist/tools/widget-tree.d.ts +4 -0
  121. package/dist/tools/widget-tree.d.ts.map +1 -0
  122. package/dist/tools/widget-tree.js +156 -0
  123. package/dist/tools/widget-tree.js.map +1 -0
  124. package/docs/README.md +9 -0
  125. package/docs/performance-audit-requirements.md +403 -0
  126. package/docs/performance-metrics-guide.md +207 -0
  127. package/docs/performance-session-simple-design.md +399 -0
  128. package/examples/app_network_image.dart +242 -0
  129. package/examples/app_network_image_README.md +51 -0
  130. package/package.json +69 -0
@@ -0,0 +1,210 @@
1
+ import { z } from "zod";
2
+ export function registerDebugActionTools(server, client) {
3
+ server.tool("hot_reload", "Trigger a hot reload on the running Flutter app. Injects updated source code without restarting the app or losing state.", {}, async () => {
4
+ if (!client.connected) {
5
+ return {
6
+ content: [
7
+ {
8
+ type: "text",
9
+ text: "Not connected. Use the `connect` tool first.",
10
+ },
11
+ ],
12
+ isError: true,
13
+ };
14
+ }
15
+ try {
16
+ await client.hotReload();
17
+ return {
18
+ content: [
19
+ {
20
+ type: "text",
21
+ text: "✅ Hot reload triggered successfully.",
22
+ },
23
+ ],
24
+ };
25
+ }
26
+ catch (error) {
27
+ return {
28
+ content: [
29
+ {
30
+ type: "text",
31
+ text: `Failed to hot reload: ${error instanceof Error ? error.message : String(error)}`,
32
+ },
33
+ ],
34
+ isError: true,
35
+ };
36
+ }
37
+ });
38
+ server.tool("hot_restart", "Trigger a hot restart on the running Flutter app. Restarts the app from scratch but is faster than a full rebuild.", {}, async () => {
39
+ if (!client.connected) {
40
+ return {
41
+ content: [
42
+ {
43
+ type: "text",
44
+ text: "Not connected. Use the `connect` tool first.",
45
+ },
46
+ ],
47
+ isError: true,
48
+ };
49
+ }
50
+ try {
51
+ await client.hotRestart();
52
+ return {
53
+ content: [
54
+ {
55
+ type: "text",
56
+ text: "✅ Hot restart triggered successfully.",
57
+ },
58
+ ],
59
+ };
60
+ }
61
+ catch (error) {
62
+ return {
63
+ content: [
64
+ {
65
+ type: "text",
66
+ text: `Failed to hot restart: ${error instanceof Error ? error.message : String(error)}`,
67
+ },
68
+ ],
69
+ isError: true,
70
+ };
71
+ }
72
+ });
73
+ server.tool("take_screenshot", "Capture a screenshot of the running Flutter app. Returns the screenshot as a base64-encoded PNG image.", {}, async () => {
74
+ if (!client.connected) {
75
+ return {
76
+ content: [
77
+ {
78
+ type: "text",
79
+ text: "Not connected. Use the `connect` tool first.",
80
+ },
81
+ ],
82
+ isError: true,
83
+ };
84
+ }
85
+ try {
86
+ const result = (await client.screenshot());
87
+ if (result?.screenshot) {
88
+ return {
89
+ content: [
90
+ {
91
+ type: "image",
92
+ data: result.screenshot,
93
+ mimeType: "image/png",
94
+ },
95
+ ],
96
+ };
97
+ }
98
+ return {
99
+ content: [
100
+ {
101
+ type: "text",
102
+ text: "Screenshot captured but no image data was returned. This may not be supported in the current Flutter configuration.",
103
+ },
104
+ ],
105
+ };
106
+ }
107
+ catch (error) {
108
+ return {
109
+ content: [
110
+ {
111
+ type: "text",
112
+ text: `Failed to take screenshot: ${error instanceof Error ? error.message : String(error)}`,
113
+ },
114
+ ],
115
+ isError: true,
116
+ };
117
+ }
118
+ });
119
+ server.tool("toggle_debug_paint", "Toggle the debug paint overlay on the Flutter app. Shows widget borders, padding, and alignment guides.", {}, async () => {
120
+ if (!client.connected) {
121
+ return {
122
+ content: [
123
+ {
124
+ type: "text",
125
+ text: "Not connected. Use the `connect` tool first.",
126
+ },
127
+ ],
128
+ isError: true,
129
+ };
130
+ }
131
+ try {
132
+ const result = (await client.toggleDebugPaint());
133
+ const state = result?.enabled ? "ON" : "OFF";
134
+ return {
135
+ content: [
136
+ {
137
+ type: "text",
138
+ text: `Debug paint overlay toggled ${state}.`,
139
+ },
140
+ ],
141
+ };
142
+ }
143
+ catch (error) {
144
+ return {
145
+ content: [
146
+ {
147
+ type: "text",
148
+ text: `Failed to toggle debug paint: ${error instanceof Error ? error.message : String(error)}`,
149
+ },
150
+ ],
151
+ isError: true,
152
+ };
153
+ }
154
+ });
155
+ server.tool("evaluate_expression", "Evaluate a Dart expression in the context of the running Flutter app. Useful for inspecting runtime values, checking state, or running diagnostics.", {
156
+ expression: z
157
+ .string()
158
+ .describe("The Dart expression to evaluate (e.g., 'MediaQuery.of(context).size', 'MyClass.instance.someValue')"),
159
+ }, async ({ expression }) => {
160
+ if (!client.connected) {
161
+ return {
162
+ content: [
163
+ {
164
+ type: "text",
165
+ text: "Not connected. Use the `connect` tool first.",
166
+ },
167
+ ],
168
+ isError: true,
169
+ };
170
+ }
171
+ try {
172
+ const result = (await client.evaluate(expression));
173
+ if (result.kind === "Error" || result.type === "@Error") {
174
+ return {
175
+ content: [
176
+ {
177
+ type: "text",
178
+ text: `Evaluation error: ${result.valueAsString ?? JSON.stringify(result)}`,
179
+ },
180
+ ],
181
+ isError: true,
182
+ };
183
+ }
184
+ return {
185
+ content: [
186
+ {
187
+ type: "text",
188
+ text: JSON.stringify({
189
+ expression,
190
+ result: result.valueAsString ?? "void",
191
+ type: result.class?.name ?? result.kind ?? "unknown",
192
+ }, null, 2),
193
+ },
194
+ ],
195
+ };
196
+ }
197
+ catch (error) {
198
+ return {
199
+ content: [
200
+ {
201
+ type: "text",
202
+ text: `Failed to evaluate expression: ${error instanceof Error ? error.message : String(error)}`,
203
+ },
204
+ ],
205
+ isError: true,
206
+ };
207
+ }
208
+ });
209
+ }
210
+ //# sourceMappingURL=debug-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-actions.js","sourceRoot":"","sources":["../../src/tools/debug-actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { FlutterVmServiceClient } from "../services/vm-service-client.js";
3
+ export declare function registerDiscoverTools(server: McpServer, client: FlutterVmServiceClient): void;
4
+ //# sourceMappingURL=discover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/tools/discover.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAgH1E,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,sBAAsB,QAsG/B"}
@@ -0,0 +1,183 @@
1
+ import { z } from "zod";
2
+ import { exec } from "child_process";
3
+ import { promisify } from "util";
4
+ const execAsync = promisify(exec);
5
+ async function findFlutterProcesses() {
6
+ const apps = [];
7
+ try {
8
+ const { stdout } = await execAsync("ps aux | grep -E 'dart|flutter' | grep -v grep", { timeout: 5000 });
9
+ const vmServicePattern = /http:\/\/127\.0\.0\.1:\d+\/[A-Za-z0-9_\-+=]+\//g;
10
+ const pidPattern = /^\S+\s+(\d+)/;
11
+ for (const line of stdout.split("\n")) {
12
+ const uris = line.match(vmServicePattern);
13
+ const pidMatch = line.match(pidPattern);
14
+ if (uris && pidMatch) {
15
+ for (const uri of uris) {
16
+ apps.push({
17
+ vmServiceUri: uri,
18
+ pid: parseInt(pidMatch[1], 10),
19
+ });
20
+ }
21
+ }
22
+ }
23
+ }
24
+ catch {
25
+ // ps not available or no processes
26
+ }
27
+ if (apps.length === 0) {
28
+ try {
29
+ const { stdout } = await execAsync("cat /tmp/flutter_tools.*/vmservice.json 2>/dev/null || " +
30
+ "cat $TMPDIR/flutter_tools.*/vmservice.json 2>/dev/null || " +
31
+ "echo ''", { timeout: 3000 });
32
+ if (stdout.trim()) {
33
+ for (const line of stdout.trim().split("\n")) {
34
+ try {
35
+ const data = JSON.parse(line);
36
+ if (data.uri) {
37
+ apps.push({
38
+ vmServiceUri: data.uri,
39
+ pid: data.pid ?? 0,
40
+ platform: data.platform,
41
+ });
42
+ }
43
+ }
44
+ catch {
45
+ // not valid JSON
46
+ }
47
+ }
48
+ }
49
+ }
50
+ catch {
51
+ // temp files not available
52
+ }
53
+ }
54
+ if (apps.length === 0) {
55
+ const commonPorts = [
56
+ ...Array.from({ length: 100 }, (_, i) => 50000 + i),
57
+ ...Array.from({ length: 50 }, (_, i) => 8080 + i),
58
+ ...Array.from({ length: 50 }, (_, i) => 9100 + i),
59
+ ];
60
+ const scanPort = async (port) => {
61
+ try {
62
+ const response = await fetch(`http://127.0.0.1:${port}`, {
63
+ signal: AbortSignal.timeout(300),
64
+ });
65
+ const text = await response.text();
66
+ if (text.includes("Dart") || text.includes("vm_service")) {
67
+ return `http://127.0.0.1:${port}/`;
68
+ }
69
+ }
70
+ catch {
71
+ // port not open or not Dart
72
+ }
73
+ return null;
74
+ };
75
+ const batchSize = 30;
76
+ for (let i = 0; i < commonPorts.length; i += batchSize) {
77
+ const batch = commonPorts.slice(i, i + batchSize);
78
+ const results = await Promise.all(batch.map(scanPort));
79
+ for (const uri of results) {
80
+ if (uri) {
81
+ apps.push({ vmServiceUri: uri, pid: 0 });
82
+ }
83
+ }
84
+ if (apps.length > 0)
85
+ break;
86
+ }
87
+ }
88
+ const seen = new Set();
89
+ return apps.filter((app) => {
90
+ if (seen.has(app.vmServiceUri))
91
+ return false;
92
+ seen.add(app.vmServiceUri);
93
+ return true;
94
+ });
95
+ }
96
+ export function registerDiscoverTools(server, client) {
97
+ server.tool("discover_apps", "Automatically discover running Flutter apps on this machine. Scans for Dart VM Service instances so you don't have to manually copy the URI. If an app is found, you can connect to it directly.", {
98
+ autoConnect: z
99
+ .boolean()
100
+ .default(true)
101
+ .describe("Automatically connect to the first discovered app (default: true)"),
102
+ }, async ({ autoConnect }) => {
103
+ try {
104
+ const apps = await findFlutterProcesses();
105
+ if (apps.length === 0) {
106
+ return {
107
+ content: [
108
+ {
109
+ type: "text",
110
+ text: "No running Flutter apps found.\n\nMake sure your app is running with:\n flutter run\n flutter run --profile\n\nThe VM Service URI is printed in the terminal when the app starts.",
111
+ },
112
+ ],
113
+ };
114
+ }
115
+ if (autoConnect && !client.connected) {
116
+ try {
117
+ const vmInfo = await client.connect(apps[0].vmServiceUri);
118
+ const mainIsolate = vmInfo.isolates.find((i) => !i.isSystemIsolate);
119
+ return {
120
+ content: [
121
+ {
122
+ type: "text",
123
+ text: [
124
+ `Found ${apps.length} Flutter app(s). Auto-connected to:`,
125
+ "",
126
+ ` URI: ${apps[0].vmServiceUri}`,
127
+ ` PID: ${apps[0].pid || "unknown"}`,
128
+ ` VM: ${vmInfo.version}`,
129
+ ` OS: ${vmInfo.operatingSystem}`,
130
+ ` Isolate: ${mainIsolate?.name ?? "unknown"}`,
131
+ "",
132
+ apps.length > 1
133
+ ? `Other apps found:\n${apps
134
+ .slice(1)
135
+ .map((a) => ` • ${a.vmServiceUri} (PID: ${a.pid})`)
136
+ .join("\n")}\n\nUse the \`connect\` tool to switch to a different app.`
137
+ : "Ready to inspect.",
138
+ ].join("\n"),
139
+ },
140
+ ],
141
+ };
142
+ }
143
+ catch (err) {
144
+ return {
145
+ content: [
146
+ {
147
+ type: "text",
148
+ text: `Found app at ${apps[0].vmServiceUri} but failed to connect: ${err instanceof Error ? err.message : String(err)}\n\nTry connecting manually with the \`connect\` tool.`,
149
+ },
150
+ ],
151
+ isError: true,
152
+ };
153
+ }
154
+ }
155
+ return {
156
+ content: [
157
+ {
158
+ type: "text",
159
+ text: [
160
+ `Found ${apps.length} running Flutter app(s):`,
161
+ "",
162
+ ...apps.map((a, i) => ` ${i + 1}. ${a.vmServiceUri} (PID: ${a.pid || "unknown"}${a.platform ? `, ${a.platform}` : ""})`),
163
+ "",
164
+ "Use the `connect` tool with one of these URIs.",
165
+ ].join("\n"),
166
+ },
167
+ ],
168
+ };
169
+ }
170
+ catch (error) {
171
+ return {
172
+ content: [
173
+ {
174
+ type: "text",
175
+ text: `Failed to discover apps: ${error instanceof Error ? error.message : String(error)}`,
176
+ },
177
+ ],
178
+ isError: true,
179
+ };
180
+ }
181
+ });
182
+ }
183
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/tools/discover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { FlutterVmServiceClient } from "../services/vm-service-client.js";
3
+ export declare function registerMemoryTools(server: McpServer, client: FlutterVmServiceClient): void;
4
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/tools/memory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAU1E,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,sBAAsB,QAsL/B"}
@@ -0,0 +1,145 @@
1
+ import { z } from "zod";
2
+ function formatBytes(bytes) {
3
+ if (bytes === 0)
4
+ return "0 B";
5
+ const units = ["B", "KB", "MB", "GB"];
6
+ const k = 1024;
7
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
8
+ return `${(bytes / Math.pow(k, i)).toFixed(2)} ${units[i]}`;
9
+ }
10
+ export function registerMemoryTools(server, client) {
11
+ server.tool("get_memory_snapshot", "Get a memory allocation profile of the running Flutter app. Shows heap usage, top memory-consuming classes, and potential leak indicators.", {
12
+ forceGC: z
13
+ .boolean()
14
+ .default(false)
15
+ .describe("Force garbage collection before taking the snapshot (gives a more accurate view of live objects)"),
16
+ topN: z
17
+ .number()
18
+ .min(5)
19
+ .max(100)
20
+ .default(20)
21
+ .describe("Number of top memory-consuming classes to show"),
22
+ }, async ({ forceGC, topN }) => {
23
+ if (!client.connected) {
24
+ return {
25
+ content: [
26
+ {
27
+ type: "text",
28
+ text: "Not connected. Use the `connect` tool first.",
29
+ },
30
+ ],
31
+ isError: true,
32
+ };
33
+ }
34
+ try {
35
+ const profile = await client.getAllocationProfile(undefined, forceGC);
36
+ const heapUsage = profile.memoryUsage.heapUsage;
37
+ const heapCapacity = profile.memoryUsage.heapCapacity;
38
+ const externalUsage = profile.memoryUsage.externalUsage;
39
+ const heapUtilization = (heapUsage / heapCapacity) * 100;
40
+ const validMembers = profile.members.filter((m) => m.class?.name);
41
+ const sortedBySize = [...validMembers]
42
+ .sort((a, b) => b.bytesCurrent - a.bytesCurrent)
43
+ .filter((m) => m.bytesCurrent > 0);
44
+ const sortedByInstances = [...validMembers]
45
+ .sort((a, b) => b.instancesCurrent - a.instancesCurrent)
46
+ .filter((m) => m.instancesCurrent > 0);
47
+ const output = [
48
+ "═══════════════════════════════════════════════════════════",
49
+ " MEMORY SNAPSHOT",
50
+ "═══════════════════════════════════════════════════════════",
51
+ "",
52
+ "📊 HEAP OVERVIEW",
53
+ "───────────────────────────────────────────────────────────",
54
+ `Heap used: ${formatBytes(heapUsage)}`,
55
+ `Heap capacity: ${formatBytes(heapCapacity)}`,
56
+ `Utilization: ${heapUtilization.toFixed(1)}%`,
57
+ `External: ${formatBytes(externalUsage)}`,
58
+ `Total: ${formatBytes(heapUsage + externalUsage)}`,
59
+ forceGC ? "(Snapshot taken after forced GC)" : "",
60
+ "",
61
+ `📦 TOP ${topN} CLASSES BY MEMORY`,
62
+ "───────────────────────────────────────────────────────────",
63
+ ];
64
+ for (const member of sortedBySize.slice(0, topN)) {
65
+ const pct = ((member.bytesCurrent / heapUsage) * 100).toFixed(1);
66
+ output.push(`${formatBytes(member.bytesCurrent).padStart(12)} (${pct}%) | ${member.instancesCurrent.toLocaleString().padStart(8)} instances | ${member.class.name}`);
67
+ }
68
+ output.push("");
69
+ output.push(`📈 TOP 10 CLASSES BY INSTANCE COUNT`);
70
+ output.push("───────────────────────────────────────────────────────────");
71
+ for (const member of sortedByInstances.slice(0, 10)) {
72
+ output.push(`${member.instancesCurrent.toLocaleString().padStart(12)} instances | ${formatBytes(member.bytesCurrent).padStart(12)} | ${member.class.name}`);
73
+ }
74
+ const vmInternalClasses = new Set([
75
+ "_OneByteString", "_TwoByteString", "String",
76
+ "_List", "_GrowableList", "_ImmutableList",
77
+ "_Mint", "_Double", "bool", "Null", "int", "double",
78
+ "Class", "ForwardingCorpse", "FreeListElement",
79
+ "TypeParameter", "UnlinkedCall", "ICData",
80
+ "Field", "Function", "Code", "Instructions",
81
+ "ObjectPool", "PcDescriptors", "CodeSourceMap",
82
+ "CompressedStackMaps", "Type", "_Type", "LibraryPrefix",
83
+ "_FunctionType", "Namespace", "Library",
84
+ "TypeArguments", "ClosureData", "SubtypeTestCache",
85
+ "SingleTargetCache", "MegamorphicCache",
86
+ "WeakProperty", "WeakReference", "FinalizerEntry",
87
+ "_WeakProperty", "_WeakReference",
88
+ "KernelProgramInfo", "Script", "Bytecode",
89
+ "_Int8List", "_Uint8List", "_Uint16List", "_Uint32List",
90
+ "_Int32List", "_Float32List", "_Float64List",
91
+ "_ExternalOneByteString", "Array", "GrowableObjectArray",
92
+ "Context", "ContextScope", "RegExp", "_RegExp",
93
+ "LocalVarDescriptors", "ExceptionHandlers",
94
+ "ParameterTypeCheck", "ApiErrorClass", "LanguageError",
95
+ "Bool", "Sentinel", "FfiTrampolineData",
96
+ ]);
97
+ const isVmInternal = (name) => vmInternalClasses.has(name) ||
98
+ name.startsWith("_") && name.length < 20 && !name.includes("State") && !name.includes("Controller");
99
+ const appClasses = sortedByInstances.filter((m) => m.instancesCurrent > 0 &&
100
+ m.bytesCurrent > 0 &&
101
+ !isVmInternal(m.class.name));
102
+ if (appClasses.length > 0) {
103
+ output.push("");
104
+ output.push("🏗️ APP & FRAMEWORK CLASSES");
105
+ output.push("───────────────────────────────────────────────────────────");
106
+ for (const cls of appClasses.slice(0, 20)) {
107
+ output.push(`${cls.instancesCurrent.toLocaleString().padStart(12)} instances | ${formatBytes(cls.bytesCurrent).padStart(12)} | ${cls.class.name}`);
108
+ }
109
+ }
110
+ const suspiciousClasses = appClasses.filter((m) => m.instancesCurrent > 500);
111
+ if (suspiciousClasses.length > 0) {
112
+ output.push("");
113
+ output.push("⚠️ POTENTIAL CONCERNS");
114
+ output.push("───────────────────────────────────────────────────────────");
115
+ for (const cls of suspiciousClasses.slice(0, 5)) {
116
+ output.push(`• ${cls.class.name}: ${cls.instancesCurrent.toLocaleString()} instances (${formatBytes(cls.bytesCurrent)}) - check for leaks or excessive allocations`);
117
+ }
118
+ }
119
+ if (heapUtilization > 85) {
120
+ output.push("");
121
+ output.push("🔴 WARNING: Heap utilization above 85%. The app may be at risk of OOM. Consider reducing memory footprint.");
122
+ }
123
+ return {
124
+ content: [
125
+ {
126
+ type: "text",
127
+ text: output.filter(Boolean).join("\n"),
128
+ },
129
+ ],
130
+ };
131
+ }
132
+ catch (error) {
133
+ return {
134
+ content: [
135
+ {
136
+ type: "text",
137
+ text: `Failed to get memory snapshot: ${error instanceof Error ? error.message : String(error)}`,
138
+ },
139
+ ],
140
+ isError: true,
141
+ };
142
+ }
143
+ });
144
+ }
145
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/tools/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { FlutterVmServiceClient } from "../services/vm-service-client.js";
3
+ export declare function registerNetworkTools(server: McpServer, client: FlutterVmServiceClient): void;
4
+ //# sourceMappingURL=network.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/tools/network.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AA6B1E,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,sBAAsB,QA2T/B"}