Skip to main content
Glama

Bluetooth MCP Server

windows_scanner.cpython-311.pyc28.4 kB
� ,6�gKw����dZddlZddlZddlZddlZddlZddlZddlZddlm Z m Z m Z m Z ddl mZddl mZddlmZeje��Zej��dkZGd�d ��Ze��ZdS) u� Module spécialisé pour le scan Bluetooth sur Windows en utilisant les API natives. Ceci est une alternative au scanner classique qui nécessite pybluez2. �N)�Dict�List�Optional�Any)�decode_ascii_name)�get_friendly_device_name)�get_device_info�Windowsc ��eZdZdZddedeedeeee ffd�Z ddedeedeeee ffd�Z dedeedeeeee fffd �Z dedeedeeeee fffd �Z dedeedeeeee fffd �Zdedeedeeeee fffd �Zdedeedeeeee fffd �Zdedeedeeeee fffd�ZdS)�WindowsBTScanneruIScanner Bluetooth spécifique à Windows utilisant les commandes système�$@N�duration� filter_name�returnc��tst�d��gSi} |�||��}t |�����}t�dt|���d���|S#t$r8}t� dt|����d���gcYd}~Sd}~wwxYw)ul Effectue un scan Bluetooth sur Windows via les commandes système. Args: duration: Durée du scan en secondes (utilisé comme timeout) filter_name: Filtre optionnel sur le nom des appareils Returns: Liste de dictionnaires contenant les informations des appareils Bluetooth uSCe scanner est spécifique à Windows et ne fonctionnera pas sur d'autres systèmesuScan Windows terminé. u! appareil(s) unique(s) trouvé(s)z'Erreur lors du scan Bluetooth Windows: T)�exc_infoN) � IS_WINDOWS�logger�warning�_run_parallel_scans�list�values�debug�len� Exception�error�str)�selfrr� all_devices�devices�es �;F:\DEV\bluetooth-mcp-server\app\services\windows_scanner.py�scanzWindowsBTScanner.scans���� � �N�N�p� q� q� q��I�� � ��2�2�8�[�I�I�K��;�-�-�/�/�0�0�G� �L�L�b�3�w�<�<�b�b�b� c� c� c��N��� � � � �L�L�K�3�q�6�6�K�K�VZ�L� [� [� [��I�I�I�I�I�I����� ���s�A#B � C �-C�C �C c��HK�tj|j||���d{V��S)u4 Version asynchrone du scan Windows. Args: duration: Durée du scan en secondes filter_name: Filtre optionnel sur le nom des appareils Returns: Liste de dictionnaires contenant les informations des appareils Bluetooth N)�asyncio� to_threadr#)rrrs r"� scan_asynczWindowsBTScanner.scan_async;s1�����&�t�y�(�K�H�H�H�H�H�H�H�H�H�c ����� � �ddl}i}|j|j|j|j|jg� |j�t� �����5� �� �� fd�� D��}|j� |��D]�}||} |� ��}t� d|�dt|���d���|� ��D]*\} } | |vr|| �| ���%| || <�+��#t$r7} t�d|�d t#| ������Yd} ~ ��d} ~ wwxYw ddd��n #1swxYwY|S) u/ Exécute les différentes méthodes de scan Windows en parallèle. Args: duration: Durée du scan en secondes filter_name: Filtre optionnel sur le nom des appareils Returns: Dictionnaire des appareils détectés rN)� max_workersc �j��i|]/}��|�t���z ���|j��0S�)�submitr�__name__)�.0�methodr�executorr� scan_methodss ����r"� <dictcomp>z8WindowsBTScanner._run_parallel_scans.<locals>.<dictcomp>dsL���3�3�3�!� ���v�x�#�l�:K�:K�/K�[�Y�Y�[a�[j�3�3�3r(u Méthode u terminée. u appareil(s) trouvé(s)uErreur lors de l'exécution de z: )�concurrent.futures�_scan_pnp_devices�_scan_bluetooth_adapter�_scan_wmi_devices�_scan_netsh_devices�_scan_registry_devices�futures�ThreadPoolExecutorr� as_completed�resultrr�items�updaterrr)rrr� concurrentrr:�future� method_namer � device_id�devicer!r1r2s `` @@r"rz$WindowsBTScanner._run_parallel_scansIs2������ "�!�!�!�� � � "� � (� � "� � $� � '�  � �� � 2� 2�s�<�?P�?P� 2� Q� Q� \�U]�3�3�3�3�3�3�3�%1�3�3�3�G�%�,�9�9�'�B�B� \� \��%�f�o� � \�$�m�m�o�o�G��L�L�!k�[�!k�!k�c�'�l�l�!k�!k�!k�l�l�l�.5�]�]�_�_�<�<�)� �6�$� �3�3�'� �2�9�9�&�A�A�A�A�6<�K� �2�2� <��!�\�\�\��L�L�!Z�;�!Z�!Z�RU�VW�RX�RX�!Z�!Z�[�[�[�[�[�[�[�[�����\���� \�  \� \� \� \� \� \� \� \� \� \� \���� \� \� \� \�.�s=�6E� BD � E� E �-E�E�E � E�E!�$E!c�t�i}gd�} tj|dd|d���}t�dt |j������d���d}|j���D�]j}tj||��}|�rO|� d��� ��} |� d ��� ��} |� d ��� ��} |�)|� ��| � ��vr��d | � ��vsd | � ��vrt� d| ����| � dd��� dd��} d| ��} | t | ��dkr | d d�n| | digid d dd| dd| �d| ��d�|| <��lnM#tjtf$r4}t�dt#|������Yd }~nd }~wwxYw|S)u! Scan des appareils PnP via PowerShell Get-PnpDevice. Args: duration: Durée du scan en secondes filter_name: Filtre optionnel sur le nom des appareils Returns: Dictionnaire des appareils détectés )� powershell� -NoProfile�-Commanda $OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 # Essayons d'abord via Get-PnpDevice try { $btDevices = Get-PnpDevice -Class Bluetooth | Where-Object { $_.Status -eq 'OK' } foreach ($dev in $btDevices) { Write-Output ("Device: " + $dev.FriendlyName + " | ID: " + $dev.DeviceID + " | Status: " + $dev.Status) } } catch { Write-Output "Error: $_" } T�utf-8��capture_output�text�timeout�encodinguRésultat Get-PnpDevice: z lignesz(Device: (.*) \| ID: (.*) \| Status: (.*)���N�freebox�freeu$Freebox trouvée via Get-PnpDevice: �&�-�\zWIN-PNP-�i�����Unknown (Windows)z Windows-PnP� windows_pnp�ID: � , Status: ��id�address�name�rssi�manufacturer_data� service_uuids� service_data�tx_power� appearance� company_name� device_type� friendly_name� detected_by�raw_infozErreur avec Get-PnpDevice: )� subprocess�runrrr�stdout� splitlines�re�match�group�strip�lower�info�replace�SubprocessError�UnicodeDecodeErrorrr)rrrr �powershell_cmd� ps_result�device_pattern�linerpr_rC�status�device_id_clean� unique_idr!s r"r5z"WindowsBTScanner._scan_pnp_devices{s���� � � ��&2 A�"���#�� � � ���I� �L�L�`�S��9I�9T�9T�9V�9V�5W�5W�`�`�`� a� a� a�I�N�!�(�3�3�5�5�" �" ������6�6��� � �;�;�q�>�>�/�/�1�1�D� %� � �A��� 4� 4� 6� 6�I�"�[�[��^�^�1�1�3�3�F�#�.�;�3D�3D�3F�3F�d�j�j�l�l�3Z�3Z� � �D�J�J�L�L�0�0�F�d�j�j�l�l�4J�4J�� � �$Q�4�$Q�$Q�R�R�R�'0�&7�&7��S�&A�&A�&I�&I�$�PS�&T�&T�O� <�?� <� <�I�(�58��^�^�b�5H�5H�9�S�b�S�>�>�i� $� #�-/�)+�(*�$(�&*�(;�'4�)-�'4�$H�9�$H�$H��$H�$H�*�*�G�I�&��'" ��F�*�,>�?� A� A� A� �L�L�?�s�1�v�v�?�?� @� @� @� @� @� @� @� @����� A�����s�G"G+�+H5�*H0�0H5c��i}gd�} tj|dd|d���}d}d}|j���D�]�}t j||��} | �rx|dz }| �d�����} | �d�����} | �d �����} |�)|���| ���vr��d | ���vsd | ���vrt� d | ����| � dd��} t| ��dkr | dd �n| } d| ��}t j d| ��}|r|�d��n |d d�}||| digid d dd| dd| �d| ��d�||<���t� d|�d���nM#tjtf$r4}t�dt#|������Yd }~nd }~wwxYw|S)u Scan via PowerShell BluetoothAdapter. Args: duration: Durée du scan en secondes filter_name: Filtre optionnel sur le nom des appareils Returns: Dictionnaire des appareils détectés )rFrGrHa� $OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 try { Add-Type -AssemblyName System.Runtime.WindowsRuntime $asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() | Where-Object { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' })[0] Function Await($WinRtTask, $ResultType) { $asTask = $asTaskGeneric.MakeGenericMethod($ResultType) $netTask = $asTask.Invoke($null, @($WinRtTask)) $netTask.Wait() $netTask.Result } [Windows.Devices.Enumeration.DeviceInformation,Windows.Devices.Enumeration,ContentType=WindowsRuntime] | Out-Null [Windows.Devices.Bluetooth.BluetoothAdapter,Windows.Devices.Bluetooth,ContentType=WindowsRuntime] | Out-Null $bluetooth = [Windows.Devices.Bluetooth.BluetoothAdapter]::GetDefaultAsync() $adapter = Await $bluetooth ([Windows.Devices.Bluetooth.BluetoothAdapter]) if ($adapter) { Write-Output "Bluetooth Adapter Info:" Write-Output "--------------------" Write-Output ("Name: " + $adapter.Name) Write-Output ("ID: " + $adapter.BluetoothAddress) Write-Output ("Status: " + $adapter.ConnectionStatus) # Get paired devices $devices = [Windows.Devices.Enumeration.DeviceInformation]::FindAllAsync([Windows.Devices.Bluetooth.BluetoothDevice]::GetDeviceSelector()) $btDevices = Await $devices ([System.Collections.Generic.IReadOnlyList[Windows.Devices.Enumeration.DeviceInformation]]) Write-Output "" Write-Output ("Found " + $btDevices.Count + " Bluetooth devices:") Write-Output "--------------------" foreach ($device in $btDevices) { Write-Output ("BT-DEVICE: " + $device.Name + " | ID: " + $device.Id + " | Status: " + $device.Pairing.CanPair) } } else { Write-Output "No Bluetooth adapter found" } } catch { Write-Output "Error: $_" } TrIrJz+BT-DEVICE: (.*) \| ID: (.*) \| Status: (.*)rrOrPrQNrRrSu'Freebox trouvée via BluetoothAdapter: �#rUrWi����zWIN-BT-z'([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})�����rXz Windows-BT�windows_bluetooth_adapterrZr[r\uTrouvé u% périphériques via BluetoothAdapterzErreur avec BluetoothAdapter: )rkrlrmrnrorprqrrrsrrtrur�searchrvrwrr)rrrr �bt_adapter_cmd� bt_result�bt_device_pattern� device_countr{rpr_rCr|r}r~� mac_matchr^r!s r"r6z(WindowsBTScanner._scan_bluetooth_adapter�s�����0 �0 �0 ��d9 D�"���#�� � � ���I�!O� ��L�!�(�3�3�5�5�( �( ����!2�D�9�9���&� �A�%�L� �;�;�q�>�>�/�/�1�1�D� %� � �A��� 4� 4� 6� 6�I�"�[�[��^�^�1�1�3�3�F�#�.�;�3D�3D�3F�3F�d�j�j�l�l�3Z�3Z� � �D�J�J�L�L�0�0�F�d�j�j�l�l�4J�4J�� � �$T�d�$T�$T�U�U�U�'0�&7�&7��S�&A�&A�O�?B�?�?S�?S�VX�?X�?X�o�c�d�d�&;�&;�^m�O� ;�/� ;� ;�I�!#� �*T�V_� `� `�I�4=�Q�i�o�o�a�0�0�0�9�S�b�S�>�G�(�#*� $� #�-/�)+�(*�$(�&*�(;�'3�)-�'B�$H�9�$H�$H��$H�$H�*�*�G�I�&��" �K�K�V�<�V�V�V� W� W� W� W���*�,>�?� D� D� D� �L�L�B�#�a�&�&�B�B� C� C� C� C� C� C� C� C����� D�����s�G)G2�2H<�*H7�7H<c���i}gd�} tj|dd|d���}d}|j���D�]j}t j||��}|�rO|�d�����} |�d�����} |�d�����} |�)|���| ���vr��d | ���vsd | ���vrt� d | ����| � d d��� dd��} d| ��} | t| ��dkr | d d�n| | digid d dd| dd| �d| ��d�|| <��lnM#tj tf$r4}t�dt!|������Yd }~nd }~wwxYw|S)u� Scan via WMI. Args: duration: Durée du scan en secondes filter_name: Filtre optionnel sur le nom des appareils Returns: Dictionnaire des appareils détectés )rFrGrHa� $OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 try { $wmiDevices = Get-WmiObject -Query "SELECT * FROM Win32_PnPEntity WHERE PNPClass = 'Bluetooth'" | Select-Object Name, DeviceID, Status, Description if ($wmiDevices) { foreach ($device in $wmiDevices) { Write-Output ("WMI-BT: " + $device.Name + " | ID: " + $device.DeviceID + " | Status: " + $device.Status) } } else { Write-Output "No WMI Bluetooth devices found" } } catch { Write-Output "Error: $_" } TrIrJz(WMI-BT: (.*) \| ID: (.*) \| Status: (.*)rOrPrQNrRrSuFreebox trouvée via WMI: rTrUrVzWIN-WMI-rWi����rXz Windows-WMI� windows_wmirZr[r\zErreur avec WMI: )rkrlrmrnrorprqrrrsrrtrurrvrwrr)rrrr �wmi_cmd� wmi_result�wmi_device_patternr{rpr_rCr|r}r~r!s r"r7z"WindowsBTScanner._scan_wmi_devicesNsE���� � � ��,0 7�#���#�� � � ���J�"M� �"�)�4�4�6�6�" �" ����!3�T�:�:��� � �;�;�q�>�>�/�/�1�1�D� %� � �A��� 4� 4� 6� 6�I�"�[�[��^�^�1�1�3�3�F�#�.�;�3D�3D�3F�3F�d�j�j�l�l�3Z�3Z� � �D�J�J�L�L�0�0�F�d�j�j�l�l�4J�4J�� � �$G��$G�$G�H�H�H�'0�&7�&7��S�&A�&A�&I�&I�$�PS�&T�&T�O� <�?� <� <�I�(�58��^�^�b�5H�5H�9�S�b�S�>�>�i� $� #�-/�)+�(*�$(�&*�(;�'4�)-�'4�$H�9�$H�$H��$H�$H�*�*�G�I�&��'" ��F�*�,>�?� 7� 7� 7� �L�L�5�S��V�V�5�5� 6� 6� 6� 6� 6� 6� 6� 6����� 7�����s�F F)�)G3�?*G.�.G3c���i}gd�} tj|dd|d���}d}tj||jtj��D]�}|�d�����}|�d�����} |�)|���|���vr�{d |���vsd |���vrt� d |����d | ��} | | |d igidddd|dd|��d�|| <��nF#tj $r4} t� dt| ������Yd} ~ nd} ~ wwxYw|S)u� Scan via netsh. Args: duration: Durée du scan en secondes filter_name: Filtre optionnel sur le nom des appareils Returns: Dictionnaire des appareils détectés )�netsh� bluetooth�showr TrIrJzFDevice \d+\s+Device Name: (.*)\s+Bluetooth Address: ([0-9a-fA-F:]{17})rOrPNrRrSuFreebox trouvée via netsh: z WIN-NETSH-r�rXz Windows-NETSH� windows_netshzNetsh Device: r\zErreur avec netsh: )rkrlro�finditerrm�DOTALLrqrrrsrrtrvrr) rrrr � netsh_cmd� netsh_result�device_block_patternrpr_r^r~r!s r"r8z$WindowsBTScanner._scan_netsh_devices�s����� � � � �0 9�%�>��#�� � � ���L�$m� ���%9�<�;N�PR�PY�Z�Z� � ���{�{�1�~�~�+�+�-�-���+�+�a�.�.�.�.�0�0���*�{�/@�/@�/B�/B�$�*�*�,�,�/V�/V���� � � � �,�,��$�*�*�,�,�0F�0F��K�K� E�t� E� E�F�F�F�3��2�2� �"�&� ��)+�%'�$&� $�"&�$7�#2�%)�#2� 7�� 7� 7�&�&�� �"�"� ��>�)� 9� 9� 9� �L�L�7�s�1�v�v�7�7� 8� 8� 8� 8� 8� 8� 8� 8����� 9�����s�D!D*�*E-�9*E(�(E-c����i}gd�} tj|dd|d���}d}d}|j���D�]W}t j||��} | �r<| �d�����} | �d������|�)|���| ���vr��t� d | ����d } t���d krLd � �fd �tdtd t�����d��D����} n"dt���dkr �dd �nd��} | | d| zdzdigid d ddddd��d| ��d�|d���<��Y|j���D�]�}t j||��} | �r�| �d�����} | �d������|�)|���| ���vr��t| ��} | | kr"t�d| �d| ����| } d | ���vsd!| ���vr�t� d"| ����d } t���d krLd � �fd#�tdtd t�����d��D����} n"dt���dkr �dd �nd��} | | d| zdzdigid d ddddd��d| ��d�|d���<���d$���} | t| ��d%kr | d d%�n| | d&igid d d'd| d(d���d�|| <���nM#tjt$f$r4}t�d)t)|������Yd }~nd }~wwxYw|S)*u Recherche spécifique dans le registre Windows. Args: duration: Durée du scan en secondes filter_name: Filtre optionnel sur le nom des appareils Returns: Dictionnaire des appareils détectés )rFrGrHuG $OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 try { # Rechercher des clés de registre contenant des appareils Bluetooth $regKeys = @( "HKLM:\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Devices", "HKLM:\SYSTEM\CurrentControlSet\Services\BTH\Parameters\Devices", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Bluetooth\Devices" ) foreach ($regKey in $regKeys) { if (Test-Path $regKey) { $devices = Get-ChildItem $regKey -ErrorAction SilentlyContinue foreach ($device in $devices) { $props = Get-ItemProperty -Path $device.PSPath -ErrorAction SilentlyContinue $name = "" # Essayer différentes propriétés qui pourraient contenir un nom if ($props.Name) { $name = $props.Name } elseif ($props.FriendlyName) { $name = $props.FriendlyName } elseif ($props.DeviceName) { $name = $props.DeviceName } elseif ($props.DeviceDesc) { $name = $props.DeviceDesc } # Si le nom contient "free" ou "freebox", c'est potentiellement une Freebox if ($name -match "free" -or $name -match "freebox") { Write-Output ("FREEBOX-REG: " + $name + " | ID: " + $device.PSChildName) } # Sinon, afficher quand même tous les appareils Bluetooth elseif ($name) { Write-Output ("BT-REG: " + $name + " | ID: " + $device.PSChildName) } } } } } catch { Write-Output "Error: $_" } TrIrJzFREEBOX-REG: (.*) \| ID: (.*)zBT-REG: (.*) \| ID: (.*)rOrPNu#Freebox trouvée dans le registre: � �:c�*��g|]}�||dz���S�rPr,�r/�i�reg_ids �r"� <listcomp>z;WindowsBTScanner._scan_registry_devices.<locals>.<listcomp>Ds%���+e�+e�+e�a�F�1�Q�q�S�5�M�+e�+e�+er(rzFB:FX:�i�����000000z Freebox (�)i����z Freebox SAzWindows-RegistryzFreebox Player�windows_registry_specificz Registry ID: z, Name: r\z FREEBOX-REG-uNom décodé de z en rSrRu5Freebox trouvée dans le registre (nom générique): c�*��g|]}�||dz���Sr�r,r�s �r"r�z;WindowsBTScanner._scan_registry_devices.<locals>.<listcomp>rs%���/i�/i�/i�!��q��1��u� �/i�/i�/ir(zWIN-REG-rWi����rX�windows_registryzErreur avec le registre: )rkrlrmrnrorprqrrrsrrtr�join�range�minrrrvrwrr)rrrr � registry_cmd�registry_result�freebox_reg_pattern�bt_reg_patternr{rpr_r^� decoded_namer~r!r�s @r"r9z'WindowsBTScanner._scan_registry_devices�s������* �* �* � �Xw ?�(�n��#�� � � ���O�#C� �8�N�(�.�9�9�;�;�$ �$ ����!4�d�;�;���"� �;�;�q�>�>�/�/�1�1�D�"�[�[��^�^�1�1�3�3�F�#�.�;�3D�3D�3F�3F�d�j�j�l�l�3Z�3Z� ��K�K� L�d� L� L�M�M�M�#�G��6�{�{�b�(�(�"%�(�(�+e�+e�+e�+e�5��C�PR�TW�X^�T_�T_�L`�L`�bc�Cd�Cd�+e�+e�+e�"f�"f���"Z�#�f�+�+��:J�:J�6�"�#�#�;�;�PX�"Z�"Z��&�#*� +�d� 2�S� 8� #�-/�)+�(*�$(�&*�(4�'9�)9�'B�$J�F�$J�$J�D�$J�$J�8�8�G�3�6�3�3�4��$(�.�9�9�;�;�@ �@ ������6�6���>� �;�;�q�>�>�/�/�1�1�D�"�[�[��^�^�1�1�3�3�F�#�.�;�3D�3D�3F�3F�d�j�j�l�l�3Z�3Z� �$5�T�#:�#:�L�#�t�+�+�� � �%P��%P�%P�,�%P�%P�Q�Q�Q�+��������-�-��d�j�j�l�l�1J�1J�� � �$b�\`�$b�$b�c�c�c�#'���v�;�;�"�,�,�&)�h�h�/i�/i�/i�/i�u�Q�PS�TV�X[�\b�Xc�Xc�Pd�Pd�fg�Gh�Gh�/i�/i�/i�&j�&j�G�G�&^�c�&�k�k�Q�>N�>N�v�b�c�c�{�{�T\�&^�&^�G�#*�'.�$/�$�$6��$<�$'�13�-/�,.�(,�*.�,8�+=�-=�+F�(N��(N�(N��(N�(N�<�<�� 7�v� 7� 7�8�8�$%8�v�$7�$7� �#,�9<�Y���"�9L�9L�y��"��~�~�R[�$(�$'�13�-/�,.�(,�*.�,?�+=�-1�+=�(@��(@�(@�.�.�� �*��c@ ��B�*�,>�?� ?� ?� ?� �L�L�=�S��V�V�=�=� >� >� >� >� >� >� >� >����� ?�����s�NN)�)O3�?*O.�.O3)r N)r.� __module__� __qualname__�__doc__�floatrrrrrr#r'rr5r6r7r8r9r,r(r"r r s{������S�S���U���� ��QU�VZ�[^�`c�[c�Vd�Qe�����@ I� I�� I�H�S�M� I�]a�bf�gj�lo�go�bp�]q� I� I� I� I�0�E�0��� �0�RV�WZ�\`�ad�fi�ai�\j�Wj�Rk�0�0�0�0�dU�%�U�h�s�m�U�PT�UX�Z^�_b�dg�_g�Zh�Uh�Pi�U�U�U�U�nz��z�H�S�M�z�VZ�[^�`d�eh�jm�em�`n�[n�Vo�z�z�z�z�xU�%�U�h�s�m�U�PT�UX�Z^�_b�dg�_g�Zh�Uh�Pi�U�U�U�U�nF�E�F��� �F�RV�WZ�\`�ad�fi�ai�\j�Wj�Rk�F�F�F�F�Pr�u�r�8�C�=�r�UY�Z]�_c�dg�il�dl�_m�Zm�Un�r�r�r�r�r�rr(r )r��logging�platformrkro�time�osr%�typingrrrr�app.utils.bluetooth_utilsrr�app.data.mac_prefixesr � getLoggerr.r�systemrr �windows_scannerr,r(r"�<module>r�s���������������� � � � � � � � � � � � �����,�,�,�,�,�,�,�,�,�,�,�,�7�7�7�7�7�7�>�>�>�>�>�>�1�1�1�1�1�1� �� �8� $� $���X�_� � �)� +� �G �G �G �G �G �G �G �G �T#�"�$�$���r(

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Hypijump31/bluetooth-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server