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,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 };
|