@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.
Files changed (43) hide show
  1. package/README.md +70 -1
  2. package/dist/config.d.ts +2 -2
  3. package/dist/config.js +4 -4
  4. package/dist/config.js.map +1 -1
  5. package/dist/index.js +48 -16
  6. package/dist/index.js.map +1 -1
  7. package/dist/mssqlClient.d.ts +6 -4
  8. package/dist/mssqlClient.d.ts.map +1 -1
  9. package/dist/mssqlClient.js +49 -20
  10. package/dist/mssqlClient.js.map +1 -1
  11. package/dist/tools/availability.d.ts +30 -10
  12. package/dist/tools/availability.d.ts.map +1 -1
  13. package/dist/tools/availability.js +18 -12
  14. package/dist/tools/availability.js.map +1 -1
  15. package/dist/tools/connection.d.ts +26 -5
  16. package/dist/tools/connection.d.ts.map +1 -1
  17. package/dist/tools/connection.js +14 -8
  18. package/dist/tools/connection.js.map +1 -1
  19. package/dist/tools/health.d.ts +42 -10
  20. package/dist/tools/health.d.ts.map +1 -1
  21. package/dist/tools/health.js +22 -13
  22. package/dist/tools/health.js.map +1 -1
  23. package/dist/tools/index.d.ts +1 -0
  24. package/dist/tools/index.d.ts.map +1 -1
  25. package/dist/tools/index.js +1 -0
  26. package/dist/tools/index.js.map +1 -1
  27. package/dist/tools/jobs.d.ts +25 -5
  28. package/dist/tools/jobs.d.ts.map +1 -1
  29. package/dist/tools/jobs.js +12 -6
  30. package/dist/tools/jobs.js.map +1 -1
  31. package/dist/tools/performance.d.ts +26 -6
  32. package/dist/tools/performance.d.ts.map +1 -1
  33. package/dist/tools/performance.js +12 -6
  34. package/dist/tools/performance.js.map +1 -1
  35. package/dist/tools/queries.d.ts +15 -3
  36. package/dist/tools/queries.d.ts.map +1 -1
  37. package/dist/tools/queries.js +7 -3
  38. package/dist/tools/queries.js.map +1 -1
  39. package/dist/tools/schema.d.ts +230 -0
  40. package/dist/tools/schema.d.ts.map +1 -0
  41. package/dist/tools/schema.js +374 -0
  42. package/dist/tools/schema.js.map +1 -0
  43. 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
