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,245 @@
1
+ # db-mcp Resource Testing Plan
2
+
3
+ Please test all db-mcp resources (8 data + up to 9 help) using the test database (test-server/test.db) and concisely report any issues.
4
+
5
+ ## Resources to Test
6
+
7
+ | # | Resource Name | URI | Type | Expected Data Source |
8
+ | --- | ------------------- | ---------------------------- | --------- | ------------------------------------------ |
9
+ | 1 | sqlite_schema | sqlite://schema | Static | Full schema via adapter.getSchema() |
10
+ | 2 | sqlite_tables | sqlite://tables | Static | Table list via adapter.listTables() |
11
+ | 3 | sqlite_table_schema | sqlite://table/{name}/schema | Templated | Specific table via adapter.describeTable() |
12
+ | 4 | sqlite_indexes | sqlite://indexes | Static | All indexes via adapter.getAllIndexes() |
13
+ | 5 | sqlite_views | sqlite://views | Static | Views from sqlite_master |
14
+ | 6 | sqlite_health | sqlite://health | Static | Connection health via adapter.getHealth() |
15
+ | 7 | sqlite_meta | sqlite://meta | Static | PRAGMA values + adapter info |
16
+ | 8 | sqlite_insights | memo://insights | Static | In-memory insights memo |
17
+
18
+ ---
19
+
20
+ ## Test Procedures
21
+
22
+ ### 1. sqlite_schema — Full Database Schema
23
+
24
+ **URI:** `sqlite://schema`
25
+ **Test:** Read the schema resource and verify it contains all 11 test tables.
26
+
27
+ **Expected Output:**
28
+
29
+ - JSON with table definitions including columns, types, and constraints
30
+ - Should include: test_products, test_orders, test_jsonb_docs, test_articles, test_users, test_measurements, test_embeddings, test_locations, test_categories, test_events, temp_text_test
31
+ - **Note:** FTS5 virtual tables (test_articles_fts and shadow tables) are intentionally filtered out
32
+
33
+ ---
34
+
35
+ ### 2. sqlite_tables — List All Tables
36
+
37
+ **URI:** `sqlite://tables`
38
+ **Test:** Read the tables resource and count entries.
39
+
40
+ **Expected Output:**
41
+
42
+ - JSON array of table objects
43
+ - Should list **11 tables** (FTS5 virtual tables are intentionally filtered for cleaner output)
44
+ - Each entry should have: name, type, columns (array with full column definitions)
45
+
46
+ ---
47
+
48
+ ### 3. sqlite_table_schema — Table-Specific Schema (Templated)
49
+
50
+ **URI Template:** `sqlite://table/{tableName}/schema`
51
+ **Tests:** Multiple table names to verify URI parsing.
52
+
53
+ **Test Cases:**
54
+
55
+ | URI | Expected Result |
56
+ | ----------------------------------------- | ----------------------------------------- |
57
+ | `sqlite://table/test_products/schema` | ✅ Returns 6 columns |
58
+ | `sqlite://table/test_orders/schema` | ✅ Returns 7 columns |
59
+ | `sqlite://table/test_embeddings/schema` | ✅ Returns 4 columns |
60
+ | `sqlite://table/nonexistent_table/schema` | ✅ Graceful error: "Table does not exist" |
61
+
62
+ **Expected Output per table:**
63
+
64
+ - Column definitions with names, types, nullability, default values
65
+ - Primary key information
66
+
67
+ ---
68
+
69
+ ### 4. sqlite_indexes — All Database Indexes
70
+
71
+ **URI:** `sqlite://indexes`
72
+ **Test:** Read indexes resource.
73
+
74
+ **Expected Output:**
75
+
76
+ - JSON grouped by table name
77
+ - Should include at minimum:
78
+ - idx_orders_status on test_orders(status)
79
+ - idx_orders_date on test_orders(order_date)
80
+ - idx_products_category on test_products(category)
81
+ - Each index should have: name, tableName, columns, unique flag
82
+
83
+ ---
84
+
85
+ ### 5. sqlite_views — All Views
86
+
87
+ **URI:** `sqlite://views`
88
+ **Test:** Read views resource.
89
+
90
+ **Expected Output:**
91
+
92
+ - JSON array of view objects
93
+ - Test database has no views by default, so expect empty array `[]`
94
+ - Optionally: Create a test view, verify it appears, then clean up
95
+
96
+ **Optional Setup/Cleanup:**
97
+
98
+ ```sql
99
+ -- Setup (if testing view detection)
100
+ CREATE VIEW test_view_order_summary AS
101
+ SELECT product_id, SUM(total_price) as total FROM test_orders GROUP BY product_id;
102
+ -- Cleanup
103
+ DROP VIEW IF EXISTS test_view_order_summary;
104
+ ```
105
+
106
+ ---
107
+
108
+ ### 6. sqlite_health — Database Health
109
+
110
+ **URI:** `sqlite://health`
111
+ **Test:** Read health resource.
112
+
113
+ **Expected Output:**
114
+
115
+ - JSON with connection status information
116
+ - Should indicate: connected/healthy status
117
+ - May include: database path, backend type (sql.js for WASM, better-sqlite3 for native), version info
118
+
119
+ ---
120
+
121
+ ### 7. sqlite_meta — Database Metadata
122
+
123
+ **URI:** `sqlite://meta`
124
+ **Test:** Read meta resource.
125
+
126
+ **Expected Output:**
127
+
128
+ - JSON with PRAGMA values for:
129
+ - database_list — Attached databases
130
+ - page_count — Total database pages
131
+ - page_size — Page size in bytes
132
+ - journal_mode — Should be wal or delete
133
+ - synchronous — Sync mode setting
134
+ - foreign_keys — FK enforcement status
135
+ - wal_autocheckpoint — WAL checkpoint threshold
136
+ - Adapter info with backend type and capabilities
137
+
138
+ ---
139
+
140
+ ### 8. sqlite_insights — Business Insights Memo
141
+
142
+ **URI:** `memo://insights`
143
+ **Test:** Read insights resource (may be empty initially), then add an insight and verify.
144
+
145
+ > **Prerequisite:** The `sqlite_append_insight` tool requires the `admin` tool group to be enabled.
146
+
147
+ **Test Sequence:**
148
+
149
+ 1. Read memo://insights — May be empty or have default content ("No business insights have been discovered yet.")
150
+ 2. Call sqlite_append_insight tool with a test insight (requires admin tools)
151
+ 3. Read memo://insights again — Should contain the new insight
152
+ 4. Verify timestamp, category, and finding text are present
153
+
154
+ **Expected Output:**
155
+
156
+ - Plain text (mimeType: text/plain)
157
+ - Synthesized memo format from insightsManager
158
+
159
+ ---
160
+
161
+ ### 9. Help Resources — On-Demand Reference Documentation
162
+
163
+ **Test A — sqlite://help (always registered):**
164
+
165
+ Read `sqlite://help` and verify it contains critical reference content:
166
+
167
+ | Check | Expected |
168
+ | --------------------------- | ---------------------------------------------- |
169
+ | Resource exists | ✅ Always registered regardless of tool filter |
170
+ | Contains "Critical Gotchas" | ✅ Section header present |
171
+ | Contains "Code Mode API" | ✅ Section header present |
172
+ | Contains "WASM vs Native" | ✅ Comparison section present |
173
+ | Content is markdown | ✅ mimeType: text/markdown |
174
+
175
+ **Test B — Group-specific help resources:**
176
+
177
+ Verify that group-specific help resources are only registered when the corresponding group is enabled. These tests depend on the `--tool-filter` configuration:
178
+
179
+ | Resource | URI | Registered When |
180
+ | --------------------------- | ----------------------------- | --------------------------- |
181
+ | `sqlite_help_json` | `sqlite://help/json` | json group enabled |
182
+ | `sqlite_help_text` | `sqlite://help/text` | text group enabled |
183
+ | `sqlite_help_stats` | `sqlite://help/stats` | stats group enabled |
184
+ | `sqlite_help_vector` | `sqlite://help/vector` | vector group enabled |
185
+ | `sqlite_help_geo` | `sqlite://help/geo` | geo group enabled |
186
+ | `sqlite_help_admin` | `sqlite://help/admin` | admin group enabled |
187
+ | `sqlite_help_introspection` | `sqlite://help/introspection` | introspection group enabled |
188
+ | `sqlite_help_migration` | `sqlite://help/migration` | migration group enabled |
189
+
190
+ If a group-specific help resource is available, read it and verify it contains relevant tool reference content (tool names, parameters, usage notes).
191
+
192
+ > **Note:** Help resources are tested more thoroughly by the `test-help-resources.mjs` integration script, which spins up separate server instances with different `--tool-filter` values.
193
+
194
+ **Test C — Tool Annotations (`openWorldHint`):**
195
+
196
+ Call `tools/list` and verify that **all** tools have `openWorldHint: false` in their annotations. db-mcp tools are local database operations — none require external network access.
197
+
198
+ | Check | Expected |
199
+ | ----------------------------------- | ------------------------ |
200
+ | All tools have `annotations` object | ✅ Present on every tool |
201
+ | All `openWorldHint` values | `false` |
202
+
203
+ ---
204
+
205
+ ## Verification Plan
206
+
207
+ ### Execution Method
208
+
209
+ Use live MCP resource reads via the `read_resource` tool against the running sqlite MCP server.
210
+
211
+ ### Test Commands
212
+
213
+ ```
214
+ # Resources being tested use the read_resource tool with:
215
+ # ServerName: "sqlite"
216
+ # Uri: "<resource-uri>"
217
+ ```
218
+
219
+ ### Pass/Fail Criteria
220
+
221
+ | Symbol | Meaning |
222
+ | ------ | ---------------------------------------------- |
223
+ | ✅ | Resource returns expected data structure |
224
+ | ❌ | Resource errors or returns unexpected format |
225
+ | ⚠️ | Unexpected behavior or improvement opportunity |
226
+ | 📦 | Response payload is larger than necessary |
227
+
228
+ ---
229
+
230
+ ## Summary
231
+
232
+ | Metric | Value |
233
+ | ------------------------- | -------------------------------------------- |
234
+ | Data resources to test | 8 |
235
+ | Help resources to test | 1 (sqlite://help) + up to 8 group-specific |
236
+ | Static resources | 7 |
237
+ | Templated resources | 1 (sqlite_table_schema with URI parameter) |
238
+ | Protocol validation tests | 2 (help resource content + tool annotations) |
239
+ | Error cases to test | 1 (nonexistent table in template) |
240
+
241
+ ---
242
+
243
+ ## Design Notes
244
+
245
+ - **FTS5 Table Filtering:** FTS5 virtual tables (`*_fts`) and shadow tables (`*_fts_*`) are intentionally hidden from `sqlite_schema` and `sqlite_tables` resources. This keeps table listings clean since shadow tables are internal implementation details. FTS5 tables are still fully accessible via `sqlite_fts_*` tools.
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Integration Test: Tool Annotations
3
+ *
4
+ * Verifies that all tools returned by tools/list have annotations
5
+ * with openWorldHint set. db-mcp tools are all local SQLite operations,
6
+ * so all should have openWorldHint: false.
7
+ *
8
+ * Usage:
9
+ * npm run build
10
+ * node test-server/test-tool-annotations.mjs
11
+ */
12
+
13
+ import { spawn } from "child_process";
14
+
15
+ const projectDir = "C:\\Users\\chris\\Desktop\\db-mcp";
16
+ const proc = spawn(
17
+ "node",
18
+ [
19
+ "dist/cli.js",
20
+ "--instruction-level",
21
+ "essential",
22
+ "--sqlite",
23
+ "./test-server/test.db",
24
+ "--tool-filter",
25
+ "+all",
26
+ ],
27
+ {
28
+ cwd: projectDir,
29
+ stdio: ["pipe", "pipe", "pipe"],
30
+ },
31
+ );
32
+
33
+ let buffer = "";
34
+ let finished = false;
35
+
36
+ proc.stdout.on("data", (chunk) => {
37
+ buffer += chunk.toString();
38
+
39
+ // Try to parse complete JSON-RPC responses
40
+ const lines = buffer.split("\n");
41
+ for (const line of lines) {
42
+ const trimmed = line.trim();
43
+ if (!trimmed) continue;
44
+ try {
45
+ const msg = JSON.parse(trimmed);
46
+ if (msg.id === 1) {
47
+ // Initialize response — skip
48
+ } else if (msg.id === 2) {
49
+ // tools/list response
50
+ const tools = msg.result?.tools || [];
51
+ console.log(`Total tools: ${tools.length}`);
52
+
53
+ let withAnnotations = 0;
54
+ let openWorldTrue = 0;
55
+ let openWorldFalse = 0;
56
+ let missing = 0;
57
+ const trueNames = [];
58
+ const missingNames = [];
59
+
60
+ for (const tool of tools) {
61
+ if (tool.annotations) {
62
+ withAnnotations++;
63
+ if (tool.annotations.openWorldHint === true) {
64
+ openWorldTrue++;
65
+ trueNames.push(tool.name);
66
+ } else if (tool.annotations.openWorldHint === false) {
67
+ openWorldFalse++;
68
+ } else {
69
+ missing++;
70
+ missingNames.push(tool.name);
71
+ }
72
+ } else {
73
+ missing++;
74
+ missingNames.push(tool.name);
75
+ }
76
+ }
77
+
78
+ console.log(
79
+ `Tools with annotations: ${withAnnotations}/${tools.length}`,
80
+ );
81
+ console.log(`openWorldHint=false (local): ${openWorldFalse}`);
82
+ console.log(`openWorldHint=true: ${openWorldTrue}`);
83
+ console.log(`Missing openWorldHint: ${missing}`);
84
+
85
+ if (trueNames.length > 0) {
86
+ console.log(`\nopenWorldHint=true tools: ${trueNames.join(", ")}`);
87
+ }
88
+ if (missingNames.length > 0) {
89
+ console.log(`\nMISSING annotations: ${missingNames.join(", ")}`);
90
+ }
91
+
92
+ // Verification
93
+ const allHaveAnnotations = missing === 0;
94
+ const allAreFalse =
95
+ openWorldTrue === 0 && openWorldFalse === tools.length;
96
+
97
+ console.log(
98
+ `\n All tools have annotations: ${allHaveAnnotations ? "✅" : "❌"}`,
99
+ );
100
+ console.log(
101
+ ` All openWorldHint=false: ${allAreFalse ? "✅" : "⚠️ (some are true)"}`,
102
+ );
103
+
104
+ finished = true;
105
+ proc.kill();
106
+ process.exit(allHaveAnnotations ? 0 : 1);
107
+ }
108
+ } catch {
109
+ // Not complete JSON yet
110
+ }
111
+ }
112
+ });
113
+
114
+ proc.stderr.on("data", () => {});
115
+
116
+ // Send initialize
117
+ proc.stdin.write(
118
+ JSON.stringify({
119
+ jsonrpc: "2.0",
120
+ id: 1,
121
+ method: "initialize",
122
+ params: {
123
+ protocolVersion: "2025-03-26",
124
+ capabilities: {},
125
+ clientInfo: { name: "test", version: "1.0" },
126
+ },
127
+ }) + "\n",
128
+ );
129
+
130
+ // Wait, then send initialized + tools/list
131
+ setTimeout(() => {
132
+ proc.stdin.write(
133
+ JSON.stringify({
134
+ jsonrpc: "2.0",
135
+ method: "notifications/initialized",
136
+ }) + "\n",
137
+ );
138
+
139
+ setTimeout(() => {
140
+ proc.stdin.write(
141
+ JSON.stringify({
142
+ jsonrpc: "2.0",
143
+ id: 2,
144
+ method: "tools/list",
145
+ params: {},
146
+ }) + "\n",
147
+ );
148
+ }, 500);
149
+ }, 1500);
150
+
151
+ setTimeout(() => {
152
+ if (!finished) {
153
+ console.log("Timeout — killing process");
154
+ proc.kill();
155
+ process.exit(1);
156
+ }
157
+ }, 15000);