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,74 @@
1
+ // src/utils/icons.ts
2
+ var MDI_BASE = "https://cdn.jsdelivr.net/npm/@mdi/svg@7.4.47/svg";
3
+ var SERVER_ICONS = [
4
+ {
5
+ src: `${MDI_BASE}/server.svg`,
6
+ mimeType: "image/svg+xml"
7
+ }
8
+ ];
9
+ var TOOL_GROUP_ICONS = {
10
+ core: [{ src: `${MDI_BASE}/database.svg`, mimeType: "image/svg+xml" }],
11
+ json: [{ src: `${MDI_BASE}/code-json.svg`, mimeType: "image/svg+xml" }],
12
+ text: [{ src: `${MDI_BASE}/format-text.svg`, mimeType: "image/svg+xml" }],
13
+ stats: [{ src: `${MDI_BASE}/chart-bar.svg`, mimeType: "image/svg+xml" }],
14
+ vector: [
15
+ { src: `${MDI_BASE}/vector-polyline.svg`, mimeType: "image/svg+xml" }
16
+ ],
17
+ admin: [{ src: `${MDI_BASE}/cog.svg`, mimeType: "image/svg+xml" }],
18
+ geo: [{ src: `${MDI_BASE}/earth.svg`, mimeType: "image/svg+xml" }],
19
+ introspection: [
20
+ { src: `${MDI_BASE}/graph-outline.svg`, mimeType: "image/svg+xml" }
21
+ ],
22
+ migration: [
23
+ { src: `${MDI_BASE}/source-branch.svg`, mimeType: "image/svg+xml" }
24
+ ],
25
+ codemode: [{ src: `${MDI_BASE}/code-braces.svg`, mimeType: "image/svg+xml" }]
26
+ };
27
+ function getToolGroupIcon(group) {
28
+ return TOOL_GROUP_ICONS[group];
29
+ }
30
+
31
+ // src/utils/annotations.ts
32
+ var READ_ONLY = {
33
+ readOnlyHint: true,
34
+ destructiveHint: false,
35
+ openWorldHint: false
36
+ };
37
+ var WRITE = {
38
+ readOnlyHint: false,
39
+ destructiveHint: false,
40
+ openWorldHint: false
41
+ };
42
+ var DESTRUCTIVE = {
43
+ readOnlyHint: false,
44
+ destructiveHint: true,
45
+ openWorldHint: false
46
+ };
47
+ var IDEMPOTENT = {
48
+ readOnlyHint: false,
49
+ destructiveHint: false,
50
+ idempotentHint: true,
51
+ openWorldHint: false
52
+ };
53
+ var ADMIN = {
54
+ readOnlyHint: false,
55
+ destructiveHint: false,
56
+ openWorldHint: false
57
+ };
58
+ function readOnly(title) {
59
+ return { title, ...READ_ONLY };
60
+ }
61
+ function write(title) {
62
+ return { title, ...WRITE };
63
+ }
64
+ function destructive(title) {
65
+ return { title, ...DESTRUCTIVE };
66
+ }
67
+ function idempotent(title) {
68
+ return { title, ...IDEMPOTENT };
69
+ }
70
+ function admin(title) {
71
+ return { title, ...ADMIN };
72
+ }
73
+
74
+ export { READ_ONLY, SERVER_ICONS, admin, destructive, getToolGroupIcon, idempotent, readOnly, write };
@@ -0,0 +1,363 @@
1
+ import { ConnectionError, formatHandlerError, ValidationError } from './chunk-4IA3DB5C.js';
2
+ import { isToolEnabled } from './chunk-AOUL5SHS.js';
3
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
4
+ import { z } from 'zod';
5
+
6
+ // src/adapters/query-validation.ts
7
+ var DANGEROUS_SQL_PATTERNS = [
8
+ /;\s*DROP\s+/i,
9
+ /;\s*DELETE\s+/i,
10
+ /;\s*TRUNCATE\s+/i,
11
+ /;\s*ALTER\s+/i,
12
+ /;\s*UNION\s+ALL\s+SELECT/i,
13
+ /;\s*UNION\s+SELECT/i,
14
+ /;\s*ATTACH\s+/i,
15
+ /;\s*DETACH\s+/i
16
+ ];
17
+ var COMMENT_SQL_PATTERNS = [/--.*$/m, /\/\*[\s\S]*?\*\//];
18
+ function stripSqlStringLiterals(sql) {
19
+ return sql.replace(/'(?:''|[^'])*'/g, "''");
20
+ }
21
+ var WRITE_PREFIXES = [
22
+ "INSERT",
23
+ "UPDATE",
24
+ "DELETE",
25
+ "DROP",
26
+ "CREATE",
27
+ "ALTER",
28
+ "TRUNCATE"
29
+ ];
30
+ function validateQuery(sql, isReadOnly) {
31
+ const trimmedSql = sql.trim().toUpperCase();
32
+ if (isReadOnly) {
33
+ for (const prefix of WRITE_PREFIXES) {
34
+ if (trimmedSql.startsWith(prefix)) {
35
+ throw new ValidationError(
36
+ `Read-only mode: ${prefix} statements are not allowed`,
37
+ "DB_READ_ONLY_VIOLATION"
38
+ );
39
+ }
40
+ }
41
+ }
42
+ for (const pattern of DANGEROUS_SQL_PATTERNS) {
43
+ if (pattern.test(sql)) {
44
+ throw new ValidationError(
45
+ "Query contains potentially dangerous patterns",
46
+ "DB_DANGEROUS_PATTERN"
47
+ );
48
+ }
49
+ }
50
+ const sqlWithoutStrings = stripSqlStringLiterals(sql);
51
+ for (const pattern of COMMENT_SQL_PATTERNS) {
52
+ if (pattern.test(sqlWithoutStrings)) {
53
+ throw new ValidationError(
54
+ "Query contains potentially dangerous patterns",
55
+ "DB_DANGEROUS_PATTERN"
56
+ );
57
+ }
58
+ }
59
+ }
60
+
61
+ // src/adapters/registration/tools.ts
62
+ function registerToolImpl(adapter, server, tool) {
63
+ const toolOptions = {
64
+ description: tool.description
65
+ };
66
+ if (tool.inputSchema !== void 0) {
67
+ const schema = tool.inputSchema;
68
+ if (typeof schema === "object" && schema !== null && "partial" in schema && typeof schema.partial === "function") {
69
+ toolOptions["inputSchema"] = schema.partial().passthrough();
70
+ } else {
71
+ toolOptions["inputSchema"] = schema;
72
+ }
73
+ }
74
+ if (tool.outputSchema !== void 0) {
75
+ toolOptions["outputSchema"] = tool.outputSchema;
76
+ }
77
+ if (tool.annotations) {
78
+ toolOptions["annotations"] = tool.annotations;
79
+ }
80
+ if (tool.icons) {
81
+ toolOptions["icons"] = tool.icons;
82
+ }
83
+ const hasOutputSchema = Boolean(tool.outputSchema);
84
+ server.registerTool(
85
+ tool.name,
86
+ toolOptions,
87
+ async (args, extra) => {
88
+ try {
89
+ const extraMeta = extra;
90
+ const progressToken = extraMeta?._meta?.progressToken;
91
+ const context = adapter.createContext(
92
+ void 0,
93
+ server.server,
94
+ progressToken
95
+ );
96
+ const result = await tool.handler(args, context);
97
+ if (hasOutputSchema) {
98
+ return {
99
+ content: [
100
+ {
101
+ type: "text",
102
+ text: JSON.stringify(result)
103
+ }
104
+ ],
105
+ structuredContent: result
106
+ };
107
+ }
108
+ return {
109
+ content: [
110
+ {
111
+ type: "text",
112
+ text: typeof result === "string" ? result : JSON.stringify(result)
113
+ }
114
+ ]
115
+ };
116
+ } catch (error) {
117
+ const structured = formatHandlerError(error);
118
+ if (hasOutputSchema) {
119
+ return {
120
+ content: [
121
+ {
122
+ type: "text",
123
+ text: JSON.stringify(structured, null, 2)
124
+ }
125
+ ],
126
+ structuredContent: structured,
127
+ isError: true
128
+ };
129
+ }
130
+ return {
131
+ content: [
132
+ {
133
+ type: "text",
134
+ text: JSON.stringify(structured, null, 2)
135
+ }
136
+ ],
137
+ isError: true
138
+ };
139
+ }
140
+ }
141
+ );
142
+ }
143
+ function registerResourceImpl(adapter, server, resource) {
144
+ const isTemplate = /\{[^}]+\}/.test(resource.uri);
145
+ if (isTemplate) {
146
+ const template = new ResourceTemplate(resource.uri, { list: void 0 });
147
+ server.registerResource(
148
+ resource.name,
149
+ template,
150
+ {
151
+ mimeType: resource.mimeType ?? "application/json",
152
+ description: resource.description,
153
+ ...resource.icons ? { icons: resource.icons } : {}
154
+ },
155
+ async (resourceUri, _variables) => {
156
+ const context = adapter.createContext();
157
+ const content = await resource.handler(resourceUri.toString(), context);
158
+ return {
159
+ contents: [
160
+ {
161
+ uri: resourceUri.toString(),
162
+ mimeType: resource.mimeType ?? "application/json",
163
+ text: typeof content === "string" ? content : JSON.stringify(content, null, 2)
164
+ }
165
+ ]
166
+ };
167
+ }
168
+ );
169
+ } else {
170
+ server.registerResource(
171
+ resource.name,
172
+ resource.uri,
173
+ {
174
+ mimeType: resource.mimeType ?? "application/json",
175
+ description: resource.description,
176
+ ...resource.icons ? { icons: resource.icons } : {}
177
+ },
178
+ async (resourceUri) => {
179
+ const context = adapter.createContext();
180
+ const content = await resource.handler(resourceUri.toString(), context);
181
+ return {
182
+ contents: [
183
+ {
184
+ uri: resourceUri.toString(),
185
+ mimeType: resource.mimeType ?? "application/json",
186
+ text: typeof content === "string" ? content : JSON.stringify(content, null, 2)
187
+ }
188
+ ]
189
+ };
190
+ }
191
+ );
192
+ }
193
+ }
194
+ function buildArgsSchema(args) {
195
+ if (!args || args.length === 0) return void 0;
196
+ const hasRequired = args.some((a) => a.required === true);
197
+ if (!hasRequired) return void 0;
198
+ const schema = {};
199
+ for (const arg of args) {
200
+ const field = z.string().describe(arg.description);
201
+ schema[arg.name] = arg.required ? field : field.optional();
202
+ }
203
+ return schema;
204
+ }
205
+ function registerPromptImpl(adapter, server, prompt) {
206
+ const argsSchema = buildArgsSchema(prompt.arguments);
207
+ const iconOpts = prompt.icons ? { icons: prompt.icons } : {};
208
+ const handleResult = async (args) => {
209
+ const context = adapter.createContext();
210
+ const safeArgs = args ?? {};
211
+ const result = await prompt.handler(safeArgs, context);
212
+ const messages = Array.isArray(result) ? result : [
213
+ {
214
+ role: "assistant",
215
+ content: {
216
+ type: "text",
217
+ text: typeof result === "string" ? result : JSON.stringify(result)
218
+ }
219
+ }
220
+ ];
221
+ return { messages };
222
+ };
223
+ if (argsSchema) {
224
+ server.registerPrompt(
225
+ prompt.name,
226
+ { description: prompt.description, argsSchema, ...iconOpts },
227
+ async (args) => handleResult(args)
228
+ );
229
+ } else {
230
+ server.registerPrompt(
231
+ prompt.name,
232
+ { description: prompt.description, ...iconOpts },
233
+ async (args) => handleResult(args)
234
+ );
235
+ }
236
+ }
237
+
238
+ // src/adapters/database-adapter.ts
239
+ var DatabaseAdapter = class {
240
+ /** Connection status */
241
+ connected = false;
242
+ /** Database configuration */
243
+ config = null;
244
+ /**
245
+ * Check if connected to the database
246
+ */
247
+ isConnected() {
248
+ return this.connected;
249
+ }
250
+ /**
251
+ * Register tools with the MCP server
252
+ * @param server - MCP server instance
253
+ * @param filterConfig - Tool filter configuration
254
+ */
255
+ registerTools(server, filterConfig) {
256
+ const tools = this.getToolDefinitions();
257
+ for (const tool of tools) {
258
+ if (!isToolEnabled(tool, filterConfig)) {
259
+ continue;
260
+ }
261
+ this.registerTool(server, tool);
262
+ }
263
+ }
264
+ /**
265
+ * Register a single tool with the MCP server.
266
+ * Uses modern registerTool() API for MCP 2025-11-25 compliance.
267
+ * Subclasses may override for custom behavior.
268
+ */
269
+ registerTool(server, tool) {
270
+ registerToolImpl(this, server, tool);
271
+ }
272
+ /**
273
+ * Register resources with the MCP server
274
+ */
275
+ registerResources(server) {
276
+ const resources = this.getResourceDefinitions();
277
+ for (const resource of resources) {
278
+ this.registerResource(server, resource);
279
+ }
280
+ }
281
+ /**
282
+ * Register a single resource with the MCP server.
283
+ * Handles both static resources and URI templates.
284
+ * Subclasses may override for custom behavior.
285
+ */
286
+ registerResource(server, resource) {
287
+ registerResourceImpl(this, server, resource);
288
+ }
289
+ /**
290
+ * Register prompts with the MCP server
291
+ */
292
+ registerPrompts(server) {
293
+ const prompts = this.getPromptDefinitions();
294
+ for (const prompt of prompts) {
295
+ this.registerPrompt(server, prompt);
296
+ }
297
+ }
298
+ /**
299
+ * Register a single prompt with the MCP server.
300
+ * Subclasses may override for custom behavior.
301
+ */
302
+ registerPrompt(server, prompt) {
303
+ registerPromptImpl(this, server, prompt);
304
+ }
305
+ // ===========================================================================
306
+ // Utility Methods
307
+ // ===========================================================================
308
+ /**
309
+ * Validate query for safety (SQL injection prevention)
310
+ * @param sql - SQL query to validate
311
+ * @param isReadOnly - Whether to enforce read-only restrictions
312
+ */
313
+ validateQuery(sql, isReadOnly) {
314
+ validateQuery(sql, isReadOnly);
315
+ }
316
+ /**
317
+ * Create a request context for tool execution
318
+ * @param requestId Optional request ID for tracing
319
+ * @param server Optional MCP Server instance for progress notifications
320
+ * @param progressToken Optional progress token from client request _meta
321
+ */
322
+ createContext(requestId, server, progressToken) {
323
+ const context = {
324
+ timestamp: /* @__PURE__ */ new Date(),
325
+ requestId: requestId ?? crypto.randomUUID()
326
+ };
327
+ if (server !== void 0) {
328
+ context.server = server;
329
+ }
330
+ if (progressToken !== void 0) {
331
+ context.progressToken = progressToken;
332
+ }
333
+ return context;
334
+ }
335
+ /**
336
+ * Ensure the adapter is connected to the database.
337
+ * Throws ConnectionError if not connected.
338
+ * Subclasses may override to add additional checks (e.g., db instance null).
339
+ */
340
+ ensureConnected() {
341
+ if (!this.connected) {
342
+ throw new ConnectionError(
343
+ "Not connected to database",
344
+ "DB_NOT_CONNECTED"
345
+ );
346
+ }
347
+ }
348
+ /**
349
+ * Get adapter info for logging/debugging
350
+ */
351
+ getInfo() {
352
+ return {
353
+ type: this.type,
354
+ name: this.name,
355
+ version: this.version,
356
+ connected: this.connected,
357
+ capabilities: this.getCapabilities(),
358
+ toolGroups: this.getSupportedToolGroups()
359
+ };
360
+ }
361
+ };
362
+
363
+ export { DatabaseAdapter };
package/dist/cli.d.ts CHANGED
@@ -1,8 +1 @@
1
1
  #!/usr/bin/env node
2
- /**
3
- * db-mcp - Command Line Interface
4
- *
5
- * Entry point for running the db-mcp server from the command line.
6
- */
7
- export {};
8
- //# sourceMappingURL=cli.d.ts.map