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.
- package/.gitattributes +2 -0
- package/LICENSE +1 -1
- package/README.md +244 -518
- package/dist/chunk-4IA3DB5C.js +135 -0
- package/dist/chunk-AOUL5SHS.js +930 -0
- package/dist/chunk-DWJXQEFA.js +13759 -0
- package/dist/chunk-DZQLDEQS.js +879 -0
- package/dist/chunk-S5IDDSSB.js +74 -0
- package/dist/chunk-Z2GFQU3G.js +363 -0
- package/dist/cli.d.ts +0 -7
- package/dist/cli.js +227 -183
- package/dist/http-VSB7DBJR.js +1541 -0
- package/dist/index.d.ts +842 -10
- package/dist/index.js +5 -17
- package/dist/sqlite-VHBA4ABV.js +600 -0
- package/dist/sqlite-native-D2LH5ZT7.js +2498 -0
- package/dist/worker-script.d.ts +2 -0
- package/dist/worker-script.js +126 -0
- package/package.json +26 -16
- package/playwright.config.ts +101 -0
- package/scripts/generate-server-instructions.ts +111 -0
- package/server.json +5 -6
- package/test-server/README.md +118 -0
- package/test-server/code-map.md +409 -0
- package/test-server/fixtures/sample.csv +6 -0
- package/test-server/reset-database.ps1 +373 -0
- package/test-server/sample.csv +11 -0
- package/test-server/test-agent-experience.md +243 -0
- package/test-server/test-database.sql +388 -0
- package/test-server/test-group-tools.md +861 -0
- package/test-server/test-help-resources.mjs +238 -0
- package/test-server/test-preflight.md +53 -0
- package/test-server/test-prompts.md +354 -0
- package/test-server/test-resources.md +245 -0
- package/test-server/test-tool-annotations.mjs +157 -0
- package/test-server/test-tools-advanced-1.md +517 -0
- package/test-server/test-tools-advanced-2.md +487 -0
- package/test-server/test-tools-codemode.md +629 -0
- package/test-server/test-tools.md +176 -0
- package/test-server/tool-reference.md +236 -0
- package/tsconfig.test.json +9 -0
- package/dist/adapters/DatabaseAdapter.d.ts +0 -141
- package/dist/adapters/DatabaseAdapter.d.ts.map +0 -1
- package/dist/adapters/DatabaseAdapter.js +0 -131
- package/dist/adapters/DatabaseAdapter.js.map +0 -1
- package/dist/adapters/sqlite/SchemaManager.d.ts +0 -58
- package/dist/adapters/sqlite/SchemaManager.d.ts.map +0 -1
- package/dist/adapters/sqlite/SchemaManager.js +0 -187
- package/dist/adapters/sqlite/SchemaManager.js.map +0 -1
- package/dist/adapters/sqlite/SqliteAdapter.d.ts +0 -161
- package/dist/adapters/sqlite/SqliteAdapter.d.ts.map +0 -1
- package/dist/adapters/sqlite/SqliteAdapter.js +0 -741
- package/dist/adapters/sqlite/SqliteAdapter.js.map +0 -1
- package/dist/adapters/sqlite/index.d.ts +0 -9
- package/dist/adapters/sqlite/index.d.ts.map +0 -1
- package/dist/adapters/sqlite/index.js +0 -8
- package/dist/adapters/sqlite/index.js.map +0 -1
- package/dist/adapters/sqlite/json-utils.d.ts +0 -100
- package/dist/adapters/sqlite/json-utils.d.ts.map +0 -1
- package/dist/adapters/sqlite/json-utils.js +0 -274
- package/dist/adapters/sqlite/json-utils.js.map +0 -1
- package/dist/adapters/sqlite/output-schemas.d.ts +0 -1187
- package/dist/adapters/sqlite/output-schemas.d.ts.map +0 -1
- package/dist/adapters/sqlite/output-schemas.js +0 -1337
- package/dist/adapters/sqlite/output-schemas.js.map +0 -1
- package/dist/adapters/sqlite/prompts.d.ts +0 -13
- package/dist/adapters/sqlite/prompts.d.ts.map +0 -1
- package/dist/adapters/sqlite/prompts.js +0 -605
- package/dist/adapters/sqlite/prompts.js.map +0 -1
- package/dist/adapters/sqlite/resources.d.ts +0 -13
- package/dist/adapters/sqlite/resources.d.ts.map +0 -1
- package/dist/adapters/sqlite/resources.js +0 -251
- package/dist/adapters/sqlite/resources.js.map +0 -1
- package/dist/adapters/sqlite/tools/admin.d.ts +0 -14
- package/dist/adapters/sqlite/tools/admin.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/admin.js +0 -788
- package/dist/adapters/sqlite/tools/admin.js.map +0 -1
- package/dist/adapters/sqlite/tools/core.d.ts +0 -25
- package/dist/adapters/sqlite/tools/core.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/core.js +0 -359
- package/dist/adapters/sqlite/tools/core.js.map +0 -1
- package/dist/adapters/sqlite/tools/fts.d.ts +0 -13
- package/dist/adapters/sqlite/tools/fts.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/fts.js +0 -347
- package/dist/adapters/sqlite/tools/fts.js.map +0 -1
- package/dist/adapters/sqlite/tools/geo.d.ts +0 -14
- package/dist/adapters/sqlite/tools/geo.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/geo.js +0 -252
- package/dist/adapters/sqlite/tools/geo.js.map +0 -1
- package/dist/adapters/sqlite/tools/index.d.ts +0 -30
- package/dist/adapters/sqlite/tools/index.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/index.js +0 -61
- package/dist/adapters/sqlite/tools/index.js.map +0 -1
- package/dist/adapters/sqlite/tools/json-helpers.d.ts +0 -14
- package/dist/adapters/sqlite/tools/json-helpers.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/json-helpers.js +0 -477
- package/dist/adapters/sqlite/tools/json-helpers.js.map +0 -1
- package/dist/adapters/sqlite/tools/json-operations.d.ts +0 -14
- package/dist/adapters/sqlite/tools/json-operations.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/json-operations.js +0 -839
- package/dist/adapters/sqlite/tools/json-operations.js.map +0 -1
- package/dist/adapters/sqlite/tools/stats.d.ts +0 -15
- package/dist/adapters/sqlite/tools/stats.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/stats.js +0 -1219
- package/dist/adapters/sqlite/tools/stats.js.map +0 -1
- package/dist/adapters/sqlite/tools/text.d.ts +0 -14
- package/dist/adapters/sqlite/tools/text.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/text.js +0 -1141
- package/dist/adapters/sqlite/tools/text.js.map +0 -1
- package/dist/adapters/sqlite/tools/vector.d.ts +0 -14
- package/dist/adapters/sqlite/tools/vector.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/vector.js +0 -613
- package/dist/adapters/sqlite/tools/vector.js.map +0 -1
- package/dist/adapters/sqlite/tools/virtual.d.ts +0 -13
- package/dist/adapters/sqlite/tools/virtual.d.ts.map +0 -1
- package/dist/adapters/sqlite/tools/virtual.js +0 -930
- package/dist/adapters/sqlite/tools/virtual.js.map +0 -1
- package/dist/adapters/sqlite/types.d.ts +0 -207
- package/dist/adapters/sqlite/types.d.ts.map +0 -1
- package/dist/adapters/sqlite/types.js +0 -186
- package/dist/adapters/sqlite/types.js.map +0 -1
- package/dist/adapters/sqlite-native/NativeSqliteAdapter.d.ts +0 -163
- package/dist/adapters/sqlite-native/NativeSqliteAdapter.d.ts.map +0 -1
- package/dist/adapters/sqlite-native/NativeSqliteAdapter.js +0 -748
- package/dist/adapters/sqlite-native/NativeSqliteAdapter.js.map +0 -1
- package/dist/adapters/sqlite-native/index.d.ts +0 -11
- package/dist/adapters/sqlite-native/index.d.ts.map +0 -1
- package/dist/adapters/sqlite-native/index.js +0 -11
- package/dist/adapters/sqlite-native/index.js.map +0 -1
- package/dist/adapters/sqlite-native/tools/spatialite.d.ts +0 -19
- package/dist/adapters/sqlite-native/tools/spatialite.d.ts.map +0 -1
- package/dist/adapters/sqlite-native/tools/spatialite.js +0 -628
- package/dist/adapters/sqlite-native/tools/spatialite.js.map +0 -1
- package/dist/adapters/sqlite-native/tools/transactions.d.ts +0 -12
- package/dist/adapters/sqlite-native/tools/transactions.d.ts.map +0 -1
- package/dist/adapters/sqlite-native/tools/transactions.js +0 -255
- package/dist/adapters/sqlite-native/tools/transactions.js.map +0 -1
- package/dist/adapters/sqlite-native/tools/window.d.ts +0 -12
- package/dist/adapters/sqlite-native/tools/window.d.ts.map +0 -1
- package/dist/adapters/sqlite-native/tools/window.js +0 -370
- package/dist/adapters/sqlite-native/tools/window.js.map +0 -1
- package/dist/auth/AuthorizationServerDiscovery.d.ts +0 -90
- package/dist/auth/AuthorizationServerDiscovery.d.ts.map +0 -1
- package/dist/auth/AuthorizationServerDiscovery.js +0 -204
- package/dist/auth/AuthorizationServerDiscovery.js.map +0 -1
- package/dist/auth/OAuthResourceServer.d.ts +0 -65
- package/dist/auth/OAuthResourceServer.d.ts.map +0 -1
- package/dist/auth/OAuthResourceServer.js +0 -121
- package/dist/auth/OAuthResourceServer.js.map +0 -1
- package/dist/auth/TokenValidator.d.ts +0 -60
- package/dist/auth/TokenValidator.d.ts.map +0 -1
- package/dist/auth/TokenValidator.js +0 -235
- package/dist/auth/TokenValidator.js.map +0 -1
- package/dist/auth/errors.d.ts +0 -74
- package/dist/auth/errors.d.ts.map +0 -1
- package/dist/auth/errors.js +0 -133
- package/dist/auth/errors.js.map +0 -1
- package/dist/auth/index.d.ts +0 -13
- package/dist/auth/index.d.ts.map +0 -1
- package/dist/auth/index.js +0 -15
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/middleware.d.ts +0 -81
- package/dist/auth/middleware.d.ts.map +0 -1
- package/dist/auth/middleware.js +0 -291
- package/dist/auth/middleware.js.map +0 -1
- package/dist/auth/scopes.d.ts +0 -136
- package/dist/auth/scopes.d.ts.map +0 -1
- package/dist/auth/scopes.js +0 -349
- package/dist/auth/scopes.js.map +0 -1
- package/dist/auth/types.d.ts +0 -257
- package/dist/auth/types.d.ts.map +0 -1
- package/dist/auth/types.js +0 -8
- package/dist/auth/types.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/constants/ServerInstructions.d.ts +0 -45
- package/dist/constants/ServerInstructions.d.ts.map +0 -1
- package/dist/constants/ServerInstructions.js +0 -356
- package/dist/constants/ServerInstructions.js.map +0 -1
- package/dist/filtering/ToolConstants.d.ts +0 -34
- package/dist/filtering/ToolConstants.d.ts.map +0 -1
- package/dist/filtering/ToolConstants.js +0 -174
- package/dist/filtering/ToolConstants.js.map +0 -1
- package/dist/filtering/ToolFilter.d.ts +0 -82
- package/dist/filtering/ToolFilter.d.ts.map +0 -1
- package/dist/filtering/ToolFilter.js +0 -296
- package/dist/filtering/ToolFilter.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/server/McpServer.d.ts +0 -61
- package/dist/server/McpServer.d.ts.map +0 -1
- package/dist/server/McpServer.js +0 -270
- package/dist/server/McpServer.js.map +0 -1
- package/dist/transports/http.d.ts +0 -134
- package/dist/transports/http.d.ts.map +0 -1
- package/dist/transports/http.js +0 -516
- package/dist/transports/http.js.map +0 -1
- package/dist/transports/index.d.ts +0 -5
- package/dist/transports/index.d.ts.map +0 -1
- package/dist/transports/index.js +0 -5
- package/dist/transports/index.js.map +0 -1
- package/dist/types/index.d.ts +0 -380
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -68
- package/dist/types/index.js.map +0 -1
- package/dist/utils/annotations.d.ts +0 -44
- package/dist/utils/annotations.d.ts.map +0 -1
- package/dist/utils/annotations.js +0 -77
- package/dist/utils/annotations.js.map +0 -1
- package/dist/utils/errors.d.ts +0 -155
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/errors.js +0 -329
- package/dist/utils/errors.js.map +0 -1
- package/dist/utils/identifiers.d.ts +0 -121
- package/dist/utils/identifiers.d.ts.map +0 -1
- package/dist/utils/identifiers.js +0 -319
- package/dist/utils/identifiers.js.map +0 -1
- package/dist/utils/index.d.ts +0 -7
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -7
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/insightsManager.d.ts +0 -39
- package/dist/utils/insightsManager.d.ts.map +0 -1
- package/dist/utils/insightsManager.js +0 -63
- package/dist/utils/insightsManager.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -189
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -394
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/progress-utils.d.ts +0 -54
- package/dist/utils/progress-utils.d.ts.map +0 -1
- package/dist/utils/progress-utils.js +0 -74
- package/dist/utils/progress-utils.js.map +0 -1
- package/dist/utils/resourceAnnotations.d.ts +0 -36
- package/dist/utils/resourceAnnotations.d.ts.map +0 -1
- package/dist/utils/resourceAnnotations.js +0 -57
- package/dist/utils/resourceAnnotations.js.map +0 -1
- package/dist/utils/where-clause.d.ts +0 -41
- package/dist/utils/where-clause.d.ts.map +0 -1
- package/dist/utils/where-clause.js +0 -116
- 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);
|