@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 CHANGED
@@ -1,91 +1,63 @@
1
1
  # System Status MCP Server
2
2
 
3
- MCP server providing real-time system status information for ACCESS-CI resources. Provides critical operational information about ACCESS-CI systems, including current outages, scheduled maintenance, and system-wide announcements.
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
- ### **Monitor Current Issues**
8
-
7
+ ### Current Status
9
8
  ```
10
- "Are there any current outages on ACCESS-CI?"
11
- "Is Delta currently operational?"
12
- "What systems are experiencing issues right now?"
13
- "Show me all systems that are down"
9
+ "Current ACCESS-CI outages"
10
+ "Delta operational status"
11
+ "Systems experiencing issues"
12
+ "GPU systems status check"
14
13
  ```
15
14
 
16
- ### **Track Maintenance Windows**
17
-
15
+ ### Maintenance & Incidents
18
16
  ```
19
- "When is the next maintenance for Expanse?"
20
- "Show me all scheduled maintenance for this week"
21
- "Is there upcoming maintenance on Bridges-2?"
22
- "What maintenance is planned for GPU systems?"
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
- ### get_current_outages
25
+ ### `get_infrastructure_news`
46
26
 
47
- Get current system outages and issues affecting ACCESS-CI resources.
27
+ Get infrastructure status, outages, and maintenance information for ACCESS-CI resources.
48
28
 
49
29
  **Parameters:**
50
-
51
- - `resource_filter` (string, optional): Filter by specific resource name or ID
52
-
53
- **Example:**
54
- ```typescript
55
- // User: "Are there any current outages on Delta?"
56
- const outages = await get_current_outages({
57
- resource_filter: "delta"
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
- ## Usage Examples
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
- MIT
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: "get_current_outages",
13
- arguments: { limit: 5 }
14
- }
13
+ name: "get_infrastructure_news",
14
+ arguments: { time: "current", limit: 5 },
15
+ },
15
16
  });
16
- const responseData = JSON.parse(result.content[0].text);
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
- expect(outage).toHaveProperty("posted_time");
30
- expect(outage).toHaveProperty("last_updated");
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: "get_scheduled_maintenance",
37
- arguments: { limit: 5 }
38
- }
39
+ name: "get_infrastructure_news",
40
+ arguments: { time: "scheduled", limit: 5 },
41
+ },
39
42
  });
40
- const responseData = JSON.parse(result.content[0].text);
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: "get_past_outages",
58
- arguments: { limit: 10 }
59
- }
62
+ name: "get_infrastructure_news",
63
+ arguments: { time: "past", limit: 5 },
64
+ },
60
65
  });
61
- const responseData = JSON.parse(result.content[0].text);
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: "get_system_announcements",
81
- arguments: { limit: 20 }
82
- }
87
+ name: "get_infrastructure_news",
88
+ arguments: { time: "all", limit: 20 },
89
+ },
83
90
  });
84
- const responseData = JSON.parse(result.content[0].text);
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: "check_resource_status",
114
+ name: "get_infrastructure_news",
106
115
  arguments: {
107
- resource_ids: ["anvil", "bridges", "jetstream"],
108
- use_group_api: false
109
- }
110
- }
116
+ ids: ["anvil", "bridges", "jetstream"],
117
+ use_group_api: false,
118
+ },
119
+ },
111
120
  });
112
- const responseData = JSON.parse(result.content[0].text);
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: "check_resource_status",
144
+ name: "get_infrastructure_news",
134
145
  arguments: {
135
- resource_ids: ["anvil"],
136
- use_group_api: true
137
- }
138
- }
146
+ ids: ["anvil"],
147
+ use_group_api: true,
148
+ },
149
+ },
139
150
  });
140
- const responseData = JSON.parse(result.content[0].text);
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: "get_current_outages",
163
- arguments: { resource_filter: "anvil" }
164
- }
175
+ name: "get_infrastructure_news",
176
+ arguments: { time: "current", query: "anvil" },
177
+ },
165
178
  });
166
- const responseData = JSON.parse(result.content[0].text);
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.forEach((outage) => {
170
- const matchesFilter = outage.Subject?.toLowerCase().includes("anvil") ||
171
- outage.AffectedResources?.some((resource) => resource.ResourceName?.toLowerCase().includes("anvil") ||
172
- resource.ResourceID?.toString().includes("anvil"));
173
- expect(matchesFilter).toBe(true);
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
- params: { uri }
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: "get_current_outages",
204
- arguments: { resource_filter: "nonexistent-resource-xyz" }
205
- }
221
+ name: "get_infrastructure_news",
222
+ arguments: { time: "current", query: "nonexistent-resource-xyz-12345" },
223
+ },
206
224
  });
207
- const responseData = JSON.parse(result.content[0].text);
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: "get_past_outages",
216
- arguments: { limit: 1000 }
217
- }
235
+ name: "get_infrastructure_news",
236
+ arguments: { time: "past", limit: 1000 },
237
+ },
218
238
  });
219
- const responseData = JSON.parse(result.content[0].text);
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);