@node2flow/sqlite-mcp 1.0.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/LICENSE +21 -0
- package/README.md +115 -0
- package/dist/client.d.ts +38 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +212 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +163 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +54 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +212 -0
- package/dist/server.js.map +1 -0
- package/dist/tools.d.ts +18 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +406 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +67 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +52 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Node2Flow
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# SQLite MCP Server
|
|
2
|
+
|
|
3
|
+
[](https://smithery.ai/server/node2flow/sqlite)
|
|
4
|
+
[](https://www.npmjs.com/package/@node2flow/sqlite-mcp)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
|
|
7
|
+
MCP server for SQLite databases — query, manage schema, indexes, and optimize through 15 tools.
|
|
8
|
+
|
|
9
|
+
## Quick Start
|
|
10
|
+
|
|
11
|
+
### Claude Desktop / Cursor
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{
|
|
15
|
+
"mcpServers": {
|
|
16
|
+
"sqlite": {
|
|
17
|
+
"command": "npx",
|
|
18
|
+
"args": ["-y", "@node2flow/sqlite-mcp"],
|
|
19
|
+
"env": {
|
|
20
|
+
"SQLITE_DB_PATH": "/path/to/your/database.db"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### HTTP Mode
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
SQLITE_DB_PATH=/path/to/database.db npx @node2flow/sqlite-mcp --http
|
|
31
|
+
# MCP endpoint: http://localhost:3000/mcp
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Configuration
|
|
35
|
+
|
|
36
|
+
| Variable | Required | Description |
|
|
37
|
+
|----------|----------|-------------|
|
|
38
|
+
| `SQLITE_DB_PATH` | Yes | Path to SQLite database file (creates if not exists) |
|
|
39
|
+
| `SQLITE_TIMEOUT` | No | Database busy timeout in milliseconds (default: 5000) |
|
|
40
|
+
|
|
41
|
+
## Tools (15)
|
|
42
|
+
|
|
43
|
+
### Query & Execute (3)
|
|
44
|
+
|
|
45
|
+
| Tool | Description |
|
|
46
|
+
|------|-------------|
|
|
47
|
+
| `sqlite_query` | Execute SELECT query, return rows as JSON |
|
|
48
|
+
| `sqlite_execute` | Execute write statement (INSERT/UPDATE/DELETE/CREATE) |
|
|
49
|
+
| `sqlite_run_script` | Execute multiple statements in transaction |
|
|
50
|
+
|
|
51
|
+
### Schema Inspection (4)
|
|
52
|
+
|
|
53
|
+
| Tool | Description |
|
|
54
|
+
|------|-------------|
|
|
55
|
+
| `sqlite_list_tables` | List all tables with row counts |
|
|
56
|
+
| `sqlite_describe_table` | Get columns, types, constraints |
|
|
57
|
+
| `sqlite_list_indexes` | List indexes for a table |
|
|
58
|
+
| `sqlite_list_foreign_keys` | List foreign key constraints |
|
|
59
|
+
|
|
60
|
+
### Schema Management (3)
|
|
61
|
+
|
|
62
|
+
| Tool | Description |
|
|
63
|
+
|------|-------------|
|
|
64
|
+
| `sqlite_create_table` | Create new table with column definitions |
|
|
65
|
+
| `sqlite_alter_table` | Add column, rename column, rename table |
|
|
66
|
+
| `sqlite_drop_table` | Drop a table |
|
|
67
|
+
|
|
68
|
+
### Index Management (2)
|
|
69
|
+
|
|
70
|
+
| Tool | Description |
|
|
71
|
+
|------|-------------|
|
|
72
|
+
| `sqlite_create_index` | Create index on columns |
|
|
73
|
+
| `sqlite_drop_index` | Drop an index |
|
|
74
|
+
|
|
75
|
+
### Database Management (3)
|
|
76
|
+
|
|
77
|
+
| Tool | Description |
|
|
78
|
+
|------|-------------|
|
|
79
|
+
| `sqlite_get_info` | Database metadata (size, tables, journal mode) |
|
|
80
|
+
| `sqlite_vacuum` | Optimize and compact database |
|
|
81
|
+
| `sqlite_integrity_check` | Check database health |
|
|
82
|
+
|
|
83
|
+
## Docker
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
docker compose up -d
|
|
87
|
+
# Endpoint: http://localhost:3025/mcp
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Mount your database files via volumes:
|
|
91
|
+
|
|
92
|
+
```yaml
|
|
93
|
+
services:
|
|
94
|
+
sqlite-mcp-community:
|
|
95
|
+
build: .
|
|
96
|
+
ports:
|
|
97
|
+
- "127.0.0.1:3025:3000"
|
|
98
|
+
environment:
|
|
99
|
+
- SQLITE_DB_PATH=/data/database.db
|
|
100
|
+
volumes:
|
|
101
|
+
- ./data:/data
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## License
|
|
105
|
+
|
|
106
|
+
MIT License - see [LICENSE](LICENSE)
|
|
107
|
+
|
|
108
|
+
Copyright (c) 2026 [Node2Flow](https://node2flow.net)
|
|
109
|
+
|
|
110
|
+
## Links
|
|
111
|
+
|
|
112
|
+
- [npm Package](https://www.npmjs.com/package/@node2flow/sqlite-mcp)
|
|
113
|
+
- [SQLite Documentation](https://sqlite.org/docs.html)
|
|
114
|
+
- [MCP Protocol](https://modelcontextprotocol.io/)
|
|
115
|
+
- [Node2Flow](https://node2flow.net)
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Client
|
|
3
|
+
* Wraps better-sqlite3 with typed methods for all MCP tools
|
|
4
|
+
*/
|
|
5
|
+
import type { SqliteConfig, ColumnInfo, IndexInfo, ForeignKeyInfo, TableInfo, DatabaseInfo, ColumnDefinition, QueryResult, ExecuteResult } from './types.js';
|
|
6
|
+
export declare class SqliteClient {
|
|
7
|
+
private db;
|
|
8
|
+
private config;
|
|
9
|
+
constructor(config: SqliteConfig);
|
|
10
|
+
query(sql: string, params?: unknown[]): QueryResult;
|
|
11
|
+
execute(sql: string, params?: unknown[]): ExecuteResult;
|
|
12
|
+
runScript(sql: string): {
|
|
13
|
+
statementsRun: number;
|
|
14
|
+
};
|
|
15
|
+
listTables(): TableInfo[];
|
|
16
|
+
describeTable(table: string): {
|
|
17
|
+
columns: ColumnInfo[];
|
|
18
|
+
sql: string;
|
|
19
|
+
};
|
|
20
|
+
listIndexes(table: string): IndexInfo[];
|
|
21
|
+
listForeignKeys(table: string): ForeignKeyInfo[];
|
|
22
|
+
createTable(table: string, columns: ColumnDefinition[], ifNotExists?: boolean): void;
|
|
23
|
+
alterTable(table: string, action: string, params: Record<string, unknown>): void;
|
|
24
|
+
dropTable(table: string, ifExists?: boolean): void;
|
|
25
|
+
createIndex(table: string, columns: string[], indexName?: string, unique?: boolean, ifNotExists?: boolean): void;
|
|
26
|
+
dropIndex(indexName: string, ifExists?: boolean): void;
|
|
27
|
+
getInfo(): DatabaseInfo;
|
|
28
|
+
vacuum(): {
|
|
29
|
+
sizeBefore: number;
|
|
30
|
+
sizeAfter: number;
|
|
31
|
+
};
|
|
32
|
+
integrityCheck(): {
|
|
33
|
+
ok: boolean;
|
|
34
|
+
results: string[];
|
|
35
|
+
};
|
|
36
|
+
close(): void;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,SAAS,EACT,cAAc,EACd,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,EAAE,YAAY;IAchC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,WAAW;IAYnD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,aAAa;IAMvD,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE;IAmBjD,UAAU,IAAI,SAAS,EAAE;IAqBzB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,UAAU,EAAE,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;IAUpE,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE;IAMvC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE;IAQhD,WAAW,CACT,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,gBAAgB,EAAE,EAC3B,WAAW,CAAC,EAAE,OAAO,GACpB,IAAI;IAiBP,UAAU,CACR,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,IAAI;IA0BP,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI;IAOlD,WAAW,CACT,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,OAAO,EAChB,WAAW,CAAC,EAAE,OAAO,GACpB,IAAI;IAUP,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI;IAOtD,OAAO,IAAI,YAAY;IA8CvB,MAAM,IAAI;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAiBnD,cAAc,IAAI;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE;IAWpD,KAAK,IAAI,IAAI;CAGd"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Client
|
|
3
|
+
* Wraps better-sqlite3 with typed methods for all MCP tools
|
|
4
|
+
*/
|
|
5
|
+
import Database from 'better-sqlite3';
|
|
6
|
+
import * as fs from 'node:fs';
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
export class SqliteClient {
|
|
9
|
+
db;
|
|
10
|
+
config;
|
|
11
|
+
constructor(config) {
|
|
12
|
+
this.config = config;
|
|
13
|
+
this.db = new Database(config.dbPath, {
|
|
14
|
+
readonly: config.readonly ?? false,
|
|
15
|
+
timeout: config.timeout ?? 5000,
|
|
16
|
+
});
|
|
17
|
+
// Enable WAL mode for better concurrency
|
|
18
|
+
this.db.pragma('journal_mode = WAL');
|
|
19
|
+
// Enable foreign keys
|
|
20
|
+
this.db.pragma('foreign_keys = ON');
|
|
21
|
+
}
|
|
22
|
+
// ========== Query & Execute ==========
|
|
23
|
+
query(sql, params) {
|
|
24
|
+
const stmt = this.db.prepare(sql);
|
|
25
|
+
const rows = params
|
|
26
|
+
? stmt.all(...params)
|
|
27
|
+
: stmt.all();
|
|
28
|
+
const columns = rows.length > 0
|
|
29
|
+
? Object.keys(rows[0])
|
|
30
|
+
: stmt.columns().map((c) => c.name);
|
|
31
|
+
return { columns, rows, rowCount: rows.length };
|
|
32
|
+
}
|
|
33
|
+
execute(sql, params) {
|
|
34
|
+
const stmt = this.db.prepare(sql);
|
|
35
|
+
const result = params ? stmt.run(...params) : stmt.run();
|
|
36
|
+
return { changes: result.changes, lastInsertRowid: result.lastInsertRowid };
|
|
37
|
+
}
|
|
38
|
+
runScript(sql) {
|
|
39
|
+
const transaction = this.db.transaction(() => {
|
|
40
|
+
const statements = sql
|
|
41
|
+
.split(';')
|
|
42
|
+
.map((s) => s.trim())
|
|
43
|
+
.filter((s) => s.length > 0);
|
|
44
|
+
let count = 0;
|
|
45
|
+
for (const stmt of statements) {
|
|
46
|
+
this.db.exec(stmt);
|
|
47
|
+
count++;
|
|
48
|
+
}
|
|
49
|
+
return count;
|
|
50
|
+
});
|
|
51
|
+
const statementsRun = transaction();
|
|
52
|
+
return { statementsRun };
|
|
53
|
+
}
|
|
54
|
+
// ========== Schema Inspection ==========
|
|
55
|
+
listTables() {
|
|
56
|
+
const tables = this.db
|
|
57
|
+
.prepare("SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%' ORDER BY name")
|
|
58
|
+
.all();
|
|
59
|
+
return tables.map((t) => {
|
|
60
|
+
let rowCount = 0;
|
|
61
|
+
try {
|
|
62
|
+
const result = this.db
|
|
63
|
+
.prepare(`SELECT COUNT(*) as count FROM "${t.name}"`)
|
|
64
|
+
.get();
|
|
65
|
+
rowCount = result.count;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// View or inaccessible table
|
|
69
|
+
}
|
|
70
|
+
return { name: t.name, type: t.type, rowCount };
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
describeTable(table) {
|
|
74
|
+
const columns = this.db
|
|
75
|
+
.prepare(`PRAGMA table_info("${table}")`)
|
|
76
|
+
.all();
|
|
77
|
+
const schemaRow = this.db
|
|
78
|
+
.prepare('SELECT sql FROM sqlite_master WHERE name = ?')
|
|
79
|
+
.get(table);
|
|
80
|
+
return { columns, sql: schemaRow?.sql ?? '' };
|
|
81
|
+
}
|
|
82
|
+
listIndexes(table) {
|
|
83
|
+
return this.db
|
|
84
|
+
.prepare(`PRAGMA index_list("${table}")`)
|
|
85
|
+
.all();
|
|
86
|
+
}
|
|
87
|
+
listForeignKeys(table) {
|
|
88
|
+
return this.db
|
|
89
|
+
.prepare(`PRAGMA foreign_key_list("${table}")`)
|
|
90
|
+
.all();
|
|
91
|
+
}
|
|
92
|
+
// ========== Schema Management ==========
|
|
93
|
+
createTable(table, columns, ifNotExists) {
|
|
94
|
+
const colDefs = columns.map((col) => {
|
|
95
|
+
let def = `"${col.name}" ${col.type}`;
|
|
96
|
+
if (col.primaryKey)
|
|
97
|
+
def += ' PRIMARY KEY';
|
|
98
|
+
if (col.notNull)
|
|
99
|
+
def += ' NOT NULL';
|
|
100
|
+
if (col.unique)
|
|
101
|
+
def += ' UNIQUE';
|
|
102
|
+
if (col.default !== undefined && col.default !== null) {
|
|
103
|
+
def += ` DEFAULT ${typeof col.default === 'string' ? `'${col.default}'` : col.default}`;
|
|
104
|
+
}
|
|
105
|
+
return def;
|
|
106
|
+
});
|
|
107
|
+
const exists = ifNotExists ? ' IF NOT EXISTS' : '';
|
|
108
|
+
this.db.exec(`CREATE TABLE${exists} "${table}" (${colDefs.join(', ')})`);
|
|
109
|
+
}
|
|
110
|
+
alterTable(table, action, params) {
|
|
111
|
+
switch (action) {
|
|
112
|
+
case 'add_column': {
|
|
113
|
+
let sql = `ALTER TABLE "${table}" ADD COLUMN "${params.column}" ${params.type}`;
|
|
114
|
+
if (params.notNull)
|
|
115
|
+
sql += ' NOT NULL';
|
|
116
|
+
if (params.default !== undefined) {
|
|
117
|
+
sql += ` DEFAULT ${typeof params.default === 'string' ? `'${params.default}'` : params.default}`;
|
|
118
|
+
}
|
|
119
|
+
this.db.exec(sql);
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
case 'rename_column':
|
|
123
|
+
this.db.exec(`ALTER TABLE "${table}" RENAME COLUMN "${params.oldName}" TO "${params.newName}"`);
|
|
124
|
+
break;
|
|
125
|
+
case 'rename_table':
|
|
126
|
+
this.db.exec(`ALTER TABLE "${table}" RENAME TO "${params.newTableName}"`);
|
|
127
|
+
break;
|
|
128
|
+
default:
|
|
129
|
+
throw new Error(`Unknown alter action: ${action}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
dropTable(table, ifExists) {
|
|
133
|
+
const exists = ifExists ? ' IF EXISTS' : '';
|
|
134
|
+
this.db.exec(`DROP TABLE${exists} "${table}"`);
|
|
135
|
+
}
|
|
136
|
+
// ========== Index Management ==========
|
|
137
|
+
createIndex(table, columns, indexName, unique, ifNotExists) {
|
|
138
|
+
const name = indexName || `idx_${table}_${columns.join('_')}`;
|
|
139
|
+
const uniqueStr = unique ? ' UNIQUE' : '';
|
|
140
|
+
const exists = ifNotExists ? ' IF NOT EXISTS' : '';
|
|
141
|
+
const cols = columns.map((c) => `"${c}"`).join(', ');
|
|
142
|
+
this.db.exec(`CREATE${uniqueStr} INDEX${exists} "${name}" ON "${table}" (${cols})`);
|
|
143
|
+
}
|
|
144
|
+
dropIndex(indexName, ifExists) {
|
|
145
|
+
const exists = ifExists ? ' IF EXISTS' : '';
|
|
146
|
+
this.db.exec(`DROP INDEX${exists} "${indexName}"`);
|
|
147
|
+
}
|
|
148
|
+
// ========== Database Management ==========
|
|
149
|
+
getInfo() {
|
|
150
|
+
const pageCount = this.db.prepare('PRAGMA page_count').get().page_count;
|
|
151
|
+
const pageSize = this.db.prepare('PRAGMA page_size').get().page_size;
|
|
152
|
+
const journalMode = this.db.prepare('PRAGMA journal_mode').get().journal_mode;
|
|
153
|
+
const encoding = this.db.prepare('PRAGMA encoding').get().encoding;
|
|
154
|
+
const sqliteVersion = this.db
|
|
155
|
+
.prepare('SELECT sqlite_version() as version')
|
|
156
|
+
.get().version;
|
|
157
|
+
let fileSize = 0;
|
|
158
|
+
try {
|
|
159
|
+
const stats = fs.statSync(this.config.dbPath);
|
|
160
|
+
fileSize = stats.size;
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// In-memory database
|
|
164
|
+
}
|
|
165
|
+
const tables = this.db
|
|
166
|
+
.prepare("SELECT COUNT(*) as count FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'")
|
|
167
|
+
.get();
|
|
168
|
+
return {
|
|
169
|
+
filePath: path.resolve(this.config.dbPath),
|
|
170
|
+
fileSize,
|
|
171
|
+
tableCount: tables.count,
|
|
172
|
+
pageCount,
|
|
173
|
+
pageSize,
|
|
174
|
+
journalMode,
|
|
175
|
+
walMode: journalMode === 'wal',
|
|
176
|
+
encoding,
|
|
177
|
+
sqliteVersion,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
vacuum() {
|
|
181
|
+
let sizeBefore = 0;
|
|
182
|
+
try {
|
|
183
|
+
sizeBefore = fs.statSync(this.config.dbPath).size;
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// In-memory database
|
|
187
|
+
}
|
|
188
|
+
this.db.exec('VACUUM');
|
|
189
|
+
let sizeAfter = 0;
|
|
190
|
+
try {
|
|
191
|
+
sizeAfter = fs.statSync(this.config.dbPath).size;
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// In-memory database
|
|
195
|
+
}
|
|
196
|
+
return { sizeBefore, sizeAfter };
|
|
197
|
+
}
|
|
198
|
+
integrityCheck() {
|
|
199
|
+
const results = this.db
|
|
200
|
+
.prepare('PRAGMA integrity_check')
|
|
201
|
+
.all();
|
|
202
|
+
const messages = results.map((r) => r.integrity_check);
|
|
203
|
+
return {
|
|
204
|
+
ok: messages.length === 1 && messages[0] === 'ok',
|
|
205
|
+
results: messages,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
close() {
|
|
209
|
+
this.db.close();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* SQLite MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Community edition — connects directly to a local SQLite database.
|
|
6
|
+
*
|
|
7
|
+
* Usage (stdio - for Claude Desktop / Cursor / VS Code):
|
|
8
|
+
* SQLITE_DB_PATH=/path/to/database.db npx @node2flow/sqlite-mcp
|
|
9
|
+
*
|
|
10
|
+
* Usage (HTTP - Streamable HTTP transport):
|
|
11
|
+
* SQLITE_DB_PATH=/path/to/database.db npx @node2flow/sqlite-mcp --http
|
|
12
|
+
*/
|
|
13
|
+
export default function createSmitheryServer(opts?: {
|
|
14
|
+
config?: {
|
|
15
|
+
SQLITE_DB_PATH?: string;
|
|
16
|
+
SQLITE_TIMEOUT?: number;
|
|
17
|
+
};
|
|
18
|
+
}): import("@modelcontextprotocol/sdk/server/mcp.js").McpServer;
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AA6JH,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,IAAI,CAAC,EAAE;IAClD,MAAM,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/D,+DAOA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* SQLite MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Community edition — connects directly to a local SQLite database.
|
|
6
|
+
*
|
|
7
|
+
* Usage (stdio - for Claude Desktop / Cursor / VS Code):
|
|
8
|
+
* SQLITE_DB_PATH=/path/to/database.db npx @node2flow/sqlite-mcp
|
|
9
|
+
*
|
|
10
|
+
* Usage (HTTP - Streamable HTTP transport):
|
|
11
|
+
* SQLITE_DB_PATH=/path/to/database.db npx @node2flow/sqlite-mcp --http
|
|
12
|
+
*/
|
|
13
|
+
import { randomUUID } from 'node:crypto';
|
|
14
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
15
|
+
import { StreamableHTTPServerTransport, } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
16
|
+
import { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js';
|
|
17
|
+
import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
18
|
+
import { createServer } from './server.js';
|
|
19
|
+
import { TOOLS } from './tools.js';
|
|
20
|
+
function getConfig() {
|
|
21
|
+
const dbPath = process.env.SQLITE_DB_PATH;
|
|
22
|
+
if (!dbPath)
|
|
23
|
+
return null;
|
|
24
|
+
return {
|
|
25
|
+
dbPath,
|
|
26
|
+
timeout: process.env.SQLITE_TIMEOUT
|
|
27
|
+
? parseInt(process.env.SQLITE_TIMEOUT, 10)
|
|
28
|
+
: undefined,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
async function startStdio() {
|
|
32
|
+
const config = getConfig();
|
|
33
|
+
const server = createServer(config ?? undefined);
|
|
34
|
+
const transport = new StdioServerTransport();
|
|
35
|
+
await server.connect(transport);
|
|
36
|
+
console.error('SQLite MCP Server running on stdio');
|
|
37
|
+
console.error(`Database: ${config ? config.dbPath : '(not configured yet)'}`);
|
|
38
|
+
console.error(`Tools available: ${TOOLS.length}`);
|
|
39
|
+
console.error('Ready for MCP client\n');
|
|
40
|
+
}
|
|
41
|
+
async function startHttp() {
|
|
42
|
+
const port = parseInt(process.env.PORT || '3000', 10);
|
|
43
|
+
const app = createMcpExpressApp({ host: '0.0.0.0' });
|
|
44
|
+
const transports = {};
|
|
45
|
+
app.post('/mcp', async (req, res) => {
|
|
46
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
47
|
+
try {
|
|
48
|
+
let transport;
|
|
49
|
+
if (sessionId && transports[sessionId]) {
|
|
50
|
+
transport = transports[sessionId];
|
|
51
|
+
}
|
|
52
|
+
else if (!sessionId && isInitializeRequest(req.body)) {
|
|
53
|
+
transport = new StreamableHTTPServerTransport({
|
|
54
|
+
sessionIdGenerator: () => randomUUID(),
|
|
55
|
+
onsessioninitialized: (sid) => {
|
|
56
|
+
transports[sid] = transport;
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
transport.onclose = () => {
|
|
60
|
+
const sid = transport.sessionId;
|
|
61
|
+
if (sid && transports[sid]) {
|
|
62
|
+
delete transports[sid];
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
const config = getConfig();
|
|
66
|
+
const server = createServer(config ?? undefined);
|
|
67
|
+
await server.connect(transport);
|
|
68
|
+
await transport.handleRequest(req, res, req.body);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
res.status(400).json({
|
|
73
|
+
jsonrpc: '2.0',
|
|
74
|
+
error: {
|
|
75
|
+
code: -32000,
|
|
76
|
+
message: 'Bad Request: No valid session ID provided',
|
|
77
|
+
},
|
|
78
|
+
id: null,
|
|
79
|
+
});
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
await transport.handleRequest(req, res, req.body);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.error('Error handling MCP request:', error);
|
|
86
|
+
if (!res.headersSent) {
|
|
87
|
+
res.status(500).json({
|
|
88
|
+
jsonrpc: '2.0',
|
|
89
|
+
error: { code: -32603, message: 'Internal server error' },
|
|
90
|
+
id: null,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
app.get('/mcp', async (req, res) => {
|
|
96
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
97
|
+
if (!sessionId || !transports[sessionId]) {
|
|
98
|
+
res.status(400).send('Invalid or missing session ID');
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
await transports[sessionId].handleRequest(req, res);
|
|
102
|
+
});
|
|
103
|
+
app.delete('/mcp', async (req, res) => {
|
|
104
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
105
|
+
if (!sessionId || !transports[sessionId]) {
|
|
106
|
+
res.status(400).send('Invalid or missing session ID');
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
await transports[sessionId].handleRequest(req, res);
|
|
110
|
+
});
|
|
111
|
+
app.get('/', (_req, res) => {
|
|
112
|
+
res.json({
|
|
113
|
+
name: 'sqlite-mcp',
|
|
114
|
+
version: '1.0.0',
|
|
115
|
+
status: 'ok',
|
|
116
|
+
tools: TOOLS.length,
|
|
117
|
+
transport: 'streamable-http',
|
|
118
|
+
endpoints: { mcp: '/mcp' },
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
const config = getConfig();
|
|
122
|
+
app.listen(port, () => {
|
|
123
|
+
console.log(`SQLite MCP Server (HTTP) listening on port ${port}`);
|
|
124
|
+
console.log(`Database: ${config ? config.dbPath : '(not configured yet)'}`);
|
|
125
|
+
console.log(`Tools available: ${TOOLS.length}`);
|
|
126
|
+
console.log(`MCP endpoint: http://localhost:${port}/mcp`);
|
|
127
|
+
});
|
|
128
|
+
process.on('SIGINT', async () => {
|
|
129
|
+
console.log('\nShutting down...');
|
|
130
|
+
for (const sessionId in transports) {
|
|
131
|
+
try {
|
|
132
|
+
await transports[sessionId].close();
|
|
133
|
+
delete transports[sessionId];
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
/* ignore */
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
process.exit(0);
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
async function main() {
|
|
143
|
+
const useHttp = process.argv.includes('--http');
|
|
144
|
+
if (useHttp) {
|
|
145
|
+
await startHttp();
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
await startStdio();
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
export default function createSmitheryServer(opts) {
|
|
152
|
+
if (opts?.config?.SQLITE_DB_PATH)
|
|
153
|
+
process.env.SQLITE_DB_PATH = opts.config.SQLITE_DB_PATH;
|
|
154
|
+
if (opts?.config?.SQLITE_TIMEOUT)
|
|
155
|
+
process.env.SQLITE_TIMEOUT = String(opts.config.SQLITE_TIMEOUT);
|
|
156
|
+
const config = getConfig();
|
|
157
|
+
return createServer(config ?? undefined);
|
|
158
|
+
}
|
|
159
|
+
main().catch((error) => {
|
|
160
|
+
console.error('Fatal error:', error);
|
|
161
|
+
process.exit(1);
|
|
162
|
+
});
|
|
163
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared MCP Server — used by both stdio and HTTP modes
|
|
3
|
+
*/
|
|
4
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
5
|
+
import { SqliteClient } from './client.js';
|
|
6
|
+
export interface SqliteMcpConfig {
|
|
7
|
+
dbPath: string;
|
|
8
|
+
readonly?: boolean;
|
|
9
|
+
timeout?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function handleToolCall(toolName: string, args: Record<string, unknown>, client: SqliteClient): import("./types.js").DatabaseInfo | import("./types.js").QueryResult | import("./types.js").ExecuteResult | {
|
|
12
|
+
statementsRun: number;
|
|
13
|
+
} | import("./types.js").TableInfo[] | {
|
|
14
|
+
columns: import("./types.js").ColumnInfo[];
|
|
15
|
+
sql: string;
|
|
16
|
+
} | import("./types.js").IndexInfo[] | import("./types.js").ForeignKeyInfo[] | {
|
|
17
|
+
sizeBefore: number;
|
|
18
|
+
sizeAfter: number;
|
|
19
|
+
} | {
|
|
20
|
+
ok: boolean;
|
|
21
|
+
results: string[];
|
|
22
|
+
} | {
|
|
23
|
+
success: boolean;
|
|
24
|
+
table: unknown;
|
|
25
|
+
action?: undefined;
|
|
26
|
+
dropped?: undefined;
|
|
27
|
+
indexName?: undefined;
|
|
28
|
+
} | {
|
|
29
|
+
success: boolean;
|
|
30
|
+
table: unknown;
|
|
31
|
+
action: unknown;
|
|
32
|
+
dropped?: undefined;
|
|
33
|
+
indexName?: undefined;
|
|
34
|
+
} | {
|
|
35
|
+
success: boolean;
|
|
36
|
+
table: unknown;
|
|
37
|
+
dropped: boolean;
|
|
38
|
+
action?: undefined;
|
|
39
|
+
indexName?: undefined;
|
|
40
|
+
} | {
|
|
41
|
+
success: boolean;
|
|
42
|
+
table: unknown;
|
|
43
|
+
indexName: {};
|
|
44
|
+
action?: undefined;
|
|
45
|
+
dropped?: undefined;
|
|
46
|
+
} | {
|
|
47
|
+
success: boolean;
|
|
48
|
+
indexName: unknown;
|
|
49
|
+
dropped: boolean;
|
|
50
|
+
table?: undefined;
|
|
51
|
+
action?: undefined;
|
|
52
|
+
};
|
|
53
|
+
export declare function createServer(config?: SqliteMcpConfig): McpServer;
|
|
54
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwFrB;AAED,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,eAAe,aAmLpD"}
|