@node2flow/sqlite-mcp 1.0.0 → 2.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/README.md +70 -8
- package/dist/client.d.ts +23 -23
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +17 -17
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +11 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +45 -14
- package/dist/index.js.map +1 -1
- package/dist/libsql-client.d.ts +39 -0
- package/dist/libsql-client.d.ts.map +1 -0
- package/dist/libsql-client.js +250 -0
- package/dist/libsql-client.js.map +1 -0
- package/dist/server.d.ts +7 -5
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +48 -22
- package/dist/server.js.map +1 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +24 -4
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +36 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/worker.d.ts +11 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +77 -0
- package/dist/worker.js.map +1 -0
- package/package.json +8 -3
package/README.md
CHANGED
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
[](https://www.npmjs.com/package/@node2flow/sqlite-mcp)
|
|
5
5
|
[](https://opensource.org/licenses/MIT)
|
|
6
6
|
|
|
7
|
-
MCP server for SQLite databases — query,
|
|
7
|
+
MCP server for SQLite databases — local files or remote Turso/libSQL via URL. 15 tools for query, schema, indexes, and optimization.
|
|
8
8
|
|
|
9
9
|
## Quick Start
|
|
10
10
|
|
|
11
|
-
### Claude Desktop / Cursor
|
|
11
|
+
### Local Database (Claude Desktop / Cursor)
|
|
12
12
|
|
|
13
13
|
```json
|
|
14
14
|
{
|
|
@@ -24,19 +24,59 @@ MCP server for SQLite databases — query, manage schema, indexes, and optimize
|
|
|
24
24
|
}
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
+
### Remote Database (Turso/libSQL)
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"mcpServers": {
|
|
32
|
+
"sqlite": {
|
|
33
|
+
"command": "npx",
|
|
34
|
+
"args": ["-y", "@node2flow/sqlite-mcp"],
|
|
35
|
+
"env": {
|
|
36
|
+
"SQLITE_DB_URL": "libsql://your-db-name.turso.io",
|
|
37
|
+
"SQLITE_AUTH_TOKEN": "your-auth-token"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
27
44
|
### HTTP Mode
|
|
28
45
|
|
|
29
46
|
```bash
|
|
47
|
+
# Local
|
|
30
48
|
SQLITE_DB_PATH=/path/to/database.db npx @node2flow/sqlite-mcp --http
|
|
31
|
-
|
|
49
|
+
|
|
50
|
+
# Remote
|
|
51
|
+
SQLITE_DB_URL=libsql://your-db.turso.io SQLITE_AUTH_TOKEN=xxx npx @node2flow/sqlite-mcp --http
|
|
32
52
|
```
|
|
33
53
|
|
|
54
|
+
MCP endpoint: `http://localhost:3000/mcp`
|
|
55
|
+
|
|
56
|
+
### Cloudflare Worker (Remote Only)
|
|
57
|
+
|
|
58
|
+
Available at: `https://sqlite-mcp-community.node2flow.net/mcp`
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
POST https://sqlite-mcp-community.node2flow.net/mcp?SQLITE_DB_URL=libsql://your-db.turso.io&SQLITE_AUTH_TOKEN=xxx
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
> CF Workers have no filesystem — only `SQLITE_DB_URL` is supported.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
34
68
|
## Configuration
|
|
35
69
|
|
|
36
|
-
| Variable | Required | Description |
|
|
37
|
-
|
|
38
|
-
| `SQLITE_DB_PATH` |
|
|
39
|
-
| `
|
|
70
|
+
| Variable | Required | Mode | Description |
|
|
71
|
+
|----------|----------|------|-------------|
|
|
72
|
+
| `SQLITE_DB_PATH` | No | Local | Path to SQLite file (creates if not exists) |
|
|
73
|
+
| `SQLITE_DB_URL` | No | Remote | Turso/libSQL URL (e.g. `libsql://db.turso.io`) |
|
|
74
|
+
| `SQLITE_AUTH_TOKEN` | No | Remote | Auth token for Turso (required with URL) |
|
|
75
|
+
| `SQLITE_TIMEOUT` | No | Local | Busy timeout in ms (default: 5000) |
|
|
76
|
+
|
|
77
|
+
**Priority:** `SQLITE_DB_URL` > `SQLITE_DB_PATH` (if both set, URL wins)
|
|
78
|
+
|
|
79
|
+
---
|
|
40
80
|
|
|
41
81
|
## Tools (15)
|
|
42
82
|
|
|
@@ -80,6 +120,20 @@ SQLITE_DB_PATH=/path/to/database.db npx @node2flow/sqlite-mcp --http
|
|
|
80
120
|
| `sqlite_vacuum` | Optimize and compact database |
|
|
81
121
|
| `sqlite_integrity_check` | Check database health |
|
|
82
122
|
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Turso Setup
|
|
126
|
+
|
|
127
|
+
1. Install Turso CLI: `curl -sSfL https://get.tur.so/install.sh | bash`
|
|
128
|
+
2. Sign up: `turso auth signup`
|
|
129
|
+
3. Create database: `turso db create my-database`
|
|
130
|
+
4. Get URL: `turso db show my-database --url`
|
|
131
|
+
5. Get token: `turso db tokens create my-database`
|
|
132
|
+
|
|
133
|
+
Free tier: 500 databases, 9GB storage, 25M reads/month.
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
83
137
|
## Docker
|
|
84
138
|
|
|
85
139
|
```bash
|
|
@@ -87,7 +141,7 @@ docker compose up -d
|
|
|
87
141
|
# Endpoint: http://localhost:3025/mcp
|
|
88
142
|
```
|
|
89
143
|
|
|
90
|
-
Mount
|
|
144
|
+
Mount database files or use remote URL:
|
|
91
145
|
|
|
92
146
|
```yaml
|
|
93
147
|
services:
|
|
@@ -96,11 +150,17 @@ services:
|
|
|
96
150
|
ports:
|
|
97
151
|
- "127.0.0.1:3025:3000"
|
|
98
152
|
environment:
|
|
153
|
+
# Local mode:
|
|
99
154
|
- SQLITE_DB_PATH=/data/database.db
|
|
155
|
+
# OR Remote mode:
|
|
156
|
+
# - SQLITE_DB_URL=libsql://your-db.turso.io
|
|
157
|
+
# - SQLITE_AUTH_TOKEN=your-token
|
|
100
158
|
volumes:
|
|
101
159
|
- ./data:/data
|
|
102
160
|
```
|
|
103
161
|
|
|
162
|
+
---
|
|
163
|
+
|
|
104
164
|
## License
|
|
105
165
|
|
|
106
166
|
MIT License - see [LICENSE](LICENSE)
|
|
@@ -110,6 +170,8 @@ Copyright (c) 2026 [Node2Flow](https://node2flow.net)
|
|
|
110
170
|
## Links
|
|
111
171
|
|
|
112
172
|
- [npm Package](https://www.npmjs.com/package/@node2flow/sqlite-mcp)
|
|
173
|
+
- [Turso](https://turso.tech/) — Hosted SQLite databases
|
|
174
|
+
- [libSQL](https://github.com/tursodatabase/libsql) — Open source SQLite fork
|
|
113
175
|
- [SQLite Documentation](https://sqlite.org/docs.html)
|
|
114
176
|
- [MCP Protocol](https://modelcontextprotocol.io/)
|
|
115
177
|
- [Node2Flow](https://node2flow.net)
|
package/dist/client.d.ts
CHANGED
|
@@ -1,38 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SQLite Client
|
|
3
|
-
* Wraps better-sqlite3 with typed methods
|
|
2
|
+
* SQLite Client (Local)
|
|
3
|
+
* Wraps better-sqlite3 with typed async methods matching SqliteClientInterface
|
|
4
4
|
*/
|
|
5
|
-
import type { SqliteConfig, ColumnInfo, IndexInfo, ForeignKeyInfo, TableInfo, DatabaseInfo, ColumnDefinition, QueryResult, ExecuteResult } from './types.js';
|
|
6
|
-
export declare class SqliteClient {
|
|
5
|
+
import type { SqliteConfig, SqliteClientInterface, ColumnInfo, IndexInfo, ForeignKeyInfo, TableInfo, DatabaseInfo, ColumnDefinition, QueryResult, ExecuteResult } from './types.js';
|
|
6
|
+
export declare class SqliteClient implements SqliteClientInterface {
|
|
7
7
|
private db;
|
|
8
8
|
private config;
|
|
9
9
|
constructor(config: SqliteConfig);
|
|
10
|
-
query(sql: string, params?: unknown[]): QueryResult
|
|
11
|
-
execute(sql: string, params?: unknown[]): ExecuteResult
|
|
12
|
-
runScript(sql: string): {
|
|
10
|
+
query(sql: string, params?: unknown[]): Promise<QueryResult>;
|
|
11
|
+
execute(sql: string, params?: unknown[]): Promise<ExecuteResult>;
|
|
12
|
+
runScript(sql: string): Promise<{
|
|
13
13
|
statementsRun: number;
|
|
14
|
-
}
|
|
15
|
-
listTables(): TableInfo[]
|
|
16
|
-
describeTable(table: string): {
|
|
14
|
+
}>;
|
|
15
|
+
listTables(): Promise<TableInfo[]>;
|
|
16
|
+
describeTable(table: string): Promise<{
|
|
17
17
|
columns: ColumnInfo[];
|
|
18
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(): {
|
|
19
|
+
}>;
|
|
20
|
+
listIndexes(table: string): Promise<IndexInfo[]>;
|
|
21
|
+
listForeignKeys(table: string): Promise<ForeignKeyInfo[]>;
|
|
22
|
+
createTable(table: string, columns: ColumnDefinition[], ifNotExists?: boolean): Promise<void>;
|
|
23
|
+
alterTable(table: string, action: string, params: Record<string, unknown>): Promise<void>;
|
|
24
|
+
dropTable(table: string, ifExists?: boolean): Promise<void>;
|
|
25
|
+
createIndex(table: string, columns: string[], indexName?: string, unique?: boolean, ifNotExists?: boolean): Promise<void>;
|
|
26
|
+
dropIndex(indexName: string, ifExists?: boolean): Promise<void>;
|
|
27
|
+
getInfo(): Promise<DatabaseInfo>;
|
|
28
|
+
vacuum(): Promise<{
|
|
29
29
|
sizeBefore: number;
|
|
30
30
|
sizeAfter: number;
|
|
31
|
-
}
|
|
32
|
-
integrityCheck(): {
|
|
31
|
+
}>;
|
|
32
|
+
integrityCheck(): Promise<{
|
|
33
33
|
ok: boolean;
|
|
34
34
|
results: string[];
|
|
35
|
-
}
|
|
35
|
+
}>;
|
|
36
36
|
close(): void;
|
|
37
37
|
}
|
|
38
38
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EACV,YAAY,EACZ,qBAAqB,EACrB,UAAU,EACV,SAAS,EACT,cAAc,EACd,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,qBAAa,YAAa,YAAW,qBAAqB;IACxD,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,EAAE,YAAY;IAc1B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAY5D,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC;IAMhE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAmB1D,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAqBlC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,UAAU,EAAE,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAU7E,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAMhD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAQzD,WAAW,CACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,gBAAgB,EAAE,EAC3B,WAAW,CAAC,EAAE,OAAO,GACpB,OAAO,CAAC,IAAI,CAAC;IAiBV,UAAU,CACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC;IA0BV,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3D,WAAW,CACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,OAAO,EAChB,WAAW,CAAC,EAAE,OAAO,GACpB,OAAO,CAAC,IAAI,CAAC;IAUV,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/D,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;IA8ChC,MAAM,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAiB5D,cAAc,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAWnE,KAAK,IAAI,IAAI;CAGd"}
|
package/dist/client.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SQLite Client
|
|
3
|
-
* Wraps better-sqlite3 with typed methods
|
|
2
|
+
* SQLite Client (Local)
|
|
3
|
+
* Wraps better-sqlite3 with typed async methods matching SqliteClientInterface
|
|
4
4
|
*/
|
|
5
5
|
import Database from 'better-sqlite3';
|
|
6
6
|
import * as fs from 'node:fs';
|
|
@@ -20,7 +20,7 @@ export class SqliteClient {
|
|
|
20
20
|
this.db.pragma('foreign_keys = ON');
|
|
21
21
|
}
|
|
22
22
|
// ========== Query & Execute ==========
|
|
23
|
-
query(sql, params) {
|
|
23
|
+
async query(sql, params) {
|
|
24
24
|
const stmt = this.db.prepare(sql);
|
|
25
25
|
const rows = params
|
|
26
26
|
? stmt.all(...params)
|
|
@@ -30,12 +30,12 @@ export class SqliteClient {
|
|
|
30
30
|
: stmt.columns().map((c) => c.name);
|
|
31
31
|
return { columns, rows, rowCount: rows.length };
|
|
32
32
|
}
|
|
33
|
-
execute(sql, params) {
|
|
33
|
+
async execute(sql, params) {
|
|
34
34
|
const stmt = this.db.prepare(sql);
|
|
35
35
|
const result = params ? stmt.run(...params) : stmt.run();
|
|
36
36
|
return { changes: result.changes, lastInsertRowid: result.lastInsertRowid };
|
|
37
37
|
}
|
|
38
|
-
runScript(sql) {
|
|
38
|
+
async runScript(sql) {
|
|
39
39
|
const transaction = this.db.transaction(() => {
|
|
40
40
|
const statements = sql
|
|
41
41
|
.split(';')
|
|
@@ -52,7 +52,7 @@ export class SqliteClient {
|
|
|
52
52
|
return { statementsRun };
|
|
53
53
|
}
|
|
54
54
|
// ========== Schema Inspection ==========
|
|
55
|
-
listTables() {
|
|
55
|
+
async listTables() {
|
|
56
56
|
const tables = this.db
|
|
57
57
|
.prepare("SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%' ORDER BY name")
|
|
58
58
|
.all();
|
|
@@ -70,7 +70,7 @@ export class SqliteClient {
|
|
|
70
70
|
return { name: t.name, type: t.type, rowCount };
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
|
-
describeTable(table) {
|
|
73
|
+
async describeTable(table) {
|
|
74
74
|
const columns = this.db
|
|
75
75
|
.prepare(`PRAGMA table_info("${table}")`)
|
|
76
76
|
.all();
|
|
@@ -79,18 +79,18 @@ export class SqliteClient {
|
|
|
79
79
|
.get(table);
|
|
80
80
|
return { columns, sql: schemaRow?.sql ?? '' };
|
|
81
81
|
}
|
|
82
|
-
listIndexes(table) {
|
|
82
|
+
async listIndexes(table) {
|
|
83
83
|
return this.db
|
|
84
84
|
.prepare(`PRAGMA index_list("${table}")`)
|
|
85
85
|
.all();
|
|
86
86
|
}
|
|
87
|
-
listForeignKeys(table) {
|
|
87
|
+
async listForeignKeys(table) {
|
|
88
88
|
return this.db
|
|
89
89
|
.prepare(`PRAGMA foreign_key_list("${table}")`)
|
|
90
90
|
.all();
|
|
91
91
|
}
|
|
92
92
|
// ========== Schema Management ==========
|
|
93
|
-
createTable(table, columns, ifNotExists) {
|
|
93
|
+
async createTable(table, columns, ifNotExists) {
|
|
94
94
|
const colDefs = columns.map((col) => {
|
|
95
95
|
let def = `"${col.name}" ${col.type}`;
|
|
96
96
|
if (col.primaryKey)
|
|
@@ -107,7 +107,7 @@ export class SqliteClient {
|
|
|
107
107
|
const exists = ifNotExists ? ' IF NOT EXISTS' : '';
|
|
108
108
|
this.db.exec(`CREATE TABLE${exists} "${table}" (${colDefs.join(', ')})`);
|
|
109
109
|
}
|
|
110
|
-
alterTable(table, action, params) {
|
|
110
|
+
async alterTable(table, action, params) {
|
|
111
111
|
switch (action) {
|
|
112
112
|
case 'add_column': {
|
|
113
113
|
let sql = `ALTER TABLE "${table}" ADD COLUMN "${params.column}" ${params.type}`;
|
|
@@ -129,24 +129,24 @@ export class SqliteClient {
|
|
|
129
129
|
throw new Error(`Unknown alter action: ${action}`);
|
|
130
130
|
}
|
|
131
131
|
}
|
|
132
|
-
dropTable(table, ifExists) {
|
|
132
|
+
async dropTable(table, ifExists) {
|
|
133
133
|
const exists = ifExists ? ' IF EXISTS' : '';
|
|
134
134
|
this.db.exec(`DROP TABLE${exists} "${table}"`);
|
|
135
135
|
}
|
|
136
136
|
// ========== Index Management ==========
|
|
137
|
-
createIndex(table, columns, indexName, unique, ifNotExists) {
|
|
137
|
+
async createIndex(table, columns, indexName, unique, ifNotExists) {
|
|
138
138
|
const name = indexName || `idx_${table}_${columns.join('_')}`;
|
|
139
139
|
const uniqueStr = unique ? ' UNIQUE' : '';
|
|
140
140
|
const exists = ifNotExists ? ' IF NOT EXISTS' : '';
|
|
141
141
|
const cols = columns.map((c) => `"${c}"`).join(', ');
|
|
142
142
|
this.db.exec(`CREATE${uniqueStr} INDEX${exists} "${name}" ON "${table}" (${cols})`);
|
|
143
143
|
}
|
|
144
|
-
dropIndex(indexName, ifExists) {
|
|
144
|
+
async dropIndex(indexName, ifExists) {
|
|
145
145
|
const exists = ifExists ? ' IF EXISTS' : '';
|
|
146
146
|
this.db.exec(`DROP INDEX${exists} "${indexName}"`);
|
|
147
147
|
}
|
|
148
148
|
// ========== Database Management ==========
|
|
149
|
-
getInfo() {
|
|
149
|
+
async getInfo() {
|
|
150
150
|
const pageCount = this.db.prepare('PRAGMA page_count').get().page_count;
|
|
151
151
|
const pageSize = this.db.prepare('PRAGMA page_size').get().page_size;
|
|
152
152
|
const journalMode = this.db.prepare('PRAGMA journal_mode').get().journal_mode;
|
|
@@ -177,7 +177,7 @@ export class SqliteClient {
|
|
|
177
177
|
sqliteVersion,
|
|
178
178
|
};
|
|
179
179
|
}
|
|
180
|
-
vacuum() {
|
|
180
|
+
async vacuum() {
|
|
181
181
|
let sizeBefore = 0;
|
|
182
182
|
try {
|
|
183
183
|
sizeBefore = fs.statSync(this.config.dbPath).size;
|
|
@@ -195,7 +195,7 @@ export class SqliteClient {
|
|
|
195
195
|
}
|
|
196
196
|
return { sizeBefore, sizeAfter };
|
|
197
197
|
}
|
|
198
|
-
integrityCheck() {
|
|
198
|
+
async integrityCheck() {
|
|
199
199
|
const results = this.db
|
|
200
200
|
.prepare('PRAGMA integrity_check')
|
|
201
201
|
.all();
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,17 +2,25 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* SQLite MCP Server
|
|
4
4
|
*
|
|
5
|
-
* Community edition — connects
|
|
5
|
+
* Community edition — connects to local SQLite files or remote Turso/libSQL databases.
|
|
6
6
|
*
|
|
7
|
-
* Usage (
|
|
7
|
+
* Usage (local - stdio):
|
|
8
8
|
* SQLITE_DB_PATH=/path/to/database.db npx @node2flow/sqlite-mcp
|
|
9
9
|
*
|
|
10
|
+
* Usage (remote - stdio):
|
|
11
|
+
* SQLITE_DB_URL=libsql://db-name.turso.io SQLITE_AUTH_TOKEN=xxx npx @node2flow/sqlite-mcp
|
|
12
|
+
*
|
|
10
13
|
* Usage (HTTP - Streamable HTTP transport):
|
|
11
|
-
*
|
|
14
|
+
* SQLITE_DB_URL=libsql://... SQLITE_AUTH_TOKEN=xxx npx @node2flow/sqlite-mcp --http
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Smithery default export
|
|
12
18
|
*/
|
|
13
19
|
export default function createSmitheryServer(opts?: {
|
|
14
20
|
config?: {
|
|
15
21
|
SQLITE_DB_PATH?: string;
|
|
22
|
+
SQLITE_DB_URL?: string;
|
|
23
|
+
SQLITE_AUTH_TOKEN?: string;
|
|
16
24
|
SQLITE_TIMEOUT?: number;
|
|
17
25
|
};
|
|
18
26
|
}): import("@modelcontextprotocol/sdk/server/mcp.js").McpServer;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG;AAkLH;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,IAAI,CAAC,EAAE;IAClD,MAAM,CAAC,EAAE;QACP,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH,+DAWA"}
|
package/dist/index.js
CHANGED
|
@@ -2,13 +2,16 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* SQLite MCP Server
|
|
4
4
|
*
|
|
5
|
-
* Community edition — connects
|
|
5
|
+
* Community edition — connects to local SQLite files or remote Turso/libSQL databases.
|
|
6
6
|
*
|
|
7
|
-
* Usage (
|
|
7
|
+
* Usage (local - stdio):
|
|
8
8
|
* SQLITE_DB_PATH=/path/to/database.db npx @node2flow/sqlite-mcp
|
|
9
9
|
*
|
|
10
|
+
* Usage (remote - stdio):
|
|
11
|
+
* SQLITE_DB_URL=libsql://db-name.turso.io SQLITE_AUTH_TOKEN=xxx npx @node2flow/sqlite-mcp
|
|
12
|
+
*
|
|
10
13
|
* Usage (HTTP - Streamable HTTP transport):
|
|
11
|
-
*
|
|
14
|
+
* SQLITE_DB_URL=libsql://... SQLITE_AUTH_TOKEN=xxx npx @node2flow/sqlite-mcp --http
|
|
12
15
|
*/
|
|
13
16
|
import { randomUUID } from 'node:crypto';
|
|
14
17
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
@@ -18,23 +21,32 @@ import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
|
18
21
|
import { createServer } from './server.js';
|
|
19
22
|
import { TOOLS } from './tools.js';
|
|
20
23
|
function getConfig() {
|
|
24
|
+
const url = process.env.SQLITE_DB_URL;
|
|
21
25
|
const dbPath = process.env.SQLITE_DB_PATH;
|
|
22
|
-
if (
|
|
23
|
-
return
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
if (url) {
|
|
27
|
+
return {
|
|
28
|
+
url,
|
|
29
|
+
authToken: process.env.SQLITE_AUTH_TOKEN,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
if (dbPath) {
|
|
33
|
+
return {
|
|
34
|
+
dbPath,
|
|
35
|
+
timeout: process.env.SQLITE_TIMEOUT
|
|
36
|
+
? parseInt(process.env.SQLITE_TIMEOUT, 10)
|
|
37
|
+
: undefined,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
30
41
|
}
|
|
31
42
|
async function startStdio() {
|
|
32
43
|
const config = getConfig();
|
|
33
44
|
const server = createServer(config ?? undefined);
|
|
34
45
|
const transport = new StdioServerTransport();
|
|
35
46
|
await server.connect(transport);
|
|
47
|
+
const mode = config?.url ? `remote: ${config.url}` : config?.dbPath ? `local: ${config.dbPath}` : '(not configured yet)';
|
|
36
48
|
console.error('SQLite MCP Server running on stdio');
|
|
37
|
-
console.error(`Database: ${
|
|
49
|
+
console.error(`Database: ${mode}`);
|
|
38
50
|
console.error(`Tools available: ${TOOLS.length}`);
|
|
39
51
|
console.error('Ready for MCP client\n');
|
|
40
52
|
}
|
|
@@ -43,6 +55,17 @@ async function startHttp() {
|
|
|
43
55
|
const app = createMcpExpressApp({ host: '0.0.0.0' });
|
|
44
56
|
const transports = {};
|
|
45
57
|
app.post('/mcp', async (req, res) => {
|
|
58
|
+
// Accept config from query params
|
|
59
|
+
const url = new URL(req.url, `http://${req.headers.host}`);
|
|
60
|
+
const qUrl = url.searchParams.get('SQLITE_DB_URL');
|
|
61
|
+
const qAuthToken = url.searchParams.get('SQLITE_AUTH_TOKEN');
|
|
62
|
+
const qDbPath = url.searchParams.get('SQLITE_DB_PATH');
|
|
63
|
+
if (qUrl)
|
|
64
|
+
process.env.SQLITE_DB_URL = qUrl;
|
|
65
|
+
if (qAuthToken)
|
|
66
|
+
process.env.SQLITE_AUTH_TOKEN = qAuthToken;
|
|
67
|
+
if (qDbPath)
|
|
68
|
+
process.env.SQLITE_DB_PATH = qDbPath;
|
|
46
69
|
const sessionId = req.headers['mcp-session-id'];
|
|
47
70
|
try {
|
|
48
71
|
let transport;
|
|
@@ -111,7 +134,7 @@ async function startHttp() {
|
|
|
111
134
|
app.get('/', (_req, res) => {
|
|
112
135
|
res.json({
|
|
113
136
|
name: 'sqlite-mcp',
|
|
114
|
-
version: '
|
|
137
|
+
version: '2.0.0',
|
|
115
138
|
status: 'ok',
|
|
116
139
|
tools: TOOLS.length,
|
|
117
140
|
transport: 'streamable-http',
|
|
@@ -119,9 +142,10 @@ async function startHttp() {
|
|
|
119
142
|
});
|
|
120
143
|
});
|
|
121
144
|
const config = getConfig();
|
|
145
|
+
const mode = config?.url ? `remote: ${config.url}` : config?.dbPath ? `local: ${config.dbPath}` : '(not configured yet)';
|
|
122
146
|
app.listen(port, () => {
|
|
123
147
|
console.log(`SQLite MCP Server (HTTP) listening on port ${port}`);
|
|
124
|
-
console.log(`Database: ${
|
|
148
|
+
console.log(`Database: ${mode}`);
|
|
125
149
|
console.log(`Tools available: ${TOOLS.length}`);
|
|
126
150
|
console.log(`MCP endpoint: http://localhost:${port}/mcp`);
|
|
127
151
|
});
|
|
@@ -148,9 +172,16 @@ async function main() {
|
|
|
148
172
|
await startStdio();
|
|
149
173
|
}
|
|
150
174
|
}
|
|
175
|
+
/**
|
|
176
|
+
* Smithery default export
|
|
177
|
+
*/
|
|
151
178
|
export default function createSmitheryServer(opts) {
|
|
152
179
|
if (opts?.config?.SQLITE_DB_PATH)
|
|
153
180
|
process.env.SQLITE_DB_PATH = opts.config.SQLITE_DB_PATH;
|
|
181
|
+
if (opts?.config?.SQLITE_DB_URL)
|
|
182
|
+
process.env.SQLITE_DB_URL = opts.config.SQLITE_DB_URL;
|
|
183
|
+
if (opts?.config?.SQLITE_AUTH_TOKEN)
|
|
184
|
+
process.env.SQLITE_AUTH_TOKEN = opts.config.SQLITE_AUTH_TOKEN;
|
|
154
185
|
if (opts?.config?.SQLITE_TIMEOUT)
|
|
155
186
|
process.env.SQLITE_TIMEOUT = String(opts.config.SQLITE_TIMEOUT);
|
|
156
187
|
const config = getConfig();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LibSQL Client (Remote)
|
|
3
|
+
* Wraps @libsql/client for remote SQLite databases (Turso, libSQL server)
|
|
4
|
+
* Implements the same SqliteClientInterface as SqliteClient
|
|
5
|
+
*/
|
|
6
|
+
import type { LibSqlConfig, SqliteClientInterface, ColumnInfo, IndexInfo, ForeignKeyInfo, TableInfo, DatabaseInfo, ColumnDefinition, QueryResult, ExecuteResult } from './types.js';
|
|
7
|
+
export declare class LibSqlClient implements SqliteClientInterface {
|
|
8
|
+
private client;
|
|
9
|
+
private config;
|
|
10
|
+
constructor(config: LibSqlConfig);
|
|
11
|
+
query(sql: string, params?: unknown[]): Promise<QueryResult>;
|
|
12
|
+
execute(sql: string, params?: unknown[]): Promise<ExecuteResult>;
|
|
13
|
+
runScript(sql: string): Promise<{
|
|
14
|
+
statementsRun: number;
|
|
15
|
+
}>;
|
|
16
|
+
listTables(): Promise<TableInfo[]>;
|
|
17
|
+
describeTable(table: string): Promise<{
|
|
18
|
+
columns: ColumnInfo[];
|
|
19
|
+
sql: string;
|
|
20
|
+
}>;
|
|
21
|
+
listIndexes(table: string): Promise<IndexInfo[]>;
|
|
22
|
+
listForeignKeys(table: string): Promise<ForeignKeyInfo[]>;
|
|
23
|
+
createTable(table: string, columns: ColumnDefinition[], ifNotExists?: boolean): Promise<void>;
|
|
24
|
+
alterTable(table: string, action: string, params: Record<string, unknown>): Promise<void>;
|
|
25
|
+
dropTable(table: string, ifExists?: boolean): Promise<void>;
|
|
26
|
+
createIndex(table: string, columns: string[], indexName?: string, unique?: boolean, ifNotExists?: boolean): Promise<void>;
|
|
27
|
+
dropIndex(indexName: string, ifExists?: boolean): Promise<void>;
|
|
28
|
+
getInfo(): Promise<DatabaseInfo>;
|
|
29
|
+
vacuum(): Promise<{
|
|
30
|
+
sizeBefore: number;
|
|
31
|
+
sizeAfter: number;
|
|
32
|
+
}>;
|
|
33
|
+
integrityCheck(): Promise<{
|
|
34
|
+
ok: boolean;
|
|
35
|
+
results: string[];
|
|
36
|
+
}>;
|
|
37
|
+
close(): void;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=libsql-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"libsql-client.d.ts","sourceRoot":"","sources":["../src/libsql-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,YAAY,EACZ,qBAAqB,EACrB,UAAU,EACV,SAAS,EACT,cAAc,EACd,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,qBAAa,YAAa,YAAW,qBAAqB;IACxD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,EAAE,YAAY;IAU1B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAgB5D,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC;IAWhE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAa1D,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAyBlC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,UAAU,EAAE,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAsB7E,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAchD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAmBzD,WAAW,CACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,gBAAgB,EAAE,EAC3B,WAAW,CAAC,EAAE,OAAO,GACpB,OAAO,CAAC,IAAI,CAAC;IAkBV,UAAU,CACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC;IAuBV,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3D,WAAW,CACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,OAAO,EAChB,WAAW,CAAC,EAAE,OAAO,GACpB,OAAO,CAAC,IAAI,CAAC;IAWV,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAU/D,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;IAkChC,MAAM,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAa5D,cAAc,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAYnE,KAAK,IAAI,IAAI;CAGd"}
|