mcp-windows 0.0.1__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,10 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
@@ -0,0 +1 @@
1
+ 3.13
@@ -0,0 +1,84 @@
1
+ Metadata-Version: 2.4
2
+ Name: mcp-windows
3
+ Version: 0.0.1
4
+ Summary: Add your description here
5
+ Author-email: TerminalMan <84923604+SecretiveShell@users.noreply.github.com>
6
+ Requires-Python: >=3.13
7
+ Requires-Dist: fastmcp>=2.2.0
8
+ Requires-Dist: mcp>=1.6.0
9
+ Requires-Dist: psutil>=7.0.0
10
+ Requires-Dist: pywin32>=310
11
+ Requires-Dist: winrt-runtime>=3.1.0
12
+ Requires-Dist: winrt-windows-data-xml-dom>=3.1.0
13
+ Requires-Dist: winrt-windows-foundation-collections>=3.1.0
14
+ Requires-Dist: winrt-windows-foundation>=3.1.0
15
+ Requires-Dist: winrt-windows-media-control>=3.1.0
16
+ Requires-Dist: winrt-windows-ui-notifications>=3.1.0
17
+ Description-Content-Type: text/markdown
18
+
19
+ # mcp-windows
20
+
21
+ MCP server for the windows API.
22
+
23
+ ## Installation
24
+
25
+ add this to your claude mcp config:
26
+
27
+ ```json
28
+ {
29
+ "mcpServers": {
30
+ "windows": {
31
+ "command": "uvx",
32
+ "args": [
33
+ "mcp-windows"
34
+ ]
35
+ }
36
+ }
37
+ }
38
+
39
+ or locally:
40
+
41
+ ```json
42
+ {
43
+ "mcpServers": {
44
+ "windows": {
45
+ "command": "uv",
46
+ "args": [
47
+ "--directory",
48
+ "C:\\Users\\{name}\\Documents\\mcp-windows",
49
+ "run",
50
+ "mcp-windows"
51
+ ]
52
+ }
53
+ }
54
+ }
55
+ ```
56
+
57
+ ## Features
58
+
59
+ ### Media
60
+
61
+ - get_media_sessions
62
+ - pause
63
+ - play
64
+
65
+ ### Notifications
66
+
67
+ - send_toast
68
+
69
+ ### Window Management
70
+
71
+ - get_foreground_window_info
72
+ - get_window_list
73
+ - focus_window
74
+ - close_window
75
+ - minimize_window
76
+
77
+ ### Monitors
78
+
79
+ - sleep_monitors
80
+ - wake_monitors
81
+
82
+ ## License
83
+
84
+ MIT
@@ -0,0 +1,66 @@
1
+ # mcp-windows
2
+
3
+ MCP server for the windows API.
4
+
5
+ ## Installation
6
+
7
+ add this to your claude mcp config:
8
+
9
+ ```json
10
+ {
11
+ "mcpServers": {
12
+ "windows": {
13
+ "command": "uvx",
14
+ "args": [
15
+ "mcp-windows"
16
+ ]
17
+ }
18
+ }
19
+ }
20
+
21
+ or locally:
22
+
23
+ ```json
24
+ {
25
+ "mcpServers": {
26
+ "windows": {
27
+ "command": "uv",
28
+ "args": [
29
+ "--directory",
30
+ "C:\\Users\\{name}\\Documents\\mcp-windows",
31
+ "run",
32
+ "mcp-windows"
33
+ ]
34
+ }
35
+ }
36
+ }
37
+ ```
38
+
39
+ ## Features
40
+
41
+ ### Media
42
+
43
+ - get_media_sessions
44
+ - pause
45
+ - play
46
+
47
+ ### Notifications
48
+
49
+ - send_toast
50
+
51
+ ### Window Management
52
+
53
+ - get_foreground_window_info
54
+ - get_window_list
55
+ - focus_window
56
+ - close_window
57
+ - minimize_window
58
+
59
+ ### Monitors
60
+
61
+ - sleep_monitors
62
+ - wake_monitors
63
+
64
+ ## License
65
+
66
+ MIT
@@ -0,0 +1,28 @@
1
+ [project]
2
+ name = "mcp-windows"
3
+ version = "0.0.1"
4
+ description = "Add your description here"
5
+ readme = "README.md"
6
+ authors = [
7
+ { name = "TerminalMan", email = "84923604+SecretiveShell@users.noreply.github.com" }
8
+ ]
9
+ requires-python = ">=3.13"
10
+ dependencies = [
11
+ "fastmcp>=2.2.0",
12
+ "mcp>=1.6.0",
13
+ "psutil>=7.0.0",
14
+ "pywin32>=310",
15
+ "winrt-runtime>=3.1.0",
16
+ "winrt-windows-data-xml-dom>=3.1.0",
17
+ "winrt-windows-foundation>=3.1.0",
18
+ "winrt-windows-foundation-collections>=3.1.0",
19
+ "winrt-windows-media-control>=3.1.0",
20
+ "winrt-windows-ui-notifications>=3.1.0",
21
+ ]
22
+
23
+ [project.scripts]
24
+ mcp-windows = "mcp_windows:main"
25
+
26
+ [build-system]
27
+ requires = ["hatchling"]
28
+ build-backend = "hatchling.build"
@@ -0,0 +1,4 @@
1
+ from mcp_windows.main import mcp
2
+
3
+ def main() -> None:
4
+ mcp.run("stdio")
@@ -0,0 +1,34 @@
1
+ """this script registers a start menu shortcut for the MCP Windows app with a custom AppUserModelID.
2
+ This is necessary for the app to be able to send windows toast notifications due to some legacy UWP API
3
+ limitations.
4
+
5
+ If you press the windows key and type "mcp" in the start menu, you should see the MCP Windows app icon."""
6
+
7
+ import os
8
+ import sys
9
+ from win32com.client import Dispatch
10
+ import pythoncom
11
+
12
+ APP_ID = "mcp-windows"
13
+ SHORTCUT_PATH = os.path.join(
14
+ os.environ["APPDATA"],
15
+ r"Microsoft\Windows\Start Menu\Programs\MCP Windows.lnk"
16
+ )
17
+
18
+ STGM_READWRITE = 0x00000002
19
+
20
+ def register_app_id():
21
+ shell = Dispatch("WScript.Shell")
22
+ shortcut = shell.CreateShortcut(SHORTCUT_PATH)
23
+ shortcut.TargetPath = sys.executable
24
+ shortcut.WorkingDirectory = os.getcwd()
25
+ shortcut.IconLocation = sys.executable
26
+ shortcut.Save()
27
+
28
+ # Add AppUserModelID
29
+ from win32com.propsys import propsys, pscon
30
+ property_store = propsys.SHGetPropertyStoreFromParsingName(SHORTCUT_PATH, None, STGM_READWRITE)
31
+ property_store.SetValue(pscon.PKEY_AppUserModel_ID, propsys.PROPVARIANTType(APP_ID, pythoncom.VT_LPWSTR))
32
+ property_store.Commit()
33
+
34
+ register_app_id()
@@ -0,0 +1,18 @@
1
+ from fastmcp import FastMCP
2
+ from os import environ
3
+
4
+ from mcp_windows.media import mcp as media_mcp
5
+ from mcp_windows.notifications import mcp as notifications_mcp
6
+ from mcp_windows.window_management import mcp as window_management_mcp
7
+ from mcp_windows.monitors import mcp as monitors_mcp
8
+
9
+ sep = environ.get("FASTMCP_TOOL_SEPARATOR", "_")
10
+
11
+ mcp: FastMCP = FastMCP(
12
+ name="windows",
13
+ )
14
+
15
+ mcp.mount("media", media_mcp, tool_separator=sep)
16
+ mcp.mount("notifications", notifications_mcp, tool_separator=sep)
17
+ mcp.mount("window_management", window_management_mcp, tool_separator=sep)
18
+ mcp.mount("monitors", monitors_mcp, tool_separator=sep)
@@ -0,0 +1,70 @@
1
+ import json
2
+ from fastmcp import FastMCP
3
+ from winrt.windows.media.control import GlobalSystemMediaTransportControlsSessionManager as MediaManager, GlobalSystemMediaTransportControlsSessionMediaProperties as MediaProperties
4
+ from winrt.windows.foundation import IAsyncOperation
5
+
6
+ mcp: FastMCP = FastMCP(
7
+ name="Media",
8
+ )
9
+
10
+ @mcp.tool("get_media_sessions")
11
+ async def get_media_sessions() -> str:
12
+ """List all media playback sessions using windows media control API."""
13
+
14
+ manager_op: IAsyncOperation = MediaManager.request_async()
15
+ manager = await manager_op
16
+ sessions = manager.get_sessions()
17
+
18
+ output = {}
19
+ for session in sessions:
20
+ props_op = session.try_get_media_properties_async()
21
+ props: MediaProperties = await props_op
22
+ app_id = session.source_app_user_model_id
23
+
24
+ output[app_id] = {
25
+ "title": props.title or "unknown",
26
+ "artist": props.artist or "unknown",
27
+ "album_title": props.album_title or "unknown",
28
+ }
29
+
30
+ return json.dumps(output)
31
+
32
+ @mcp.tool("pause")
33
+ async def pause(app_id: str) -> str:
34
+ """Pause the media playback for a given app_id using windows media control API."""
35
+
36
+ manager_op: IAsyncOperation[MediaManager] = \
37
+ MediaManager.request_async()
38
+ manager: MediaManager = await manager_op
39
+
40
+ sessions = manager.get_sessions()
41
+ for session in sessions:
42
+ if session.source_app_user_model_id.lower() == app_id.lower():
43
+ playback_info = session.get_playback_info()
44
+ if playback_info.controls.is_pause_enabled:
45
+ await session.try_pause_async()
46
+ return "Paused"
47
+ else:
48
+ return "Pause not available"
49
+
50
+ return "Session not found"
51
+
52
+ @mcp.tool("play")
53
+ async def play(app_id: str) -> str:
54
+ """Play the media playback for a given app_id using windows media control API."""
55
+
56
+ manager_op: IAsyncOperation[MediaManager] = \
57
+ MediaManager.request_async()
58
+ manager: MediaManager = await manager_op
59
+
60
+ sessions = manager.get_sessions()
61
+ for session in sessions:
62
+ if session.source_app_user_model_id.lower() == app_id.lower():
63
+ playback_info = session.get_playback_info()
64
+ if playback_info.controls.is_play_enabled:
65
+ await session.try_play_async()
66
+ return "Playing"
67
+ else:
68
+ return "Play not available"
69
+
70
+ return "Session not found"
@@ -0,0 +1,35 @@
1
+ import ctypes
2
+ import win32con
3
+ import win32gui
4
+
5
+ from fastmcp import FastMCP
6
+
7
+ mcp: FastMCP = FastMCP(
8
+ name="monitors",
9
+ )
10
+
11
+ @mcp.tool("sleep_monitors")
12
+ async def sleep_monitors() -> str:
13
+ """Put all monitors to sleep."""
14
+ try:
15
+ ctypes.windll.user32.SendMessageW(
16
+ win32con.HWND_BROADCAST,
17
+ win32con.WM_SYSCOMMAND,
18
+ win32con.SC_MONITORPOWER,
19
+ 2 # 2 = power off
20
+ )
21
+ return "Monitors put to sleep"
22
+ except Exception as e:
23
+ return f"Failed to sleep monitors: {type(e).__name__}: {e}"
24
+
25
+ @mcp.tool("wake_monitors")
26
+ async def wake_monitors() -> str:
27
+ """Wake up sleeping monitors."""
28
+ try:
29
+ # This is dumb, but moving the mouse 1px wakes monitors
30
+ x, y = win32gui.GetCursorPos()
31
+ ctypes.windll.user32.SetCursorPos(x, y + 1)
32
+ ctypes.windll.user32.SetCursorPos(x, y)
33
+ return "Monitors woken up"
34
+ except Exception as e:
35
+ return f"Failed to wake monitors: {type(e).__name__}: {e}"
@@ -0,0 +1,38 @@
1
+ import asyncio
2
+ from fastmcp import FastMCP
3
+
4
+ from mcp_windows.appid import APP_ID
5
+
6
+ from winrt.windows.ui.notifications import ToastNotificationManager, ToastNotification
7
+ from winrt.windows.data.xml.dom import XmlDocument
8
+
9
+ mcp: FastMCP = FastMCP(
10
+ name="notifications",
11
+ )
12
+
13
+ @mcp.tool("send_toast")
14
+ async def send_toast(title: str, message: str) -> str:
15
+ """Send a windows toast notification to the user."""
16
+
17
+
18
+ toast_xml_string = f"""
19
+ <toast>
20
+ <visual>
21
+ <binding template="ToastGeneric">
22
+ <text>{title}</text>
23
+ <text>{message}</text>
24
+ </binding>
25
+ </visual>
26
+ </toast>
27
+ """
28
+
29
+ xml_doc = XmlDocument()
30
+ xml_doc.load_xml(toast_xml_string)
31
+
32
+ toast = ToastNotification(xml_doc)
33
+
34
+ notifier = ToastNotificationManager.create_toast_notifier_with_id(APP_ID)
35
+
36
+ notifier.show(toast)
37
+
38
+ return "Toast notification sent"
@@ -0,0 +1,140 @@
1
+ import asyncio
2
+ import json
3
+ import win32gui
4
+ import win32con
5
+ import win32process
6
+ import win32api
7
+ import psutil
8
+
9
+ from fastmcp import FastMCP
10
+
11
+ mcp: FastMCP = FastMCP(
12
+ name="window_management"
13
+ )
14
+
15
+ def get_process_info(pid: int) -> dict:
16
+ try:
17
+ proc = psutil.Process(pid)
18
+ return {
19
+ "pid": pid,
20
+ "exe": proc.name(),
21
+ }
22
+ except psutil.NoSuchProcess:
23
+ return {
24
+ "pid": pid,
25
+ "exe": "<terminated>"
26
+ }
27
+
28
+ @mcp.tool("get_foreground_window_info")
29
+ async def get_foreground_window_info() -> str:
30
+ """Return information about the currently focused (foreground) window."""
31
+ hwnd = win32gui.GetForegroundWindow()
32
+ if hwnd == 0:
33
+ return json.dumps({"error": "No active window"})
34
+
35
+ _, pid = win32process.GetWindowThreadProcessId(hwnd)
36
+ info = get_process_info(pid)
37
+ info.update({
38
+ "hwnd": hwnd,
39
+ "title": win32gui.GetWindowText(hwnd),
40
+ "class": win32gui.GetClassName(hwnd),
41
+ })
42
+ return json.dumps(info, ensure_ascii=False)
43
+
44
+ @mcp.tool("get_window_list")
45
+ async def list_open_windows() -> str:
46
+ """Return a list of all top-level visible windows."""
47
+ windows = []
48
+
49
+ def callback(hwnd, _):
50
+ if win32gui.IsWindowVisible(hwnd) and win32gui.GetWindowText(hwnd):
51
+ _, pid = win32process.GetWindowThreadProcessId(hwnd)
52
+ info = get_process_info(pid)
53
+ info.update({
54
+ "hwnd": hwnd,
55
+ "title": win32gui.GetWindowText(hwnd),
56
+ "class": win32gui.GetClassName(hwnd),
57
+ })
58
+ windows.append(info)
59
+
60
+ win32gui.EnumWindows(callback, None)
61
+ return json.dumps(windows, ensure_ascii=False)
62
+
63
+ @mcp.tool("focus_window")
64
+ async def focus_window(hwnd: int) -> str:
65
+ """Force focus a window using all known safe tricks (thread attach, fake input, fallback restore)."""
66
+ try:
67
+ hwnd = int(hwnd)
68
+
69
+ if not win32gui.IsWindow(hwnd):
70
+ return "Invalid HWND"
71
+
72
+ # Step 1: Only restore if minimized (prevent resizing)
73
+ if win32gui.IsIconic(hwnd):
74
+ win32gui.ShowWindow(hwnd, win32con.SW_RESTORE)
75
+
76
+ # Step 2: Try normal focus via thread attach
77
+ fg_hwnd = win32gui.GetForegroundWindow()
78
+ fg_thread = win32process.GetWindowThreadProcessId(fg_hwnd)[0]
79
+ current_thread = win32api.GetCurrentThreadId()
80
+
81
+ if fg_thread != current_thread:
82
+ win32process.AttachThreadInput(fg_thread, current_thread, True)
83
+
84
+ try:
85
+ win32gui.SetForegroundWindow(hwnd)
86
+ except Exception:
87
+ pass
88
+
89
+ if fg_thread != current_thread:
90
+ win32process.AttachThreadInput(fg_thread, current_thread, False)
91
+
92
+ # Step 3: Check if it worked
93
+ if win32gui.GetForegroundWindow() == hwnd:
94
+ return "Focused window successfully"
95
+
96
+ # Step 4: Fallback — simulate user input (to defeat foreground lock)
97
+ win32api.keybd_event(0, 0, 0, 0)
98
+ await asyncio.sleep(0.05)
99
+
100
+ # Step 5: Try again
101
+ try:
102
+ win32gui.SetForegroundWindow(hwnd)
103
+ except Exception:
104
+ pass
105
+
106
+ if win32gui.GetForegroundWindow() == hwnd:
107
+ return "Focused window (after simulating input)"
108
+
109
+ # Step 6: Hard fallback — minimize + restore
110
+ win32gui.ShowWindow(hwnd, win32con.SW_MINIMIZE)
111
+ await asyncio.sleep(0.2)
112
+ win32gui.ShowWindow(hwnd, win32con.SW_RESTORE)
113
+ win32gui.SetForegroundWindow(hwnd)
114
+
115
+ if win32gui.GetForegroundWindow() == hwnd:
116
+ return "Focused window (after minimize/restore trick)"
117
+
118
+ return "Could not focus window: OS restrictions"
119
+
120
+ except Exception as e:
121
+ return f"Could not focus window: {type(e).__name__}: {e}"
122
+
123
+
124
+ @mcp.tool("close_window")
125
+ async def close_window(hwnd: int) -> str:
126
+ """Close the specified window."""
127
+ try:
128
+ win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)
129
+ return "Closed window"
130
+ except Exception as e:
131
+ return f"Could not close window: {type(e).__name__}: {e}"
132
+
133
+ @mcp.tool("minimize_window")
134
+ async def minimize_window(hwnd: int) -> str:
135
+ """Minimize the specified window."""
136
+ try:
137
+ win32gui.ShowWindow(hwnd, win32con.SW_MINIMIZE)
138
+ return "Minimized window"
139
+ except Exception as e:
140
+ return f"Could not minimize window: {type(e).__name__}: {e}"
@@ -0,0 +1,540 @@
1
+ version = 1
2
+ requires-python = ">=3.13"
3
+
4
+ [[package]]
5
+ name = "annotated-types"
6
+ version = "0.7.0"
7
+ source = { registry = "https://pypi.org/simple" }
8
+ sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 }
9
+ wheels = [
10
+ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 },
11
+ ]
12
+
13
+ [[package]]
14
+ name = "anyio"
15
+ version = "4.9.0"
16
+ source = { registry = "https://pypi.org/simple" }
17
+ dependencies = [
18
+ { name = "idna" },
19
+ { name = "sniffio" },
20
+ ]
21
+ sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949 }
22
+ wheels = [
23
+ { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916 },
24
+ ]
25
+
26
+ [[package]]
27
+ name = "certifi"
28
+ version = "2025.1.31"
29
+ source = { registry = "https://pypi.org/simple" }
30
+ sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 }
31
+ wheels = [
32
+ { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 },
33
+ ]
34
+
35
+ [[package]]
36
+ name = "click"
37
+ version = "8.1.8"
38
+ source = { registry = "https://pypi.org/simple" }
39
+ dependencies = [
40
+ { name = "colorama", marker = "sys_platform == 'win32'" },
41
+ ]
42
+ sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 }
43
+ wheels = [
44
+ { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 },
45
+ ]
46
+
47
+ [[package]]
48
+ name = "colorama"
49
+ version = "0.4.6"
50
+ source = { registry = "https://pypi.org/simple" }
51
+ sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 }
52
+ wheels = [
53
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
54
+ ]
55
+
56
+ [[package]]
57
+ name = "dotenv"
58
+ version = "0.9.9"
59
+ source = { registry = "https://pypi.org/simple" }
60
+ dependencies = [
61
+ { name = "python-dotenv" },
62
+ ]
63
+ wheels = [
64
+ { url = "https://files.pythonhosted.org/packages/b2/b7/545d2c10c1fc15e48653c91efde329a790f2eecfbbf2bd16003b5db2bab0/dotenv-0.9.9-py2.py3-none-any.whl", hash = "sha256:29cf74a087b31dafdb5a446b6d7e11cbce8ed2741540e2339c69fbef92c94ce9", size = 1892 },
65
+ ]
66
+
67
+ [[package]]
68
+ name = "exceptiongroup"
69
+ version = "1.2.2"
70
+ source = { registry = "https://pypi.org/simple" }
71
+ sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 }
72
+ wheels = [
73
+ { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 },
74
+ ]
75
+
76
+ [[package]]
77
+ name = "fastmcp"
78
+ version = "2.2.0"
79
+ source = { registry = "https://pypi.org/simple" }
80
+ dependencies = [
81
+ { name = "dotenv" },
82
+ { name = "exceptiongroup" },
83
+ { name = "httpx" },
84
+ { name = "mcp" },
85
+ { name = "openapi-pydantic" },
86
+ { name = "rich" },
87
+ { name = "typer" },
88
+ { name = "websockets" },
89
+ ]
90
+ sdist = { url = "https://files.pythonhosted.org/packages/e8/5f/0ad05fb3cca4529a994a7446da554c0ecf2a91bcf3a076261e29b5043ff1/fastmcp-2.2.0.tar.gz", hash = "sha256:4d9373705ebd9e3de807005ed732b8955c6eb74e4b47595752f461c1c689f231", size = 918342 }
91
+ wheels = [
92
+ { url = "https://files.pythonhosted.org/packages/69/1d/266a86204e658d9133382e7f260d4cabb75fb18ac2e03efc953e25ebe20f/fastmcp-2.2.0-py3-none-any.whl", hash = "sha256:077bdf3f37f423688f1356db0f6ed0864e001de712bce41ad4939fa8b38d7149", size = 75793 },
93
+ ]
94
+
95
+ [[package]]
96
+ name = "h11"
97
+ version = "0.14.0"
98
+ source = { registry = "https://pypi.org/simple" }
99
+ sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 }
100
+ wheels = [
101
+ { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 },
102
+ ]
103
+
104
+ [[package]]
105
+ name = "httpcore"
106
+ version = "1.0.8"
107
+ source = { registry = "https://pypi.org/simple" }
108
+ dependencies = [
109
+ { name = "certifi" },
110
+ { name = "h11" },
111
+ ]
112
+ sdist = { url = "https://files.pythonhosted.org/packages/9f/45/ad3e1b4d448f22c0cff4f5692f5ed0666658578e358b8d58a19846048059/httpcore-1.0.8.tar.gz", hash = "sha256:86e94505ed24ea06514883fd44d2bc02d90e77e7979c8eb71b90f41d364a1bad", size = 85385 }
113
+ wheels = [
114
+ { url = "https://files.pythonhosted.org/packages/18/8d/f052b1e336bb2c1fc7ed1aaed898aa570c0b61a09707b108979d9fc6e308/httpcore-1.0.8-py3-none-any.whl", hash = "sha256:5254cf149bcb5f75e9d1b2b9f729ea4a4b883d1ad7379fc632b727cec23674be", size = 78732 },
115
+ ]
116
+
117
+ [[package]]
118
+ name = "httpx"
119
+ version = "0.28.1"
120
+ source = { registry = "https://pypi.org/simple" }
121
+ dependencies = [
122
+ { name = "anyio" },
123
+ { name = "certifi" },
124
+ { name = "httpcore" },
125
+ { name = "idna" },
126
+ ]
127
+ sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 }
128
+ wheels = [
129
+ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 },
130
+ ]
131
+
132
+ [[package]]
133
+ name = "httpx-sse"
134
+ version = "0.4.0"
135
+ source = { registry = "https://pypi.org/simple" }
136
+ sdist = { url = "https://files.pythonhosted.org/packages/4c/60/8f4281fa9bbf3c8034fd54c0e7412e66edbab6bc74c4996bd616f8d0406e/httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721", size = 12624 }
137
+ wheels = [
138
+ { url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f", size = 7819 },
139
+ ]
140
+
141
+ [[package]]
142
+ name = "idna"
143
+ version = "3.10"
144
+ source = { registry = "https://pypi.org/simple" }
145
+ sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 }
146
+ wheels = [
147
+ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
148
+ ]
149
+
150
+ [[package]]
151
+ name = "markdown-it-py"
152
+ version = "3.0.0"
153
+ source = { registry = "https://pypi.org/simple" }
154
+ dependencies = [
155
+ { name = "mdurl" },
156
+ ]
157
+ sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 }
158
+ wheels = [
159
+ { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 },
160
+ ]
161
+
162
+ [[package]]
163
+ name = "mcp"
164
+ version = "1.6.0"
165
+ source = { registry = "https://pypi.org/simple" }
166
+ dependencies = [
167
+ { name = "anyio" },
168
+ { name = "httpx" },
169
+ { name = "httpx-sse" },
170
+ { name = "pydantic" },
171
+ { name = "pydantic-settings" },
172
+ { name = "sse-starlette" },
173
+ { name = "starlette" },
174
+ { name = "uvicorn" },
175
+ ]
176
+ sdist = { url = "https://files.pythonhosted.org/packages/95/d2/f587cb965a56e992634bebc8611c5b579af912b74e04eb9164bd49527d21/mcp-1.6.0.tar.gz", hash = "sha256:d9324876de2c5637369f43161cd71eebfd803df5a95e46225cab8d280e366723", size = 200031 }
177
+ wheels = [
178
+ { url = "https://files.pythonhosted.org/packages/10/30/20a7f33b0b884a9d14dd3aa94ff1ac9da1479fe2ad66dd9e2736075d2506/mcp-1.6.0-py3-none-any.whl", hash = "sha256:7bd24c6ea042dbec44c754f100984d186620d8b841ec30f1b19eda9b93a634d0", size = 76077 },
179
+ ]
180
+
181
+ [[package]]
182
+ name = "mcp-windows"
183
+ version = "0.0.1"
184
+ source = { editable = "." }
185
+ dependencies = [
186
+ { name = "fastmcp" },
187
+ { name = "mcp" },
188
+ { name = "psutil" },
189
+ { name = "pywin32" },
190
+ { name = "winrt-runtime" },
191
+ { name = "winrt-windows-data-xml-dom" },
192
+ { name = "winrt-windows-foundation" },
193
+ { name = "winrt-windows-foundation-collections" },
194
+ { name = "winrt-windows-media-control" },
195
+ { name = "winrt-windows-ui-notifications" },
196
+ ]
197
+
198
+ [package.metadata]
199
+ requires-dist = [
200
+ { name = "fastmcp", specifier = ">=2.2.0" },
201
+ { name = "mcp", specifier = ">=1.6.0" },
202
+ { name = "psutil", specifier = ">=7.0.0" },
203
+ { name = "pywin32", specifier = ">=310" },
204
+ { name = "winrt-runtime", specifier = ">=3.1.0" },
205
+ { name = "winrt-windows-data-xml-dom", specifier = ">=3.1.0" },
206
+ { name = "winrt-windows-foundation", specifier = ">=3.1.0" },
207
+ { name = "winrt-windows-foundation-collections", specifier = ">=3.1.0" },
208
+ { name = "winrt-windows-media-control", specifier = ">=3.1.0" },
209
+ { name = "winrt-windows-ui-notifications", specifier = ">=3.1.0" },
210
+ ]
211
+
212
+ [[package]]
213
+ name = "mdurl"
214
+ version = "0.1.2"
215
+ source = { registry = "https://pypi.org/simple" }
216
+ sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 }
217
+ wheels = [
218
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 },
219
+ ]
220
+
221
+ [[package]]
222
+ name = "openapi-pydantic"
223
+ version = "0.5.1"
224
+ source = { registry = "https://pypi.org/simple" }
225
+ dependencies = [
226
+ { name = "pydantic" },
227
+ ]
228
+ sdist = { url = "https://files.pythonhosted.org/packages/02/2e/58d83848dd1a79cb92ed8e63f6ba901ca282c5f09d04af9423ec26c56fd7/openapi_pydantic-0.5.1.tar.gz", hash = "sha256:ff6835af6bde7a459fb93eb93bb92b8749b754fc6e51b2f1590a19dc3005ee0d", size = 60892 }
229
+ wheels = [
230
+ { url = "https://files.pythonhosted.org/packages/12/cf/03675d8bd8ecbf4445504d8071adab19f5f993676795708e36402ab38263/openapi_pydantic-0.5.1-py3-none-any.whl", hash = "sha256:a3a09ef4586f5bd760a8df7f43028b60cafb6d9f61de2acba9574766255ab146", size = 96381 },
231
+ ]
232
+
233
+ [[package]]
234
+ name = "psutil"
235
+ version = "7.0.0"
236
+ source = { registry = "https://pypi.org/simple" }
237
+ sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003 }
238
+ wheels = [
239
+ { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051 },
240
+ { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535 },
241
+ { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004 },
242
+ { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986 },
243
+ { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544 },
244
+ { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053 },
245
+ { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 },
246
+ ]
247
+
248
+ [[package]]
249
+ name = "pydantic"
250
+ version = "2.11.3"
251
+ source = { registry = "https://pypi.org/simple" }
252
+ dependencies = [
253
+ { name = "annotated-types" },
254
+ { name = "pydantic-core" },
255
+ { name = "typing-extensions" },
256
+ { name = "typing-inspection" },
257
+ ]
258
+ sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513 }
259
+ wheels = [
260
+ { url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591 },
261
+ ]
262
+
263
+ [[package]]
264
+ name = "pydantic-core"
265
+ version = "2.33.1"
266
+ source = { registry = "https://pypi.org/simple" }
267
+ dependencies = [
268
+ { name = "typing-extensions" },
269
+ ]
270
+ sdist = { url = "https://files.pythonhosted.org/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", size = 434395 }
271
+ wheels = [
272
+ { url = "https://files.pythonhosted.org/packages/7a/24/eed3466a4308d79155f1cdd5c7432c80ddcc4530ba8623b79d5ced021641/pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", size = 2033551 },
273
+ { url = "https://files.pythonhosted.org/packages/ab/14/df54b1a0bc9b6ded9b758b73139d2c11b4e8eb43e8ab9c5847c0a2913ada/pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", size = 1852785 },
274
+ { url = "https://files.pythonhosted.org/packages/fa/96/e275f15ff3d34bb04b0125d9bc8848bf69f25d784d92a63676112451bfb9/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", size = 1897758 },
275
+ { url = "https://files.pythonhosted.org/packages/b7/d8/96bc536e975b69e3a924b507d2a19aedbf50b24e08c80fb00e35f9baaed8/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", size = 1986109 },
276
+ { url = "https://files.pythonhosted.org/packages/90/72/ab58e43ce7e900b88cb571ed057b2fcd0e95b708a2e0bed475b10130393e/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", size = 2129159 },
277
+ { url = "https://files.pythonhosted.org/packages/dc/3f/52d85781406886c6870ac995ec0ba7ccc028b530b0798c9080531b409fdb/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", size = 2680222 },
278
+ { url = "https://files.pythonhosted.org/packages/f4/56/6e2ef42f363a0eec0fd92f74a91e0ac48cd2e49b695aac1509ad81eee86a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", size = 2006980 },
279
+ { url = "https://files.pythonhosted.org/packages/4c/c0/604536c4379cc78359f9ee0aa319f4aedf6b652ec2854953f5a14fc38c5a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", size = 2120840 },
280
+ { url = "https://files.pythonhosted.org/packages/1f/46/9eb764814f508f0edfb291a0f75d10854d78113fa13900ce13729aaec3ae/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", size = 2072518 },
281
+ { url = "https://files.pythonhosted.org/packages/42/e3/fb6b2a732b82d1666fa6bf53e3627867ea3131c5f39f98ce92141e3e3dc1/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", size = 2248025 },
282
+ { url = "https://files.pythonhosted.org/packages/5c/9d/fbe8fe9d1aa4dac88723f10a921bc7418bd3378a567cb5e21193a3c48b43/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", size = 2254991 },
283
+ { url = "https://files.pythonhosted.org/packages/aa/99/07e2237b8a66438d9b26482332cda99a9acccb58d284af7bc7c946a42fd3/pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", size = 1915262 },
284
+ { url = "https://files.pythonhosted.org/packages/8a/f4/e457a7849beeed1e5defbcf5051c6f7b3c91a0624dd31543a64fc9adcf52/pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", size = 1956626 },
285
+ { url = "https://files.pythonhosted.org/packages/20/d0/e8d567a7cff7b04e017ae164d98011f1e1894269fe8e90ea187a3cbfb562/pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", size = 1909590 },
286
+ { url = "https://files.pythonhosted.org/packages/ef/fd/24ea4302d7a527d672c5be06e17df16aabfb4e9fdc6e0b345c21580f3d2a/pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", size = 1812963 },
287
+ { url = "https://files.pythonhosted.org/packages/5f/95/4fbc2ecdeb5c1c53f1175a32d870250194eb2fdf6291b795ab08c8646d5d/pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", size = 1986896 },
288
+ { url = "https://files.pythonhosted.org/packages/71/ae/fe31e7f4a62431222d8f65a3bd02e3fa7e6026d154a00818e6d30520ea77/pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", size = 1931810 },
289
+ ]
290
+
291
+ [[package]]
292
+ name = "pydantic-settings"
293
+ version = "2.9.0"
294
+ source = { registry = "https://pypi.org/simple" }
295
+ dependencies = [
296
+ { name = "pydantic" },
297
+ { name = "python-dotenv" },
298
+ { name = "typing-inspection" },
299
+ ]
300
+ sdist = { url = "https://files.pythonhosted.org/packages/04/e3/ed51b456c7f2a299af624dd6096e7c96d6f65de06ee2f7fb5884072a2c86/pydantic_settings-2.9.0.tar.gz", hash = "sha256:24fd3fe19bc2c0eddeff91860dc5e303572b39fb70b1391c64955dd4d1875098", size = 163231 }
301
+ wheels = [
302
+ { url = "https://files.pythonhosted.org/packages/08/88/07f8aee46a05e6490c211ded648a2440eec6e96b9a40186de424ed253c31/pydantic_settings-2.9.0-py3-none-any.whl", hash = "sha256:4937fe39355b1f1f1e429e6695d68ce42501340d642c000447e48b1d9d418dfd", size = 44348 },
303
+ ]
304
+
305
+ [[package]]
306
+ name = "pygments"
307
+ version = "2.19.1"
308
+ source = { registry = "https://pypi.org/simple" }
309
+ sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 }
310
+ wheels = [
311
+ { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 },
312
+ ]
313
+
314
+ [[package]]
315
+ name = "python-dotenv"
316
+ version = "1.1.0"
317
+ source = { registry = "https://pypi.org/simple" }
318
+ sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920 }
319
+ wheels = [
320
+ { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256 },
321
+ ]
322
+
323
+ [[package]]
324
+ name = "pywin32"
325
+ version = "310"
326
+ source = { registry = "https://pypi.org/simple" }
327
+ wheels = [
328
+ { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384 },
329
+ { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039 },
330
+ { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152 },
331
+ ]
332
+
333
+ [[package]]
334
+ name = "rich"
335
+ version = "14.0.0"
336
+ source = { registry = "https://pypi.org/simple" }
337
+ dependencies = [
338
+ { name = "markdown-it-py" },
339
+ { name = "pygments" },
340
+ ]
341
+ sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 }
342
+ wheels = [
343
+ { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 },
344
+ ]
345
+
346
+ [[package]]
347
+ name = "shellingham"
348
+ version = "1.5.4"
349
+ source = { registry = "https://pypi.org/simple" }
350
+ sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 }
351
+ wheels = [
352
+ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 },
353
+ ]
354
+
355
+ [[package]]
356
+ name = "sniffio"
357
+ version = "1.3.1"
358
+ source = { registry = "https://pypi.org/simple" }
359
+ sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 }
360
+ wheels = [
361
+ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 },
362
+ ]
363
+
364
+ [[package]]
365
+ name = "sse-starlette"
366
+ version = "2.2.1"
367
+ source = { registry = "https://pypi.org/simple" }
368
+ dependencies = [
369
+ { name = "anyio" },
370
+ { name = "starlette" },
371
+ ]
372
+ sdist = { url = "https://files.pythonhosted.org/packages/71/a4/80d2a11af59fe75b48230846989e93979c892d3a20016b42bb44edb9e398/sse_starlette-2.2.1.tar.gz", hash = "sha256:54470d5f19274aeed6b2d473430b08b4b379ea851d953b11d7f1c4a2c118b419", size = 17376 }
373
+ wheels = [
374
+ { url = "https://files.pythonhosted.org/packages/d9/e0/5b8bd393f27f4a62461c5cf2479c75a2cc2ffa330976f9f00f5f6e4f50eb/sse_starlette-2.2.1-py3-none-any.whl", hash = "sha256:6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99", size = 10120 },
375
+ ]
376
+
377
+ [[package]]
378
+ name = "starlette"
379
+ version = "0.46.2"
380
+ source = { registry = "https://pypi.org/simple" }
381
+ dependencies = [
382
+ { name = "anyio" },
383
+ ]
384
+ sdist = { url = "https://files.pythonhosted.org/packages/ce/20/08dfcd9c983f6a6f4a1000d934b9e6d626cff8d2eeb77a89a68eef20a2b7/starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5", size = 2580846 }
385
+ wheels = [
386
+ { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037 },
387
+ ]
388
+
389
+ [[package]]
390
+ name = "typer"
391
+ version = "0.15.2"
392
+ source = { registry = "https://pypi.org/simple" }
393
+ dependencies = [
394
+ { name = "click" },
395
+ { name = "rich" },
396
+ { name = "shellingham" },
397
+ { name = "typing-extensions" },
398
+ ]
399
+ sdist = { url = "https://files.pythonhosted.org/packages/8b/6f/3991f0f1c7fcb2df31aef28e0594d8d54b05393a0e4e34c65e475c2a5d41/typer-0.15.2.tar.gz", hash = "sha256:ab2fab47533a813c49fe1f16b1a370fd5819099c00b119e0633df65f22144ba5", size = 100711 }
400
+ wheels = [
401
+ { url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl", hash = "sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc", size = 45061 },
402
+ ]
403
+
404
+ [[package]]
405
+ name = "typing-extensions"
406
+ version = "4.13.2"
407
+ source = { registry = "https://pypi.org/simple" }
408
+ sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967 }
409
+ wheels = [
410
+ { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806 },
411
+ ]
412
+
413
+ [[package]]
414
+ name = "typing-inspection"
415
+ version = "0.4.0"
416
+ source = { registry = "https://pypi.org/simple" }
417
+ dependencies = [
418
+ { name = "typing-extensions" },
419
+ ]
420
+ sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222 }
421
+ wheels = [
422
+ { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125 },
423
+ ]
424
+
425
+ [[package]]
426
+ name = "uvicorn"
427
+ version = "0.34.1"
428
+ source = { registry = "https://pypi.org/simple" }
429
+ dependencies = [
430
+ { name = "click" },
431
+ { name = "h11" },
432
+ ]
433
+ sdist = { url = "https://files.pythonhosted.org/packages/86/37/dd92f1f9cedb5eaf74d9999044306e06abe65344ff197864175dbbd91871/uvicorn-0.34.1.tar.gz", hash = "sha256:af981725fc4b7ffc5cb3b0e9eda6258a90c4b52cb2a83ce567ae0a7ae1757afc", size = 76755 }
434
+ wheels = [
435
+ { url = "https://files.pythonhosted.org/packages/5f/38/a5801450940a858c102a7ad9e6150146a25406a119851c993148d56ab041/uvicorn-0.34.1-py3-none-any.whl", hash = "sha256:984c3a8c7ca18ebaad15995ee7401179212c59521e67bfc390c07fa2b8d2e065", size = 62404 },
436
+ ]
437
+
438
+ [[package]]
439
+ name = "websockets"
440
+ version = "15.0.1"
441
+ source = { registry = "https://pypi.org/simple" }
442
+ sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016 }
443
+ wheels = [
444
+ { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440 },
445
+ { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098 },
446
+ { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329 },
447
+ { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111 },
448
+ { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054 },
449
+ { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496 },
450
+ { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829 },
451
+ { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217 },
452
+ { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195 },
453
+ { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393 },
454
+ { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837 },
455
+ { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743 },
456
+ ]
457
+
458
+ [[package]]
459
+ name = "winrt-runtime"
460
+ version = "3.1.0"
461
+ source = { registry = "https://pypi.org/simple" }
462
+ dependencies = [
463
+ { name = "typing-extensions" },
464
+ ]
465
+ sdist = { url = "https://files.pythonhosted.org/packages/1a/e3/eb3bd683e73e224214e3809b0100b97bf36cf0bf18119b47631a3ed59681/winrt_runtime-3.1.0.tar.gz", hash = "sha256:943d01a960a3d3c55da8c98eeb66ec801e2306c17fe70eaad3b97b2fd248368b", size = 19535 }
466
+ wheels = [
467
+ { url = "https://files.pythonhosted.org/packages/57/24/ca2192ae5b69c82fa624845fe8c63790edddd3992ea3d83e790ec5067b77/winrt_runtime-3.1.0-cp313-cp313-win32.whl", hash = "sha256:7d92db2810c2d6c7148c3817b7d57fc2b3e6c433d644a2097485d4c6dfd92cad", size = 205876 },
468
+ { url = "https://files.pythonhosted.org/packages/b4/a1/bc84e44a36a01b8633e59d7ea7994795f9d93bebe7080ab7f237f3006da2/winrt_runtime-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:378bfded5b8c20b34c0d68be317e05031b37d1c168c50afca40e7af6863934e0", size = 236867 },
469
+ { url = "https://files.pythonhosted.org/packages/32/53/117d97ec277c06494f3de67523634c9a5d846bc74b1a42162cc3e79c5f5f/winrt_runtime-3.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:ca3f4c728973194c6b07a18be25ba6d3eee08e6bf5bd6eaec4dee482be30811c", size = 411040 },
470
+ ]
471
+
472
+ [[package]]
473
+ name = "winrt-windows-data-xml-dom"
474
+ version = "3.1.0"
475
+ source = { registry = "https://pypi.org/simple" }
476
+ dependencies = [
477
+ { name = "winrt-runtime" },
478
+ ]
479
+ sdist = { url = "https://files.pythonhosted.org/packages/29/af/a2f6a48ae1acfde32a71a81139431c8f168d53daafe2ee0694e75a22a4eb/winrt_windows_data_xml_dom-3.1.0.tar.gz", hash = "sha256:0c73578e55c1b78bd815a31c898d187d15d109a6941d6ddd06cf9e03385b538a", size = 49929 }
480
+ wheels = [
481
+ { url = "https://files.pythonhosted.org/packages/1c/9b/8d19cf3a0a8704156c08cffcf29b2a2f6db17a30510b676dbdcea66342c3/winrt_windows_data_xml_dom-3.1.0-cp313-cp313-win32.whl", hash = "sha256:a03ccc90be458f09bd27fb7ceb58222f4c540ca2e2874ac94755770dc28f9d5a", size = 154835 },
482
+ { url = "https://files.pythonhosted.org/packages/76/5a/99b119d63a682476952ee345f978290854664a6fcb8e425f0ff564afc3cb/winrt_windows_data_xml_dom-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:cbf37bc5a6fac3d4890e08c838ce17225f477a9ae5c29fe56f34e190705d01f4", size = 184611 },
483
+ { url = "https://files.pythonhosted.org/packages/56/cf/39960b8183be0d333b3ddf9e6f64aeda5b8b4b289d98a166da57d7c82f6b/winrt_windows_data_xml_dom-3.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:124e8182b073d12a17b4ca7bce23892786fa9b77751915cd44b2e3b170638b00", size = 156376 },
484
+ ]
485
+
486
+ [[package]]
487
+ name = "winrt-windows-foundation"
488
+ version = "3.1.0"
489
+ source = { registry = "https://pypi.org/simple" }
490
+ dependencies = [
491
+ { name = "winrt-runtime" },
492
+ ]
493
+ sdist = { url = "https://files.pythonhosted.org/packages/62/b3/7ab7c1c9c7714a6de0ff0b774906a0211a1b5a4e9fbf6febfa4949a0c4ef/winrt_windows_foundation-3.1.0.tar.gz", hash = "sha256:3a2f9243b76fe093c74f8aad8cc3c7c93c6ec2a9498817058d85de0a2e9b083d", size = 30000 }
494
+ wheels = [
495
+ { url = "https://files.pythonhosted.org/packages/ba/c7/e913020310fbc5045f417d3dbde69996933e9a1de7e8eab85f5ff789edd7/winrt_windows_foundation-3.1.0-cp313-cp313-win32.whl", hash = "sha256:0a7770d76e0dfd00092c1a3a3ac33455e6aa4fd73b51fd16e787aa1202f31bef", size = 110283 },
496
+ { url = "https://files.pythonhosted.org/packages/b0/d0/8e293cd83e48c4edfe2cb39997344acf1215f90972358582947e155c74a9/winrt_windows_foundation-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:395fd880941ce04e2e089e02452e6e6c4c0b991ba1f5f1f4bbad50c2d30915f5", size = 118840 },
497
+ { url = "https://files.pythonhosted.org/packages/19/04/c17bcde5983c3355473d90eb3eab895f2b00ab1c75f8e7054dbf41515089/winrt_windows_foundation-3.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:c89b2076117de98848f5356fc16a97444eb0bcabbf2cae12534f6d40c2d6d6e0", size = 109327 },
498
+ ]
499
+
500
+ [[package]]
501
+ name = "winrt-windows-foundation-collections"
502
+ version = "3.1.0"
503
+ source = { registry = "https://pypi.org/simple" }
504
+ dependencies = [
505
+ { name = "winrt-runtime" },
506
+ ]
507
+ sdist = { url = "https://files.pythonhosted.org/packages/0b/82/af3055af2f40ee6a3c9a9418ffb8d33e6744ebe42714bc393ec3d44dfd2d/winrt_windows_foundation_collections-3.1.0.tar.gz", hash = "sha256:7ab521a42031f8f16898460f2b8efc151c1b7e88ccfb164f6412cce03af533a5", size = 15947 }
508
+ wheels = [
509
+ { url = "https://files.pythonhosted.org/packages/0f/ec/684b7e66fd1db9e26a4f7fad0d8e537a2e6a33a2890ecef104216f3fbeca/winrt_windows_foundation_collections-3.1.0-cp313-cp313-win32.whl", hash = "sha256:131a7a4ddde1699ea80d0f7da1610b0aaec719c46bbdbd2bd489d2cd8c7ba7e8", size = 59048 },
510
+ { url = "https://files.pythonhosted.org/packages/71/f7/eb6366862de443fdbcf64a7f18bbdff071445ec404e67d51ac394c2c309a/winrt_windows_foundation_collections-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:ee297077a573bc6ad17b731b326db1bf5818caa7d724b70104fe6bceceaeea12", size = 68064 },
511
+ { url = "https://files.pythonhosted.org/packages/d9/bc/c2f59ba029130de4b7023414d6abd47842a61e8dc5cf8ad01c07e0cce1f9/winrt_windows_foundation_collections-3.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:cd95c677dec999327627a9f324d9ee975f9e224107e74c3902aa83d06ca68a86", size = 57805 },
512
+ ]
513
+
514
+ [[package]]
515
+ name = "winrt-windows-media-control"
516
+ version = "3.1.0"
517
+ source = { registry = "https://pypi.org/simple" }
518
+ dependencies = [
519
+ { name = "winrt-runtime" },
520
+ ]
521
+ sdist = { url = "https://files.pythonhosted.org/packages/e8/a3/e44b0f02baab77d98dad75d86065fb37276d5e105d1997bc8e85cb2c5176/winrt_windows_media_control-3.1.0.tar.gz", hash = "sha256:15f8de2291bd896d24ce62f27b175829aa12e3483ede753f436f2342311e667a", size = 12065 }
522
+ wheels = [
523
+ { url = "https://files.pythonhosted.org/packages/34/5a/a6a8b0fd921206ef070bb718da092e68c74b94d14627d63c40379c6e8080/winrt_windows_media_control-3.1.0-cp313-cp313-win32.whl", hash = "sha256:0b7d8917b742d22692bcd27294f6f3f358192a546131a60fc709d1d082bfa02d", size = 60700 },
524
+ { url = "https://files.pythonhosted.org/packages/6d/b8/ba2d4c413fcd74260fc7722da4057ccc1dc76586fd11ea4bd61c2f64063b/winrt_windows_media_control-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:88219a29db06a6fb3392d52af04bb36b2267192f211dce0e1522dfcf9228e380", size = 64100 },
525
+ { url = "https://files.pythonhosted.org/packages/11/3a/fbd05ed7057613cf605f7eb0dab05d112d3d4ac473df443467fdebb880bf/winrt_windows_media_control-3.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:ebaa57ab082c0e95eec05f932fe53916000c8e73effb67b8d63936b294b4fa96", size = 58813 },
526
+ ]
527
+
528
+ [[package]]
529
+ name = "winrt-windows-ui-notifications"
530
+ version = "3.1.0"
531
+ source = { registry = "https://pypi.org/simple" }
532
+ dependencies = [
533
+ { name = "winrt-runtime" },
534
+ ]
535
+ sdist = { url = "https://files.pythonhosted.org/packages/d2/17/90e6344dd5f8ded8b9c3203dc0d4319ace37ee0e3590942716a92a52cb46/winrt_windows_ui_notifications-3.1.0.tar.gz", hash = "sha256:40f1d559004e0aad840c79a6f494f2f48e89c2cfbb72207a7a6127dd452a4aeb", size = 28883 }
536
+ wheels = [
537
+ { url = "https://files.pythonhosted.org/packages/d6/1d/e69cd16f983ad93e0a44bcc60612d4b0a36e8afe506953788833cc030954/winrt_windows_ui_notifications-3.1.0-cp313-cp313-win32.whl", hash = "sha256:2e4f5b649548ba4b9bb60cf32c4dfa9fa0ca856f49ebb0744a0b0e923d97679e", size = 152993 },
538
+ { url = "https://files.pythonhosted.org/packages/06/9a/2edd19b47e7981e6829af2b1af2a451ae5cc6c78c7c8330f6c7b917b9962/winrt_windows_ui_notifications-3.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:93fa5dc40245102a04b4e8b69f2a71aaea045b4a1fdcd8eca19db24241f2496e", size = 166530 },
539
+ { url = "https://files.pythonhosted.org/packages/2c/f2/ff5ba93ff76a56c453c3b955f20917f78a17069d6ac21f38dfc9e34ba1d1/winrt_windows_ui_notifications-3.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:3eabd14415781ee3709222bddd9862ad061c9cb5c955d1b4454244c1438acf34", size = 154131 },
540
+ ]