@eamonboyle/mssql-mcp 1.2.0 → 1.3.1
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 -21
- package/README.md +43 -7
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +40 -0
- package/dist/config.js.map +1 -1
- package/dist/db.d.ts +1 -0
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +1 -1
- package/dist/db.js.map +1 -1
- package/dist/index.js +356 -44
- package/dist/index.js.map +1 -1
- package/dist/mcpResults.d.ts +49 -0
- package/dist/mcpResults.d.ts.map +1 -0
- package/dist/mcpResults.js +246 -0
- package/dist/mcpResults.js.map +1 -0
- package/dist/promptRegistry.d.ts.map +1 -1
- package/dist/promptRegistry.js +6 -1
- package/dist/promptRegistry.js.map +1 -1
- package/dist/resourceRegistry.d.ts +2 -0
- package/dist/resourceRegistry.d.ts.map +1 -1
- package/dist/resourceRegistry.js +149 -10
- package/dist/resourceRegistry.js.map +1 -1
- package/dist/schema.d.ts +16 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +180 -1
- package/dist/schema.js.map +1 -1
- package/dist/serverState.d.ts +28 -0
- package/dist/serverState.d.ts.map +1 -0
- package/dist/serverState.js +99 -0
- package/dist/serverState.js.map +1 -0
- package/dist/sql.js +0 -0
- package/dist/toolRegistry.d.ts +4 -0
- package/dist/toolRegistry.d.ts.map +1 -1
- package/dist/toolRegistry.js +210 -64
- package/dist/toolRegistry.js.map +1 -1
- package/dist/tools/AnalyzeTableTool.d.ts +37 -0
- package/dist/tools/AnalyzeTableTool.d.ts.map +1 -0
- package/dist/tools/AnalyzeTableTool.js +81 -0
- package/dist/tools/AnalyzeTableTool.js.map +1 -0
- package/dist/tools/DeleteDataTool.d.ts.map +1 -1
- package/dist/tools/DeleteDataTool.js +4 -1
- package/dist/tools/DeleteDataTool.js.map +1 -1
- package/dist/tools/DescribeRelationshipsTool.d.ts +20 -0
- package/dist/tools/DescribeRelationshipsTool.d.ts.map +1 -0
- package/dist/tools/DescribeRelationshipsTool.js +24 -0
- package/dist/tools/DescribeRelationshipsTool.js.map +1 -0
- package/dist/tools/ListDatabasesTool.d.ts +16 -0
- package/dist/tools/ListDatabasesTool.d.ts.map +1 -0
- package/dist/tools/ListDatabasesTool.js +26 -0
- package/dist/tools/ListDatabasesTool.js.map +1 -0
- package/dist/tools/ListForeignKeysTool.d.ts +19 -0
- package/dist/tools/ListForeignKeysTool.d.ts.map +1 -0
- package/dist/tools/ListForeignKeysTool.js +24 -0
- package/dist/tools/ListForeignKeysTool.js.map +1 -0
- package/dist/tools/PreviewDeleteTool.d.ts +28 -0
- package/dist/tools/PreviewDeleteTool.d.ts.map +1 -0
- package/dist/tools/PreviewDeleteTool.js +31 -0
- package/dist/tools/PreviewDeleteTool.js.map +1 -0
- package/dist/tools/PreviewUpdateTool.d.ts +30 -0
- package/dist/tools/PreviewUpdateTool.d.ts.map +1 -0
- package/dist/tools/PreviewUpdateTool.js +34 -0
- package/dist/tools/PreviewUpdateTool.js.map +1 -0
- package/dist/tools/ReadDataTool.js +2 -2
- package/dist/tools/ReadDataTool.js.map +1 -1
- package/dist/tools/UpdateDataTool.d.ts +1 -0
- package/dist/tools/UpdateDataTool.d.ts.map +1 -1
- package/dist/tools/UpdateDataTool.js +6 -3
- package/dist/tools/UpdateDataTool.js.map +1 -1
- package/dist/validation.js +0 -0
- package/dist/writePreview.d.ts +20 -0
- package/dist/writePreview.d.ts.map +1 -0
- package/dist/writePreview.js +27 -0
- package/dist/writePreview.js.map +1 -0
- package/dist/writePreviewGrant.d.ts +18 -0
- package/dist/writePreviewGrant.d.ts.map +1 -0
- package/dist/writePreviewGrant.js +71 -0
- package/dist/writePreviewGrant.js.map +1 -0
- package/dist/writePreviewGrantStore.d.ts +10 -0
- package/dist/writePreviewGrantStore.d.ts.map +1 -0
- package/dist/writePreviewGrantStore.js +47 -0
- package/dist/writePreviewGrantStore.js.map +1 -0
- package/dist/writeSafety.js +0 -0
- package/package.json +6 -2
- package/dist/__tests__/ExplainQueryTool.test.d.ts +0 -2
- package/dist/__tests__/ExplainQueryTool.test.d.ts.map +0 -1
- package/dist/__tests__/ExplainQueryTool.test.js +0 -96
- package/dist/__tests__/ExplainQueryTool.test.js.map +0 -1
- package/dist/__tests__/config.test.d.ts +0 -2
- package/dist/__tests__/config.test.d.ts.map +0 -1
- package/dist/__tests__/config.test.js +0 -29
- package/dist/__tests__/config.test.js.map +0 -1
- package/dist/__tests__/db.test.d.ts +0 -2
- package/dist/__tests__/db.test.d.ts.map +0 -1
- package/dist/__tests__/db.test.js +0 -204
- package/dist/__tests__/db.test.js.map +0 -1
- package/dist/__tests__/promptRegistry.test.d.ts +0 -2
- package/dist/__tests__/promptRegistry.test.d.ts.map +0 -1
- package/dist/__tests__/promptRegistry.test.js +0 -40
- package/dist/__tests__/promptRegistry.test.js.map +0 -1
- package/dist/__tests__/resourceRegistry.test.d.ts +0 -2
- package/dist/__tests__/resourceRegistry.test.d.ts.map +0 -1
- package/dist/__tests__/resourceRegistry.test.js +0 -40
- package/dist/__tests__/resourceRegistry.test.js.map +0 -1
- package/dist/__tests__/schema.test.d.ts +0 -2
- package/dist/__tests__/schema.test.d.ts.map +0 -1
- package/dist/__tests__/schema.test.js +0 -130
- package/dist/__tests__/schema.test.js.map +0 -1
- package/dist/__tests__/sql.test.d.ts +0 -2
- package/dist/__tests__/sql.test.d.ts.map +0 -1
- package/dist/__tests__/sql.test.js +0 -35
- package/dist/__tests__/sql.test.js.map +0 -1
- package/dist/__tests__/toolRegistry.test.d.ts +0 -2
- package/dist/__tests__/toolRegistry.test.d.ts.map +0 -1
- package/dist/__tests__/toolRegistry.test.js +0 -47
- package/dist/__tests__/toolRegistry.test.js.map +0 -1
- package/dist/__tests__/validation.test.d.ts +0 -2
- package/dist/__tests__/validation.test.d.ts.map +0 -1
- package/dist/__tests__/validation.test.js +0 -111
- package/dist/__tests__/validation.test.js.map +0 -1
- package/dist/__tests__/writeTools.test.d.ts +0 -2
- package/dist/__tests__/writeTools.test.d.ts.map +0 -1
- package/dist/__tests__/writeTools.test.js +0 -115
- package/dist/__tests__/writeTools.test.js.map +0 -1
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) Microsoft Corporation.
|
|
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
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) Microsoft Corporation.
|
|
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
CHANGED
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
[](https://opensource.org/licenses/MIT)
|
|
4
4
|
[](https://www.npmjs.com/package/@eamonboyle/mssql-mcp)
|
|
5
5
|
[](https://nodejs.org/)
|
|
6
|
+
[](https://x.com/eamonyo)
|
|
6
7
|
|
|
7
|
-
[](https://cursor.com/en/install-mcp?name=MSSQL&config=
|
|
8
|
-
[](https://intradeus.github.io/http-protocol-redirector?r=vscode%3Amcp%2Finstall%3F%257B%2522name%2522%253A%2522mssql%2522%252C%2522command%2522%253A%2522npx%2522%252C%2522args%2522%253A%255B%2522-y%2522%252C%2522%2540eamonboyle%252Fmssql-mcp%2522%255D%252C%2522env%2522%253A%257B%2522SERVER_NAME%2522%253A%2522localhost%2522%252C%2522DATABASE_NAME%2522%253A%2522YourDatabase%2522%252C%2522DATABASES%2522%253A%2522%2522%252C%2522DB_USER%2522%253A%2522%2522%252C%2522DB_PASSWORD%2522%253A%2522%2522%252C%2522READONLY%2522%253A%2522false%2522%252C%2522CONNECTION_TIMEOUT%2522%253A%252230%2522%252C%2522QUERY_TIMEOUT_MS%2522%253A%252230000%2522%252C%2522MAX_ROWS%2522%253A%252210000%2522%252C%2522TRUST_SERVER_CERTIFICATE%2522%253A%2522false%2522%257D%257D)
|
|
8
|
+
[](https://cursor.com/en/install-mcp?name=MSSQL&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBlYW1vbmJveWxlL21zc3FsLW1jcCJdLCJlbnYiOnsiU0VSVkVSX05BTUUiOiJsb2NhbGhvc3QiLCJEQVRBQkFTRV9OQU1FIjoiWW91ckRhdGFiYXNlIiwiREFUQUJBU0VTIjoiIiwiREJfVVNFUiI6IiIsIkRCX1BBU1NXT1JEIjoiIiwiUkVBRE9OTFkiOiJmYWxzZSIsIkNPTk5FQ1RJT05fVElNRU9VVCI6IjMwIiwiUVVFUllfVElNRU9VVF9NUyI6IjMwMDAwIiwiTUFYX1JPV1MiOiIxMDAwMCIsIlRSVVNUX1NFUlZFUl9DRVJUSUZJQ0FURSI6ImZhbHNlIiwiTUNQX1RSQU5TUE9SVCI6InN0ZGlvIiwiTUNQX0hUVFBfSE9TVCI6IjEyNy4wLjAuMSIsIk1DUF9IVFRQX1BPUlQiOiIzMzMzIiwiTUNQX0JBU0VfVVJMIjoiIiwiRU5BQkxFX0RETCI6ImZhbHNlIiwiTUFYX1dSSVRFX1JPV1MiOiIxMDAiLCJSRVFVSVJFX1dSSVRFX1BSRVZJRVciOiJ0cnVlIn19)
|
|
9
|
+
[](https://intradeus.github.io/http-protocol-redirector?r=vscode%3Amcp%2Finstall%3F%257B%2522name%2522%253A%2522mssql%2522%252C%2522command%2522%253A%2522npx%2522%252C%2522args%2522%253A%255B%2522-y%2522%252C%2522%2540eamonboyle%252Fmssql-mcp%2522%255D%252C%2522env%2522%253A%257B%2522SERVER_NAME%2522%253A%2522localhost%2522%252C%2522DATABASE_NAME%2522%253A%2522YourDatabase%2522%252C%2522DATABASES%2522%253A%2522%2522%252C%2522DB_USER%2522%253A%2522%2522%252C%2522DB_PASSWORD%2522%253A%2522%2522%252C%2522READONLY%2522%253A%2522false%2522%252C%2522CONNECTION_TIMEOUT%2522%253A%252230%2522%252C%2522QUERY_TIMEOUT_MS%2522%253A%252230000%2522%252C%2522MAX_ROWS%2522%253A%252210000%2522%252C%2522TRUST_SERVER_CERTIFICATE%2522%253A%2522false%2522%252C%2522MCP_TRANSPORT%2522%253A%2522stdio%2522%252C%2522MCP_HTTP_HOST%2522%253A%2522127.0.0.1%2522%252C%2522MCP_HTTP_PORT%2522%253A%25223333%2522%252C%2522MCP_BASE_URL%2522%253A%2522%2522%252C%2522ENABLE_DDL%2522%253A%2522false%2522%252C%2522MAX_WRITE_ROWS%2522%253A%2522100%2522%252C%2522REQUIRE_WRITE_PREVIEW%2522%253A%2522true%2522%257D%257D)
|
|
9
10
|
|
|
10
11
|
> ⚠️ **EXPERIMENTAL USE ONLY** — This MCP Server is provided for educational and experimental purposes. It is NOT intended for production use. Use appropriate security measures and test thoroughly before any deployment.
|
|
11
12
|
|
|
@@ -25,11 +26,14 @@ AI: *queries your MSSQL database and returns the results in plain English*
|
|
|
25
26
|
- **Natural language to SQL** — Ask questions in plain English
|
|
26
27
|
- **Row-level CRUD support** — Read, insert, update, and delete rows with dedicated tools
|
|
27
28
|
- **Schema discovery** — Inspect tables, views, procedures, functions, and triggers
|
|
29
|
+
- **Safer write workflows** — `preview_update` and `preview_delete` plus confirmation gating for destructive tools
|
|
30
|
+
- **Rich text tool results** — Concise summaries with JSON inlined in the primary text block when helpful, plus resource links for large artifacts
|
|
28
31
|
- **Query analysis** — Generate estimated execution plans with `explain_query`
|
|
29
|
-
- **MCP resources and prompts** — Expose schema snapshots and prompt templates to capable clients
|
|
32
|
+
- **MCP resources and prompts** — Expose schema snapshots, query artifacts, and prompt templates to capable clients
|
|
33
|
+
- **Remote transport support** — Run locally over `stdio` or remotely over Streamable HTTP
|
|
30
34
|
- **Multi-database support** — Connect to multiple databases on the same server
|
|
31
35
|
- **Read-only mode** — Restrict to inspection, search, read, and explain tools for safer environments
|
|
32
|
-
- **Secure by default** — WHERE clauses required for updates/deletes; SQL injection safeguards for reads
|
|
36
|
+
- **Secure by default** — WHERE clauses required for updates/deletes; SQL injection safeguards for reads; DDL tools off unless `ENABLE_DDL=true`
|
|
33
37
|
|
|
34
38
|
## Supported AI Clients
|
|
35
39
|
|
|
@@ -44,7 +48,7 @@ AI: *queries your MSSQL database and returns the results in plain English*
|
|
|
44
48
|
|
|
45
49
|
Click **Add to Cursor** or **Install in VS Code** above to add the MCP server—no cloning required; it runs via `npx`.
|
|
46
50
|
|
|
47
|
-
**Cursor** opens a dedicated install page that lists env vars you can edit before saving (similar to a short form).
|
|
51
|
+
**Cursor** opens a dedicated install page that lists env vars you can edit before saving (similar to a short form). The **Add to Cursor** preset includes every variable from the table below (connection, timeouts, **`ENABLE_DDL`** defaulting to **`false`**, write caps, **`MCP_TRANSPORT`** / HTTP settings, **`MCP_BASE_URL`**, etc.); set **`ENABLE_DDL`** to **`true`** there if you want schema tools.
|
|
48
52
|
|
|
49
53
|
**VS Code** only applies the JSON embedded in the `vscode:mcp/install` link: you get static placeholder values, not an interactive database wizard. To be prompted for host, database, and credentials when the server starts, add [`inputs`](https://code.visualstudio.com/docs/copilot/reference/mcp-configuration#_input-variables-for-sensitive-data) to `.vscode/mcp.json` as in the **Prompted inputs** example under **VS Code (`mcp.json`)** below.
|
|
50
54
|
|
|
@@ -89,6 +93,13 @@ npm run build
|
|
|
89
93
|
| `QUERY_TIMEOUT_MS` | No | Query timeout in milliseconds (default: `30000`) |
|
|
90
94
|
| `MAX_ROWS` | No | Maximum rows returned by read tools (default: `10000`) |
|
|
91
95
|
| `TRUST_SERVER_CERTIFICATE` | No | `"true"` for self-signed certs (e.g., local dev) (default: `"false"`) |
|
|
96
|
+
| `MCP_TRANSPORT` | No | `stdio` (default) or `http` |
|
|
97
|
+
| `MCP_HTTP_HOST` | No | Bind host for Streamable HTTP mode (default: `127.0.0.1`) |
|
|
98
|
+
| `MCP_HTTP_PORT` | No | Bind port for Streamable HTTP mode (default: `3333`) |
|
|
99
|
+
| `MCP_BASE_URL` | No | Optional externally visible base URL for remote deployments |
|
|
100
|
+
| `ENABLE_DDL` | No | `"true"` enables `create_table`, `create_index`, and `drop_table` (default: `false`) |
|
|
101
|
+
| `MAX_WRITE_ROWS` | No | Maximum rows a single write tool may affect before it is blocked (default: `100`) |
|
|
102
|
+
| `REQUIRE_WRITE_PREVIEW` | No | `"true"` (default): call `preview_update` / `preview_delete`, then pass the returned `previewToken` with `confirmed=true` on `update_data` / `delete_data`. Set `"false"` to skip the token (confirmation still applies). |
|
|
92
103
|
|
|
93
104
|
\* Required for SQL authentication. For Windows/Integrated authentication, consult the [mssql](https://www.npmjs.com/package/mssql) package documentation.
|
|
94
105
|
|
|
@@ -119,6 +130,26 @@ Use [global or project MCP config](https://cursor.com/docs/context/mcp): e.g. `~
|
|
|
119
130
|
|
|
120
131
|
Restart Cursor after changes.
|
|
121
132
|
|
|
133
|
+
### Cursor HTTP MCP
|
|
134
|
+
|
|
135
|
+
To expose the server remotely over Streamable HTTP:
|
|
136
|
+
|
|
137
|
+
```json
|
|
138
|
+
{
|
|
139
|
+
"mcpServers": {
|
|
140
|
+
"mssql-http": {
|
|
141
|
+
"url": "http://127.0.0.1:3333"
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Run the server with:
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
MCP_TRANSPORT=http MCP_HTTP_HOST=127.0.0.1 MCP_HTTP_PORT=3333 npx -y @eamonboyle/mssql-mcp
|
|
151
|
+
```
|
|
152
|
+
|
|
122
153
|
### VS Code (`mcp.json`)
|
|
123
154
|
|
|
124
155
|
VS Code uses `.vscode/mcp.json` (or **MCP: Open User Configuration**) with a top-level [`servers`](https://code.visualstudio.com/docs/copilot/reference/mcp-configuration) object—**not** `mcpServers`.
|
|
@@ -258,6 +289,10 @@ See `src/samples/` for example configs:
|
|
|
258
289
|
Once configured, you can ask things like:
|
|
259
290
|
|
|
260
291
|
- "Show me all users from New York"
|
|
292
|
+
- "List the configured databases this MCP can access"
|
|
293
|
+
- "Preview the rows that would be updated before changing status to archived"
|
|
294
|
+
- "Explain this query and open the execution plan viewer"
|
|
295
|
+
- "Show the foreign keys and relationships around dbo.Orders"
|
|
261
296
|
- "Search the customers table for email addresses containing acme.com"
|
|
262
297
|
- "Create a new table called products with columns for id, name, and price"
|
|
263
298
|
- "Update all pending orders to completed status"
|
|
@@ -279,8 +314,8 @@ Once configured, you can ask things like:
|
|
|
279
314
|
| `list_objects` | ✓ | List tables, views, procedures, functions, and triggers |
|
|
280
315
|
| `describe_object` | ✓ | Describe an object definition and metadata |
|
|
281
316
|
| `insert_data` | | Insert rows |
|
|
282
|
-
| `update_data` | | Update rows (requires WHERE)
|
|
283
|
-
| `delete_data` | | Delete rows (requires WHERE)
|
|
317
|
+
| `update_data` | | Update rows (requires WHERE; optional `schemaName`) |
|
|
318
|
+
| `delete_data` | | Delete rows (requires WHERE; optional `schemaName`) |
|
|
284
319
|
| `create_table` | | Create tables |
|
|
285
320
|
| `create_index` | | Create indexes |
|
|
286
321
|
| `drop_table` | | Drop tables |
|
|
@@ -302,6 +337,7 @@ Release notes: [CHANGELOG.md](https://github.com/eamonboyle/mssql-mcp/blob/main/
|
|
|
302
337
|
- **Read-only mode** — Set `READONLY: "true"` when you only need queries.
|
|
303
338
|
- **WHERE clauses** — Update and delete operations require explicit WHERE clauses to reduce accidental full-table changes.
|
|
304
339
|
- **SQL injection** — The server validates and restricts dangerous SQL patterns.
|
|
340
|
+
- **DDL tools** — Disabled by default (`ENABLE_DDL` unset or `false`). Set `ENABLE_DDL=true` only if the assistant should create/drop tables or indexes.
|
|
305
341
|
|
|
306
342
|
## Contributing
|
|
307
343
|
|
package/dist/config.d.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
|
+
export type McpTransportMode = "stdio" | "http";
|
|
1
2
|
export declare function getMaxRows(): number;
|
|
2
3
|
export declare function getQueryTimeoutMs(): number;
|
|
3
4
|
export declare function getDefaultSearchLimit(): number;
|
|
4
5
|
export declare function clampRowLimit(limit: unknown, fallback?: number): number;
|
|
6
|
+
export declare function getMcpTransport(): McpTransportMode;
|
|
7
|
+
export declare function getMcpHttpPort(): number;
|
|
8
|
+
export declare function getMcpHttpHost(): string;
|
|
9
|
+
export declare function getMcpBaseUrl(): string | undefined;
|
|
10
|
+
export declare function isDdlEnabled(): boolean;
|
|
11
|
+
export declare function getMaxWriteRows(): number;
|
|
12
|
+
export declare function isWritePreviewRequired(): boolean;
|
|
5
13
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AA4CA,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEhD,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAK1C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAe,GAAG,MAAM,CAa7E;AAED,wBAAgB,eAAe,IAAI,gBAAgB,CAIlD;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,CAGlD;AAED,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAKxC;AAED,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD"}
|
package/dist/config.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
const DEFAULT_MAX_ROWS = 10000;
|
|
2
2
|
const DEFAULT_QUERY_TIMEOUT_MS = 30000;
|
|
3
3
|
const DEFAULT_SEARCH_LIMIT = 100;
|
|
4
|
+
const DEFAULT_HTTP_PORT = 3333;
|
|
5
|
+
const DEFAULT_HTTP_HOST = "127.0.0.1";
|
|
6
|
+
const DEFAULT_MAX_WRITE_ROWS = 100;
|
|
4
7
|
function parsePositiveInt(value, fallback, minimum = 1) {
|
|
5
8
|
if (!value) {
|
|
6
9
|
return fallback;
|
|
@@ -11,6 +14,19 @@ function parsePositiveInt(value, fallback, minimum = 1) {
|
|
|
11
14
|
}
|
|
12
15
|
return parsed;
|
|
13
16
|
}
|
|
17
|
+
function parseBoolean(value, fallback) {
|
|
18
|
+
if (!value) {
|
|
19
|
+
return fallback;
|
|
20
|
+
}
|
|
21
|
+
const normalized = value.trim().toLowerCase();
|
|
22
|
+
if (normalized === "true") {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
if (normalized === "false") {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
return fallback;
|
|
29
|
+
}
|
|
14
30
|
export function getMaxRows() {
|
|
15
31
|
return parsePositiveInt(process.env.MAX_ROWS, DEFAULT_MAX_ROWS);
|
|
16
32
|
}
|
|
@@ -31,4 +47,28 @@ export function clampRowLimit(limit, fallback = getMaxRows()) {
|
|
|
31
47
|
}
|
|
32
48
|
return Math.min(Math.floor(parsed), getMaxRows());
|
|
33
49
|
}
|
|
50
|
+
export function getMcpTransport() {
|
|
51
|
+
return process.env.MCP_TRANSPORT?.trim().toLowerCase() === "http"
|
|
52
|
+
? "http"
|
|
53
|
+
: "stdio";
|
|
54
|
+
}
|
|
55
|
+
export function getMcpHttpPort() {
|
|
56
|
+
return parsePositiveInt(process.env.MCP_HTTP_PORT, DEFAULT_HTTP_PORT);
|
|
57
|
+
}
|
|
58
|
+
export function getMcpHttpHost() {
|
|
59
|
+
return process.env.MCP_HTTP_HOST?.trim() || DEFAULT_HTTP_HOST;
|
|
60
|
+
}
|
|
61
|
+
export function getMcpBaseUrl() {
|
|
62
|
+
const value = process.env.MCP_BASE_URL?.trim();
|
|
63
|
+
return value ? value : undefined;
|
|
64
|
+
}
|
|
65
|
+
export function isDdlEnabled() {
|
|
66
|
+
return parseBoolean(process.env.ENABLE_DDL, false);
|
|
67
|
+
}
|
|
68
|
+
export function getMaxWriteRows() {
|
|
69
|
+
return parsePositiveInt(process.env.MAX_WRITE_ROWS, DEFAULT_MAX_WRITE_ROWS);
|
|
70
|
+
}
|
|
71
|
+
export function isWritePreviewRequired() {
|
|
72
|
+
return parseBoolean(process.env.REQUIRE_WRITE_PREVIEW, true);
|
|
73
|
+
}
|
|
34
74
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,wBAAwB,GAAG,KAAK,CAAC;AACvC,MAAM,oBAAoB,GAAG,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/db.d.ts
CHANGED
package/dist/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;AAiBxB,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAatD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAQ9C;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQxE;AA6CD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAoB7B;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAWnD;AAED,wBAAsB,mBAAmB,CACvC,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC;IAAE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBvD"}
|
package/dist/db.js
CHANGED
|
@@ -11,7 +11,7 @@ function parseDatabaseList(value) {
|
|
|
11
11
|
.map((db) => db.trim())
|
|
12
12
|
.filter(Boolean);
|
|
13
13
|
}
|
|
14
|
-
function getDefaultDatabaseName() {
|
|
14
|
+
export function getDefaultDatabaseName() {
|
|
15
15
|
const allowedDatabases = parseDatabaseList(process.env.DATABASES);
|
|
16
16
|
const explicitDefault = process.env.DATABASE_NAME?.trim();
|
|
17
17
|
if (allowedDatabases.length === 0) {
|
package/dist/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,0CAA0C;AAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;AAEvD,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,KAAK;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;SACtB,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,0CAA0C;AAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;AAEvD,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,KAAK;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;SACtB,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAClE,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;IAE1D,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,eAAe,IAAI,IAAI,CAAC;IACjC,CAAC;IAED,IAAI,eAAe,IAAI,gBAAgB,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAClE,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,OAAO,gBAAgB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAClE,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;IACpD,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,YAAqB;IACvD,MAAM,QAAQ,GAAG,YAAY,EAAE,IAAI,EAAE,IAAI,sBAAsB,EAAE,CAAC;IAClE,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;IACtC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAChD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,0BAA0B,CAAC,YAAoB;IACtD,MAAM,sBAAsB,GAC1B,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,WAAW,EAAE,KAAK,MAAM,CAAC;IACjE,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB;QACtD,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAC9C,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,WAAW;QAC9C,QAAQ,EAAE,YAAY;QACtB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO;QACzB,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW;QACjC,cAAc,EAAE,iBAAiB,EAAE;QACnC,OAAO,EAAE;YACP,OAAO,EAAE,KAAK;YACd,sBAAsB,EAAE,sBAAsB,IAAI,IAAI;YACtD,gBAAgB,EAAE,IAAI;YACtB,MAAM,EAAE,KAAK;SACd;QACD,iBAAiB,EAAE,iBAAiB,GAAG,IAAI;KAC9B,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,YAAqB;IAErB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;IACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;QACtC,MAAM,iBAAiB,GACrB,OAAO,CAAC,MAAM,GAAG,CAAC;YAChB,CAAC,CAAC,YAAY,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YACnC,CAAC,CAAC,8DAA8D,CAAC;QAErE,OAAO;YACL,YAAY,EAAE,EAAE;YAChB,KAAK,EAAE,mCAAmC,iBAAiB,2EAA2E;SACvI,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,YAAoB;IAEpB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5C,IAAI,QAAQ,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,MAAM,GAAG,0BAA0B,CAAC,YAAY,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACrB,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACjC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,YAAqB;IAErB,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC,YAAY,CAAC,CAAC;IAC/D,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO;YACL,OAAO,EAAE,IAA8B;YACvC,KAAK,EAAE,QAAQ,CAAC,KAAK;SACtB,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,YAAqB;IAErB,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC,YAAY,CAAC,CAAC;IAC/D,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO;YACL,IAAI,EAAE,IAAqC;YAC3C,KAAK,EAAE,QAAQ,CAAC,KAAK;SACtB,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG;QACb,GAAG,0BAA0B,CAAC,QAAQ,CAAC,YAAY,CAAC;QACpD,IAAI,EAAE;YACJ,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,CAAC;YACN,iBAAiB,EAAE,KAAK;SACzB;KACY,CAAC;IAEhB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACrB,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC"}
|