@elad-nofy/mssql-mcp 1.0.1 → 1.0.3
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 -1
- package/dist/config.d.ts +2 -2
- package/dist/config.js +4 -4
- package/dist/config.js.map +1 -1
- package/dist/index.js +48 -16
- package/dist/index.js.map +1 -1
- package/dist/mssqlClient.d.ts +6 -4
- package/dist/mssqlClient.d.ts.map +1 -1
- package/dist/mssqlClient.js +49 -20
- package/dist/mssqlClient.js.map +1 -1
- package/dist/tools/availability.d.ts +30 -10
- package/dist/tools/availability.d.ts.map +1 -1
- package/dist/tools/availability.js +18 -12
- package/dist/tools/availability.js.map +1 -1
- package/dist/tools/connection.d.ts +26 -5
- package/dist/tools/connection.d.ts.map +1 -1
- package/dist/tools/connection.js +14 -8
- package/dist/tools/connection.js.map +1 -1
- package/dist/tools/health.d.ts +42 -10
- package/dist/tools/health.d.ts.map +1 -1
- package/dist/tools/health.js +22 -13
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/jobs.d.ts +25 -5
- package/dist/tools/jobs.d.ts.map +1 -1
- package/dist/tools/jobs.js +12 -6
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/performance.d.ts +26 -6
- package/dist/tools/performance.d.ts.map +1 -1
- package/dist/tools/performance.js +12 -6
- package/dist/tools/performance.js.map +1 -1
- package/dist/tools/queries.d.ts +15 -3
- package/dist/tools/queries.d.ts.map +1 -1
- package/dist/tools/queries.js +7 -3
- package/dist/tools/queries.js.map +1 -1
- package/dist/tools/schema.d.ts +230 -0
- package/dist/tools/schema.d.ts.map +1 -0
- package/dist/tools/schema.js +374 -0
- package/dist/tools/schema.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -14,6 +14,17 @@ MCP (Model Context Protocol) server for Microsoft SQL Server. Provides AI assist
|
|
|
14
14
|
- **get_expensive_queries** - Find resource-intensive queries from plan cache
|
|
15
15
|
- **get_running_queries** - View currently executing queries
|
|
16
16
|
|
|
17
|
+
### Schema Exploration
|
|
18
|
+
- **get_tables** - List tables with row counts, sizes, and metadata
|
|
19
|
+
- **get_columns** - Column definitions for a table (types, keys, defaults)
|
|
20
|
+
- **get_stored_procedures** - List and view stored procedure code
|
|
21
|
+
- **get_functions** - List and view user-defined function code
|
|
22
|
+
- **get_views** - List and view definitions
|
|
23
|
+
- **get_foreign_keys** - Table relationships and constraints
|
|
24
|
+
- **get_indexes** - Index definitions with included columns
|
|
25
|
+
- **get_triggers** - Table triggers with event types
|
|
26
|
+
- **get_connected_users** - Active sessions and connections
|
|
27
|
+
|
|
17
28
|
### Performance Analysis
|
|
18
29
|
- **get_blocking** - Identify blocking chains and deadlocks
|
|
19
30
|
- **get_wait_stats** - Analyze wait statistics for bottlenecks
|
|
@@ -72,8 +83,22 @@ MSSQL_REQUEST_TIMEOUT=30000 # Default: 30000ms
|
|
|
72
83
|
|
|
73
84
|
### Claude Code CLI
|
|
74
85
|
|
|
75
|
-
|
|
86
|
+
**Windows:**
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"mcpServers": {
|
|
90
|
+
"mssql": {
|
|
91
|
+
"command": "cmd",
|
|
92
|
+
"args": ["/c", "npx", "@elad-nofy/mssql-mcp"],
|
|
93
|
+
"env": {
|
|
94
|
+
"MSSQL_HOST": "your-server.domain.com"
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
76
100
|
|
|
101
|
+
**macOS/Linux:**
|
|
77
102
|
```json
|
|
78
103
|
{
|
|
79
104
|
"mcpServers": {
|
|
@@ -113,6 +138,22 @@ GRANT SELECT ON SCHEMA::dbo TO [DOMAIN\ServiceAccount];
|
|
|
113
138
|
|
|
114
139
|
## Example Usage
|
|
115
140
|
|
|
141
|
+
### Explore Database Schema
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
"What tables are in the Orders database?"
|
|
145
|
+
→ Uses get_tables to list all tables with row counts
|
|
146
|
+
|
|
147
|
+
"Show me the columns in the Customers table"
|
|
148
|
+
→ Uses get_columns to show column definitions
|
|
149
|
+
|
|
150
|
+
"What stored procedures exist for order processing?"
|
|
151
|
+
→ Uses get_stored_procedures with name filter
|
|
152
|
+
|
|
153
|
+
"How are the tables related?"
|
|
154
|
+
→ Uses get_foreign_keys to map relationships
|
|
155
|
+
```
|
|
156
|
+
|
|
116
157
|
### Investigate Performance Issues
|
|
117
158
|
|
|
118
159
|
```
|
|
@@ -149,6 +190,33 @@ GRANT SELECT ON SCHEMA::dbo TO [DOMAIN\ServiceAccount];
|
|
|
149
190
|
→ Uses get_running_jobs to check status
|
|
150
191
|
```
|
|
151
192
|
|
|
193
|
+
## Troubleshooting
|
|
194
|
+
|
|
195
|
+
### Connection Issues
|
|
196
|
+
|
|
197
|
+
**"Login failed for user"**
|
|
198
|
+
- Verify SQL Server allows the authentication type (Windows/SQL)
|
|
199
|
+
- Check the account has server-level permissions
|
|
200
|
+
- For Windows Auth, ensure the process runs as the correct user
|
|
201
|
+
|
|
202
|
+
**"Connection timeout"**
|
|
203
|
+
- Verify network connectivity to SQL Server
|
|
204
|
+
- Check firewall allows port 1433 (or custom port)
|
|
205
|
+
- Increase `MSSQL_CONNECTION_TIMEOUT` if needed
|
|
206
|
+
|
|
207
|
+
**"Cannot open database"**
|
|
208
|
+
- Verify the account has access to the database
|
|
209
|
+
- Check database is online: `SELECT state_desc FROM sys.databases`
|
|
210
|
+
|
|
211
|
+
### Permission Errors
|
|
212
|
+
|
|
213
|
+
**"The server principal is not able to access the database"**
|
|
214
|
+
- Create a user in the target database for the login
|
|
215
|
+
- Grant appropriate permissions
|
|
216
|
+
|
|
217
|
+
**"VIEW SERVER STATE permission denied"**
|
|
218
|
+
- Grant at server level: `GRANT VIEW SERVER STATE TO [login]`
|
|
219
|
+
|
|
152
220
|
## Development
|
|
153
221
|
|
|
154
222
|
```bash
|
|
@@ -168,6 +236,7 @@ npm run dev
|
|
|
168
236
|
- **No secrets in code** - All credentials via environment variables
|
|
169
237
|
- **Parameterized queries** - Protection against SQL injection
|
|
170
238
|
- **Blocked dangerous operations** - INSERT, UPDATE, DELETE, EXEC prevented
|
|
239
|
+
- **Graceful shutdown** - Connection pool properly closed on exit
|
|
171
240
|
|
|
172
241
|
## License
|
|
173
242
|
|
package/dist/config.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
declare const
|
|
2
|
+
declare const ConfigSchema: z.ZodObject<{
|
|
3
3
|
host: z.ZodString;
|
|
4
4
|
port: z.ZodDefault<z.ZodNumber>;
|
|
5
5
|
database: z.ZodDefault<z.ZodString>;
|
|
@@ -30,7 +30,7 @@ declare const configSchema: z.ZodObject<{
|
|
|
30
30
|
connectionTimeout?: number | undefined;
|
|
31
31
|
requestTimeout?: number | undefined;
|
|
32
32
|
}>;
|
|
33
|
-
export type Config = z.infer<typeof
|
|
33
|
+
export type Config = z.infer<typeof ConfigSchema>;
|
|
34
34
|
export declare function loadConfig(): Config;
|
|
35
35
|
export {};
|
|
36
36
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
const
|
|
2
|
+
const ConfigSchema = z.object({
|
|
3
3
|
host: z.string().min(1, 'MSSQL_HOST is required'),
|
|
4
4
|
port: z.coerce.number().default(1433),
|
|
5
5
|
database: z.string().default('master'),
|
|
@@ -22,10 +22,10 @@ export function loadConfig() {
|
|
|
22
22
|
connectionTimeout: process.env.MSSQL_CONNECTION_TIMEOUT,
|
|
23
23
|
requestTimeout: process.env.MSSQL_REQUEST_TIMEOUT,
|
|
24
24
|
};
|
|
25
|
-
const result =
|
|
25
|
+
const result = ConfigSchema.safeParse(raw);
|
|
26
26
|
if (!result.success) {
|
|
27
|
-
const errors = result.error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join('
|
|
28
|
-
throw new Error(`Configuration error
|
|
27
|
+
const errors = result.error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join('\n');
|
|
28
|
+
throw new Error(`Configuration error:\n${errors}`);
|
|
29
29
|
}
|
|
30
30
|
return result.data;
|
|
31
31
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +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,
|
|
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,yBAAyB,MAAM,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
3
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
4
|
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
-
import { z } from 'zod';
|
|
6
5
|
import { zodToJsonSchema } from 'zod-to-json-schema';
|
|
7
6
|
import { loadConfig } from './config.js';
|
|
8
7
|
import { MssqlClient } from './mssqlClient.js';
|
|
9
|
-
import { connectionTools, queryTools, performanceTools, healthTools, jobTools, availabilityTools, } from './tools/index.js';
|
|
8
|
+
import { connectionTools, queryTools, performanceTools, healthTools, jobTools, availabilityTools, schemaTools, } from './tools/index.js';
|
|
10
9
|
// Combine all tools
|
|
11
10
|
const allTools = {
|
|
12
11
|
...connectionTools,
|
|
@@ -15,6 +14,7 @@ const allTools = {
|
|
|
15
14
|
...healthTools,
|
|
16
15
|
...jobTools,
|
|
17
16
|
...availabilityTools,
|
|
17
|
+
...schemaTools,
|
|
18
18
|
};
|
|
19
19
|
// Initialize config and client
|
|
20
20
|
const config = loadConfig();
|
|
@@ -30,11 +30,17 @@ const server = new Server({
|
|
|
30
30
|
});
|
|
31
31
|
// List available tools
|
|
32
32
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
33
|
-
const tools = Object.entries(allTools).map(([name, tool]) =>
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
const tools = Object.entries(allTools).map(([name, tool]) => {
|
|
34
|
+
const fullSchema = zodToJsonSchema(tool.inputSchema, {
|
|
35
|
+
$refStrategy: 'none',
|
|
36
|
+
});
|
|
37
|
+
const { $schema, ...inputSchema } = fullSchema;
|
|
38
|
+
return {
|
|
39
|
+
name,
|
|
40
|
+
description: tool.description,
|
|
41
|
+
inputSchema,
|
|
42
|
+
};
|
|
43
|
+
});
|
|
38
44
|
return { tools };
|
|
39
45
|
});
|
|
40
46
|
// Handle tool calls
|
|
@@ -42,13 +48,35 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
42
48
|
const toolName = request.params.name;
|
|
43
49
|
const tool = allTools[toolName];
|
|
44
50
|
if (!tool) {
|
|
45
|
-
|
|
51
|
+
return {
|
|
52
|
+
content: [
|
|
53
|
+
{
|
|
54
|
+
type: 'text',
|
|
55
|
+
text: JSON.stringify({ error: `Unknown tool: ${toolName}` }, null, 2),
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
isError: true,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// Validate input using safeParse
|
|
62
|
+
const parseResult = tool.inputSchema.safeParse(request.params.arguments || {});
|
|
63
|
+
if (!parseResult.success) {
|
|
64
|
+
const errors = parseResult.error.errors
|
|
65
|
+
.map(e => `${e.path.join('.')}: ${e.message}`)
|
|
66
|
+
.join('\n');
|
|
67
|
+
return {
|
|
68
|
+
content: [
|
|
69
|
+
{
|
|
70
|
+
type: 'text',
|
|
71
|
+
text: JSON.stringify({ error: `Validation error:\n${errors}` }, null, 2),
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
isError: true,
|
|
75
|
+
};
|
|
46
76
|
}
|
|
47
77
|
try {
|
|
48
|
-
// Validate input
|
|
49
|
-
const args = tool.inputSchema.parse(request.params.arguments || {});
|
|
50
78
|
// Execute tool handler
|
|
51
|
-
const result = await tool.handler(client,
|
|
79
|
+
const result = await tool.handler(client, parseResult.data);
|
|
52
80
|
return {
|
|
53
81
|
content: [
|
|
54
82
|
{
|
|
@@ -59,11 +87,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
59
87
|
};
|
|
60
88
|
}
|
|
61
89
|
catch (error) {
|
|
62
|
-
const message = error instanceof
|
|
63
|
-
? `Validation error: ${error.errors.map(e => `${e.path.join('.')}: ${e.message}`).join(', ')}`
|
|
64
|
-
: error instanceof Error
|
|
65
|
-
? error.message
|
|
66
|
-
: String(error);
|
|
90
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
67
91
|
return {
|
|
68
92
|
content: [
|
|
69
93
|
{
|
|
@@ -75,6 +99,14 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
75
99
|
};
|
|
76
100
|
}
|
|
77
101
|
});
|
|
102
|
+
// Graceful shutdown handler
|
|
103
|
+
async function shutdown() {
|
|
104
|
+
console.error('Shutting down MSSQL MCP server...');
|
|
105
|
+
await client.close();
|
|
106
|
+
process.exit(0);
|
|
107
|
+
}
|
|
108
|
+
process.on('SIGTERM', shutdown);
|
|
109
|
+
process.on('SIGINT', shutdown);
|
|
78
110
|
// Start server
|
|
79
111
|
async function main() {
|
|
80
112
|
const transport = new StdioServerTransport();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/mssqlClient.d.ts
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import sql from 'mssql';
|
|
2
2
|
import { Config } from './config.js';
|
|
3
3
|
export declare class MssqlClient {
|
|
4
|
-
private
|
|
4
|
+
private pools;
|
|
5
5
|
private config;
|
|
6
6
|
constructor(config: Config);
|
|
7
|
+
private parseServer;
|
|
7
8
|
private getSqlConfig;
|
|
8
|
-
connect(): Promise<sql.ConnectionPool>;
|
|
9
|
-
query<T =
|
|
10
|
-
testConnection(): Promise<{
|
|
9
|
+
connect(server?: string): Promise<sql.ConnectionPool>;
|
|
10
|
+
query<T = Record<string, unknown>>(queryText: string, params?: Record<string, unknown>, server?: string): Promise<T[]>;
|
|
11
|
+
testConnection(server?: string): Promise<{
|
|
11
12
|
success: boolean;
|
|
13
|
+
server: string;
|
|
12
14
|
version?: string;
|
|
13
15
|
error?: string;
|
|
14
16
|
}>;
|
|
@@ -1 +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,
|
|
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,KAAK,CAA8C;IAC3D,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAI1B,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,YAAY;IAgDd,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAgBrD,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,CAAC,EAAE,CAAC;IAcT,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAUhH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ7B"}
|
package/dist/mssqlClient.js
CHANGED
|
@@ -1,22 +1,43 @@
|
|
|
1
1
|
import sql from 'mssql';
|
|
2
2
|
export class MssqlClient {
|
|
3
|
-
|
|
3
|
+
pools = new Map();
|
|
4
4
|
config;
|
|
5
5
|
constructor(config) {
|
|
6
6
|
this.config = config;
|
|
7
7
|
}
|
|
8
|
-
|
|
8
|
+
parseServer(server) {
|
|
9
|
+
// Handle formats:
|
|
10
|
+
// - server\instance
|
|
11
|
+
// - server,port
|
|
12
|
+
// - server
|
|
13
|
+
if (server.includes(',')) {
|
|
14
|
+
const [host, portStr] = server.split(',');
|
|
15
|
+
return { host, port: parseInt(portStr, 10) };
|
|
16
|
+
}
|
|
17
|
+
return { host: server };
|
|
18
|
+
}
|
|
19
|
+
getSqlConfig(server) {
|
|
20
|
+
const targetServer = server || this.config.host;
|
|
21
|
+
const parsed = this.parseServer(targetServer);
|
|
9
22
|
const baseConfig = {
|
|
10
|
-
server:
|
|
11
|
-
port: this.config.port,
|
|
23
|
+
server: parsed.host,
|
|
24
|
+
port: parsed.port || this.config.port,
|
|
12
25
|
database: this.config.database,
|
|
13
26
|
options: {
|
|
14
27
|
encrypt: this.config.encrypt,
|
|
15
28
|
trustServerCertificate: this.config.trustServerCertificate,
|
|
29
|
+
// Enable named instance support
|
|
30
|
+
instanceName: targetServer.includes('\\')
|
|
31
|
+
? targetServer.split('\\')[1]
|
|
32
|
+
: undefined,
|
|
16
33
|
},
|
|
17
34
|
connectionTimeout: this.config.connectionTimeout,
|
|
18
35
|
requestTimeout: this.config.requestTimeout,
|
|
19
36
|
};
|
|
37
|
+
// If instance name is used, don't specify port (SQL Browser will resolve it)
|
|
38
|
+
if (baseConfig.options?.instanceName) {
|
|
39
|
+
delete baseConfig.port;
|
|
40
|
+
}
|
|
20
41
|
// Use Windows Auth if no user/password provided
|
|
21
42
|
if (this.config.user && this.config.password) {
|
|
22
43
|
return {
|
|
@@ -32,7 +53,7 @@ export class MssqlClient {
|
|
|
32
53
|
authentication: {
|
|
33
54
|
type: 'ntlm',
|
|
34
55
|
options: {
|
|
35
|
-
domain: '',
|
|
56
|
+
domain: '',
|
|
36
57
|
userName: '',
|
|
37
58
|
password: '',
|
|
38
59
|
},
|
|
@@ -40,16 +61,21 @@ export class MssqlClient {
|
|
|
40
61
|
};
|
|
41
62
|
}
|
|
42
63
|
}
|
|
43
|
-
async connect() {
|
|
44
|
-
|
|
45
|
-
|
|
64
|
+
async connect(server) {
|
|
65
|
+
const key = server || this.config.host || 'default';
|
|
66
|
+
// Check for existing pool
|
|
67
|
+
const existingPool = this.pools.get(key);
|
|
68
|
+
if (existingPool?.connected) {
|
|
69
|
+
return existingPool;
|
|
46
70
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
71
|
+
// Create new pool
|
|
72
|
+
const sqlConfig = this.getSqlConfig(server);
|
|
73
|
+
const pool = await sql.connect(sqlConfig);
|
|
74
|
+
this.pools.set(key, pool);
|
|
75
|
+
return pool;
|
|
50
76
|
}
|
|
51
|
-
async query(queryText, params) {
|
|
52
|
-
const pool = await this.connect();
|
|
77
|
+
async query(queryText, params, server) {
|
|
78
|
+
const pool = await this.connect(server);
|
|
53
79
|
const request = pool.request();
|
|
54
80
|
if (params) {
|
|
55
81
|
for (const [key, value] of Object.entries(params)) {
|
|
@@ -59,19 +85,22 @@ export class MssqlClient {
|
|
|
59
85
|
const result = await request.query(queryText);
|
|
60
86
|
return result.recordset;
|
|
61
87
|
}
|
|
62
|
-
async testConnection() {
|
|
88
|
+
async testConnection(server) {
|
|
89
|
+
const targetServer = server || this.config.host;
|
|
63
90
|
try {
|
|
64
|
-
const result = await this.query('SELECT @@VERSION as version');
|
|
65
|
-
return { success: true, version: result[0]?.version };
|
|
91
|
+
const result = await this.query('SELECT @@VERSION as version', undefined, server);
|
|
92
|
+
return { success: true, server: targetServer, version: result[0]?.version };
|
|
66
93
|
}
|
|
67
94
|
catch (error) {
|
|
68
|
-
return { success: false, error: error instanceof Error ? error.message : String(error) };
|
|
95
|
+
return { success: false, server: targetServer, error: error instanceof Error ? error.message : String(error) };
|
|
69
96
|
}
|
|
70
97
|
}
|
|
71
98
|
async close() {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
99
|
+
for (const [key, pool] of this.pools) {
|
|
100
|
+
if (pool?.connected) {
|
|
101
|
+
await pool.close();
|
|
102
|
+
}
|
|
103
|
+
this.pools.delete(key);
|
|
75
104
|
}
|
|
76
105
|
}
|
|
77
106
|
}
|
package/dist/mssqlClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mssqlClient.js","sourceRoot":"","sources":["../src/mssqlClient.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;AAGxB,MAAM,OAAO,WAAW;IACd,
|
|
1
|
+
{"version":3,"file":"mssqlClient.js","sourceRoot":"","sources":["../src/mssqlClient.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,OAAO,CAAC;AAGxB,MAAM,OAAO,WAAW;IACd,KAAK,GAAoC,IAAI,GAAG,EAAE,CAAC;IACnD,MAAM,CAAS;IAEvB,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEO,WAAW,CAAC,MAAc;QAChC,kBAAkB;QAClB,oBAAoB;QACpB,gBAAgB;QAChB,WAAW;QACX,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAEO,YAAY,CAAC,MAAe;QAClC,MAAM,YAAY,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAE9C,MAAM,UAAU,GAAe;YAC7B,MAAM,EAAE,MAAM,CAAC,IAAI;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI;YACrC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,OAAO,EAAE;gBACP,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;gBAC5B,sBAAsB,EAAE,IAAI,CAAC,MAAM,CAAC,sBAAsB;gBAC1D,gCAAgC;gBAChC,YAAY,EAAE,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;oBACvC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAC7B,CAAC,CAAC,SAAS;aACd;YACD,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB;YAChD,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;SAC3C,CAAC;QAEF,6EAA6E;QAC7E,IAAI,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;YACrC,OAAO,UAAU,CAAC,IAAI,CAAC;QACzB,CAAC;QAED,gDAAgD;QAChD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC7C,OAAO;gBACL,GAAG,UAAU;gBACb,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;gBACtB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;aAC/B,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,gCAAgC;YAChC,OAAO;gBACL,GAAG,UAAU;gBACb,cAAc,EAAE;oBACd,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,MAAM,EAAE,EAAE;wBACV,QAAQ,EAAE,EAAE;wBACZ,QAAQ,EAAE,EAAE;qBACb;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAe;QAC3B,MAAM,GAAG,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC;QAEpD,0BAA0B;QAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,YAAY,EAAE,SAAS,EAAE,CAAC;YAC5B,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,kBAAkB;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,KAAK,CACT,SAAiB,EACjB,MAAgC,EAChC,MAAe;QAEf,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAE/B,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClD,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC,SAAgB,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAe;QAClC,MAAM,YAAY,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAsB,6BAA6B,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;YACvG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;QAC9E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACjH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACrC,IAAI,IAAI,EAAE,SAAS,EAAE,CAAC;gBACpB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -3,36 +3,56 @@ import { MssqlClient } from '../mssqlClient.js';
|
|
|
3
3
|
export declare const availabilityTools: {
|
|
4
4
|
get_ag_status: {
|
|
5
5
|
description: string;
|
|
6
|
-
inputSchema: z.ZodObject<{
|
|
7
|
-
|
|
6
|
+
inputSchema: z.ZodObject<{
|
|
7
|
+
server: z.ZodOptional<z.ZodString>;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
server?: string | undefined;
|
|
10
|
+
}, {
|
|
11
|
+
server?: string | undefined;
|
|
12
|
+
}>;
|
|
13
|
+
handler: (client: MssqlClient, args: {
|
|
14
|
+
server?: string;
|
|
15
|
+
}) => Promise<{
|
|
8
16
|
hadrEnabled: boolean;
|
|
9
17
|
message: string;
|
|
10
18
|
replicas?: undefined;
|
|
11
19
|
databases?: undefined;
|
|
12
20
|
} | {
|
|
13
21
|
hadrEnabled: boolean;
|
|
14
|
-
replicas:
|
|
15
|
-
databases:
|
|
22
|
+
replicas: Record<string, unknown>[];
|
|
23
|
+
databases: Record<string, unknown>[];
|
|
16
24
|
message?: undefined;
|
|
17
25
|
}>;
|
|
18
26
|
};
|
|
19
27
|
get_replica_states: {
|
|
20
28
|
description: string;
|
|
21
29
|
inputSchema: z.ZodObject<{
|
|
30
|
+
server: z.ZodOptional<z.ZodString>;
|
|
22
31
|
agName: z.ZodOptional<z.ZodString>;
|
|
23
32
|
}, "strip", z.ZodTypeAny, {
|
|
33
|
+
server?: string | undefined;
|
|
24
34
|
agName?: string | undefined;
|
|
25
35
|
}, {
|
|
36
|
+
server?: string | undefined;
|
|
26
37
|
agName?: string | undefined;
|
|
27
38
|
}>;
|
|
28
39
|
handler: (client: MssqlClient, args: {
|
|
40
|
+
server?: string;
|
|
29
41
|
agName?: string;
|
|
30
|
-
}) => Promise<
|
|
42
|
+
}) => Promise<Record<string, unknown>[]>;
|
|
31
43
|
};
|
|
32
44
|
get_cluster_status: {
|
|
33
45
|
description: string;
|
|
34
|
-
inputSchema: z.ZodObject<{
|
|
35
|
-
|
|
46
|
+
inputSchema: z.ZodObject<{
|
|
47
|
+
server: z.ZodOptional<z.ZodString>;
|
|
48
|
+
}, "strip", z.ZodTypeAny, {
|
|
49
|
+
server?: string | undefined;
|
|
50
|
+
}, {
|
|
51
|
+
server?: string | undefined;
|
|
52
|
+
}>;
|
|
53
|
+
handler: (client: MssqlClient, args: {
|
|
54
|
+
server?: string;
|
|
55
|
+
}) => Promise<{
|
|
36
56
|
isClustered: boolean;
|
|
37
57
|
message: string;
|
|
38
58
|
cluster?: undefined;
|
|
@@ -40,9 +60,9 @@ export declare const availabilityTools: {
|
|
|
40
60
|
networks?: undefined;
|
|
41
61
|
} | {
|
|
42
62
|
isClustered: boolean;
|
|
43
|
-
cluster:
|
|
44
|
-
members:
|
|
45
|
-
networks:
|
|
63
|
+
cluster: Record<string, unknown>;
|
|
64
|
+
members: Record<string, unknown>[];
|
|
65
|
+
networks: Record<string, unknown>[];
|
|
46
66
|
message?: undefined;
|
|
47
67
|
}>;
|
|
48
68
|
};
|
|
@@ -1 +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;
|
|
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;AAIhD,eAAO,MAAM,iBAAiB;;;;;;;;;;0BAMF,WAAW,QAAQ;YAAE,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE;;;;;;;;;;;;;;;;;;;;;;;;0BAkFtC,WAAW,QAAQ;YAAE,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE;;;;;;;;;;;0BAqCvD,WAAW,QAAQ;YAAE,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE;;;;;;;;;;;;;;CAwDjE,CAAC"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
const serverParam = z.string().optional().describe('SQL Server instance (e.g., "server\\instance" or "server,port"). Uses default if not specified.');
|
|
2
3
|
export const availabilityTools = {
|
|
3
4
|
get_ag_status: {
|
|
4
5
|
description: 'Get Always On Availability Group status and health',
|
|
5
|
-
inputSchema: z.object({
|
|
6
|
-
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
server: serverParam,
|
|
8
|
+
}),
|
|
9
|
+
handler: async (client, args) => {
|
|
7
10
|
// First check if HADR is enabled
|
|
8
|
-
const hadrCheck = await client.query("SELECT CAST(SERVERPROPERTY('IsHadrEnabled') AS INT) as is_hadr_enabled");
|
|
11
|
+
const hadrCheck = await client.query("SELECT CAST(SERVERPROPERTY('IsHadrEnabled') AS INT) as is_hadr_enabled", undefined, args.server);
|
|
9
12
|
if (!hadrCheck[0]?.is_hadr_enabled) {
|
|
10
13
|
return {
|
|
11
14
|
hadrEnabled: false,
|
|
@@ -36,7 +39,7 @@ export const availabilityTools = {
|
|
|
36
39
|
INNER JOIN sys.dm_hadr_availability_replica_states ars ON ar.replica_id = ars.replica_id
|
|
37
40
|
ORDER BY ag.name, ar.replica_server_name
|
|
38
41
|
`;
|
|
39
|
-
const replicas = await client.query(query);
|
|
42
|
+
const replicas = await client.query(query, undefined, args.server);
|
|
40
43
|
// Get database-level sync status
|
|
41
44
|
const dbQuery = `
|
|
42
45
|
SELECT
|
|
@@ -60,7 +63,7 @@ export const availabilityTools = {
|
|
|
60
63
|
INNER JOIN sys.dm_hadr_database_replica_states drs ON adc.group_database_id = drs.group_database_id
|
|
61
64
|
ORDER BY ag.name, adc.database_name, drs.is_primary_replica DESC
|
|
62
65
|
`;
|
|
63
|
-
const databases = await client.query(dbQuery);
|
|
66
|
+
const databases = await client.query(dbQuery, undefined, args.server);
|
|
64
67
|
return {
|
|
65
68
|
hadrEnabled: true,
|
|
66
69
|
replicas,
|
|
@@ -71,6 +74,7 @@ export const availabilityTools = {
|
|
|
71
74
|
get_replica_states: {
|
|
72
75
|
description: 'Get detailed state information for all availability group replicas',
|
|
73
76
|
inputSchema: z.object({
|
|
77
|
+
server: serverParam,
|
|
74
78
|
agName: z.string().optional().describe('Filter by availability group name'),
|
|
75
79
|
}),
|
|
76
80
|
handler: async (client, args) => {
|
|
@@ -99,15 +103,17 @@ export const availabilityTools = {
|
|
|
99
103
|
${agFilter}
|
|
100
104
|
ORDER BY ag.name, ars.role_desc, ar.replica_server_name
|
|
101
105
|
`;
|
|
102
|
-
return await client.query(query);
|
|
106
|
+
return await client.query(query, undefined, args.server);
|
|
103
107
|
},
|
|
104
108
|
},
|
|
105
109
|
get_cluster_status: {
|
|
106
110
|
description: 'Get Windows Server Failover Cluster status for the SQL Server instance',
|
|
107
|
-
inputSchema: z.object({
|
|
108
|
-
|
|
111
|
+
inputSchema: z.object({
|
|
112
|
+
server: serverParam,
|
|
113
|
+
}),
|
|
114
|
+
handler: async (client, args) => {
|
|
109
115
|
// Check if this is a clustered instance
|
|
110
|
-
const clusterCheck = await client.query("SELECT CAST(SERVERPROPERTY('IsClustered') AS INT) as is_clustered");
|
|
116
|
+
const clusterCheck = await client.query("SELECT CAST(SERVERPROPERTY('IsClustered') AS INT) as is_clustered", undefined, args.server);
|
|
111
117
|
if (!clusterCheck[0]?.is_clustered) {
|
|
112
118
|
return {
|
|
113
119
|
isClustered: false,
|
|
@@ -121,7 +127,7 @@ export const availabilityTools = {
|
|
|
121
127
|
quorum_state_desc as quorum_state
|
|
122
128
|
FROM sys.dm_hadr_cluster
|
|
123
129
|
`;
|
|
124
|
-
const cluster = await client.query(query);
|
|
130
|
+
const cluster = await client.query(query, undefined, args.server);
|
|
125
131
|
const membersQuery = `
|
|
126
132
|
SELECT
|
|
127
133
|
member_name,
|
|
@@ -130,7 +136,7 @@ export const availabilityTools = {
|
|
|
130
136
|
number_of_quorum_votes
|
|
131
137
|
FROM sys.dm_hadr_cluster_members
|
|
132
138
|
`;
|
|
133
|
-
const members = await client.query(membersQuery);
|
|
139
|
+
const members = await client.query(membersQuery, undefined, args.server);
|
|
134
140
|
const networksQuery = `
|
|
135
141
|
SELECT
|
|
136
142
|
network_subnet_ip,
|
|
@@ -140,7 +146,7 @@ export const availabilityTools = {
|
|
|
140
146
|
is_ipv4
|
|
141
147
|
FROM sys.dm_hadr_cluster_networks
|
|
142
148
|
`;
|
|
143
|
-
const networks = await client.query(networksQuery);
|
|
149
|
+
const networks = await client.query(networksQuery, undefined, args.server);
|
|
144
150
|
return {
|
|
145
151
|
isClustered: true,
|
|
146
152
|
cluster: cluster[0],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"availability.js","sourceRoot":"","sources":["../../src/tools/availability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,aAAa,EAAE;QACb,WAAW,EAAE,oDAAoD;QACjE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"availability.js","sourceRoot":"","sources":["../../src/tools/availability.ts"],"names":[],"mappings":"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"}
|