@elad-nofy/mssql-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 +174 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +32 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +88 -0
- package/dist/index.js.map +1 -0
- package/dist/mssqlClient.d.ts +17 -0
- package/dist/mssqlClient.d.ts.map +1 -0
- package/dist/mssqlClient.js +78 -0
- package/dist/mssqlClient.js.map +1 -0
- package/dist/tools/availability.d.ts +50 -0
- package/dist/tools/availability.d.ts.map +1 -0
- package/dist/tools/availability.js +153 -0
- package/dist/tools/availability.js.map +1 -0
- package/dist/tools/connection.d.ts +32 -0
- package/dist/tools/connection.d.ts.map +1 -0
- package/dist/tools/connection.js +63 -0
- package/dist/tools/connection.js.map +1 -0
- package/dist/tools/health.d.ts +89 -0
- package/dist/tools/health.d.ts.map +1 -0
- package/dist/tools/health.js +189 -0
- package/dist/tools/health.js.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +7 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/jobs.d.ts +53 -0
- package/dist/tools/jobs.d.ts.map +1 -0
- package/dist/tools/jobs.js +161 -0
- package/dist/tools/jobs.js.map +1 -0
- package/dist/tools/performance.d.ts +60 -0
- package/dist/tools/performance.d.ts.map +1 -0
- package/dist/tools/performance.js +162 -0
- package/dist/tools/performance.js.map +1 -0
- package/dist/tools/queries.d.ts +59 -0
- package/dist/tools/queries.d.ts.map +1 -0
- package/dist/tools/queries.js +125 -0
- package/dist/tools/queries.js.map +1 -0
- package/package.json +54 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Nof Yonany
|
|
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,174 @@
|
|
|
1
|
+
# MSSQL MCP Server
|
|
2
|
+
|
|
3
|
+
MCP (Model Context Protocol) server for Microsoft SQL Server. Provides AI assistants with read-only access to SQL Server for query execution, performance analysis, health monitoring, and troubleshooting.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
### Connection & Discovery
|
|
8
|
+
- **test_connection** - Verify SQL Server connectivity and authentication
|
|
9
|
+
- **list_databases** - List all databases with status and size
|
|
10
|
+
- **get_server_info** - Server version, edition, and configuration
|
|
11
|
+
|
|
12
|
+
### Query Execution
|
|
13
|
+
- **execute_query** - Run read-only SELECT queries (INSERT/UPDATE/DELETE blocked)
|
|
14
|
+
- **get_expensive_queries** - Find resource-intensive queries from plan cache
|
|
15
|
+
- **get_running_queries** - View currently executing queries
|
|
16
|
+
|
|
17
|
+
### Performance Analysis
|
|
18
|
+
- **get_blocking** - Identify blocking chains and deadlocks
|
|
19
|
+
- **get_wait_stats** - Analyze wait statistics for bottlenecks
|
|
20
|
+
- **get_cpu_usage** - CPU usage history from ring buffer
|
|
21
|
+
- **get_index_usage** - Find unused or missing indexes
|
|
22
|
+
|
|
23
|
+
### Health Monitoring
|
|
24
|
+
- **get_database_states** - Database health and status
|
|
25
|
+
- **get_disk_space** - Data and log file space usage
|
|
26
|
+
- **get_memory_usage** - Buffer pool and memory clerk stats
|
|
27
|
+
- **get_log_space** - Transaction log usage
|
|
28
|
+
- **get_backup_status** - Last backup times and status
|
|
29
|
+
|
|
30
|
+
### SQL Agent Jobs
|
|
31
|
+
- **list_jobs** - All SQL Agent jobs with status
|
|
32
|
+
- **get_running_jobs** - Currently executing jobs
|
|
33
|
+
- **get_failed_jobs** - Recent job failures
|
|
34
|
+
- **get_job_history** - Execution history for a job
|
|
35
|
+
|
|
36
|
+
### Availability Groups
|
|
37
|
+
- **get_ag_status** - Always On AG health and sync status
|
|
38
|
+
- **get_replica_states** - Detailed replica information
|
|
39
|
+
- **get_cluster_status** - WSFC cluster status
|
|
40
|
+
|
|
41
|
+
## Installation
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npx @elad-nofy/mssql-mcp
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Configuration
|
|
48
|
+
|
|
49
|
+
### Environment Variables
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# Required
|
|
53
|
+
MSSQL_HOST=your-server.domain.com
|
|
54
|
+
|
|
55
|
+
# Optional
|
|
56
|
+
MSSQL_PORT=1433 # Default: 1433
|
|
57
|
+
MSSQL_DATABASE=master # Default: master
|
|
58
|
+
|
|
59
|
+
# Authentication - Windows Auth (default)
|
|
60
|
+
# Leave MSSQL_USER and MSSQL_PASSWORD empty for Windows Authentication
|
|
61
|
+
|
|
62
|
+
# Authentication - SQL Auth
|
|
63
|
+
MSSQL_USER=your_username
|
|
64
|
+
MSSQL_PASSWORD=your_password
|
|
65
|
+
|
|
66
|
+
# Connection Options
|
|
67
|
+
MSSQL_ENCRYPT=false # Default: false
|
|
68
|
+
MSSQL_TRUST_SERVER_CERTIFICATE=true # Default: true
|
|
69
|
+
MSSQL_CONNECTION_TIMEOUT=30000 # Default: 30000ms
|
|
70
|
+
MSSQL_REQUEST_TIMEOUT=30000 # Default: 30000ms
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Claude Code CLI
|
|
74
|
+
|
|
75
|
+
Add to your MCP settings:
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"mcpServers": {
|
|
80
|
+
"mssql": {
|
|
81
|
+
"command": "npx",
|
|
82
|
+
"args": ["@elad-nofy/mssql-mcp"],
|
|
83
|
+
"env": {
|
|
84
|
+
"MSSQL_HOST": "your-server.domain.com"
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Windows Authentication
|
|
92
|
+
|
|
93
|
+
For Windows Authentication, run the MCP server under an account with SQL Server access. The server will use the process credentials automatically.
|
|
94
|
+
|
|
95
|
+
### Required Permissions
|
|
96
|
+
|
|
97
|
+
The SQL Server login needs these permissions:
|
|
98
|
+
- `VIEW SERVER STATE` - For DMVs (wait stats, blocking, etc.)
|
|
99
|
+
- `VIEW DATABASE STATE` - For database-level DMVs
|
|
100
|
+
- `SELECT` on `msdb` - For SQL Agent job information
|
|
101
|
+
|
|
102
|
+
Example:
|
|
103
|
+
```sql
|
|
104
|
+
USE master;
|
|
105
|
+
CREATE LOGIN [DOMAIN\ServiceAccount] FROM WINDOWS;
|
|
106
|
+
GRANT VIEW SERVER STATE TO [DOMAIN\ServiceAccount];
|
|
107
|
+
GRANT VIEW ANY DATABASE TO [DOMAIN\ServiceAccount];
|
|
108
|
+
|
|
109
|
+
USE msdb;
|
|
110
|
+
CREATE USER [DOMAIN\ServiceAccount] FOR LOGIN [DOMAIN\ServiceAccount];
|
|
111
|
+
GRANT SELECT ON SCHEMA::dbo TO [DOMAIN\ServiceAccount];
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Example Usage
|
|
115
|
+
|
|
116
|
+
### Investigate Performance Issues
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
"Check for blocking on PROD-SQL-01"
|
|
120
|
+
→ Uses get_blocking to show blocking chains
|
|
121
|
+
|
|
122
|
+
"What are the top CPU-consuming queries?"
|
|
123
|
+
→ Uses get_expensive_queries sorted by CPU
|
|
124
|
+
|
|
125
|
+
"Show me the wait stats"
|
|
126
|
+
→ Uses get_wait_stats to identify bottlenecks
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Health Check
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
"Are all databases healthy?"
|
|
133
|
+
→ Uses get_database_states to check status
|
|
134
|
+
|
|
135
|
+
"When was the last backup for each database?"
|
|
136
|
+
→ Uses get_backup_status to show backup times
|
|
137
|
+
|
|
138
|
+
"Check disk space on SQL Server"
|
|
139
|
+
→ Uses get_disk_space for file usage
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Troubleshoot Jobs
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
"What jobs failed in the last 24 hours?"
|
|
146
|
+
→ Uses get_failed_jobs to show failures
|
|
147
|
+
|
|
148
|
+
"Is the nightly backup job running?"
|
|
149
|
+
→ Uses get_running_jobs to check status
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Development
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
# Install dependencies
|
|
156
|
+
npm install
|
|
157
|
+
|
|
158
|
+
# Build
|
|
159
|
+
npm run build
|
|
160
|
+
|
|
161
|
+
# Run in development (watch mode)
|
|
162
|
+
npm run dev
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Security Notes
|
|
166
|
+
|
|
167
|
+
- **Read-only by design** - Only SELECT queries are allowed
|
|
168
|
+
- **No secrets in code** - All credentials via environment variables
|
|
169
|
+
- **Parameterized queries** - Protection against SQL injection
|
|
170
|
+
- **Blocked dangerous operations** - INSERT, UPDATE, DELETE, EXEC prevented
|
|
171
|
+
|
|
172
|
+
## License
|
|
173
|
+
|
|
174
|
+
MIT
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
declare const configSchema: z.ZodObject<{
|
|
3
|
+
host: z.ZodString;
|
|
4
|
+
port: z.ZodDefault<z.ZodNumber>;
|
|
5
|
+
database: z.ZodDefault<z.ZodString>;
|
|
6
|
+
user: z.ZodOptional<z.ZodString>;
|
|
7
|
+
password: z.ZodOptional<z.ZodString>;
|
|
8
|
+
encrypt: z.ZodDefault<z.ZodBoolean>;
|
|
9
|
+
trustServerCertificate: z.ZodDefault<z.ZodBoolean>;
|
|
10
|
+
connectionTimeout: z.ZodDefault<z.ZodNumber>;
|
|
11
|
+
requestTimeout: z.ZodDefault<z.ZodNumber>;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
host: string;
|
|
14
|
+
port: number;
|
|
15
|
+
database: string;
|
|
16
|
+
encrypt: boolean;
|
|
17
|
+
trustServerCertificate: boolean;
|
|
18
|
+
connectionTimeout: number;
|
|
19
|
+
requestTimeout: number;
|
|
20
|
+
user?: string | undefined;
|
|
21
|
+
password?: string | undefined;
|
|
22
|
+
}, {
|
|
23
|
+
host: string;
|
|
24
|
+
port?: number | undefined;
|
|
25
|
+
database?: string | undefined;
|
|
26
|
+
user?: string | undefined;
|
|
27
|
+
password?: string | undefined;
|
|
28
|
+
encrypt?: boolean | undefined;
|
|
29
|
+
trustServerCertificate?: boolean | undefined;
|
|
30
|
+
connectionTimeout?: number | undefined;
|
|
31
|
+
requestTimeout?: number | undefined;
|
|
32
|
+
}>;
|
|
33
|
+
export type Config = z.infer<typeof configSchema>;
|
|
34
|
+
export declare function loadConfig(): Config;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUhB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,wBAAgB,UAAU,IAAI,MAAM,CAoBnC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const configSchema = z.object({
|
|
3
|
+
host: z.string().min(1, 'MSSQL_HOST is required'),
|
|
4
|
+
port: z.coerce.number().default(1433),
|
|
5
|
+
database: z.string().default('master'),
|
|
6
|
+
user: z.string().optional(),
|
|
7
|
+
password: z.string().optional(),
|
|
8
|
+
encrypt: z.coerce.boolean().default(false),
|
|
9
|
+
trustServerCertificate: z.coerce.boolean().default(true),
|
|
10
|
+
connectionTimeout: z.coerce.number().default(30000),
|
|
11
|
+
requestTimeout: z.coerce.number().default(30000),
|
|
12
|
+
});
|
|
13
|
+
export function loadConfig() {
|
|
14
|
+
const raw = {
|
|
15
|
+
host: process.env.MSSQL_HOST,
|
|
16
|
+
port: process.env.MSSQL_PORT,
|
|
17
|
+
database: process.env.MSSQL_DATABASE,
|
|
18
|
+
user: process.env.MSSQL_USER,
|
|
19
|
+
password: process.env.MSSQL_PASSWORD,
|
|
20
|
+
encrypt: process.env.MSSQL_ENCRYPT,
|
|
21
|
+
trustServerCertificate: process.env.MSSQL_TRUST_SERVER_CERTIFICATE,
|
|
22
|
+
connectionTimeout: process.env.MSSQL_CONNECTION_TIMEOUT,
|
|
23
|
+
requestTimeout: process.env.MSSQL_REQUEST_TIMEOUT,
|
|
24
|
+
};
|
|
25
|
+
const result = configSchema.safeParse(raw);
|
|
26
|
+
if (!result.success) {
|
|
27
|
+
const errors = result.error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', ');
|
|
28
|
+
throw new Error(`Configuration error: ${errors}`);
|
|
29
|
+
}
|
|
30
|
+
return result.data;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,wBAAwB,CAAC;IACjD,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACrC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;IACtC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC1C,sBAAsB,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACxD,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACnD,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACjD,CAAC,CAAC;AAIH,MAAM,UAAU,UAAU;IACxB,MAAM,GAAG,GAAG;QACV,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;QAC5B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;QAC5B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;QACpC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;QAC5B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;QACpC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;QAClC,sBAAsB,EAAE,OAAO,CAAC,GAAG,CAAC,8BAA8B;QAClE,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB;QACvD,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB;KAClD,CAAC;IAEF,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5F,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { zodToJsonSchema } from 'zod-to-json-schema';
|
|
7
|
+
import { loadConfig } from './config.js';
|
|
8
|
+
import { MssqlClient } from './mssqlClient.js';
|
|
9
|
+
import { connectionTools, queryTools, performanceTools, healthTools, jobTools, availabilityTools, } from './tools/index.js';
|
|
10
|
+
// Combine all tools
|
|
11
|
+
const allTools = {
|
|
12
|
+
...connectionTools,
|
|
13
|
+
...queryTools,
|
|
14
|
+
...performanceTools,
|
|
15
|
+
...healthTools,
|
|
16
|
+
...jobTools,
|
|
17
|
+
...availabilityTools,
|
|
18
|
+
};
|
|
19
|
+
// Initialize config and client
|
|
20
|
+
const config = loadConfig();
|
|
21
|
+
const client = new MssqlClient(config);
|
|
22
|
+
// Create MCP server
|
|
23
|
+
const server = new Server({
|
|
24
|
+
name: 'mssql-mcp',
|
|
25
|
+
version: '1.0.0',
|
|
26
|
+
}, {
|
|
27
|
+
capabilities: {
|
|
28
|
+
tools: {},
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
// List available tools
|
|
32
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
33
|
+
const tools = Object.entries(allTools).map(([name, tool]) => ({
|
|
34
|
+
name,
|
|
35
|
+
description: tool.description,
|
|
36
|
+
inputSchema: zodToJsonSchema(tool.inputSchema),
|
|
37
|
+
}));
|
|
38
|
+
return { tools };
|
|
39
|
+
});
|
|
40
|
+
// Handle tool calls
|
|
41
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
42
|
+
const toolName = request.params.name;
|
|
43
|
+
const tool = allTools[toolName];
|
|
44
|
+
if (!tool) {
|
|
45
|
+
throw new Error(`Unknown tool: ${toolName}`);
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
// Validate input
|
|
49
|
+
const args = tool.inputSchema.parse(request.params.arguments || {});
|
|
50
|
+
// Execute tool handler
|
|
51
|
+
const result = await tool.handler(client, args);
|
|
52
|
+
return {
|
|
53
|
+
content: [
|
|
54
|
+
{
|
|
55
|
+
type: 'text',
|
|
56
|
+
text: JSON.stringify(result, null, 2),
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
const message = error instanceof z.ZodError
|
|
63
|
+
? `Validation error: ${error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', ')}`
|
|
64
|
+
: error instanceof Error
|
|
65
|
+
? error.message
|
|
66
|
+
: String(error);
|
|
67
|
+
return {
|
|
68
|
+
content: [
|
|
69
|
+
{
|
|
70
|
+
type: 'text',
|
|
71
|
+
text: JSON.stringify({ error: message }, null, 2),
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
isError: true,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
// Start server
|
|
79
|
+
async function main() {
|
|
80
|
+
const transport = new StdioServerTransport();
|
|
81
|
+
await server.connect(transport);
|
|
82
|
+
console.error('MSSQL MCP server running on stdio');
|
|
83
|
+
}
|
|
84
|
+
main().catch((error) => {
|
|
85
|
+
console.error('Fatal error:', error);
|
|
86
|
+
process.exit(1);
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import sql from 'mssql';
|
|
2
|
+
import { Config } from './config.js';
|
|
3
|
+
export declare class MssqlClient {
|
|
4
|
+
private pool;
|
|
5
|
+
private config;
|
|
6
|
+
constructor(config: Config);
|
|
7
|
+
private getSqlConfig;
|
|
8
|
+
connect(): Promise<sql.ConnectionPool>;
|
|
9
|
+
query<T = sql.IRecordSet<unknown>>(queryText: string, params?: Record<string, unknown>): Promise<T[]>;
|
|
10
|
+
testConnection(): Promise<{
|
|
11
|
+
success: boolean;
|
|
12
|
+
version?: string;
|
|
13
|
+
error?: string;
|
|
14
|
+
}>;
|
|
15
|
+
close(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=mssqlClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mssqlClient.d.ts","sourceRoot":"","sources":["../src/mssqlClient.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAmC;IAC/C,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAI1B,OAAO,CAAC,YAAY;IAoCd,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAUtC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAcrG,cAAc,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IASjF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import sql from 'mssql';
|
|
2
|
+
export class MssqlClient {
|
|
3
|
+
pool = null;
|
|
4
|
+
config;
|
|
5
|
+
constructor(config) {
|
|
6
|
+
this.config = config;
|
|
7
|
+
}
|
|
8
|
+
getSqlConfig() {
|
|
9
|
+
const baseConfig = {
|
|
10
|
+
server: this.config.host,
|
|
11
|
+
port: this.config.port,
|
|
12
|
+
database: this.config.database,
|
|
13
|
+
options: {
|
|
14
|
+
encrypt: this.config.encrypt,
|
|
15
|
+
trustServerCertificate: this.config.trustServerCertificate,
|
|
16
|
+
},
|
|
17
|
+
connectionTimeout: this.config.connectionTimeout,
|
|
18
|
+
requestTimeout: this.config.requestTimeout,
|
|
19
|
+
};
|
|
20
|
+
// Use Windows Auth if no user/password provided
|
|
21
|
+
if (this.config.user && this.config.password) {
|
|
22
|
+
return {
|
|
23
|
+
...baseConfig,
|
|
24
|
+
user: this.config.user,
|
|
25
|
+
password: this.config.password,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
// Windows Authentication (NTLM)
|
|
30
|
+
return {
|
|
31
|
+
...baseConfig,
|
|
32
|
+
authentication: {
|
|
33
|
+
type: 'ntlm',
|
|
34
|
+
options: {
|
|
35
|
+
domain: '', // Uses current domain
|
|
36
|
+
userName: '',
|
|
37
|
+
password: '',
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async connect() {
|
|
44
|
+
if (this.pool) {
|
|
45
|
+
return this.pool;
|
|
46
|
+
}
|
|
47
|
+
const sqlConfig = this.getSqlConfig();
|
|
48
|
+
this.pool = await sql.connect(sqlConfig);
|
|
49
|
+
return this.pool;
|
|
50
|
+
}
|
|
51
|
+
async query(queryText, params) {
|
|
52
|
+
const pool = await this.connect();
|
|
53
|
+
const request = pool.request();
|
|
54
|
+
if (params) {
|
|
55
|
+
for (const [key, value] of Object.entries(params)) {
|
|
56
|
+
request.input(key, value);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const result = await request.query(queryText);
|
|
60
|
+
return result.recordset;
|
|
61
|
+
}
|
|
62
|
+
async testConnection() {
|
|
63
|
+
try {
|
|
64
|
+
const result = await this.query('SELECT @@VERSION as version');
|
|
65
|
+
return { success: true, version: result[0]?.version };
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
return { success: false, error: error instanceof Error ? error.message : String(error) };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async close() {
|
|
72
|
+
if (this.pool) {
|
|
73
|
+
await this.pool.close();
|
|
74
|
+
this.pool = null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=mssqlClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mssqlClient.js","sourceRoot":"","sources":["../src/mssqlClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { MssqlClient } from '../mssqlClient.js';
|
|
3
|
+
export declare const availabilityTools: {
|
|
4
|
+
get_ag_status: {
|
|
5
|
+
description: string;
|
|
6
|
+
inputSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
7
|
+
handler: (client: MssqlClient) => Promise<{
|
|
8
|
+
hadrEnabled: boolean;
|
|
9
|
+
message: string;
|
|
10
|
+
replicas?: undefined;
|
|
11
|
+
databases?: undefined;
|
|
12
|
+
} | {
|
|
13
|
+
hadrEnabled: boolean;
|
|
14
|
+
replicas: import("mssql").IRecordSet<unknown>[];
|
|
15
|
+
databases: import("mssql").IRecordSet<unknown>[];
|
|
16
|
+
message?: undefined;
|
|
17
|
+
}>;
|
|
18
|
+
};
|
|
19
|
+
get_replica_states: {
|
|
20
|
+
description: string;
|
|
21
|
+
inputSchema: z.ZodObject<{
|
|
22
|
+
agName: z.ZodOptional<z.ZodString>;
|
|
23
|
+
}, "strip", z.ZodTypeAny, {
|
|
24
|
+
agName?: string | undefined;
|
|
25
|
+
}, {
|
|
26
|
+
agName?: string | undefined;
|
|
27
|
+
}>;
|
|
28
|
+
handler: (client: MssqlClient, args: {
|
|
29
|
+
agName?: string;
|
|
30
|
+
}) => Promise<import("mssql").IRecordSet<unknown>[]>;
|
|
31
|
+
};
|
|
32
|
+
get_cluster_status: {
|
|
33
|
+
description: string;
|
|
34
|
+
inputSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
35
|
+
handler: (client: MssqlClient) => Promise<{
|
|
36
|
+
isClustered: boolean;
|
|
37
|
+
message: string;
|
|
38
|
+
cluster?: undefined;
|
|
39
|
+
members?: undefined;
|
|
40
|
+
networks?: undefined;
|
|
41
|
+
} | {
|
|
42
|
+
isClustered: boolean;
|
|
43
|
+
cluster: import("mssql").IRecordSet<unknown>;
|
|
44
|
+
members: import("mssql").IRecordSet<unknown>[];
|
|
45
|
+
networks: import("mssql").IRecordSet<unknown>[];
|
|
46
|
+
message?: undefined;
|
|
47
|
+
}>;
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=availability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"availability.d.ts","sourceRoot":"","sources":["../../src/tools/availability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,eAAO,MAAM,iBAAiB;;;;0BAIF,WAAW;;;;;;;;;;;;;;;;;;;;;0BA+EX,WAAW,QAAQ;YAAE,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE;;;;;0BAmCtC,WAAW;;;;;;;;;;;;;;CAsDtC,CAAC"}
|