- Add to your MCP settings:
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 configSchema: z.ZodObject<{
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 configSchema>;
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 configSchema = z.object({
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 = configSchema.safeParse(raw);
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: ${errors}`);
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
  }
@@ -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,wBAAwB,MAAM,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,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
- name,
35
- description: tool.description,
36
- inputSchema: zodToJsonSchema(tool.inputSchema),
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
- throw new Error(`Unknown tool: ${toolName}`);
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, args);
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 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);
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":"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"}
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;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,iBAAiB,EACjB,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAE1B,oBAAoB;AACpB,MAAM,QAAQ,GAAG;IACf,GAAG,eAAe;IAClB,GAAG,UAAU;IACb,GAAG,gBAAgB;IACnB,GAAG,WAAW;IACd,GAAG,QAAQ;IACX,GAAG,iBAAiB;IACpB,GAAG,WAAW;CACf,CAAC;AAIF,+BAA+B;AAC/B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAC5B,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;AAEvC,oBAAoB;AACpB,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,uBAAuB;AACvB,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;IAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;QAC1D,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE;YACnD,YAAY,EAAE,MAAM;SACrB,CAA4B,CAAC;QAC9B,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,GAAG,UAAU,CAAC;QAE/C,OAAO;YACL,IAAI;YACJ,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW;SACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC,CAAC,CAAC;AAEH,oBAAoB;AACpB,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,IAAgB,CAAC;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEhC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,iBAAiB,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtE;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,iCAAiC;IACjC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAC/E,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM;aACpC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aAC7C,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,sBAAsB,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBACzE;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,uBAAuB;QACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,IAAa,CAAC,CAAC;QAErE,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEvE,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBAClD;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,4BAA4B;AAC5B,KAAK,UAAU,QAAQ;IACrB,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACnD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAChC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAE/B,eAAe;AACf,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;AACrD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -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 pool;
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 = sql.IRecordSet<unknown>>(queryText: string, params?: Record<string, unknown>): Promise<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,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"}
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"}
@@ -1,22 +1,43 @@
1
1
  import sql from 'mssql';
2
2
  export class MssqlClient {
3
- pool = null;
3
+ pools = new Map();
4
4
  config;
5
5
  constructor(config) {
6
6
  this.config = config;
7
7
  }
8
- getSqlConfig() {
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: this.config.host,
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: '', // Uses current 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
- if (this.pool) {
45
- return this.pool;
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
- const sqlConfig = this.getSqlConfig();
48
- this.pool = await sql.connect(sqlConfig);
49
- return this.pool;
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
- if (this.pool) {
73
- await this.pool.close();
74
- this.pool = null;
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mssqlClient.js","sourceRoot":"","sources":["../src/mssqlClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mssqlClient.js","sourceRoot":"","sources":["../src/mssqlClient.ts"],"names":[],"mappings":"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"}
@@ -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<{}, "strip", z.ZodTypeAny, {}, {}>;
7
- handler: (client: MssqlClient) => Promise<{
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: import("mssql").IRecordSet<unknown>[];
15
- databases: import("mssql").IRecordSet<unknown>[];
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<import("mssql").IRecordSet<unknown>[]>;
42
+ }) => Promise<Record<string, unknown>[]>;
31
43
  };
32
44
  get_cluster_status: {
33
45
  description: string;
34
- inputSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
35
- handler: (client: MssqlClient) => Promise<{
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: import("mssql").IRecordSet<unknown>;
44
- members: import("mssql").IRecordSet<unknown>[];
45
- networks: import("mssql").IRecordSet<unknown>[];
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;AAEhD,eAAO,MAAM,iBAAiB;;;;0BAIF,WAAW;;;;;;;;;;;;;;;;;;;;;0BA+EX,WAAW,QAAQ;YAAE,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE;;;;;0BAmCtC,WAAW;;;;;;;;;;;;;;CAsDtC,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
- handler: async (client) => {
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
- handler: async (client) => {
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;QACzB,OAAO,EAAE,KAAK,EAAE,MAAmB,EAAE,EAAE;YACrC,iCAAiC;YACjC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAClC,wEAAwE,CACzE,CAAC;YAEF,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC;gBACnC,OAAO;oBACL,WAAW,EAAE,KAAK;oBAClB,OAAO,EAAE,6DAA6D;iBACvE,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;OAuBb,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAE3C,iCAAiC;YACjC,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;OAqBf,CAAC;YAEF,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAE9C,OAAO;gBACL,WAAW,EAAE,IAAI;gBACjB,QAAQ;gBACR,SAAS;aACV,CAAC;QACJ,CAAC;KACF;IAED,kBAAkB,EAAE;QAClB,WAAW,EAAE,oEAAoE;QACjF,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;SAC5E,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,MAAmB,EAAE,IAAyB,EAAE,EAAE;YAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,oBAAoB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAEvE,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;UAqBV,QAAQ;;OAEX,CAAC;YAEF,OAAO,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;KACF;IAED,kBAAkB,EAAE;QAClB,WAAW,EAAE,wEAAwE;QACrF,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,EAAE,MAAmB,EAAE,EAAE;YACrC,wCAAwC;YACxC,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,KAAK,CACrC,mEAAmE,CACpE,CAAC;YAEF,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;gBACnC,OAAO;oBACL,WAAW,EAAE,KAAK;oBAClB,OAAO,EAAE,2CAA2C;iBACrD,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,GAAG;;;;;;OAMb,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAE1C,MAAM,YAAY,GAAG;;;;;;;OAOpB,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAEjD,MAAM,aAAa,GAAG;;;;;;;;OAQrB,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAEnD,OAAO;gBACL,WAAW,EAAE,IAAI;gBACjB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;gBACnB,OAAO;gBACP,QAAQ;aACT,CAAC;QACJ,CAAC;KACF;CACF,CAAC"}
1
+ {"version":3,"file":"availability.js","sourceRoot":"","sources":["../../src/tools/availability.ts"],"names":[],"mappings":"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"}