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.
@@ -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
+ ![Architecture](mcp-architecture.png)
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