@access-mcp/system-status 0.4.1 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -172
- package/dist/__tests__/server.integration.test.js +71 -50
- package/dist/__tests__/server.test.js +136 -111
- package/dist/index.js +3 -11
- package/dist/server.d.ts +11 -95
- package/dist/server.js +129 -144
- package/dist/web-server.js +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,91 +1,63 @@
|
|
|
1
1
|
# System Status MCP Server
|
|
2
2
|
|
|
3
|
-
MCP server
|
|
3
|
+
MCP server for real-time ACCESS-CI system status including current outages, scheduled maintenance, and operational status.
|
|
4
4
|
|
|
5
5
|
## Usage Examples
|
|
6
6
|
|
|
7
|
-
###
|
|
8
|
-
|
|
7
|
+
### Current Status
|
|
9
8
|
```
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
9
|
+
"Current ACCESS-CI outages"
|
|
10
|
+
"Delta operational status"
|
|
11
|
+
"Systems experiencing issues"
|
|
12
|
+
"GPU systems status check"
|
|
14
13
|
```
|
|
15
14
|
|
|
16
|
-
###
|
|
17
|
-
|
|
15
|
+
### Maintenance & Incidents
|
|
18
16
|
```
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
### **System Announcements**
|
|
26
|
-
|
|
27
|
-
```
|
|
28
|
-
"What are the latest system announcements?"
|
|
29
|
-
"Are there any important notices for ACCESS users?"
|
|
30
|
-
"Show me recent updates about system changes"
|
|
31
|
-
"Any policy updates I should know about?"
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
### **Check Resource Status**
|
|
35
|
-
|
|
36
|
-
```
|
|
37
|
-
"What's the current status of Anvil?"
|
|
38
|
-
"Is Frontera available for job submission?"
|
|
39
|
-
"Check if all GPU systems are operational"
|
|
40
|
-
"Get status for all TACC resources"
|
|
17
|
+
"Scheduled maintenance this week"
|
|
18
|
+
"Next Expanse maintenance window"
|
|
19
|
+
"Past outages for Bridges-2"
|
|
20
|
+
"All infrastructure news for Delta"
|
|
41
21
|
```
|
|
42
22
|
|
|
43
23
|
## Tools
|
|
44
24
|
|
|
45
|
-
###
|
|
25
|
+
### `get_infrastructure_news`
|
|
46
26
|
|
|
47
|
-
Get
|
|
27
|
+
Get infrastructure status, outages, and maintenance information for ACCESS-CI resources.
|
|
48
28
|
|
|
49
29
|
**Parameters:**
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
30
|
+
| Parameter | Type | Description |
|
|
31
|
+
|-----------|------|-------------|
|
|
32
|
+
| `resource` | string | Filter by resource name (e.g., "delta", "bridges2") |
|
|
33
|
+
| `time` | enum | Time period: `current`, `scheduled`, `past`, `all` (default: "current") |
|
|
34
|
+
| `resource_ids` | array | Check status for specific resource IDs |
|
|
35
|
+
| `limit` | number | Max results (default: 50 for "all", 100 for "past") |
|
|
36
|
+
| `use_group_api` | boolean | Use resource group API for status checking (default: false) |
|
|
37
|
+
|
|
38
|
+
**Examples:**
|
|
39
|
+
```javascript
|
|
40
|
+
// Get current outages across all resources
|
|
41
|
+
get_infrastructure_news({})
|
|
42
|
+
|
|
43
|
+
// Get scheduled maintenance
|
|
44
|
+
get_infrastructure_news({ time: "scheduled" })
|
|
45
|
+
|
|
46
|
+
// Get comprehensive overview
|
|
47
|
+
get_infrastructure_news({ time: "all" })
|
|
48
|
+
|
|
49
|
+
// Check current status for specific resource
|
|
50
|
+
get_infrastructure_news({ resource: "delta", time: "current" })
|
|
51
|
+
|
|
52
|
+
// Check operational status of specific resources
|
|
53
|
+
get_infrastructure_news({
|
|
54
|
+
resource_ids: ["delta.ncsa.access-ci.org", "bridges2.psc.access-ci.org"]
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
// Get past outages with limit
|
|
58
|
+
get_infrastructure_news({ time: "past", limit: 50 })
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
-
### get_scheduled_maintenance
|
|
62
|
-
|
|
63
|
-
Get scheduled maintenance and future outages for ACCESS-CI resources.
|
|
64
|
-
|
|
65
|
-
**Parameters:**
|
|
66
|
-
|
|
67
|
-
- `resource_filter` (string, optional): Filter by specific resource name or ID
|
|
68
|
-
|
|
69
|
-
### get_system_announcements
|
|
70
|
-
|
|
71
|
-
Get all system announcements (current and scheduled).
|
|
72
|
-
|
|
73
|
-
**Parameters:**
|
|
74
|
-
|
|
75
|
-
- `limit` (number, optional): Maximum number of announcements to return (default: 50)
|
|
76
|
-
|
|
77
|
-
### get_resource_status
|
|
78
|
-
|
|
79
|
-
Get the current operational status of a specific resource.
|
|
80
|
-
|
|
81
|
-
**Parameters:**
|
|
82
|
-
|
|
83
|
-
- `resource_id` (string): The resource ID to check status for
|
|
84
|
-
|
|
85
|
-
## Resources
|
|
86
|
-
|
|
87
|
-
- `accessci://system-status`: Current operational status of all ACCESS-CI resources
|
|
88
|
-
|
|
89
61
|
## Installation
|
|
90
62
|
|
|
91
63
|
```bash
|
|
@@ -94,8 +66,6 @@ npm install -g @access-mcp/system-status
|
|
|
94
66
|
|
|
95
67
|
## Configuration
|
|
96
68
|
|
|
97
|
-
Add to your Claude Desktop configuration:
|
|
98
|
-
|
|
99
69
|
```json
|
|
100
70
|
{
|
|
101
71
|
"mcpServers": {
|
|
@@ -107,104 +77,6 @@ Add to your Claude Desktop configuration:
|
|
|
107
77
|
}
|
|
108
78
|
```
|
|
109
79
|
|
|
110
|
-
##
|
|
111
|
-
|
|
112
|
-
### 🚨 **Monitor Current Issues**
|
|
113
|
-
|
|
114
|
-
- "Are there any current outages on ACCESS-CI?"
|
|
115
|
-
- "Is Delta currently operational?"
|
|
116
|
-
- "What systems are experiencing issues right now?"
|
|
117
|
-
|
|
118
|
-
### 🔧 **Track Maintenance Windows**
|
|
119
|
-
|
|
120
|
-
- "When is the next maintenance for Expanse?"
|
|
121
|
-
- "Show me all scheduled maintenance for this week"
|
|
122
|
-
- "Is there upcoming maintenance on Bridges-2?"
|
|
123
|
-
|
|
124
|
-
### 📢 **System Announcements**
|
|
125
|
-
|
|
126
|
-
- "What are the latest system announcements?"
|
|
127
|
-
- "Are there any important notices for ACCESS users?"
|
|
128
|
-
- "Show me recent updates about system changes"
|
|
129
|
-
|
|
130
|
-
### ✅ **Check Resource Status**
|
|
131
|
-
|
|
132
|
-
- "What's the current status of Anvil?"
|
|
133
|
-
- "Is Frontera available for job submission?"
|
|
134
|
-
- "Check if all GPU systems are operational"
|
|
135
|
-
|
|
136
|
-
## Detailed Usage Examples
|
|
137
|
-
|
|
138
|
-
### Checking Current Outages
|
|
139
|
-
|
|
140
|
-
**Natural Language**: "Are there any systems down right now?"
|
|
141
|
-
|
|
142
|
-
**Tool Call**:
|
|
143
|
-
```typescript
|
|
144
|
-
const outages = await get_current_outages();
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
**Returns**: List of active outages with:
|
|
148
|
-
- Affected resources
|
|
149
|
-
- Start time and expected resolution
|
|
150
|
-
- Impact description
|
|
151
|
-
- Workaround information if available
|
|
152
|
-
|
|
153
|
-
### Finding Scheduled Maintenance
|
|
154
|
-
|
|
155
|
-
**Natural Language**: "When is Delta scheduled for maintenance?"
|
|
156
|
-
|
|
157
|
-
**Tool Call**:
|
|
158
|
-
```typescript
|
|
159
|
-
const maintenance = await get_scheduled_maintenance({
|
|
160
|
-
resource_filter: "delta"
|
|
161
|
-
});
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
**Returns**: Upcoming maintenance windows including:
|
|
165
|
-
- Scheduled start and end times
|
|
166
|
-
- Systems affected
|
|
167
|
-
- Type of maintenance
|
|
168
|
-
- Expected impact on users
|
|
169
|
-
|
|
170
|
-
### Getting System Announcements
|
|
171
|
-
|
|
172
|
-
**Natural Language**: "What are the latest announcements?"
|
|
173
|
-
|
|
174
|
-
**Tool Call**:
|
|
175
|
-
```typescript
|
|
176
|
-
const announcements = await get_system_announcements({
|
|
177
|
-
limit: 10
|
|
178
|
-
});
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
**Returns**: Recent announcements about:
|
|
182
|
-
- Policy changes
|
|
183
|
-
- New features or services
|
|
184
|
-
- Important deadlines
|
|
185
|
-
- System-wide updates
|
|
186
|
-
|
|
187
|
-
### Checking Specific Resource Status
|
|
188
|
-
|
|
189
|
-
**Natural Language**: "Is Expanse available?"
|
|
190
|
-
|
|
191
|
-
**Tool Call**:
|
|
192
|
-
```typescript
|
|
193
|
-
const status = await get_resource_status({
|
|
194
|
-
resource_id: "expanse.sdsc.xsede.org"
|
|
195
|
-
});
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
**Returns**: Current operational status:
|
|
199
|
-
- Overall system health
|
|
200
|
-
- Service availability
|
|
201
|
-
- Performance metrics
|
|
202
|
-
- Any active issues or limitations
|
|
203
|
-
|
|
204
|
-
## API Endpoints
|
|
205
|
-
|
|
206
|
-
This server connects to the ACCESS-CI Operations API at `https://operations-api.access-ci.org`
|
|
207
|
-
|
|
208
|
-
## License
|
|
80
|
+
## Resources
|
|
209
81
|
|
|
210
|
-
|
|
82
|
+
- `accessci://system-status` - Current operational status of all ACCESS-CI resources
|
|
@@ -8,12 +8,14 @@ describe("SystemStatusServer Integration Tests", () => {
|
|
|
8
8
|
describe("Real API Integration", () => {
|
|
9
9
|
it("should fetch current outages from real API", async () => {
|
|
10
10
|
const result = await server["handleToolCall"]({
|
|
11
|
+
method: "tools/call",
|
|
11
12
|
params: {
|
|
12
|
-
name: "
|
|
13
|
-
arguments: { limit: 5 }
|
|
14
|
-
}
|
|
13
|
+
name: "get_infrastructure_news",
|
|
14
|
+
arguments: { time: "current", limit: 5 },
|
|
15
|
+
},
|
|
15
16
|
});
|
|
16
|
-
const
|
|
17
|
+
const content = result.content[0];
|
|
18
|
+
const responseData = JSON.parse(content.text);
|
|
17
19
|
expect(responseData).toHaveProperty("total_outages");
|
|
18
20
|
expect(responseData).toHaveProperty("affected_resources");
|
|
19
21
|
expect(responseData).toHaveProperty("severity_counts");
|
|
@@ -26,18 +28,20 @@ describe("SystemStatusServer Integration Tests", () => {
|
|
|
26
28
|
if (responseData.outages.length > 0) {
|
|
27
29
|
const outage = responseData.outages[0];
|
|
28
30
|
expect(outage).toHaveProperty("severity");
|
|
29
|
-
|
|
30
|
-
expect(outage).toHaveProperty("
|
|
31
|
+
// The API response includes original fields like Subject, OutageStart, OutageEnd, etc.
|
|
32
|
+
expect(outage).toHaveProperty("Subject");
|
|
31
33
|
}
|
|
32
34
|
}, 10000);
|
|
33
35
|
it("should fetch scheduled maintenance from real API", async () => {
|
|
34
36
|
const result = await server["handleToolCall"]({
|
|
37
|
+
method: "tools/call",
|
|
35
38
|
params: {
|
|
36
|
-
name: "
|
|
37
|
-
arguments: { limit: 5 }
|
|
38
|
-
}
|
|
39
|
+
name: "get_infrastructure_news",
|
|
40
|
+
arguments: { time: "scheduled", limit: 5 },
|
|
41
|
+
},
|
|
39
42
|
});
|
|
40
|
-
const
|
|
43
|
+
const content = result.content[0];
|
|
44
|
+
const responseData = JSON.parse(content.text);
|
|
41
45
|
expect(responseData).toHaveProperty("total_scheduled");
|
|
42
46
|
expect(responseData).toHaveProperty("upcoming_24h");
|
|
43
47
|
expect(responseData).toHaveProperty("upcoming_week");
|
|
@@ -53,12 +57,14 @@ describe("SystemStatusServer Integration Tests", () => {
|
|
|
53
57
|
}, 10000);
|
|
54
58
|
it("should fetch past outages from real API", async () => {
|
|
55
59
|
const result = await server["handleToolCall"]({
|
|
60
|
+
method: "tools/call",
|
|
56
61
|
params: {
|
|
57
|
-
name: "
|
|
58
|
-
arguments: { limit:
|
|
59
|
-
}
|
|
62
|
+
name: "get_infrastructure_news",
|
|
63
|
+
arguments: { time: "past", limit: 5 },
|
|
64
|
+
},
|
|
60
65
|
});
|
|
61
|
-
const
|
|
66
|
+
const content = result.content[0];
|
|
67
|
+
const responseData = JSON.parse(content.text);
|
|
62
68
|
expect(responseData).toHaveProperty("total_past_outages");
|
|
63
69
|
expect(responseData).toHaveProperty("recent_outages_30_days");
|
|
64
70
|
expect(responseData).toHaveProperty("affected_resources");
|
|
@@ -76,12 +82,14 @@ describe("SystemStatusServer Integration Tests", () => {
|
|
|
76
82
|
}, 10000);
|
|
77
83
|
it("should get comprehensive system announcements", async () => {
|
|
78
84
|
const result = await server["handleToolCall"]({
|
|
85
|
+
method: "tools/call",
|
|
79
86
|
params: {
|
|
80
|
-
name: "
|
|
81
|
-
arguments: { limit: 20 }
|
|
82
|
-
}
|
|
87
|
+
name: "get_infrastructure_news",
|
|
88
|
+
arguments: { time: "all", limit: 20 },
|
|
89
|
+
},
|
|
83
90
|
});
|
|
84
|
-
const
|
|
91
|
+
const content = result.content[0];
|
|
92
|
+
const responseData = JSON.parse(content.text);
|
|
85
93
|
expect(responseData).toHaveProperty("total_announcements");
|
|
86
94
|
expect(responseData).toHaveProperty("current_outages");
|
|
87
95
|
expect(responseData).toHaveProperty("scheduled_maintenance");
|
|
@@ -101,15 +109,17 @@ describe("SystemStatusServer Integration Tests", () => {
|
|
|
101
109
|
it("should check resource status with direct method", async () => {
|
|
102
110
|
// Test with common resource names that might exist
|
|
103
111
|
const result = await server["handleToolCall"]({
|
|
112
|
+
method: "tools/call",
|
|
104
113
|
params: {
|
|
105
|
-
name: "
|
|
114
|
+
name: "get_infrastructure_news",
|
|
106
115
|
arguments: {
|
|
107
|
-
|
|
108
|
-
use_group_api: false
|
|
109
|
-
}
|
|
110
|
-
}
|
|
116
|
+
ids: ["anvil", "bridges", "jetstream"],
|
|
117
|
+
use_group_api: false,
|
|
118
|
+
},
|
|
119
|
+
},
|
|
111
120
|
});
|
|
112
|
-
const
|
|
121
|
+
const content = result.content[0];
|
|
122
|
+
const responseData = JSON.parse(content.text);
|
|
113
123
|
expect(responseData).toHaveProperty("checked_at");
|
|
114
124
|
expect(responseData).toHaveProperty("resources_checked", 3);
|
|
115
125
|
expect(responseData).toHaveProperty("operational");
|
|
@@ -129,15 +139,17 @@ describe("SystemStatusServer Integration Tests", () => {
|
|
|
129
139
|
it("should test group API functionality", async () => {
|
|
130
140
|
// Test group API with a resource that might have a group ID
|
|
131
141
|
const result = await server["handleToolCall"]({
|
|
142
|
+
method: "tools/call",
|
|
132
143
|
params: {
|
|
133
|
-
name: "
|
|
144
|
+
name: "get_infrastructure_news",
|
|
134
145
|
arguments: {
|
|
135
|
-
|
|
136
|
-
use_group_api: true
|
|
137
|
-
}
|
|
138
|
-
}
|
|
146
|
+
ids: ["anvil"],
|
|
147
|
+
use_group_api: true,
|
|
148
|
+
},
|
|
149
|
+
},
|
|
139
150
|
});
|
|
140
|
-
const
|
|
151
|
+
const content = result.content[0];
|
|
152
|
+
const responseData = JSON.parse(content.text);
|
|
141
153
|
expect(responseData).toHaveProperty("api_method", "resource_group_api");
|
|
142
154
|
expect(responseData).toHaveProperty("resources_checked", 1);
|
|
143
155
|
expect(responseData.resource_status).toHaveLength(1);
|
|
@@ -158,31 +170,36 @@ describe("SystemStatusServer Integration Tests", () => {
|
|
|
158
170
|
}, 10000);
|
|
159
171
|
it("should filter outages by resource correctly", async () => {
|
|
160
172
|
const result = await server["handleToolCall"]({
|
|
173
|
+
method: "tools/call",
|
|
161
174
|
params: {
|
|
162
|
-
name: "
|
|
163
|
-
arguments: {
|
|
164
|
-
}
|
|
175
|
+
name: "get_infrastructure_news",
|
|
176
|
+
arguments: { time: "current", query: "anvil" },
|
|
177
|
+
},
|
|
165
178
|
});
|
|
166
|
-
const
|
|
179
|
+
const content = result.content[0];
|
|
180
|
+
const responseData = JSON.parse(content.text);
|
|
167
181
|
expect(responseData).toHaveProperty("total_outages");
|
|
168
182
|
// If there are any results, they should match the filter
|
|
169
|
-
responseData.outages.
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
resource.
|
|
173
|
-
|
|
174
|
-
|
|
183
|
+
if (responseData.outages.length > 0) {
|
|
184
|
+
responseData.outages.forEach((outage) => {
|
|
185
|
+
const matchesFilter = outage.Subject?.toLowerCase().includes("anvil") ||
|
|
186
|
+
outage.AffectedResources?.some((resource) => resource.ResourceName?.toLowerCase().includes("anvil") ||
|
|
187
|
+
resource.ResourceID?.toString().includes("anvil"));
|
|
188
|
+
expect(matchesFilter).toBe(true);
|
|
189
|
+
});
|
|
190
|
+
}
|
|
175
191
|
}, 10000);
|
|
176
192
|
it("should handle resource reads for all endpoints", async () => {
|
|
177
193
|
const resources = [
|
|
178
194
|
"accessci://system-status",
|
|
179
195
|
"accessci://outages/current",
|
|
180
196
|
"accessci://outages/scheduled",
|
|
181
|
-
"accessci://outages/past"
|
|
197
|
+
"accessci://outages/past",
|
|
182
198
|
];
|
|
183
199
|
for (const uri of resources) {
|
|
184
200
|
const result = await server["handleResourceRead"]({
|
|
185
|
-
|
|
201
|
+
method: "resources/read",
|
|
202
|
+
params: { uri },
|
|
186
203
|
});
|
|
187
204
|
expect(result.contents).toHaveLength(1);
|
|
188
205
|
expect(result.contents[0]).toHaveProperty("uri", uri);
|
|
@@ -199,24 +216,28 @@ describe("SystemStatusServer Integration Tests", () => {
|
|
|
199
216
|
it("should handle empty API responses", async () => {
|
|
200
217
|
// This tests the robustness of our logic with potentially empty responses
|
|
201
218
|
const result = await server["handleToolCall"]({
|
|
219
|
+
method: "tools/call",
|
|
202
220
|
params: {
|
|
203
|
-
name: "
|
|
204
|
-
arguments: {
|
|
205
|
-
}
|
|
221
|
+
name: "get_infrastructure_news",
|
|
222
|
+
arguments: { time: "current", query: "nonexistent-resource-xyz-12345" },
|
|
223
|
+
},
|
|
206
224
|
});
|
|
207
|
-
const
|
|
225
|
+
const content = result.content[0];
|
|
226
|
+
const responseData = JSON.parse(content.text);
|
|
208
227
|
expect(responseData).toHaveProperty("total_outages", 0);
|
|
209
228
|
expect(responseData.outages).toHaveLength(0);
|
|
210
229
|
expect(responseData.affected_resources).toHaveLength(0);
|
|
211
230
|
}, 10000);
|
|
212
231
|
it("should handle large limit values gracefully", async () => {
|
|
213
232
|
const result = await server["handleToolCall"]({
|
|
233
|
+
method: "tools/call",
|
|
214
234
|
params: {
|
|
215
|
-
name: "
|
|
216
|
-
arguments: { limit: 1000 }
|
|
217
|
-
}
|
|
235
|
+
name: "get_infrastructure_news",
|
|
236
|
+
arguments: { time: "past", limit: 1000 },
|
|
237
|
+
},
|
|
218
238
|
});
|
|
219
|
-
const
|
|
239
|
+
const content = result.content[0];
|
|
240
|
+
const responseData = JSON.parse(content.text);
|
|
220
241
|
expect(responseData).toHaveProperty("total_past_outages");
|
|
221
242
|
// Should not crash or timeout
|
|
222
243
|
expect(responseData.outages.length).toBeLessThanOrEqual(1000);
|