db-mcp 1.0.2 → 1.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 (241) hide show
  1. package/.gitattributes +2 -0
  2. package/LICENSE +1 -1
  3. package/README.md +244 -518
  4. package/dist/chunk-4IA3DB5C.js +135 -0
  5. package/dist/chunk-AOUL5SHS.js +930 -0
  6. package/dist/chunk-DWJXQEFA.js +13759 -0
  7. package/dist/chunk-DZQLDEQS.js +879 -0
  8. package/dist/chunk-S5IDDSSB.js +74 -0
  9. package/dist/chunk-Z2GFQU3G.js +363 -0
  10. package/dist/cli.d.ts +0 -7
  11. package/dist/cli.js +227 -183
  12. package/dist/http-VSB7DBJR.js +1541 -0
  13. package/dist/index.d.ts +842 -10
  14. package/dist/index.js +5 -17
  15. package/dist/sqlite-VHBA4ABV.js +600 -0
  16. package/dist/sqlite-native-D2LH5ZT7.js +2498 -0
  17. package/dist/worker-script.d.ts +2 -0
  18. package/dist/worker-script.js +126 -0
  19. package/package.json +26 -16
  20. package/playwright.config.ts +101 -0
  21. package/scripts/generate-server-instructions.ts +111 -0
  22. package/server.json +5 -6
  23. package/test-server/README.md +118 -0
  24. package/test-server/code-map.md +409 -0
  25. package/test-server/fixtures/sample.csv +6 -0
  26. package/test-server/reset-database.ps1 +373 -0
  27. package/test-server/sample.csv +11 -0
  28. package/test-server/test-agent-experience.md +243 -0
  29. package/test-server/test-database.sql +388 -0
  30. package/test-server/test-group-tools.md +861 -0
  31. package/test-server/test-help-resources.mjs +238 -0
  32. package/test-server/test-preflight.md +53 -0
  33. package/test-server/test-prompts.md +354 -0
  34. package/test-server/test-resources.md +245 -0
  35. package/test-server/test-tool-annotations.mjs +157 -0
  36. package/test-server/test-tools-advanced-1.md +517 -0
  37. package/test-server/test-tools-advanced-2.md +487 -0
  38. package/test-server/test-tools-codemode.md +629 -0
  39. package/test-server/test-tools.md +176 -0
  40. package/test-server/tool-reference.md +236 -0
  41. package/tsconfig.test.json +9 -0
  42. package/dist/adapters/DatabaseAdapter.d.ts +0 -141
  43. package/dist/adapters/DatabaseAdapter.d.ts.map +0 -1
  44. package/dist/adapters/DatabaseAdapter.js +0 -131
  45. package/dist/adapters/DatabaseAdapter.js.map +0 -1
  46. package/dist/adapters/sqlite/SchemaManager.d.ts +0 -58
  47. package/dist/adapters/sqlite/SchemaManager.d.ts.map +0 -1
  48. package/dist/adapters/sqlite/SchemaManager.js +0 -187
  49. package/dist/adapters/sqlite/SchemaManager.js.map +0 -1
  50. package/dist/adapters/sqlite/SqliteAdapter.d.ts +0 -161
  51. package/dist/adapters/sqlite/SqliteAdapter.d.ts.map +0 -1
  52. package/dist/adapters/sqlite/SqliteAdapter.js +0 -741
  53. package/dist/adapters/sqlite/SqliteAdapter.js.map +0 -1
  54. package/dist/adapters/sqlite/index.d.ts +0 -9
  55. package/dist/adapters/sqlite/index.d.ts.map +0 -1
  56. package/dist/adapters/sqlite/index.js +0 -8
  57. package/dist/adapters/sqlite/index.js.map +0 -1
  58. package/dist/adapters/sqlite/json-utils.d.ts +0 -100
  59. package/dist/adapters/sqlite/json-utils.d.ts.map +0 -1
  60. package/dist/adapters/sqlite/json-utils.js +0 -274
  61. package/dist/adapters/sqlite/json-utils.js.map +0 -1
  62. package/dist/adapters/sqlite/output-schemas.d.ts +0 -1187
  63. package/dist/adapters/sqlite/output-schemas.d.ts.map +0 -1
  64. package/dist/adapters/sqlite/output-schemas.js +0 -1337
  65. package/dist/adapters/sqlite/output-schemas.js.map +0 -1
  66. package/dist/adapters/sqlite/prompts.d.ts +0 -13
  67. package/dist/adapters/sqlite/prompts.d.ts.map +0 -1
  68. package/dist/adapters/sqlite/prompts.js +0 -605
  69. package/dist/adapters/sqlite/prompts.js.map +0 -1
  70. package/dist/adapters/sqlite/resources.d.ts +0 -13
  71. package/dist/adapters/sqlite/resources.d.ts.map +0 -1
  72. package/dist/adapters/sqlite/resources.js +0 -251
  73. package/dist/adapters/sqlite/resources.js.map +0 -1
  74. package/dist/adapters/sqlite/tools/admin.d.ts +0 -14
  75. package/dist/adapters/sqlite/tools/admin.d.ts.map +0 -1
  76. package/dist/adapters/sqlite/tools/admin.js +0 -788
  77. package/dist/adapters/sqlite/tools/admin.js.map +0 -1
  78. package/dist/adapters/sqlite/tools/core.d.ts +0 -25
  79. package/dist/adapters/sqlite/tools/core.d.ts.map +0 -1
  80. package/dist/adapters/sqlite/tools/core.js +0 -359
  81. package/dist/adapters/sqlite/tools/core.js.map +0 -1
  82. package/dist/adapters/sqlite/tools/fts.d.ts +0 -13
  83. package/dist/adapters/sqlite/tools/fts.d.ts.map +0 -1
  84. package/dist/adapters/sqlite/tools/fts.js +0 -347
  85. package/dist/adapters/sqlite/tools/fts.js.map +0 -1
  86. package/dist/adapters/sqlite/tools/geo.d.ts +0 -14
  87. package/dist/adapters/sqlite/tools/geo.d.ts.map +0 -1
  88. package/dist/adapters/sqlite/tools/geo.js +0 -252
  89. package/dist/adapters/sqlite/tools/geo.js.map +0 -1
  90. package/dist/adapters/sqlite/tools/index.d.ts +0 -30
  91. package/dist/adapters/sqlite/tools/index.d.ts.map +0 -1
  92. package/dist/adapters/sqlite/tools/index.js +0 -61
  93. package/dist/adapters/sqlite/tools/index.js.map +0 -1
  94. package/dist/adapters/sqlite/tools/json-helpers.d.ts +0 -14
  95. package/dist/adapters/sqlite/tools/json-helpers.d.ts.map +0 -1
  96. package/dist/adapters/sqlite/tools/json-helpers.js +0 -477
  97. package/dist/adapters/sqlite/tools/json-helpers.js.map +0 -1
  98. package/dist/adapters/sqlite/tools/json-operations.d.ts +0 -14
  99. package/dist/adapters/sqlite/tools/json-operations.d.ts.map +0 -1
  100. package/dist/adapters/sqlite/tools/json-operations.js +0 -839
  101. package/dist/adapters/sqlite/tools/json-operations.js.map +0 -1
  102. package/dist/adapters/sqlite/tools/stats.d.ts +0 -15
  103. package/dist/adapters/sqlite/tools/stats.d.ts.map +0 -1
  104. package/dist/adapters/sqlite/tools/stats.js +0 -1219
  105. package/dist/adapters/sqlite/tools/stats.js.map +0 -1
  106. package/dist/adapters/sqlite/tools/text.d.ts +0 -14
  107. package/dist/adapters/sqlite/tools/text.d.ts.map +0 -1
  108. package/dist/adapters/sqlite/tools/text.js +0 -1141
  109. package/dist/adapters/sqlite/tools/text.js.map +0 -1
  110. package/dist/adapters/sqlite/tools/vector.d.ts +0 -14
  111. package/dist/adapters/sqlite/tools/vector.d.ts.map +0 -1
  112. package/dist/adapters/sqlite/tools/vector.js +0 -613
  113. package/dist/adapters/sqlite/tools/vector.js.map +0 -1
  114. package/dist/adapters/sqlite/tools/virtual.d.ts +0 -13
  115. package/dist/adapters/sqlite/tools/virtual.d.ts.map +0 -1
  116. package/dist/adapters/sqlite/tools/virtual.js +0 -930
  117. package/dist/adapters/sqlite/tools/virtual.js.map +0 -1
  118. package/dist/adapters/sqlite/types.d.ts +0 -207
  119. package/dist/adapters/sqlite/types.d.ts.map +0 -1
  120. package/dist/adapters/sqlite/types.js +0 -186
  121. package/dist/adapters/sqlite/types.js.map +0 -1
  122. package/dist/adapters/sqlite-native/NativeSqliteAdapter.d.ts +0 -163
  123. package/dist/adapters/sqlite-native/NativeSqliteAdapter.d.ts.map +0 -1
  124. package/dist/adapters/sqlite-native/NativeSqliteAdapter.js +0 -748
  125. package/dist/adapters/sqlite-native/NativeSqliteAdapter.js.map +0 -1
  126. package/dist/adapters/sqlite-native/index.d.ts +0 -11
  127. package/dist/adapters/sqlite-native/index.d.ts.map +0 -1
  128. package/dist/adapters/sqlite-native/index.js +0 -11
  129. package/dist/adapters/sqlite-native/index.js.map +0 -1
  130. package/dist/adapters/sqlite-native/tools/spatialite.d.ts +0 -19
  131. package/dist/adapters/sqlite-native/tools/spatialite.d.ts.map +0 -1
  132. package/dist/adapters/sqlite-native/tools/spatialite.js +0 -628
  133. package/dist/adapters/sqlite-native/tools/spatialite.js.map +0 -1
  134. package/dist/adapters/sqlite-native/tools/transactions.d.ts +0 -12
  135. package/dist/adapters/sqlite-native/tools/transactions.d.ts.map +0 -1
  136. package/dist/adapters/sqlite-native/tools/transactions.js +0 -255
  137. package/dist/adapters/sqlite-native/tools/transactions.js.map +0 -1
  138. package/dist/adapters/sqlite-native/tools/window.d.ts +0 -12
  139. package/dist/adapters/sqlite-native/tools/window.d.ts.map +0 -1
  140. package/dist/adapters/sqlite-native/tools/window.js +0 -370
  141. package/dist/adapters/sqlite-native/tools/window.js.map +0 -1
  142. package/dist/auth/AuthorizationServerDiscovery.d.ts +0 -90
  143. package/dist/auth/AuthorizationServerDiscovery.d.ts.map +0 -1
  144. package/dist/auth/AuthorizationServerDiscovery.js +0 -204
  145. package/dist/auth/AuthorizationServerDiscovery.js.map +0 -1
  146. package/dist/auth/OAuthResourceServer.d.ts +0 -65
  147. package/dist/auth/OAuthResourceServer.d.ts.map +0 -1
  148. package/dist/auth/OAuthResourceServer.js +0 -121
  149. package/dist/auth/OAuthResourceServer.js.map +0 -1
  150. package/dist/auth/TokenValidator.d.ts +0 -60
  151. package/dist/auth/TokenValidator.d.ts.map +0 -1
  152. package/dist/auth/TokenValidator.js +0 -235
  153. package/dist/auth/TokenValidator.js.map +0 -1
  154. package/dist/auth/errors.d.ts +0 -74
  155. package/dist/auth/errors.d.ts.map +0 -1
  156. package/dist/auth/errors.js +0 -133
  157. package/dist/auth/errors.js.map +0 -1
  158. package/dist/auth/index.d.ts +0 -13
  159. package/dist/auth/index.d.ts.map +0 -1
  160. package/dist/auth/index.js +0 -15
  161. package/dist/auth/index.js.map +0 -1
  162. package/dist/auth/middleware.d.ts +0 -81
  163. package/dist/auth/middleware.d.ts.map +0 -1
  164. package/dist/auth/middleware.js +0 -291
  165. package/dist/auth/middleware.js.map +0 -1
  166. package/dist/auth/scopes.d.ts +0 -136
  167. package/dist/auth/scopes.d.ts.map +0 -1
  168. package/dist/auth/scopes.js +0 -349
  169. package/dist/auth/scopes.js.map +0 -1
  170. package/dist/auth/types.d.ts +0 -257
  171. package/dist/auth/types.d.ts.map +0 -1
  172. package/dist/auth/types.js +0 -8
  173. package/dist/auth/types.js.map +0 -1
  174. package/dist/cli.d.ts.map +0 -1
  175. package/dist/cli.js.map +0 -1
  176. package/dist/constants/ServerInstructions.d.ts +0 -45
  177. package/dist/constants/ServerInstructions.d.ts.map +0 -1
  178. package/dist/constants/ServerInstructions.js +0 -356
  179. package/dist/constants/ServerInstructions.js.map +0 -1
  180. package/dist/filtering/ToolConstants.d.ts +0 -34
  181. package/dist/filtering/ToolConstants.d.ts.map +0 -1
  182. package/dist/filtering/ToolConstants.js +0 -174
  183. package/dist/filtering/ToolConstants.js.map +0 -1
  184. package/dist/filtering/ToolFilter.d.ts +0 -82
  185. package/dist/filtering/ToolFilter.d.ts.map +0 -1
  186. package/dist/filtering/ToolFilter.js +0 -296
  187. package/dist/filtering/ToolFilter.js.map +0 -1
  188. package/dist/index.d.ts.map +0 -1
  189. package/dist/index.js.map +0 -1
  190. package/dist/server/McpServer.d.ts +0 -61
  191. package/dist/server/McpServer.d.ts.map +0 -1
  192. package/dist/server/McpServer.js +0 -270
  193. package/dist/server/McpServer.js.map +0 -1
  194. package/dist/transports/http.d.ts +0 -134
  195. package/dist/transports/http.d.ts.map +0 -1
  196. package/dist/transports/http.js +0 -516
  197. package/dist/transports/http.js.map +0 -1
  198. package/dist/transports/index.d.ts +0 -5
  199. package/dist/transports/index.d.ts.map +0 -1
  200. package/dist/transports/index.js +0 -5
  201. package/dist/transports/index.js.map +0 -1
  202. package/dist/types/index.d.ts +0 -380
  203. package/dist/types/index.d.ts.map +0 -1
  204. package/dist/types/index.js +0 -68
  205. package/dist/types/index.js.map +0 -1
  206. package/dist/utils/annotations.d.ts +0 -44
  207. package/dist/utils/annotations.d.ts.map +0 -1
  208. package/dist/utils/annotations.js +0 -77
  209. package/dist/utils/annotations.js.map +0 -1
  210. package/dist/utils/errors.d.ts +0 -155
  211. package/dist/utils/errors.d.ts.map +0 -1
  212. package/dist/utils/errors.js +0 -329
  213. package/dist/utils/errors.js.map +0 -1
  214. package/dist/utils/identifiers.d.ts +0 -121
  215. package/dist/utils/identifiers.d.ts.map +0 -1
  216. package/dist/utils/identifiers.js +0 -319
  217. package/dist/utils/identifiers.js.map +0 -1
  218. package/dist/utils/index.d.ts +0 -7
  219. package/dist/utils/index.d.ts.map +0 -1
  220. package/dist/utils/index.js +0 -7
  221. package/dist/utils/index.js.map +0 -1
  222. package/dist/utils/insightsManager.d.ts +0 -39
  223. package/dist/utils/insightsManager.d.ts.map +0 -1
  224. package/dist/utils/insightsManager.js +0 -63
  225. package/dist/utils/insightsManager.js.map +0 -1
  226. package/dist/utils/logger.d.ts +0 -189
  227. package/dist/utils/logger.d.ts.map +0 -1
  228. package/dist/utils/logger.js +0 -394
  229. package/dist/utils/logger.js.map +0 -1
  230. package/dist/utils/progress-utils.d.ts +0 -54
  231. package/dist/utils/progress-utils.d.ts.map +0 -1
  232. package/dist/utils/progress-utils.js +0 -74
  233. package/dist/utils/progress-utils.js.map +0 -1
  234. package/dist/utils/resourceAnnotations.d.ts +0 -36
  235. package/dist/utils/resourceAnnotations.d.ts.map +0 -1
  236. package/dist/utils/resourceAnnotations.js +0 -57
  237. package/dist/utils/resourceAnnotations.js.map +0 -1
  238. package/dist/utils/where-clause.d.ts +0 -41
  239. package/dist/utils/where-clause.d.ts.map +0 -1
  240. package/dist/utils/where-clause.js +0 -116
  241. package/dist/utils/where-clause.js.map +0 -1
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Integration Test: Help Resources + Slim Instructions
3
+ *
4
+ * Starts the server with various --tool-filter configs and verifies:
5
+ * 1. Instructions are slim (~680 chars, within client limits)
6
+ * 2. sqlite://help resources are registered based on tool filter
7
+ * 3. Group-specific help resources are only registered for enabled groups
8
+ *
9
+ * Usage:
10
+ * npm run build
11
+ * node test-server/test-help-resources.mjs
12
+ */
13
+
14
+ import { spawn } from "child_process";
15
+
16
+ const PROJECT_DIR = "C:\\Users\\chris\\Desktop\\db-mcp";
17
+
18
+ /**
19
+ * Start server, send initialize + resources/list, return results
20
+ */
21
+ function testServer(args) {
22
+ return new Promise((resolve, reject) => {
23
+ const proc = spawn("node", ["dist/cli.js", ...args], {
24
+ cwd: PROJECT_DIR,
25
+ stdio: ["pipe", "pipe", "pipe"],
26
+ });
27
+
28
+ let buffer = "";
29
+ let instructions = "";
30
+ let resourceUris = [];
31
+ let gotInitialize = false;
32
+
33
+ proc.stdout.on("data", (chunk) => {
34
+ buffer += chunk.toString();
35
+ const lines = buffer.split("\n");
36
+ buffer = lines.pop(); // Keep incomplete line
37
+
38
+ for (const line of lines) {
39
+ const trimmed = line.trim();
40
+ if (!trimmed) continue;
41
+ try {
42
+ const msg = JSON.parse(trimmed);
43
+
44
+ // Response to initialize (id=1)
45
+ if (msg.id === 1 && msg.result) {
46
+ instructions =
47
+ msg.result?.serverInfo?.instructions ||
48
+ msg.result?.instructions ||
49
+ msg.result?.capabilities?.instructions ||
50
+ "";
51
+ gotInitialize = true;
52
+
53
+ // Send resources/list
54
+ proc.stdin.write(
55
+ JSON.stringify({
56
+ jsonrpc: "2.0",
57
+ id: 2,
58
+ method: "resources/list",
59
+ params: {},
60
+ }) + "\n",
61
+ );
62
+ }
63
+
64
+ // Response to resources/list (id=2)
65
+ if (msg.id === 2 && msg.result) {
66
+ const resources = msg.result.resources || [];
67
+ resourceUris = resources.map((r) => r.uri);
68
+ proc.kill();
69
+ resolve({
70
+ instructions,
71
+ instructionChars: instructions.length,
72
+ resourceUris,
73
+ });
74
+ }
75
+ } catch {
76
+ // Not complete JSON yet
77
+ }
78
+ }
79
+ });
80
+
81
+ proc.stderr.on("data", () => {});
82
+
83
+ // Send initialize request
84
+ proc.stdin.write(
85
+ JSON.stringify({
86
+ jsonrpc: "2.0",
87
+ id: 1,
88
+ method: "initialize",
89
+ params: {
90
+ protocolVersion: "2025-03-26",
91
+ capabilities: {},
92
+ clientInfo: { name: "help-resource-test", version: "1.0" },
93
+ },
94
+ }) + "\n",
95
+ );
96
+
97
+ setTimeout(() => {
98
+ proc.kill();
99
+ reject(new Error(`Timeout for args: ${args.join(" ")}`));
100
+ }, 10000);
101
+ });
102
+ }
103
+
104
+ async function main() {
105
+ let allPassed = true;
106
+
107
+ // ── Test 1: Slim Instructions ──
108
+ console.log("=== Test 1: Slim Instructions ===\n");
109
+
110
+ const baseResult = await testServer([]);
111
+ console.log(` Instruction chars: ${baseResult.instructionChars}`);
112
+ console.log(
113
+ ` Token estimate: ~${Math.round(baseResult.instructionChars / 4)}`,
114
+ );
115
+
116
+ const isSlim = baseResult.instructionChars < 1000;
117
+ console.log(` Under 1000 chars: ${isSlim ? "✅" : "❌"}`);
118
+ if (!isSlim) allPassed = false;
119
+
120
+ const hasHelpPointer = baseResult.instructions.includes("sqlite://help");
121
+ console.log(
122
+ ` Contains sqlite://help pointer: ${hasHelpPointer ? "✅" : "❌"}`,
123
+ );
124
+ if (!hasHelpPointer) allPassed = false;
125
+
126
+ const noOldContent = !baseResult.instructions.includes("Critical Gotchas");
127
+ console.log(
128
+ ` No old gotchas in instructions: ${noOldContent ? "✅" : "❌"}`,
129
+ );
130
+ if (!noOldContent) allPassed = false;
131
+
132
+ // ── Test 2: Core-only Filter ──
133
+ console.log("\n=== Test 2: Core-only Filter (--tool-filter core) ===\n");
134
+
135
+ const coreResult = await testServer(["--tool-filter", "core"]);
136
+ const coreHelpUris = coreResult.resourceUris.filter((u) =>
137
+ u.startsWith("sqlite://help"),
138
+ );
139
+ console.log(` Help resources: ${coreHelpUris.join(", ") || "(none)"}`);
140
+
141
+ const coreHasBaseHelp = coreHelpUris.includes("sqlite://help");
142
+ console.log(` Has sqlite://help: ${coreHasBaseHelp ? "✅" : "❌"}`);
143
+ if (!coreHasBaseHelp) allPassed = false;
144
+
145
+ const coreNoGroupHelp = coreHelpUris.length === 1;
146
+ console.log(
147
+ ` No group-specific help: ${coreNoGroupHelp ? "✅" : "❌"} (count: ${coreHelpUris.length})`,
148
+ );
149
+ if (!coreNoGroupHelp) allPassed = false;
150
+
151
+ // ── Test 3: Stats Filter ──
152
+ console.log("\n=== Test 3: Stats Filter (--tool-filter stats) ===\n");
153
+
154
+ const statsResult = await testServer(["--tool-filter", "stats"]);
155
+ const statsHelpUris = statsResult.resourceUris.filter((u) =>
156
+ u.startsWith("sqlite://help"),
157
+ );
158
+ console.log(` Help resources: ${statsHelpUris.join(", ")}`);
159
+
160
+ const statsHasBaseHelp = statsHelpUris.includes("sqlite://help");
161
+ const statsHasStatsHelp = statsHelpUris.includes("sqlite://help/stats");
162
+ console.log(` Has sqlite://help: ${statsHasBaseHelp ? "✅" : "❌"}`);
163
+ console.log(` Has sqlite://help/stats: ${statsHasStatsHelp ? "✅" : "❌"}`);
164
+ if (!statsHasBaseHelp || !statsHasStatsHelp) allPassed = false;
165
+
166
+ const statsNoJsonHelp = !statsHelpUris.includes("sqlite://help/json");
167
+ console.log(` No sqlite://help/json: ${statsNoJsonHelp ? "✅" : "❌"}`);
168
+ if (!statsNoJsonHelp) allPassed = false;
169
+
170
+ // ── Test 4: Multi-group Filter ──
171
+ console.log(
172
+ "\n=== Test 4: Multi-group Filter (--tool-filter core,json,text,stats) ===\n",
173
+ );
174
+
175
+ const multiResult = await testServer([
176
+ "--tool-filter",
177
+ "core,json,text,stats",
178
+ ]);
179
+ const multiHelpUris = multiResult.resourceUris.filter((u) =>
180
+ u.startsWith("sqlite://help"),
181
+ );
182
+ console.log(` Help resources: ${multiHelpUris.join(", ")}`);
183
+
184
+ const expectedMulti = [
185
+ "sqlite://help",
186
+ "sqlite://help/json",
187
+ "sqlite://help/text",
188
+ "sqlite://help/stats",
189
+ ];
190
+ for (const uri of expectedMulti) {
191
+ const found = multiHelpUris.includes(uri);
192
+ console.log(` Has ${uri}: ${found ? "✅" : "❌"}`);
193
+ if (!found) allPassed = false;
194
+ }
195
+
196
+ const multiNoVector = !multiHelpUris.includes("sqlite://help/vector");
197
+ const multiNoGeo = !multiHelpUris.includes("sqlite://help/geo");
198
+ console.log(` No sqlite://help/vector: ${multiNoVector ? "✅" : "❌"}`);
199
+ console.log(` No sqlite://help/geo: ${multiNoGeo ? "✅" : "❌"}`);
200
+ if (!multiNoVector || !multiNoGeo) allPassed = false;
201
+
202
+ // ── Test 5: Full Filter ──
203
+ console.log("\n=== Test 5: Full Filter (--tool-filter full) ===\n");
204
+
205
+ const fullResult = await testServer(["--tool-filter", "full"]);
206
+ const fullHelpUris = fullResult.resourceUris.filter((u) =>
207
+ u.startsWith("sqlite://help"),
208
+ );
209
+ console.log(
210
+ ` Help resources (${fullHelpUris.length}): ${fullHelpUris.join(", ")}`,
211
+ );
212
+
213
+ const expectedFull = [
214
+ "sqlite://help",
215
+ "sqlite://help/json",
216
+ "sqlite://help/text",
217
+ "sqlite://help/stats",
218
+ "sqlite://help/vector",
219
+ "sqlite://help/geo",
220
+ "sqlite://help/admin",
221
+ "sqlite://help/introspection",
222
+ "sqlite://help/migration",
223
+ ];
224
+ const fullHasAll = expectedFull.every((u) => fullHelpUris.includes(u));
225
+ console.log(` Has all 9 help resources: ${fullHasAll ? "✅" : "❌"}`);
226
+ if (!fullHasAll) allPassed = false;
227
+
228
+ // ── Summary ──
229
+ console.log(
230
+ `\n=== Overall: ${allPassed ? "✅ ALL PASSED" : "❌ FAILURES"} ===`,
231
+ );
232
+ process.exit(allPassed ? 0 : 1);
233
+ }
234
+
235
+ main().catch((err) => {
236
+ console.error("Fatal:", err.message);
237
+ process.exit(1);
238
+ });
@@ -0,0 +1,53 @@
1
+ # MCP Server Pre-Flight Check — db-mcp (SQLite)
2
+
3
+ > **Purpose:** Validate that slim instructions, help resources, and data resources are working correctly before running full test passes. Run this in a fresh conversation with the server enabled.
4
+
5
+ Do NOT read any files from disk. Answer using ONLY what you received via MCP initialization and resource reads.
6
+
7
+ ## Step 1: Instructions Audit
8
+
9
+ Report exactly what you received in the MCP server instructions during initialization:
10
+
11
+ - Paste the FULL raw text you received (use a code block)
12
+ - Character count of the instructions
13
+ - Does it mention help resources? If so, what URIs?
14
+ - Does it contain detailed tool parameter tables or response structure docs? (It should NOT)
15
+
16
+ ## Step 2: Help Resource Access
17
+
18
+ Read the main help resource `sqlite://help`. Report:
19
+
20
+ - Did it succeed?
21
+ - Approximate character count of the content
22
+ - First 3 lines of content
23
+
24
+ Then read ONE group-specific help resource (e.g., `sqlite://help/core`, `sqlite://help/json`, or whichever is available). Report:
25
+
26
+ - Which URI did you read?
27
+ - Did it succeed?
28
+ - Does it contain tool-specific parameter details and response structures?
29
+
30
+ ## Step 3: Data Resource Access
31
+
32
+ Read the schema resource `sqlite://schema`. Report:
33
+
34
+ - Did it succeed?
35
+ - How many tables are listed?
36
+
37
+ ## Step 4: Tool Inventory
38
+
39
+ List the tool groups you see and count of tools per group. Do NOT call any tools — just report what's in your tool list.
40
+
41
+ ## Step 5: Verdict
42
+
43
+ Based on steps 1-4, answer:
44
+
45
+ | # | Check | Result |
46
+ | --- | ---------------------------------------------------------- | -------- |
47
+ | 1 | Instructions are slim (<1000 chars), not monolithic | ✅ or ❌ |
48
+ | 2 | Instructions reference help resources (`sqlite://help`) | ✅ or ❌ |
49
+ | 3 | Main help resource is readable | ✅ or ❌ |
50
+ | 4 | Group-specific help resource is readable | ✅ or ❌ |
51
+ | 5 | Data resources are readable | ✅ or ❌ |
52
+ | 6 | Tool count matches expected for configured `--tool-filter` | ✅ or ❌ |
53
+ | 7 | No detailed parameter tables leaked into instructions | ✅ or ❌ |
@@ -0,0 +1,354 @@
1
+ # db-mcp Prompt Testing Plan (Cursor)
2
+
3
+ This plan documents how to test all 10 MCP prompts in Cursor, since prompts aren't supported in AntiGravity.
4
+
5
+ ## Prerequisites
6
+
7
+ 1. Open Cursor and connect to the SQLite MCP server
8
+ 2. Test database must be loaded: `test-server/test.db`
9
+ 3. Server command: `node dist/cli.js --transport stdio --sqlite-native "test-server/test.db"`
10
+
11
+ ---
12
+
13
+ ## Prompt Categories
14
+
15
+ Prompts fall into two categories:
16
+
17
+ ### Data-Fetching Prompts (Work Without Tools)
18
+
19
+ These prompts call adapter methods directly and provide real database information to the LLM. They work regardless of tool filter settings.
20
+
21
+ | Prompt | Data Source |
22
+ | ----------------------- | --------------------------------------------------------------------- |
23
+ | `sqlite_explain_schema` | `adapter.getSchema()`, `adapter.listTables()` |
24
+ | `sqlite_optimization` | `adapter.getSchema()`, `adapter.listTables()`, `adapter.getIndexes()` |
25
+ | `sqlite_documentation` | `adapter.getSchema()` |
26
+
27
+ ### Template Prompts (Need Tools for Execution)
28
+
29
+ These prompts format a structured request but require database tools to execute queries. The LLM can provide SQL guidance without tools, but running queries requires tools.
30
+
31
+ | Prompt | Purpose |
32
+ | ------------------------------- | ------------------------------------------------ |
33
+ | `sqlite_query_builder` | Helps construct SQL (running it needs tools) |
34
+ | `sqlite_data_analysis` | Guides analysis workflow (execution needs tools) |
35
+ | `sqlite_migration` | Helps write migration scripts |
36
+ | `sqlite_debug_query` | Helps fix SQL queries |
37
+ | `sqlite_summarize_table` | Guides table analysis (execution needs tools) |
38
+ | `sqlite_hybrid_search_workflow` | Provides hybrid search template |
39
+ | `sqlite_demo` | Interactive demo (full execution needs tools) |
40
+
41
+ ---
42
+
43
+ ## Prompts Summary
44
+
45
+ | # | Prompt | Arguments | Category |
46
+ | --- | ------------------------------- | ---------------------- | ------------- |
47
+ | 1 | `sqlite_explain_schema` | None | Data-fetching |
48
+ | 2 | `sqlite_query_builder` | 3 required | Template |
49
+ | 3 | `sqlite_data_analysis` | 1 required, 1 optional | Template |
50
+ | 4 | `sqlite_optimization` | None | Data-fetching |
51
+ | 5 | `sqlite_migration` | 1 required, 1 optional | Template |
52
+ | 6 | `sqlite_debug_query` | 1 required, 2 optional | Template |
53
+ | 7 | `sqlite_documentation` | 1 optional | Data-fetching |
54
+ | 8 | `sqlite_summarize_table` | 1 required, 1 optional | Template |
55
+ | 9 | `sqlite_hybrid_search_workflow` | 1 required | Template |
56
+ | 10 | `sqlite_demo` | 1 required | Template |
57
+
58
+ ---
59
+
60
+ ## Detailed Test Procedures
61
+
62
+ ### 1. sqlite_explain_schema
63
+
64
+ **Slash Command:** `/sqlite_explain_schema`
65
+
66
+ **Arguments:** None
67
+
68
+ **What to Enter:** Just invoke the slash command, no additional input needed.
69
+
70
+ **Expected Behavior:**
71
+
72
+ - LLM receives schema and table list from test database
73
+ - Should explain purpose of all 11 test tables
74
+ - Should identify relationships (e.g., `test_orders.product_id` → `test_products.id`)
75
+
76
+ ---
77
+
78
+ ### 2. sqlite_query_builder
79
+
80
+ **Slash Command:** `/sqlite_query_builder`
81
+
82
+ **Arguments (pop-up prompts):**
83
+
84
+ | Argument | Value to Enter |
85
+ | ------------- | ------------------------------------------------------------- |
86
+ | `operation` | `aggregate` |
87
+ | `tables` | `test_orders, test_products` |
88
+ | `description` | `Calculate total sales by product category with order counts` |
89
+
90
+ **Expected Behavior:**
91
+
92
+ - LLM builds a JOIN query with GROUP BY aggregations
93
+ - Should provide SQL with explanation
94
+
95
+ **Alternative Test Case:**
96
+
97
+ | Argument | Value to Enter |
98
+ | ------------- | ----------------------------------------------- |
99
+ | `operation` | `select` |
100
+ | `tables` | `test_users` |
101
+ | `description` | `Find all users with gmail.com email addresses` |
102
+
103
+ ---
104
+
105
+ ### 3. sqlite_data_analysis
106
+
107
+ **Slash Command:** `/sqlite_data_analysis`
108
+
109
+ **Arguments (pop-up prompts):**
110
+
111
+ | Argument | Value to Enter |
112
+ | ------------------ | ------------------- |
113
+ | `table` | `test_measurements` |
114
+ | `focus` (optional) | `distribution` |
115
+
116
+ **Expected Behavior:**
117
+
118
+ - LLM uses SQLite tools to analyze the 200-row measurements table
119
+ - Should provide statistics for temperature, humidity, pressure columns
120
+ - Should detect patterns across 5 sensor_ids
121
+
122
+ **Alternative Test Case:**
123
+
124
+ | Argument | Value to Enter |
125
+ | ------------------ | -------------- |
126
+ | `table` | `test_orders` |
127
+ | `focus` (optional) | `trends` |
128
+
129
+ ---
130
+
131
+ ### 4. sqlite_optimization
132
+
133
+ **Slash Command:** `/sqlite_optimization`
134
+
135
+ **Arguments:** None
136
+
137
+ **What to Enter:** Just invoke the slash command, no additional input needed.
138
+
139
+ **Expected Behavior:**
140
+
141
+ - LLM receives full schema and index information
142
+ - Should identify existing indexes (`idx_orders_status`, `idx_orders_date`, `idx_products_category`)
143
+ - May suggest additional indexes or optimizations
144
+ - Should check for VACUUM recommendations
145
+
146
+ ---
147
+
148
+ ### 5. sqlite_migration
149
+
150
+ **Slash Command:** `/sqlite_migration`
151
+
152
+ **Arguments (pop-up prompts):**
153
+
154
+ | Argument | Value to Enter |
155
+ | ----------------------- | ----------------------------------------------------------------------------- |
156
+ | `change` | `Add a 'discount_percent' column to test_products table with default value 0` |
157
+ | `reversible` (optional) | `true` |
158
+
159
+ **Expected Behavior:**
160
+
161
+ - LLM provides UP migration: `ALTER TABLE test_products ADD COLUMN discount_percent REAL DEFAULT 0`
162
+ - LLM provides DOWN migration (if reversible=true)
163
+ - Should include data migration steps if needed
164
+ - Should include testing/verification steps
165
+
166
+ **Alternative Test Case:**
167
+
168
+ | Argument | Value to Enter |
169
+ | ----------------------- | ------------------------------------------------------------------------------ |
170
+ | `change` | `Create a new index on test_events(event_type, user_id) for dashboard queries` |
171
+ | `reversible` (optional) | `false` |
172
+
173
+ ---
174
+
175
+ ### 6. sqlite_debug_query
176
+
177
+ **Slash Command:** `/sqlite_debug_query`
178
+
179
+ **Arguments (pop-up prompts):**
180
+
181
+ | Argument | Value to Enter |
182
+ | --------------------- | ---------------------------------------------------- |
183
+ | `query` | `SELECT * FROM test_orders WHERE status = completed` |
184
+ | `error` (optional) | `SQLITE_ERROR: no such column: completed` |
185
+ | `expected` (optional) | `All orders with completed status` |
186
+
187
+ **Expected Behavior:**
188
+
189
+ - LLM identifies the bug: `completed` should be `'completed'` (quoted string)
190
+ - Provides corrected query: `SELECT * FROM test_orders WHERE status = 'completed'`
191
+ - Explains that unquoted text is treated as column name
192
+
193
+ **Alternative Test Case:**
194
+
195
+ | Argument | Value to Enter |
196
+ | --------------------- | --------------------------------------------------------- |
197
+ | `query` | `SELECT customer_name, SUM(total_price) FROM test_orders` |
198
+ | `error` (optional) | `Returns only one row instead of per-customer totals` |
199
+ | `expected` (optional) | `Sum of total_price grouped by each customer` |
200
+
201
+ ---
202
+
203
+ ### 7. sqlite_documentation
204
+
205
+ **Slash Command:** `/sqlite_documentation`
206
+
207
+ **Arguments (pop-up prompts):**
208
+
209
+ | Argument | Value to Enter |
210
+ | ------------------- | -------------- |
211
+ | `format` (optional) | `markdown` |
212
+
213
+ **What to Enter:** Optionally specify format, or leave blank for default `markdown`.
214
+
215
+ **Expected Behavior:**
216
+
217
+ - LLM generates comprehensive schema documentation
218
+ - Should include overview, ERD description, table docs
219
+ - Should provide common query examples
220
+
221
+ **Alternative Test Case:**
222
+
223
+ | Argument | Value to Enter |
224
+ | ------------------- | -------------- |
225
+ | `format` (optional) | `json` |
226
+
227
+ ---
228
+
229
+ ### 8. sqlite_summarize_table
230
+
231
+ **Slash Command:** `/sqlite_summarize_table`
232
+
233
+ **Arguments (pop-up prompts):**
234
+
235
+ | Argument | Value to Enter |
236
+ | --------------------------- | --------------- |
237
+ | `table_name` | `test_products` |
238
+ | `analysis_depth` (optional) | `detailed` |
239
+
240
+ **Expected Behavior:**
241
+
242
+ - LLM uses `sqlite_describe_table` to get schema
243
+ - Runs statistics queries on 16 products
244
+ - Performs NULL analysis, unique value analysis
245
+ - Provides data quality assessment
246
+
247
+ **Alternative Test Case:**
248
+
249
+ | Argument | Value to Enter |
250
+ | --------------------------- | ----------------- |
251
+ | `table_name` | `test_embeddings` |
252
+ | `analysis_depth` (optional) | `comprehensive` |
253
+
254
+ ---
255
+
256
+ ### 9. sqlite_hybrid_search_workflow
257
+
258
+ **Slash Command:** `/sqlite_hybrid_search_workflow`
259
+
260
+ **Arguments (pop-up prompts):**
261
+
262
+ | Argument | Value to Enter |
263
+ | ---------- | ---------------- |
264
+ | `use_case` | `article_search` |
265
+
266
+ **Expected Behavior:**
267
+
268
+ - LLM provides template for FTS5 + vector hybrid search
269
+ - Should create `article_search_fts` virtual table example
270
+ - Should create `article_search_embeddings` table example
271
+ - Provides weighted scoring template (keyword + semantic)
272
+
273
+ **Alternative Test Case:**
274
+
275
+ | Argument | Value to Enter |
276
+ | ---------- | ----------------- |
277
+ | `use_case` | `product_catalog` |
278
+
279
+ ---
280
+
281
+ ### 10. sqlite_demo
282
+
283
+ **Slash Command:** `/sqlite_demo`
284
+
285
+ **Arguments (pop-up prompts):**
286
+
287
+ | Argument | Value to Enter |
288
+ | -------- | -------------- |
289
+ | `topic` | `retail sales` |
290
+
291
+ **Expected Behavior:**
292
+
293
+ - LLM creates interactive business narrative scenario
294
+ - May create demo tables with synthetic data
295
+ - Presents query options to user
296
+ - Uses `sqlite_append_insight` to capture findings in `memo://insights`
297
+ - Demonstrates prompts + tools + resources workflow
298
+
299
+ **Alternative Test Case:**
300
+
301
+ | Argument | Value to Enter |
302
+ | -------- | ----------------------- |
303
+ | `topic` | `IoT sensor monitoring` |
304
+
305
+ ---
306
+
307
+ ## Pass/Fail Criteria
308
+
309
+ | Symbol | Meaning |
310
+ | ------ | -------------------------------------------------------------------------- |
311
+ | ✅ | Prompt invoked successfully, arguments collected, LLM response appropriate |
312
+ | ❌ | Prompt fails to invoke or arguments not collected properly |
313
+ | ⚠️ | Prompt works but unexpected behavior or improvement opportunity |
314
+ | 📝 | Documentation issue or unclear prompt description |
315
+
316
+ ---
317
+
318
+ ## Test Artifacts
319
+
320
+ | File | Description |
321
+ | ------------------------- | ---------------------------------------- |
322
+ | `test-prompts-plan.md` | This testing plan |
323
+ | `test-prompts-results.md` | Summary report after testing (to create) |
324
+
325
+ ---
326
+
327
+ ## Test Database Reference
328
+
329
+ The test database contains 11 tables (417 total rows):
330
+
331
+ | Table | Rows | Best for Testing |
332
+ | ------------------- | ---- | ---------------------------- |
333
+ | `test_products` | 16 | Query builder, documentation |
334
+ | `test_orders` | 20 | Query builder, data analysis |
335
+ | `test_jsonb_docs` | 6 | JSON-related prompts |
336
+ | `test_articles` | 8 | Text/FTS prompts |
337
+ | `test_users` | 9 | Debug query scenarios |
338
+ | `test_measurements` | 200 | Data analysis, stats |
339
+ | `test_embeddings` | 20 | Hybrid search workflow |
340
+ | `test_locations` | 15 | Geo-related analysis |
341
+ | `test_categories` | 17 | Hierarchical data |
342
+ | `test_events` | 100 | Time-series analysis |
343
+ | `temp_text_test` | 5 | Quick tests |
344
+
345
+ ---
346
+
347
+ ## Summary
348
+
349
+ | Metric | Value |
350
+ | ------------------------------------ | -------------------------------------------------- |
351
+ | Total prompts to test | 10 |
352
+ | Prompts with no arguments | 2 (`sqlite_explain_schema`, `sqlite_optimization`) |
353
+ | Prompts with required arguments | 8 |
354
+ | Prompts with optional-only arguments | 1 (`sqlite_documentation`) |