cylera-mcp-server 1.2.0__tar.gz
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.
- cylera_mcp_server-1.2.0/LICENSE +21 -0
- cylera_mcp_server-1.2.0/PKG-INFO +675 -0
- cylera_mcp_server-1.2.0/README.md +659 -0
- cylera_mcp_server-1.2.0/cylera_mcp_server.egg-info/PKG-INFO +675 -0
- cylera_mcp_server-1.2.0/cylera_mcp_server.egg-info/SOURCES.txt +10 -0
- cylera_mcp_server-1.2.0/cylera_mcp_server.egg-info/dependency_links.txt +1 -0
- cylera_mcp_server-1.2.0/cylera_mcp_server.egg-info/entry_points.txt +2 -0
- cylera_mcp_server-1.2.0/cylera_mcp_server.egg-info/requires.txt +7 -0
- cylera_mcp_server-1.2.0/cylera_mcp_server.egg-info/top_level.txt +1 -0
- cylera_mcp_server-1.2.0/pyproject.toml +28 -0
- cylera_mcp_server-1.2.0/server.py +487 -0
- cylera_mcp_server-1.2.0/setup.cfg +4 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Cylera
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,675 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: cylera-mcp-server
|
|
3
|
+
Version: 1.2.0
|
|
4
|
+
Summary: Add your description here
|
|
5
|
+
Requires-Python: ==3.13.*
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Requires-Dist: mcp[cli]>=1.9.4
|
|
9
|
+
Requires-Dist: requests>=2.31.0
|
|
10
|
+
Requires-Dist: pydantic>=2.6.1
|
|
11
|
+
Requires-Dist: python-dotenv>=1.1.0
|
|
12
|
+
Requires-Dist: pytest-dotenv>=0.5.2
|
|
13
|
+
Requires-Dist: fastmcp>=3.0.1
|
|
14
|
+
Requires-Dist: cylera-client>=1.2.0
|
|
15
|
+
Dynamic: license-file
|
|
16
|
+
|
|
17
|
+
# MCP Cylera Server
|
|
18
|
+
|
|
19
|
+
The official [MCP](https://modelcontextprotocol.io/introduction) Server for [Cylera](https://cylera.com). Brings context about device inventory, threats, risks and utilization powered by the [Cylera Partner API](https://github.com/Cylera/cylera-partner-api) into an LLM.
|
|
20
|
+
|
|
21
|
+
In addition, Cylera offers an alternative way to bring AI assistance into your security and device management workflows: the [Cylera CLI](https://github.com/Cylera/cylera-cli).
|
|
22
|
+
|
|
23
|
+
## Table of Contents
|
|
24
|
+
- [Demo](#demo)
|
|
25
|
+
- [Architecture](#architecture)
|
|
26
|
+
- [Examples](#examples)
|
|
27
|
+
- [Installation](#installation)
|
|
28
|
+
- [Configuration](#configuration)
|
|
29
|
+
- [Testing](#testing)
|
|
30
|
+
- [Coverage](#coverage)
|
|
31
|
+
|
|
32
|
+
## Demo
|
|
33
|
+
![Tutorial][tutorial]
|
|
34
|
+
|
|
35
|
+
## Architecture
|
|
36
|
+
|
|
37
|
+

|
|
38
|
+
|
|
39
|
+
## Security
|
|
40
|
+
|
|
41
|
+
Since it's introduction in [late 2024](https://www.anthropic.com/news/model-context-protocol), MCP has quickly become a standard for connecting AI
|
|
42
|
+
assistants to any other systems and data you may have within your enterprise. This is powerful
|
|
43
|
+
because it enables proprietary and up-to the minute data that were (hopefully) not included in
|
|
44
|
+
the original training set of the model, to be brought into context.
|
|
45
|
+
|
|
46
|
+
A powerful technology such as GenAI brings wonderful opportunities for efficiency and automation.
|
|
47
|
+
Of course, there are also opportunities for things to go awry. The security threats are emerging
|
|
48
|
+
and so it is strongly encouraged that you evaluate your AI usage through a security lens.
|
|
49
|
+
|
|
50
|
+
In essence, as we begin to consider concentrating power into agents that act on
|
|
51
|
+
your behalf, know that this makes the agent a highly prized target for a bad actor. The risks
|
|
52
|
+
are particularly high if the agent contains the [lethal trifecta of private data, untrusted content and
|
|
53
|
+
external communication](https://simonwillison.net/2025/Jun/16/the-lethal-trifecta/).
|
|
54
|
+
|
|
55
|
+
There are risks involved and it is worthwhile to become apprised of the risks and
|
|
56
|
+
how to potentially mitigate them. The OWASP [Top 10 Risk & Mitigations for LLMs and Gen AI Apps](https://genai.owasp.org/llm-top-10/)
|
|
57
|
+
is a valuable resource for keeping on top of the security landscape.
|
|
58
|
+
|
|
59
|
+
Of course, a conservative wait and see approach might be a consideration but know that bad
|
|
60
|
+
actors are [weaponizing GenAI](https://www.youtube.com/watch?v=_GxopZS8LwU).
|
|
61
|
+
|
|
62
|
+
This MCP server has been designed with threats in mind. At least for now, the
|
|
63
|
+
MCP server only supports read-only operations of the data (only GET operations). This does not
|
|
64
|
+
eliminate the risk of data exfiltration, but it does reduce eliminate the risk of data vandalism
|
|
65
|
+
and un-authorized manipulation when an agent is compromized.
|
|
66
|
+
|
|
67
|
+
## Examples
|
|
68
|
+
|
|
69
|
+
### Example 1 - Get information about a device
|
|
70
|
+
|
|
71
|
+
Prompt:
|
|
72
|
+
|
|
73
|
+
Using Cylera, tell me about device with mac address d9:68:3a:ce:3d:e3
|
|
74
|
+
|
|
75
|
+
And it will respond with something like this:
|
|
76
|
+
|
|
77
|
+
I'll look up the device information for that MAC address using Cylera.
|
|
78
|
+
|
|
79
|
+
Here's the information about the device with MAC address d9:68:3a:ce:3d:e3:
|
|
80
|
+
Device Details:
|
|
81
|
+
|
|
82
|
+
Hostname: IoMTPOUMEDCARESCAPE-TS-NS01
|
|
83
|
+
IP Address: 10.120.209.202
|
|
84
|
+
Device Type: Server
|
|
85
|
+
Model: Dell PowerEdge 2850
|
|
86
|
+
Vendor: Dell Inc.
|
|
87
|
+
Classification: Miscellaneous IoT device
|
|
88
|
+
Location: Urgent Care Clinic
|
|
89
|
+
Risk Level: 4 (on what appears to be a scale where higher numbers indicate higher risk)
|
|
90
|
+
VLAN: -1 (not assigned to a specific VLAN)
|
|
91
|
+
|
|
92
|
+
This appears to be a Dell server located in an urgent care clinic, classified as an IoT device. The hostname suggests it may be related to medical care systems (MEDCARESCAPE). The risk level of 4 indicates this device may require attention from a security perspective.
|
|
93
|
+
|
|
94
|
+
### Example 2: Get information about device utilization
|
|
95
|
+
|
|
96
|
+
Prompt:
|
|
97
|
+
|
|
98
|
+
Summarize the utilization for the device with MAC address 7f:14:22:72:00:e5
|
|
99
|
+
|
|
100
|
+
And it will respond with something like this:
|
|
101
|
+
|
|
102
|
+
I'll help you get the utilization summary for that device. Let me first retrieve the device information and then get its recent procedures.
|
|
103
|
+
|
|
104
|
+
Utilization Summary for Philips Allura Xper X-Ray System (MAC: 7f:14:22:72:00:e5)
|
|
105
|
+
|
|
106
|
+
Device Overview:
|
|
107
|
+
|
|
108
|
+
- Model: Philips Allura Xper X-Ray System (Version 8.1.17.2)
|
|
109
|
+
- Location: Location 2
|
|
110
|
+
- IP Address: 10.40.6.159
|
|
111
|
+
- Risk Level: 4 (High - device is outdated running Windows XP)
|
|
112
|
+
|
|
113
|
+
Recent Utilization Analysis: Based on the last 20 procedures recorded, this X-ray system shows active and diverse utilization:
|
|
114
|
+
|
|
115
|
+
Procedure Distribution:
|
|
116
|
+
|
|
117
|
+
- Abdomen imaging: 6 procedures (30%)
|
|
118
|
+
- Cardiac procedures: 3 procedures (15%)
|
|
119
|
+
- Interventional Radiology (IR): 5 procedures (25%)
|
|
120
|
+
- Head imaging: 3 procedures (15%)
|
|
121
|
+
- Other specialized procedures: 3 procedures (15%)
|
|
122
|
+
|
|
123
|
+
Usage Patterns:
|
|
124
|
+
|
|
125
|
+
- Total procedures analyzed: 20
|
|
126
|
+
- Image volume: 145 total images across procedures (average 7.25 images per procedure)
|
|
127
|
+
- Procedure duration: Highly variable, ranging from 6 minutes to over 9 hours
|
|
128
|
+
- Peak usage: Extended procedures often run overnight or span multiple shifts
|
|
129
|
+
- Date range: Recent activity from late June through July 2025
|
|
130
|
+
|
|
131
|
+
Key Observations:
|
|
132
|
+
|
|
133
|
+
The system handles a diverse case mix including routine imaging, cardiac catheterizations, and complex interventional procedures
|
|
134
|
+
Several long-duration procedures suggest use for complex interventional cases requiring extended imaging
|
|
135
|
+
High image counts in some procedures (up to 15 images) indicate thorough diagnostic imaging
|
|
136
|
+
Active utilization across different times of day, including after-hours procedures
|
|
137
|
+
|
|
138
|
+
Operational Concerns:
|
|
139
|
+
|
|
140
|
+
Device is flagged as outdated and poses security risks (Windows XP operating system)
|
|
141
|
+
Despite age, the system remains actively utilized for critical medical procedures
|
|
142
|
+
|
|
143
|
+
This X-ray system demonstrates consistent, heavy utilization across multiple procedure types,
|
|
144
|
+
making it a critical piece of equipment for the facility's imaging and interventional capabilities.
|
|
145
|
+
|
|
146
|
+
### Example 3: Get information about device attributes
|
|
147
|
+
|
|
148
|
+
Prompt:
|
|
149
|
+
|
|
150
|
+
Using cylera, get the attributes for device with MAC address 7f:14:22:72:00:e5
|
|
151
|
+
|
|
152
|
+
And it will respond with something like this:
|
|
153
|
+
|
|
154
|
+
I'll get the attributes for the device with MAC address 7f:14:22:72:00:e5 using Cylera.
|
|
155
|
+
|
|
156
|
+
Here are the attributes for the device with MAC address 7f:14:22:72:00:e5:
|
|
157
|
+
Device Information
|
|
158
|
+
|
|
159
|
+
Clinical Function: Diagnostic
|
|
160
|
+
Connection Type: Ethernet
|
|
161
|
+
Operating System: Windows XP
|
|
162
|
+
Version: Allura Xper, 8.1.17.2
|
|
163
|
+
DICOM Implementation: AlluraXper81RIS
|
|
164
|
+
AETitle: TGXYNUGMIK
|
|
165
|
+
Serial: 722012-1560
|
|
166
|
+
TMS Asset Number: 023435
|
|
167
|
+
|
|
168
|
+
Risk Attributes
|
|
169
|
+
|
|
170
|
+
EOL OS: Yes (End-of-life operating system)
|
|
171
|
+
VLAN Type: Mixed Usage
|
|
172
|
+
Creates ePHI: Yes
|
|
173
|
+
Receives ePHI: Yes
|
|
174
|
+
Stores ePHI: Yes
|
|
175
|
+
Transmits ePHI: Yes
|
|
176
|
+
|
|
177
|
+
Impact Ratings (All Medium)
|
|
178
|
+
|
|
179
|
+
Data Availability Impact
|
|
180
|
+
Data Confidentiality Impact
|
|
181
|
+
Data Integrity Impact
|
|
182
|
+
Functional Availability Impact
|
|
183
|
+
Functional Integrity Impact
|
|
184
|
+
|
|
185
|
+
Security Insights
|
|
186
|
+
|
|
187
|
+
Device has been observed sending cleartext PHI
|
|
188
|
+
Device has sent cleartext ePHI internally
|
|
189
|
+
Device is running outdated firmware
|
|
190
|
+
There's low visibility into this device's traffic
|
|
191
|
+
|
|
192
|
+
Services Running
|
|
193
|
+
|
|
194
|
+
FTP Server: Microsoft FTP Service (Port 21)
|
|
195
|
+
MySQL Server: Yes
|
|
196
|
+
RDP Server: Yes
|
|
197
|
+
|
|
198
|
+
DICOM Functionality
|
|
199
|
+
|
|
200
|
+
This device sends DICOM C-STORE requests
|
|
201
|
+
|
|
202
|
+
This appears to be a Philips Allura Xper diagnostic imaging system running on
|
|
203
|
+
Windows XP with several security concerns including end-of-life OS, cleartext
|
|
204
|
+
PHI transmission, and outdated firmware.
|
|
205
|
+
|
|
206
|
+
### Example 4: Ask Cylera if a device stores ePHI
|
|
207
|
+
|
|
208
|
+
Prompt:
|
|
209
|
+
|
|
210
|
+
Does the device with MAC address 7f:14:22:72:00:e5 store ePHI?
|
|
211
|
+
|
|
212
|
+
And it will respond with something like this:
|
|
213
|
+
|
|
214
|
+
I'll look up the device with that MAC address to check if it stores ePHI
|
|
215
|
+
(electronic Protected Health Information).
|
|
216
|
+
|
|
217
|
+
Let me get more detailed attributes for this device to see if there's specific
|
|
218
|
+
information about ePHI storage.
|
|
219
|
+
|
|
220
|
+
Yes, the device with MAC address 7f:14:22:72:00:e5 does store ePHI. This is a
|
|
221
|
+
Philips Allura Xper X-Ray System, and according to the device attributes, it has
|
|
222
|
+
the "Stores ePHI" attribute set to true.
|
|
223
|
+
|
|
224
|
+
Additionally, this device:
|
|
225
|
+
|
|
226
|
+
Creates ePHI (generates patient health information through X-ray imaging)
|
|
227
|
+
Receives ePHI (gets patient data from other systems)
|
|
228
|
+
Transmits ePHI (sends patient data to other systems)
|
|
229
|
+
Has been observed sending cleartext PHI both internally and externally
|
|
230
|
+
|
|
231
|
+
This X-ray machine is actively involved in handling electronic Protected Health
|
|
232
|
+
Information as part of its diagnostic imaging function in the healthcare
|
|
233
|
+
facility.
|
|
234
|
+
|
|
235
|
+
### Example 5: Search for devices
|
|
236
|
+
|
|
237
|
+
Prompt:
|
|
238
|
+
|
|
239
|
+
Using Cylera, find all the devices with model set to “Panasonic IP Camera” in Location 1
|
|
240
|
+
|
|
241
|
+
And it will respond with something like this:
|
|
242
|
+
|
|
243
|
+
I'll help you search for Panasonic IP Camera devices in Location 1 using Cylera. Let me
|
|
244
|
+
search for devices with that specific model.
|
|
245
|
+
|
|
246
|
+
Based on the search results, I found 4 Panasonic IP Camera devices specifically located in Location 1:
|
|
247
|
+
Panasonic IP Cameras in Location 1
|
|
248
|
+
|
|
249
|
+
1. Device ID: 67c470a6-4c28-11ec-8a38-5eeeaabea551
|
|
250
|
+
|
|
251
|
+
Hostname: PMLETVCUTA
|
|
252
|
+
IP Address: 10.50.170.146
|
|
253
|
+
MAC Address: 00:c8:58:bd:2c:66
|
|
254
|
+
Risk Level: 1 (Low)
|
|
255
|
+
VLAN: 889
|
|
256
|
+
|
|
257
|
+
2. Device ID: 62fc170e-4c28-11ec-8a38-5eeeaabea551
|
|
258
|
+
|
|
259
|
+
Hostname: BBRECIFBSL
|
|
260
|
+
IP Address: 10.30.0.146
|
|
261
|
+
MAC Address: 0d:75:3c:4a:ea:6c
|
|
262
|
+
Risk Level: 1 (Low)
|
|
263
|
+
VLAN: 77
|
|
264
|
+
|
|
265
|
+
3. Device ID: 645b45fc-4c28-11ec-8a38-5eeeaabea551
|
|
266
|
+
|
|
267
|
+
Hostname: WTAGLHXTTA
|
|
268
|
+
IP Address: 10.40.197.1
|
|
269
|
+
MAC Address: 0e:b0:33:4f:c0:36
|
|
270
|
+
Risk Level: 1 (Low)
|
|
271
|
+
VLAN: 274
|
|
272
|
+
|
|
273
|
+
4. Device ID: 59c7433e-4c28-11ec-8a38-5eeeaabea551
|
|
274
|
+
|
|
275
|
+
Hostname: UOKLPQZYWX
|
|
276
|
+
IP Address: 10.20.216.229
|
|
277
|
+
MAC Address: 0e:b3:c7:5c:cb:11
|
|
278
|
+
Risk Level: 1 (Low)
|
|
279
|
+
VLAN: 893
|
|
280
|
+
|
|
281
|
+
All four devices are classified as Infrastructure class, Surveillance Camera type devices
|
|
282
|
+
running Windows OS, and all have a low risk level (1). The search returned a total of 250
|
|
283
|
+
Panasonic IP Camera devices across all locations, but these 4 are specifically in Location
|
|
284
|
+
1 as requested.
|
|
285
|
+
|
|
286
|
+
Then Prompt
|
|
287
|
+
|
|
288
|
+
Generate me a CSV containing these devices
|
|
289
|
+
|
|
290
|
+
And it will respond with something like this:
|
|
291
|
+
|
|
292
|
+
I'll create a CSV file containing the 4 Panasonic IP Camera devices from Location 1.
|
|
293
|
+
|
|
294
|
+
### Example 6: Risk mitigations
|
|
295
|
+
|
|
296
|
+
Prompt:
|
|
297
|
+
|
|
298
|
+
Using Cylera, provide suggestions for mitigating CVE-2017-2852
|
|
299
|
+
|
|
300
|
+
And it will respond with something like this:
|
|
301
|
+
|
|
302
|
+
Based on the Cylera system data, here are the risk mitigation suggestions
|
|
303
|
+
for CVE-2017-2852, which affects Natus Xltek NeuroWorks 8:
|
|
304
|
+
|
|
305
|
+
Vulnerability Summary
|
|
306
|
+
|
|
307
|
+
This is a denial-of-service vulnerability in the unserialization of lists
|
|
308
|
+
functionality of Natus Xltek NeuroWorks 8. An attacker can send a specially
|
|
309
|
+
crafted network packet that causes an out-of-bounds read, resulting in service
|
|
310
|
+
disruption.
|
|
311
|
+
|
|
312
|
+
Primary Mitigation: Software Upgrade
|
|
313
|
+
|
|
314
|
+
Upgrade NeuroWorks Software
|
|
315
|
+
|
|
316
|
+
1. Contact Natus: Reach out to Natus at 1-800-387-7516 or
|
|
317
|
+
Oakville_Technical_Service@natus.com to request the free software update
|
|
318
|
+
2. Apply Upgrade: Install the software update on all affected devices
|
|
319
|
+
|
|
320
|
+
Compensating Controls: Incident Response Plan
|
|
321
|
+
|
|
322
|
+
Since this affects medical devices, having a comprehensive incident
|
|
323
|
+
response plan is crucial:
|
|
324
|
+
|
|
325
|
+
Incident Response Preparation
|
|
326
|
+
|
|
327
|
+
1. Identify Contacts: Establish clear contact points within biomedical
|
|
328
|
+
engineering teams responsible for these devices
|
|
329
|
+
2. Communication Procedures: Create documented procedures for alerting
|
|
330
|
+
relevant staff including IT, Information Security, biomedical engineering, and
|
|
331
|
+
clinical teams in case of device compromise
|
|
332
|
+
3. Network Segmentation Planning: Document procedures for isolating or
|
|
333
|
+
disconnecting devices from the network during various clinical scenarios
|
|
334
|
+
4. Workflow Contingencies: Plan for workflow changes that may be necessary if
|
|
335
|
+
devices need to be disconnected from the network (such as manual processes for
|
|
336
|
+
drug library updates)
|
|
337
|
+
5. Training and Simulation: Schedule regular training events to prepare staff
|
|
338
|
+
for potential device downtime scenarios
|
|
339
|
+
|
|
340
|
+
Additional Recommendations
|
|
341
|
+
|
|
342
|
+
Given the nature of this vulnerability, I would also suggest:
|
|
343
|
+
|
|
344
|
+
- Network Monitoring: Implement monitoring for unusual network traffic to these devices
|
|
345
|
+
- Network Segmentation: Consider placing these devices on isolated network segments with restricted access
|
|
346
|
+
- Access Controls: Limit network access to these devices to only necessary systems and personnel
|
|
347
|
+
|
|
348
|
+
The primary focus should be on applying the vendor's software update, as
|
|
349
|
+
this directly addresses the vulnerability at its source.
|
|
350
|
+
|
|
351
|
+
### Example 7: Subnets
|
|
352
|
+
|
|
353
|
+
Prompt:
|
|
354
|
+
|
|
355
|
+
Using Cylera, tell me about subnet with VLAN 477
|
|
356
|
+
|
|
357
|
+
And it will respond with something like this:
|
|
358
|
+
|
|
359
|
+
Based on the Cylera data, here's what I found about the subnet with VLAN 477:
|
|
360
|
+
|
|
361
|
+
Subnet Details:
|
|
362
|
+
|
|
363
|
+
- VLAN: 477
|
|
364
|
+
- Description: Main Building - Floor 4
|
|
365
|
+
- CIDR Range: Not specified in the available data
|
|
366
|
+
- Gateway: Not specified in the available data
|
|
367
|
+
- Dynamic Status: Not specified in the available data
|
|
368
|
+
|
|
369
|
+
The subnet appears to be associated with the 4th floor of the main building,
|
|
370
|
+
suggesting it's likely used for devices and network infrastructure on that
|
|
371
|
+
floor. However, some technical details like the specific IP range (CIDR),
|
|
372
|
+
gateway address, and whether it uses dynamic IP allocation aren't available
|
|
373
|
+
in the current response.
|
|
374
|
+
|
|
375
|
+
If you need more detailed technical information about this subnet, such as
|
|
376
|
+
the specific IP address range or gateway configuration, you may need to access
|
|
377
|
+
the full Cylera interface directly or contact your network administrator.
|
|
378
|
+
|
|
379
|
+
### Example 8: Vulnerabilities
|
|
380
|
+
|
|
381
|
+
Prompt:
|
|
382
|
+
|
|
383
|
+
Using Cylera, tell me about critical vulnerabilities
|
|
384
|
+
|
|
385
|
+
And it will respond with something like this (by default, suppressed devices are included - simply add "excluding suppressed devices" to the prompt to see only devices that have not been suppressed:
|
|
386
|
+
|
|
387
|
+
I'll help you find information about critical vulnerabilities using the Cylera
|
|
388
|
+
system. Let me search for vulnerabilities with critical severity.
|
|
389
|
+
|
|
390
|
+
Based on the Cylera system data, here's what I found about critical
|
|
391
|
+
vulnerabilities: Critical Vulnerability Summary Primary Threat: Ripple20
|
|
392
|
+
(ICSA-20-168-01) The system shows a widespread critical vulnerability affecting
|
|
393
|
+
medical devices across your network. All 20 devices shown are affected by the
|
|
394
|
+
Ripple20 vulnerability, which is a series of zero-day vulnerabilities in a
|
|
395
|
+
TCP/IP library used by hundreds of millions of connected devices. Key Details:
|
|
396
|
+
Severity: Critical Status: Most are "Open" (19 devices), with 1 showing "In
|
|
397
|
+
Progress" Confidence Level: High Affected Device Class: Medical devices
|
|
398
|
+
Vulnerability Category: Security Affected Network Ranges:
|
|
399
|
+
|
|
400
|
+
10.20.x.x subnet (4 devices)
|
|
401
|
+
10.30.x.x subnet (8 devices)
|
|
402
|
+
10.50.x.x subnet (8 devices)
|
|
403
|
+
|
|
404
|
+
Risk Assessment:
|
|
405
|
+
This is a particularly concerning situation because:
|
|
406
|
+
|
|
407
|
+
Medical devices are affected, which could impact patient safety
|
|
408
|
+
High confidence rating indicates the vulnerability detection is reliable
|
|
409
|
+
All devices show the same timestamp pattern, suggesting systematic scanning detected this vulnerability
|
|
410
|
+
The vulnerability has been open for an extended period (timestamps from late 2021)
|
|
411
|
+
|
|
412
|
+
The system indicates there are more critical vulnerabilities beyond these 20
|
|
413
|
+
devices. Would you like me to:
|
|
414
|
+
|
|
415
|
+
Fetch additional pages to see more affected devices
|
|
416
|
+
Look up specific risk mitigations for the Ripple20 vulnerability
|
|
417
|
+
Get more details about any specific device by MAC address
|
|
418
|
+
|
|
419
|
+
This appears to be a significant security incident requiring immediate
|
|
420
|
+
attention, especially given the medical device classification.
|
|
421
|
+
|
|
422
|
+
### Example 9: Organization switching
|
|
423
|
+
|
|
424
|
+
Prompt:
|
|
425
|
+
|
|
426
|
+
Using Cylera, list the organizations available to me
|
|
427
|
+
|
|
428
|
+
And it will respond with something like this:
|
|
429
|
+
|
|
430
|
+
I'll retrieve the list of organizations available to you using Cylera.
|
|
431
|
+
|
|
432
|
+
Here are the organizations available for you to switch into:
|
|
433
|
+
|
|
434
|
+
1. Acme Health System (ID: a1b2c3d4-...)
|
|
435
|
+
2. Regional Medical Center (ID: e5f6g7h8-...)
|
|
436
|
+
3. Community Clinic Network (ID: i9j0k1l2-...)
|
|
437
|
+
|
|
438
|
+
You are currently authenticated to Acme Health System. Would you like me
|
|
439
|
+
to switch to one of the other organizations?
|
|
440
|
+
|
|
441
|
+
Then prompt:
|
|
442
|
+
|
|
443
|
+
Switch to Regional Medical Center and tell me about their critical vulnerabilities, then switch back
|
|
444
|
+
|
|
445
|
+
And it will respond with something like this:
|
|
446
|
+
|
|
447
|
+
I'll switch to Regional Medical Center, fetch their critical vulnerabilities, then switch back.
|
|
448
|
+
|
|
449
|
+
Successfully switched to Regional Medical Center. Now fetching critical vulnerabilities...
|
|
450
|
+
|
|
451
|
+
[vulnerability results for Regional Medical Center]
|
|
452
|
+
|
|
453
|
+
Now resetting back to your home organization, Acme Health System.
|
|
454
|
+
|
|
455
|
+
Successfully reset to home organization.
|
|
456
|
+
|
|
457
|
+
### Example 10: Threats
|
|
458
|
+
|
|
459
|
+
Prompt:
|
|
460
|
+
|
|
461
|
+
Using Cylera, get all Medium threats with a page size of 3
|
|
462
|
+
|
|
463
|
+
And it will respond with something like this:
|
|
464
|
+
|
|
465
|
+
I'll retrieve the medium severity threats from Cylera with a page size of 3.
|
|
466
|
+
|
|
467
|
+
Successfully retrieved medium severity threats from Cylera. Here are the results:
|
|
468
|
+
Medium Severity Threats (Page 1 of multiple)
|
|
469
|
+
Threat 1:
|
|
470
|
+
|
|
471
|
+
Device: LifeCare PCA (MAC: ef:ce:c8:24:3e:ea)
|
|
472
|
+
IP Address: 10.30.226.195
|
|
473
|
+
Threat: Anomalous network communication behavior
|
|
474
|
+
Category: GENERAL
|
|
475
|
+
Status: Accepted
|
|
476
|
+
First Seen: Nov 22, 2021
|
|
477
|
+
Last Seen: Nov 23, 2021
|
|
478
|
+
|
|
479
|
+
Threat 2:
|
|
480
|
+
|
|
481
|
+
Device: Philips Achieva dStream MRI (MAC: bb:b0:71:cf:30:0a)
|
|
482
|
+
IP Address: 10.30.150.250
|
|
483
|
+
Threat: Anomalous network communication behavior
|
|
484
|
+
Category: GENERAL
|
|
485
|
+
Status: Open
|
|
486
|
+
First Seen: Nov 22, 2021
|
|
487
|
+
Last Seen: Nov 23, 2021
|
|
488
|
+
|
|
489
|
+
Threat 3:
|
|
490
|
+
|
|
491
|
+
Device: DRX Revolution (MAC: b2:37:6f:b6:73:09)
|
|
492
|
+
IP Address: 10.30.28.249
|
|
493
|
+
Threat: Unusual port 139 traffic
|
|
494
|
+
Category: NETWORK
|
|
495
|
+
Status: Open
|
|
496
|
+
First Seen: Nov 22, 2021
|
|
497
|
+
Last Seen: Nov 23, 2021
|
|
498
|
+
|
|
499
|
+
Pagination: More medium severity threats are available (has_more: true). Would you like me to retrieve the next page?
|
|
500
|
+
|
|
501
|
+
|
|
502
|
+
## Installation - the easy button
|
|
503
|
+
|
|
504
|
+
The simplest and most secure way to install is using the [Docker MCP Toolkit](https://www.docker.com/products/mcp-catalog-and-toolkit/)
|
|
505
|
+
which is available in the latest versions of [Docker Desktop](https://www.docker.com/products/docker-desktop/).
|
|
506
|
+
|
|
507
|
+
Simply search for Cylera within the Catalog, click the "Add MCP Server" button
|
|
508
|
+
and configure it via the Configuration tab.
|
|
509
|
+
|
|
510
|
+
Then, simply connect the clients you want to use.
|
|
511
|
+
|
|
512
|
+
Not only does this approach make it easier to connect multiple chat
|
|
513
|
+
applications with multiple MCP servers, it also helps to secure credentials
|
|
514
|
+
needed for configuration by storing them in an embedded vault.
|
|
515
|
+
|
|
516
|
+
Upgrades are automatic, although be delays in the latest release being available in Docker MCP Registry.
|
|
517
|
+
|
|
518
|
+
## Manual Installation
|
|
519
|
+
|
|
520
|
+
The following instructions show how to integrate the MCP Server with [Claude Desktop](https://claude.ai/download) and [Gemini CLI](https://github.com/google-gemini/gemini-cli). Other configuration options will be supported in the future.
|
|
521
|
+
|
|
522
|
+
Currently, the instructions are a little technical - this is why we recommend
|
|
523
|
+
using Docker Desktop (see above)
|
|
524
|
+
|
|
525
|
+
1. Install [Claude Desktop](https://claude.ai/download) or [Gemini CLI](https://github.com/google-gemini/gemini-cli)
|
|
526
|
+
2. Install [uv](https://github.com/astral-sh/uv)
|
|
527
|
+
3. Clone the MCP Server for Cylera
|
|
528
|
+
|
|
529
|
+
To subsequently update to the latest (on Linux or macOS):
|
|
530
|
+
|
|
531
|
+
```bash
|
|
532
|
+
git pull
|
|
533
|
+
uv sync
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
|
|
537
|
+
## Configuration
|
|
538
|
+
|
|
539
|
+
Secrets are required to be provided. The values of these secrets can be
|
|
540
|
+
configured using one of two ways. The simplest way is to create a .env file in the same directory that you cloned the MCP Server for Cylera and add the following lines replacing with your own credentials:
|
|
541
|
+
|
|
542
|
+
CYLERA_BASE_URL=https://partner.us1.cylera.com/" # Or https://partner.uk1.cylera.com/ Or https://partner.demo.cylera.com
|
|
543
|
+
CYLERA_USERNAME="<Your username>"
|
|
544
|
+
CYLERA_PASSWORD="<Your password>"
|
|
545
|
+
|
|
546
|
+
TEST_CYLERA_BASE_URL="https://partner.demo.cylera.com"
|
|
547
|
+
TEST_CYLERA_USERNAME="<Your username>"
|
|
548
|
+
TEST_CYLERA_PASSWORD="<Your password>"
|
|
549
|
+
|
|
550
|
+
Alternatively, you may prefer to use [Doppler](https://www.doppler.com) to
|
|
551
|
+
store these secrets. This approach is arguably more secure as it avoids storing
|
|
552
|
+
secrets in the clear on the filesystem.
|
|
553
|
+
|
|
554
|
+
### If using Claude Desktop
|
|
555
|
+
|
|
556
|
+
Go to Claude->Settings and Edit Config adding the Cylera MCP Server to any other MCP servers you might have configured. Modify the paths accordingly to the locations where you installed uv (unless your user name happens to be bill) and where you cloned the Cylera MCP server:
|
|
557
|
+
|
|
558
|
+
```lang=json
|
|
559
|
+
{
|
|
560
|
+
"mcpServers": {
|
|
561
|
+
"Cylera": {
|
|
562
|
+
"command": "/Users/bill/.local/bin/uv",
|
|
563
|
+
"args": [
|
|
564
|
+
"--directory",
|
|
565
|
+
"/Users/bill/repos/cylera-mcp-server",
|
|
566
|
+
"run",
|
|
567
|
+
"server.py"
|
|
568
|
+
]
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
If you are using Doppler for secrets management instead of storing them in a
|
|
575
|
+
.env file, the configuration will look something like this. Be sure to replace the --pro:
|
|
576
|
+
|
|
577
|
+
```lang=json
|
|
578
|
+
{
|
|
579
|
+
"mcpServers": {
|
|
580
|
+
"Cylera": {
|
|
581
|
+
"command": "/opt/homebrew/bin/doppler",
|
|
582
|
+
"args": [
|
|
583
|
+
"run",
|
|
584
|
+
"--project", "<Replace with your Doppler project name>",
|
|
585
|
+
"--config", "<Replace with your Doppler configuration name e.g. dev>",
|
|
586
|
+
"--",
|
|
587
|
+
"/Users/Bill/.local/bin/uv",
|
|
588
|
+
"--directory",
|
|
589
|
+
"/Users/Bill/repos/cylera-mcp-server",
|
|
590
|
+
"run",
|
|
591
|
+
"server.py"
|
|
592
|
+
]
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
```
|
|
597
|
+
|
|
598
|
+
|
|
599
|
+
### If using Gemini CLI
|
|
600
|
+
|
|
601
|
+
Modify ~/.gemini/settings.json changing the paths accordingly to the locations where you installed uv:
|
|
602
|
+
|
|
603
|
+
```
|
|
604
|
+
{
|
|
605
|
+
"mcpServers": {
|
|
606
|
+
"Cylera": {
|
|
607
|
+
"command": "/Users/bill/.local/bin/uv",
|
|
608
|
+
"args": [
|
|
609
|
+
"run",
|
|
610
|
+
"server.py"
|
|
611
|
+
],
|
|
612
|
+
"cwd": "/Users/bill/repos/cylera-mcp-server"
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
```
|
|
617
|
+
Test the Gemini configuration by launching gemini. In the start screen, you should
|
|
618
|
+
see something similar to:
|
|
619
|
+
|
|
620
|
+
...
|
|
621
|
+
Using: 1 MCP server (ctrl+t to view)
|
|
622
|
+
...
|
|
623
|
+
|
|
624
|
+
If you press Ctrl+t, you should see the Cylera MCP server details.
|
|
625
|
+
|
|
626
|
+
## Testing
|
|
627
|
+
|
|
628
|
+
We have unit tests which essentially verify the REST API client
|
|
629
|
+
(test_cylera_client.py) works ok.
|
|
630
|
+
|
|
631
|
+
In addition, we have tests which verify the MCP server itself works as expected by an
|
|
632
|
+
MCP client (test_mcp_server.py).
|
|
633
|
+
|
|
634
|
+
Run the testsuite as follows:
|
|
635
|
+
|
|
636
|
+
uv run pytest -v
|
|
637
|
+
|
|
638
|
+
If tests are failing, and you want to see more information add the -s option to pytest and set the DEBUG environment variable to 1.
|
|
639
|
+
|
|
640
|
+
export DEBUG=1
|
|
641
|
+
uv run pytest -v -s
|
|
642
|
+
|
|
643
|
+
If using [Doppler](https://www.doppler.com) for secrets management instead of storing secrets in a .env file, simply use the "doppler run -- " prefix as follows:
|
|
644
|
+
|
|
645
|
+
doppler run -- uv run pytest -v
|
|
646
|
+
|
|
647
|
+
## Coverage
|
|
648
|
+
|
|
649
|
+
The following API endpoints are currently integrated into the MCP server.
|
|
650
|
+
|
|
651
|
+
| HTTP Method | URL | Description |
|
|
652
|
+
|-------------|-----|-------------|
|
|
653
|
+
| **GET** | `/organization/` | Get current organization - Returns the name of the organization associated with the authenticated credentials. |
|
|
654
|
+
| **GET** | `/organization/available` | Get available organizations - Returns the list of organizations available to switch into. |
|
|
655
|
+
| **POST** | `/organization/switch` | Switch organization - Switches context to a different organization. The current token is invalidated and the next request will re-authenticate in the new organization's context. |
|
|
656
|
+
| **POST** | `/organization/reset` | Reset organization - Resets back to the home organization. This is the inverse of switch. If already in the home organization, the request is a no-op. |
|
|
657
|
+
| **GET** | `/inventory/device` | Get single device - This endpoint returns details about a single IoT device based on mac address. If the supplied MAC is invalid, or doesn't correspond to an IoT device, then the response will be null. |
|
|
658
|
+
| **GET** | `/inventory/devices` | Get many devices - This endpoint returns details about the devices that match the provided search criteria. |
|
|
659
|
+
| **GET** | `/utilization/procedures` | Get procedures - Returns procedure information with optional filtering by procedure name, accession number, device UUID, and completion date. |
|
|
660
|
+
| **GET** | `/inventory/device_attributes` | Get attributes for device - This endpoint returns the attributes for a single IoT device based on mac address. If the supplied MAC is invalid, or doesn't correspond to an IoT device, then the response will be null. |
|
|
661
|
+
| **GET** | `/network/subnets` | Get subnets - Returns subnet information with optional filtering by CIDR range, description, and VLAN. |
|
|
662
|
+
| **GET** | `/risk/mitigations` | Get mitigations - Returns mitigation information for a specific vulnerability. |
|
|
663
|
+
| **GET** | `/risk/vulnerabilities` | Get vulnerabilities - Returns vulnerability information with optional filtering by confidence, detection time, MAC address, name, severity, and status. |
|
|
664
|
+
| **GET** | `/threat/threats` | Get threats - Returns threat information with optional filtering by detection time, MAC address, name, severity, and status. |
|
|
665
|
+
|
|
666
|
+
The full power of the Cylera Partner API is not yet fully exposed and will be developed over time.
|
|
667
|
+
|
|
668
|
+
| HTTP Method | URL | Description |
|
|
669
|
+
|-------------|-----|-------------|
|
|
670
|
+
| **DELETE** | `/inventory/device_attributes` | Delete custom attribute for a device - This endpoint deletes a single custom attribute for a single device. If the provided parameters don't match an existing attribute, then nothing will be deleted. Note that if the attribute is a Cylera-created attribute, it won't be deleted. |
|
|
671
|
+
| **POST** | `/inventory/device_attributes` | Create an attribute for a device - This endpoint creates a new label-value attribute for a single IoT device based on mac address. If the supplied MAC is invalid, or doesn't correspond to an IoT device, then the attribute won't be created. Note that you can only create attributes for non-reserved (aka non-Cylera) keys. |
|
|
672
|
+
| **POST** | `/risk/vulnerability` | Update vulnerability - Updates the status of a specific vulnerability using its UUID. |
|
|
673
|
+
| **POST** | `/threat/threat` | Update threat - Updates the status of a specific threat using its UUID. |
|
|
674
|
+
|
|
675
|
+
[tutorial]: tutorial.webp
|