@pilat/mcp-datalink 1.1.0 → 1.2.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/README.md +19 -97
- package/dist/adapters/factory.d.ts +0 -4
- package/dist/adapters/factory.d.ts.map +1 -1
- package/dist/adapters/factory.js +3 -8
- package/dist/adapters/factory.js.map +1 -1
- package/dist/adapters/mysql/adapter.d.ts +2 -31
- package/dist/adapters/mysql/adapter.d.ts.map +1 -1
- package/dist/adapters/mysql/adapter.js +27 -283
- package/dist/adapters/mysql/adapter.js.map +1 -1
- package/dist/adapters/postgresql/adapter.d.ts +2 -22
- package/dist/adapters/postgresql/adapter.d.ts.map +1 -1
- package/dist/adapters/postgresql/adapter.js +18 -175
- package/dist/adapters/postgresql/adapter.js.map +1 -1
- package/dist/adapters/sqlite/adapter.d.ts +3 -25
- package/dist/adapters/sqlite/adapter.d.ts.map +1 -1
- package/dist/adapters/sqlite/adapter.js +65 -364
- package/dist/adapters/sqlite/adapter.js.map +1 -1
- package/dist/adapters/sqlite/pragma-check.d.ts +19 -0
- package/dist/adapters/sqlite/pragma-check.d.ts.map +1 -0
- package/dist/adapters/sqlite/pragma-check.js +25 -0
- package/dist/adapters/sqlite/pragma-check.js.map +1 -0
- package/dist/adapters/sqlite/url-parser.d.ts +34 -0
- package/dist/adapters/sqlite/url-parser.d.ts.map +1 -0
- package/dist/adapters/sqlite/url-parser.js +73 -0
- package/dist/adapters/sqlite/url-parser.js.map +1 -0
- package/dist/adapters/types.d.ts +10 -113
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +31 -20
- package/dist/server.js.map +1 -1
- package/dist/tools/describe-table.d.ts +5 -6
- package/dist/tools/describe-table.d.ts.map +1 -1
- package/dist/tools/describe-table.js +65 -9
- package/dist/tools/describe-table.js.map +1 -1
- package/dist/tools/execute.d.ts +5 -6
- package/dist/tools/execute.d.ts.map +1 -1
- package/dist/tools/execute.js +13 -11
- package/dist/tools/execute.js.map +1 -1
- package/dist/tools/explain.d.ts +5 -10
- package/dist/tools/explain.d.ts.map +1 -1
- package/dist/tools/explain.js +25 -26
- package/dist/tools/explain.js.map +1 -1
- package/dist/tools/list-databases.d.ts +5 -7
- package/dist/tools/list-databases.d.ts.map +1 -1
- package/dist/tools/list-databases.js +31 -0
- package/dist/tools/list-databases.js.map +1 -1
- package/dist/tools/list-tables.d.ts +5 -10
- package/dist/tools/list-tables.d.ts.map +1 -1
- package/dist/tools/list-tables.js +27 -9
- package/dist/tools/list-tables.js.map +1 -1
- package/dist/tools/query.d.ts +1 -6
- package/dist/tools/query.d.ts.map +1 -1
- package/dist/tools/query.js +7 -27
- package/dist/tools/query.js.map +1 -1
- package/dist/types.d.ts +39 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/formatter.d.ts +7 -4
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +20 -10
- package/dist/utils/formatter.js.map +1 -1
- package/dist/utils/sql-parser.d.ts +51 -0
- package/dist/utils/sql-parser.d.ts.map +1 -0
- package/dist/utils/sql-parser.js +310 -0
- package/dist/utils/sql-parser.js.map +1 -0
- package/dist/utils/truncate.d.ts +4 -13
- package/dist/utils/truncate.d.ts.map +1 -1
- package/dist/utils/truncate.js +38 -18
- package/dist/utils/truncate.js.map +1 -1
- package/dist/utils/validation.d.ts +35 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +89 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +10 -11
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite URL and Path Parsing Utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles parsing of SQLite connection URLs and path validation/resolution.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Parse SQLite URL to extract file path
|
|
8
|
+
*
|
|
9
|
+
* Supported formats:
|
|
10
|
+
* - sqlite:///absolute/path.db
|
|
11
|
+
* - sqlite://./relative/path.db
|
|
12
|
+
* - sqlite://:memory:
|
|
13
|
+
* - /absolute/path.db (plain file path)
|
|
14
|
+
* - ./relative/path.db (plain file path)
|
|
15
|
+
*
|
|
16
|
+
* @param url - SQLite connection URL or file path
|
|
17
|
+
* @returns Resolved absolute file path or :memory:
|
|
18
|
+
*/
|
|
19
|
+
export declare function parseSqliteUrl(url: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Validate and resolve SQLite database path
|
|
22
|
+
*
|
|
23
|
+
* SECURITY: Prevents path traversal attacks by:
|
|
24
|
+
* 1. Resolving to absolute path
|
|
25
|
+
* 2. Ensuring path doesn't contain suspicious patterns
|
|
26
|
+
* 3. Checking file exists (unless :memory:)
|
|
27
|
+
*
|
|
28
|
+
* @param rawPath - Raw path from config
|
|
29
|
+
* @param basePath - Base directory for relative paths (process.cwd())
|
|
30
|
+
* @returns Validated absolute path
|
|
31
|
+
* @throws DbMcpError if path is invalid or file not found
|
|
32
|
+
*/
|
|
33
|
+
export declare function validateAndResolvePath(rawPath: string, basePath: string): string;
|
|
34
|
+
//# sourceMappingURL=url-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-parser.d.ts","sourceRoot":"","sources":["../../../src/adapters/sqlite/url-parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAelD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAqChF"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite URL and Path Parsing Utilities
|
|
3
|
+
*
|
|
4
|
+
* Handles parsing of SQLite connection URLs and path validation/resolution.
|
|
5
|
+
*/
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import { DbMcpError, ErrorCode } from '../../utils/errors.js';
|
|
9
|
+
/**
|
|
10
|
+
* Parse SQLite URL to extract file path
|
|
11
|
+
*
|
|
12
|
+
* Supported formats:
|
|
13
|
+
* - sqlite:///absolute/path.db
|
|
14
|
+
* - sqlite://./relative/path.db
|
|
15
|
+
* - sqlite://:memory:
|
|
16
|
+
* - /absolute/path.db (plain file path)
|
|
17
|
+
* - ./relative/path.db (plain file path)
|
|
18
|
+
*
|
|
19
|
+
* @param url - SQLite connection URL or file path
|
|
20
|
+
* @returns Resolved absolute file path or :memory:
|
|
21
|
+
*/
|
|
22
|
+
export function parseSqliteUrl(url) {
|
|
23
|
+
if (url.startsWith('sqlite://')) {
|
|
24
|
+
const pathPart = url.slice('sqlite://'.length);
|
|
25
|
+
// Special case: :memory:
|
|
26
|
+
if (pathPart === ':memory:') {
|
|
27
|
+
return ':memory:';
|
|
28
|
+
}
|
|
29
|
+
// Handle both absolute (/path) and relative (./path) paths
|
|
30
|
+
return pathPart;
|
|
31
|
+
}
|
|
32
|
+
// Plain file path (no sqlite:// prefix)
|
|
33
|
+
return url;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Validate and resolve SQLite database path
|
|
37
|
+
*
|
|
38
|
+
* SECURITY: Prevents path traversal attacks by:
|
|
39
|
+
* 1. Resolving to absolute path
|
|
40
|
+
* 2. Ensuring path doesn't contain suspicious patterns
|
|
41
|
+
* 3. Checking file exists (unless :memory:)
|
|
42
|
+
*
|
|
43
|
+
* @param rawPath - Raw path from config
|
|
44
|
+
* @param basePath - Base directory for relative paths (process.cwd())
|
|
45
|
+
* @returns Validated absolute path
|
|
46
|
+
* @throws DbMcpError if path is invalid or file not found
|
|
47
|
+
*/
|
|
48
|
+
export function validateAndResolvePath(rawPath, basePath) {
|
|
49
|
+
// :memory: is always valid
|
|
50
|
+
if (rawPath === ':memory:') {
|
|
51
|
+
return ':memory:';
|
|
52
|
+
}
|
|
53
|
+
// Resolve to absolute path
|
|
54
|
+
const absolutePath = path.isAbsolute(rawPath) ? rawPath : path.resolve(basePath, rawPath);
|
|
55
|
+
// Normalize to remove any .. or . components
|
|
56
|
+
const normalizedPath = path.normalize(absolutePath);
|
|
57
|
+
// SECURITY: Check for path traversal attempts
|
|
58
|
+
// After normalization, path should not go above the base directory for relative paths
|
|
59
|
+
if (!path.isAbsolute(rawPath)) {
|
|
60
|
+
// For relative paths, ensure the resolved path is still within reasonable bounds
|
|
61
|
+
// This prevents sqlite://../../etc/passwd type attacks
|
|
62
|
+
const relativeToCwd = path.relative(basePath, normalizedPath);
|
|
63
|
+
if (relativeToCwd.startsWith('..')) {
|
|
64
|
+
throw new DbMcpError(ErrorCode.CONFIG_INVALID, 'Path traversal detected. SQLite path must not escape the working directory.', { path: rawPath, resolved: normalizedPath });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Check file exists
|
|
68
|
+
if (!fs.existsSync(normalizedPath)) {
|
|
69
|
+
throw new DbMcpError(ErrorCode.CONNECTION_FAILED, `SQLite database file not found: ${normalizedPath}`, { path: rawPath, resolved: normalizedPath });
|
|
70
|
+
}
|
|
71
|
+
return normalizedPath;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=url-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-parser.js","sourceRoot":"","sources":["../../../src/adapters/sqlite/url-parser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE/C,yBAAyB;QACzB,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC5B,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,2DAA2D;QAC3D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,wCAAwC;IACxC,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,QAAgB;IACtE,2BAA2B;IAC3B,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAC3B,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,2BAA2B;IAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE1F,6CAA6C;IAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAEpD,8CAA8C;IAC9C,sFAAsF;IACtF,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,iFAAiF;QACjF,uDAAuD;QACvD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC9D,IAAI,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,UAAU,CAClB,SAAS,CAAC,cAAc,EACxB,6EAA6E,EAC7E,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,CAC5C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,UAAU,CAClB,SAAS,CAAC,iBAAiB,EAC3B,mCAAmC,cAAc,EAAE,EACnD,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,CAC5C,CAAC;IACJ,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC"}
|
package/dist/adapters/types.d.ts
CHANGED
|
@@ -4,152 +4,49 @@
|
|
|
4
4
|
* Core abstractions for multi-database support.
|
|
5
5
|
*/
|
|
6
6
|
import type { ParsedQuery, TableInfo, TableDescription, DefaultsConfig, DatabaseConfig } from '../types.js';
|
|
7
|
-
/**
|
|
8
|
-
* Result from a raw query execution
|
|
9
|
-
* Normalized format across all database drivers
|
|
10
|
-
*/
|
|
7
|
+
/** Normalized result format across all database drivers */
|
|
11
8
|
export interface RawQueryResult {
|
|
12
|
-
/** Column metadata */
|
|
13
9
|
fields: Array<{
|
|
14
10
|
name: string;
|
|
15
11
|
}>;
|
|
16
|
-
/** Row data as arrays (positional, not named) */
|
|
17
12
|
rows: unknown[][];
|
|
18
|
-
/** Number of rows returned or affected */
|
|
19
13
|
rowCount: number;
|
|
20
14
|
}
|
|
21
|
-
/**
|
|
22
|
-
* Database adapter interface - implemented by each database driver
|
|
23
|
-
*
|
|
24
|
-
* Combines connection management with SQL dialect operations.
|
|
25
|
-
*/
|
|
15
|
+
/** Implemented by each database driver */
|
|
26
16
|
export interface DatabaseAdapter {
|
|
27
|
-
/** Unique identifier for this adapter type */
|
|
28
17
|
readonly type: 'postgresql' | 'mysql' | 'sqlite';
|
|
29
|
-
/**
|
|
30
|
-
* Execute a function with a managed connection.
|
|
31
|
-
* Connection is created at start and destroyed at end.
|
|
32
|
-
*/
|
|
33
18
|
withConnection<T>(fn: (conn: AdapterConnection) => Promise<T>): Promise<T>;
|
|
34
|
-
/**
|
|
35
|
-
* Get the default schema name for this database type
|
|
36
|
-
*
|
|
37
|
-
* PostgreSQL: "public"
|
|
38
|
-
* MySQL: database name from connection URL
|
|
39
|
-
* SQLite: "main"
|
|
40
|
-
*/
|
|
19
|
+
/** PostgreSQL: "public", MySQL: db name from URL, SQLite: "main" */
|
|
41
20
|
getDefaultSchema(): string;
|
|
42
|
-
/**
|
|
43
|
-
* Clean up any resources (called on server shutdown)
|
|
44
|
-
*/
|
|
45
21
|
dispose(): Promise<void>;
|
|
46
|
-
/**
|
|
47
|
-
* Parse a SQL statement and validate it
|
|
48
|
-
*
|
|
49
|
-
* SECURITY: This validates:
|
|
50
|
-
* - Single statement only (no multi-statement attacks)
|
|
51
|
-
* - No dangerous operations (DROP, TRUNCATE, etc.)
|
|
52
|
-
*
|
|
53
|
-
* @param sql - Raw SQL to parse
|
|
54
|
-
* @throws DbMcpError if SQL is invalid or multi-statement
|
|
55
|
-
*/
|
|
22
|
+
/** Parse and validate SQL (rejects multi-statement, dangerous ops) */
|
|
56
23
|
parseQuery(sql: string): ParsedQuery;
|
|
57
|
-
/**
|
|
58
|
-
* Inject LIMIT clause if query doesn't have one
|
|
59
|
-
*
|
|
60
|
-
* Used to enforce maxRows limit on SELECT queries.
|
|
61
|
-
*
|
|
62
|
-
* @param sql - Original SQL
|
|
63
|
-
* @param limit - Limit value to inject
|
|
64
|
-
* @returns Modified SQL with LIMIT, or original if already has LIMIT
|
|
65
|
-
*/
|
|
24
|
+
/** Add LIMIT if missing */
|
|
66
25
|
injectLimit(sql: string, limit: number): string;
|
|
67
|
-
/**
|
|
68
|
-
* Validate that a SQL query is appropriate for a specific tool
|
|
69
|
-
*
|
|
70
|
-
* @param sql - The SQL query string
|
|
71
|
-
* @param tool - Either 'query' (SELECT only) or 'execute' (INSERT/UPDATE/DELETE)
|
|
72
|
-
* @throws DbMcpError with QUERY_BLOCKED if query type is not allowed
|
|
73
|
-
*/
|
|
26
|
+
/** Validate query is appropriate for tool (query=SELECT, execute=INSERT/UPDATE/DELETE) */
|
|
74
27
|
validateQueryForTool(sql: string, tool: 'query' | 'execute'): void;
|
|
75
|
-
/**
|
|
76
|
-
* Get the EXPLAIN prefix for this dialect
|
|
77
|
-
*
|
|
78
|
-
* @param analyze - Whether to include ANALYZE
|
|
79
|
-
* @returns Prefix to prepend to SQL for EXPLAIN
|
|
80
|
-
*
|
|
81
|
-
* PostgreSQL: "EXPLAIN " or "EXPLAIN ANALYZE "
|
|
82
|
-
* MySQL: "EXPLAIN " or "EXPLAIN ANALYZE "
|
|
83
|
-
* SQLite: "EXPLAIN QUERY PLAN "
|
|
84
|
-
*/
|
|
85
28
|
getExplainPrefix(analyze: boolean): string;
|
|
86
|
-
/**
|
|
87
|
-
* Convert parameter placeholders to dialect-specific format
|
|
88
|
-
*
|
|
89
|
-
* PostgreSQL uses $1, $2, $3 (no conversion needed)
|
|
90
|
-
* MySQL/SQLite use ? placeholders (convert $1 -> ?)
|
|
91
|
-
*
|
|
92
|
-
* @param sql - SQL with placeholders
|
|
93
|
-
* @returns SQL with converted placeholders
|
|
94
|
-
*/
|
|
29
|
+
/** PostgreSQL: no-op, MySQL/SQLite: $1 -> ? */
|
|
95
30
|
convertPlaceholders(sql: string): string;
|
|
96
31
|
}
|
|
97
|
-
/**
|
|
98
|
-
* Active connection handle - passed to tool implementations
|
|
99
|
-
*
|
|
100
|
-
* Provides database operations during a single request lifecycle.
|
|
101
|
-
* Connection is automatically recycled after the request completes.
|
|
102
|
-
*/
|
|
32
|
+
/** Active connection handle for a single request */
|
|
103
33
|
export interface AdapterConnection {
|
|
104
|
-
/**
|
|
105
|
-
* Execute a parameterized query
|
|
106
|
-
*
|
|
107
|
-
* SECURITY: All user SQL MUST go through this method with parameters
|
|
108
|
-
*
|
|
109
|
-
* @param sql - SQL with placeholders ($1, $2 for PG; ? for MySQL/SQLite)
|
|
110
|
-
* @param params - Parameter values (type-safe, prevents injection)
|
|
111
|
-
*/
|
|
112
34
|
query(sql: string, params?: unknown[]): Promise<RawQueryResult>;
|
|
113
|
-
/**
|
|
114
|
-
* Execute a raw SQL statement (for SET, BEGIN, etc.)
|
|
115
|
-
*
|
|
116
|
-
* Only use for validated internal commands.
|
|
117
|
-
* Never pass user-provided values through this method.
|
|
118
|
-
*/
|
|
35
|
+
/** For internal commands only (SET, BEGIN, COMMIT) - never user input */
|
|
119
36
|
execute(sql: string): Promise<void>;
|
|
120
|
-
/**
|
|
121
|
-
* List tables in a schema (adapter-specific implementation)
|
|
122
|
-
*
|
|
123
|
-
* @param schema - Schema name (ignored for SQLite)
|
|
124
|
-
* @param maxTables - Maximum number of tables to return
|
|
125
|
-
*/
|
|
126
37
|
listTables(schema: string, maxTables: number): Promise<ListTablesInternalResult>;
|
|
127
|
-
/**
|
|
128
|
-
* Describe a table structure (adapter-specific implementation)
|
|
129
|
-
*
|
|
130
|
-
* @param table - Table name
|
|
131
|
-
* @param schema - Schema name (ignored for SQLite)
|
|
132
|
-
* @param limits - Limits for columns and indexes
|
|
133
|
-
*/
|
|
134
38
|
describeTable(table: string, schema: string, limits: {
|
|
135
39
|
maxColumns: number;
|
|
136
40
|
maxIndexes: number;
|
|
137
41
|
}): Promise<TableDescription>;
|
|
138
42
|
}
|
|
139
|
-
/**
|
|
140
|
-
* Internal result from listTables before tool formatting
|
|
141
|
-
*/
|
|
142
43
|
export interface ListTablesInternalResult {
|
|
143
44
|
tables: TableInfo[];
|
|
45
|
+
truncated?: boolean;
|
|
144
46
|
totalAvailable: number;
|
|
145
47
|
}
|
|
146
|
-
/**
|
|
147
|
-
* Configuration passed to adapter constructors
|
|
148
|
-
*/
|
|
149
48
|
export interface AdapterConfig {
|
|
150
|
-
/** Database configuration (url, readonly, etc.) */
|
|
151
49
|
database: DatabaseConfig;
|
|
152
|
-
/** Default settings (timeout, limits) */
|
|
153
50
|
defaults: DefaultsConfig;
|
|
154
51
|
}
|
|
155
52
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,cAAc,EACf,MAAM,aAAa,CAAC;AAErB
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,2DAA2D;AAC3D,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,0CAA0C;AAC1C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,GAAG,QAAQ,CAAC;IAEjD,cAAc,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAE3E,oEAAoE;IACpE,gBAAgB,IAAI,MAAM,CAAC;IAE3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAMzB,sEAAsE;IACtE,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC;IAErC,2BAA2B;IAC3B,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAEhD,0FAA0F;IAC1F,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;IAEnE,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC;IAE3C,+CAA+C;IAC/C,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1C;AAED,oDAAoD;AACpD,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEhE,yEAAyE;IACzE,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAEjF,aAAa,CACX,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GACjD,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,cAAc,CAAC;CAC1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAkC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAkC,MAAM,aAAa,CAAC;AAuC1E;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAWnC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,cAAc,GAAmB;IACrC,OAAO,EAAE,GAAG;IACZ,aAAa,EAAE,GAAG;IAClB,YAAY,EAAE,KAAK,EAAE,OAAO;IAC5B,UAAU,EAAE,EAAE;IACd,SAAS,EAAE,GAAG;IACd,UAAU,EAAE,EAAE;IACd,OAAO,EAAE,KAAK;CACf,CAAC;AAEF;;;GAGG;AACH,SAAS,mBAAmB;IAC1B,MAAM,SAAS,GAAmC,EAAE,CAAC;IACrD,MAAM,UAAU,GAAG,6BAA6B,CAAC;IAEjD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACpC,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,WAAW,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC;YACpD,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAE/C,SAAS,CAAC,IAAI,CAAC,GAAG;gBAChB,GAAG,EAAE,KAAK;gBACV,QAAQ,EAAE,aAAa,KAAK,MAAM,IAAI,aAAa,KAAK,GAAG;aAC5D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IAExC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,UAAU,CAClB,SAAS,CAAC,gBAAgB,EAC1B,yEAAyE,CAC1E,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;AACjD,CAAC"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAInE,OAAO,KAAK,EACV,MAAM,EAMP,MAAM,YAAY,CAAC;AAyBpB;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA0OnD;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7D"}
|
package/dist/server.js
CHANGED
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
7
7
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
8
|
-
import { CallToolRequestSchema, ListToolsRequestSchema
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
8
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
9
|
+
import { describeTable, formatTableDescriptionAsMarkdown } from './tools/describe-table.js';
|
|
10
|
+
import { execute, formatExecuteResultAsMarkdown } from './tools/execute.js';
|
|
11
|
+
import { explain, formatExplainResultAsMarkdown } from './tools/explain.js';
|
|
12
|
+
import { formatListDatabasesResultAsMarkdown, listDatabases } from './tools/list-databases.js';
|
|
13
|
+
import { formatListTablesResultAsMarkdown, listTables } from './tools/list-tables.js';
|
|
14
|
+
import { formatQueryResultAsMarkdown, query } from './tools/query.js';
|
|
15
15
|
import { DbMcpError } from './utils/errors.js';
|
|
16
16
|
/**
|
|
17
17
|
* Server instructions for LLM agents.
|
|
@@ -43,7 +43,6 @@ export function createServer(config) {
|
|
|
43
43
|
},
|
|
44
44
|
instructions: SERVER_INSTRUCTIONS,
|
|
45
45
|
});
|
|
46
|
-
// Register list tools handler
|
|
47
46
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
48
47
|
tools: [
|
|
49
48
|
{
|
|
@@ -168,33 +167,38 @@ export function createServer(config) {
|
|
|
168
167
|
},
|
|
169
168
|
],
|
|
170
169
|
}));
|
|
171
|
-
// Register call tool handler
|
|
172
170
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
173
171
|
const { name, arguments: args } = request.params;
|
|
174
172
|
try {
|
|
175
173
|
switch (name) {
|
|
176
|
-
case 'list_databases':
|
|
174
|
+
case 'list_databases': {
|
|
175
|
+
const result = listDatabases(config);
|
|
177
176
|
return {
|
|
178
|
-
content: [{ type: 'text', text:
|
|
177
|
+
content: [{ type: 'text', text: formatListDatabasesResultAsMarkdown(result, config) }],
|
|
179
178
|
};
|
|
180
|
-
|
|
179
|
+
}
|
|
180
|
+
case 'list_tables': {
|
|
181
|
+
const result = await listTables(args, config);
|
|
181
182
|
return {
|
|
182
183
|
content: [
|
|
183
184
|
{
|
|
184
185
|
type: 'text',
|
|
185
|
-
text:
|
|
186
|
+
text: formatListTablesResultAsMarkdown(result),
|
|
186
187
|
},
|
|
187
188
|
],
|
|
188
189
|
};
|
|
189
|
-
|
|
190
|
+
}
|
|
191
|
+
case 'describe_table': {
|
|
192
|
+
const result = await describeTable(args, config);
|
|
190
193
|
return {
|
|
191
194
|
content: [
|
|
192
195
|
{
|
|
193
196
|
type: 'text',
|
|
194
|
-
text:
|
|
197
|
+
text: formatTableDescriptionAsMarkdown(result),
|
|
195
198
|
},
|
|
196
199
|
],
|
|
197
200
|
};
|
|
201
|
+
}
|
|
198
202
|
case 'query': {
|
|
199
203
|
const result = await query(args, config);
|
|
200
204
|
return {
|
|
@@ -206,24 +210,28 @@ export function createServer(config) {
|
|
|
206
210
|
],
|
|
207
211
|
};
|
|
208
212
|
}
|
|
209
|
-
case 'execute':
|
|
213
|
+
case 'execute': {
|
|
214
|
+
const result = await execute(args, config);
|
|
210
215
|
return {
|
|
211
216
|
content: [
|
|
212
217
|
{
|
|
213
218
|
type: 'text',
|
|
214
|
-
text:
|
|
219
|
+
text: formatExecuteResultAsMarkdown(result),
|
|
215
220
|
},
|
|
216
221
|
],
|
|
217
222
|
};
|
|
218
|
-
|
|
223
|
+
}
|
|
224
|
+
case 'explain': {
|
|
225
|
+
const result = await explain(args, config);
|
|
219
226
|
return {
|
|
220
227
|
content: [
|
|
221
228
|
{
|
|
222
229
|
type: 'text',
|
|
223
|
-
text:
|
|
230
|
+
text: formatExplainResultAsMarkdown(result),
|
|
224
231
|
},
|
|
225
232
|
],
|
|
226
233
|
};
|
|
234
|
+
}
|
|
227
235
|
default:
|
|
228
236
|
throw new Error(`Unknown tool: ${name}`);
|
|
229
237
|
}
|
|
@@ -235,7 +243,10 @@ export function createServer(config) {
|
|
|
235
243
|
isError: true,
|
|
236
244
|
};
|
|
237
245
|
}
|
|
238
|
-
|
|
246
|
+
if (error instanceof Error) {
|
|
247
|
+
throw error;
|
|
248
|
+
}
|
|
249
|
+
throw new Error(String(error));
|
|
239
250
|
}
|
|
240
251
|
});
|
|
241
252
|
return server;
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* describe_table tool - Returns table structure including columns, indexes, and foreign keys
|
|
3
3
|
*/
|
|
4
|
-
import type { Config, TableDescription } from '../types.js';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
4
|
+
import type { Config, DescribeTableParams, TableDescription } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Format TableDescription as Markdown with sections for columns, indexes, and foreign keys
|
|
7
|
+
*/
|
|
8
|
+
export declare function formatTableDescriptionAsMarkdown(result: TableDescription): string;
|
|
10
9
|
export declare function describeTable(params: DescribeTableParams, config: Config): Promise<TableDescription>;
|
|
11
10
|
//# sourceMappingURL=describe-table.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"describe-table.d.ts","sourceRoot":"","sources":["../../src/tools/describe-table.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"describe-table.d.ts","sourceRoot":"","sources":["../../src/tools/describe-table.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKjF;;GAEG;AACH,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CA6DjF;AAGD,wBAAsB,aAAa,CACjC,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,CAAC,CAU3B"}
|
|
@@ -2,19 +2,75 @@
|
|
|
2
2
|
* describe_table tool - Returns table structure including columns, indexes, and foreign keys
|
|
3
3
|
*/
|
|
4
4
|
import { createAdapter } from '../adapters/index.js';
|
|
5
|
-
import {
|
|
5
|
+
import { formatAsMarkdownTable } from '../utils/formatter.js';
|
|
6
|
+
/**
|
|
7
|
+
* Format TableDescription as Markdown with sections for columns, indexes, and foreign keys
|
|
8
|
+
*/
|
|
9
|
+
export function formatTableDescriptionAsMarkdown(result) {
|
|
10
|
+
const parts = [];
|
|
11
|
+
// Header
|
|
12
|
+
parts.push(`## ${result.schema}.${result.table}`);
|
|
13
|
+
parts.push('');
|
|
14
|
+
// Columns section
|
|
15
|
+
parts.push('### Columns');
|
|
16
|
+
if (result.columns.length > 0) {
|
|
17
|
+
const columnHeaders = ['name', 'type', 'nullable', 'default', 'primary_key'];
|
|
18
|
+
const columnRows = result.columns.map((col) => [
|
|
19
|
+
col.name,
|
|
20
|
+
col.type,
|
|
21
|
+
col.nullable ? 'YES' : 'NO',
|
|
22
|
+
col.default ?? 'NULL',
|
|
23
|
+
col.primaryKey ? 'YES' : 'NO',
|
|
24
|
+
]);
|
|
25
|
+
parts.push(formatAsMarkdownTable(columnHeaders, columnRows));
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
parts.push('_No columns_');
|
|
29
|
+
}
|
|
30
|
+
parts.push('');
|
|
31
|
+
// Indexes section
|
|
32
|
+
parts.push('### Indexes');
|
|
33
|
+
if (result.indexes.length > 0) {
|
|
34
|
+
const indexHeaders = ['name', 'columns', 'unique', 'primary'];
|
|
35
|
+
const indexRows = result.indexes.map((idx) => [
|
|
36
|
+
idx.name,
|
|
37
|
+
idx.columns.join(', '),
|
|
38
|
+
idx.unique ? 'YES' : 'NO',
|
|
39
|
+
idx.primary ? 'YES' : 'NO',
|
|
40
|
+
]);
|
|
41
|
+
parts.push(formatAsMarkdownTable(indexHeaders, indexRows));
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
parts.push('_No indexes_');
|
|
45
|
+
}
|
|
46
|
+
parts.push('');
|
|
47
|
+
// Foreign keys section
|
|
48
|
+
parts.push('### Foreign Keys');
|
|
49
|
+
if (result.foreignKeys.length > 0) {
|
|
50
|
+
const fkHeaders = ['column', 'references_table', 'references_column'];
|
|
51
|
+
const fkRows = result.foreignKeys.map((fk) => [
|
|
52
|
+
fk.column,
|
|
53
|
+
fk.references.table,
|
|
54
|
+
fk.references.column,
|
|
55
|
+
]);
|
|
56
|
+
parts.push(formatAsMarkdownTable(fkHeaders, fkRows));
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
parts.push('_No foreign keys_');
|
|
60
|
+
}
|
|
61
|
+
// Truncation info
|
|
62
|
+
if (result.truncated && result.truncationReason) {
|
|
63
|
+
parts.push('');
|
|
64
|
+
parts.push(`**Note:** Results truncated (${result.truncationReason})`);
|
|
65
|
+
}
|
|
66
|
+
return parts.join('\n');
|
|
67
|
+
}
|
|
68
|
+
import { getValidatedDatabase } from '../utils/validation.js';
|
|
6
69
|
export async function describeTable(params, config) {
|
|
7
70
|
const { table, database } = params;
|
|
8
71
|
const { maxColumns, maxIndexes } = config.defaults;
|
|
9
|
-
|
|
10
|
-
const dbConfig = config.databases[database];
|
|
11
|
-
if (!dbConfig) {
|
|
12
|
-
throw new DbMcpError(ErrorCode.DATABASE_NOT_FOUND, `Database "${database}" not found in configuration`, { database, available: Object.keys(config.databases) });
|
|
13
|
-
}
|
|
14
|
-
// Create adapter for this database
|
|
72
|
+
const dbConfig = getValidatedDatabase(database, config);
|
|
15
73
|
const adapter = createAdapter(dbConfig, config.defaults);
|
|
16
|
-
// Use provided schema or adapter's default schema
|
|
17
|
-
// PostgreSQL: "public", MySQL: database name, SQLite: "main"
|
|
18
74
|
const schema = params.schema ?? adapter.getDefaultSchema();
|
|
19
75
|
return adapter.withConnection(async (conn) => {
|
|
20
76
|
return conn.describeTable(table, schema, { maxColumns, maxIndexes });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"describe-table.js","sourceRoot":"","sources":["../../src/tools/describe-table.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"describe-table.js","sourceRoot":"","sources":["../../src/tools/describe-table.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/execute.d.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Execute tool for INSERT/UPDATE/DELETE statements
|
|
3
3
|
*/
|
|
4
|
-
import type { Config, ExecuteResult } from '../types.js';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
4
|
+
import type { Config, ExecuteParams, ExecuteResult } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Format ExecuteResult as Markdown
|
|
7
|
+
*/
|
|
8
|
+
export declare function formatExecuteResultAsMarkdown(result: ExecuteResult): string;
|
|
10
9
|
/**
|
|
11
10
|
* Execute an INSERT/UPDATE/DELETE statement
|
|
12
11
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/tools/execute.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/tools/execute.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIxE;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAQ3E;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,aAAa,CAAC,CA+BxB"}
|