windows-mcp 0.6.1__tar.gz → 0.6.2__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.
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/PKG-INFO +3 -1
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/README.md +2 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/manifest.json +1 -1
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/pyproject.toml +1 -1
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/server.json +2 -2
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/__main__.py +10 -4
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/desktop/service.py +8 -2
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/uv.lock +1 -1
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/.github/FUNDING.yml +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/.gitignore +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/.mcpbignore +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/.python-version +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/CONTRIBUTING.md +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/LICENSE.md +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/SECURITY.md +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/assets/logo.png +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/assets/screenshots/screenshot_1.png +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/assets/screenshots/screenshot_2.png +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/assets/screenshots/screenshot_3.png +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/__init__.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/analytics.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/desktop/__init__.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/desktop/config.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/desktop/views.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/tree/__init__.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/tree/cache_utils.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/tree/config.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/tree/service.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/tree/utils.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/tree/views.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/uia/__init__.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/uia/controls.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/uia/core.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/uia/enums.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/uia/events.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/uia/patterns.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/vdm/__init__.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/vdm/core.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/watchdog/__init__.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/watchdog/event_handlers.py +0 -0
- {windows_mcp-0.6.1 → windows_mcp-0.6.2}/src/windows_mcp/watchdog/service.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: windows-mcp
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.2
|
|
4
4
|
Summary: Lightweight MCP Server for interacting with Windows Operating System.
|
|
5
5
|
Project-URL: homepage, https://github.com/CursorTouch
|
|
6
6
|
Author-email: Jeomon George <jeogeoalukka@gmail.com>
|
|
@@ -73,6 +73,8 @@ Description-Content-Type: text/markdown
|
|
|
73
73
|
mcp-name: io.github.CursorTouch/Windows-MCP
|
|
74
74
|
|
|
75
75
|
## Updates
|
|
76
|
+
- v0.6.2: Extended boolean parameter compatibility and updated `manifest.json` for `mcpb` compatibility in Claude Desktop (Thanks to bryan-anthropic).
|
|
77
|
+
- v0.6.1: Fixed `Shell` tool output issues and improved boolean parameter compatibility (Thanks to @yakub268).
|
|
76
78
|
- Windows-MCP reached `1M+ Users` in [Claude Desktop Extensiosn](https://claude.ai/directory).
|
|
77
79
|
- Windows-MCP is now available on [PyPI](https://pypi.org/project/windows-mcp/) (thus supports `uvx windows-mcp`)
|
|
78
80
|
- Windows-MCP is added to [MCP Registry](https://github.com/modelcontextprotocol/registry)
|
|
@@ -26,6 +26,8 @@
|
|
|
26
26
|
mcp-name: io.github.CursorTouch/Windows-MCP
|
|
27
27
|
|
|
28
28
|
## Updates
|
|
29
|
+
- v0.6.2: Extended boolean parameter compatibility and updated `manifest.json` for `mcpb` compatibility in Claude Desktop (Thanks to bryan-anthropic).
|
|
30
|
+
- v0.6.1: Fixed `Shell` tool output issues and improved boolean parameter compatibility (Thanks to @yakub268).
|
|
29
31
|
- Windows-MCP reached `1M+ Users` in [Claude Desktop Extensiosn](https://claude.ai/directory).
|
|
30
32
|
- Windows-MCP is now available on [PyPI](https://pypi.org/project/windows-mcp/) (thus supports `uvx windows-mcp`)
|
|
31
33
|
- Windows-MCP is added to [MCP Registry](https://github.com/modelcontextprotocol/registry)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"manifest_version": "0.2",
|
|
3
3
|
"name": "Windows-MCP",
|
|
4
|
-
"version": "0.6.
|
|
4
|
+
"version": "0.6.2",
|
|
5
5
|
"description": "MCP Server that enables Claude to interact with Windows OS",
|
|
6
6
|
"long_description": "Windows MCP is an open-source project that enables seamless integration between AI agents and the Windows operating system. Acting as an MCP server, it bridges the gap between large language models (LLMs) and the Windows OS, allowing agents to perform tasks such as **file navigation, application control, UI interaction, QA testing, and more**.\n\n**KEY FEATURES**\n- **Seamless Windows Integration**: Interacts natively with Windows UI elements, opens applications, controls windows, simulates user input, and more.\n- **Use Any LLM (Vision Optional)**: Does not rely on traditional computer vision techniques or fine-tuned models. Works with any LLM, reducing complexity and setup time.\n- **Rich Toolset for UI Automation**: Includes tools for keyboard and mouse control, window management, and capturing window or UI state.\n- **Lightweight & Open-Source**: Minimal dependencies with full source code available under the MIT license.\n- **Customizable & Extendable**: Easily adapt or extend tools to suit custom automation workflows or AI integrations.\n- **Real-Time Interaction**: Typical latency between actions ranges from `0.2` to `0.9` seconds, depending on system load, active applications, and LLM inference speed.\n\n**MINIMUM REQUIREMENTS**\n- Python 3.13 or higher\n- UV Package Manager\nThis MCP server requires UV, a fast Python package manager.\nInstallation:\n`curl -LsSf https://astral.sh/uv/install.sh | sh`\nFor detailed installation instructions, [see the UV documentation](https://github.com/astral-sh/uv)",
|
|
7
7
|
"author": {
|
|
@@ -97,7 +97,10 @@ def powershell_tool(command: str,timeout:int=10, ctx: Context = None) -> str:
|
|
|
97
97
|
)
|
|
98
98
|
)
|
|
99
99
|
@with_analytics(analytics, "State-Tool")
|
|
100
|
-
def state_tool(use_vision:bool=False,use_dom:bool=False, ctx: Context = None):
|
|
100
|
+
def state_tool(use_vision:bool|str=False,use_dom:bool|str=False, ctx: Context = None):
|
|
101
|
+
use_vision = use_vision is True or (isinstance(use_vision, str) and use_vision.lower() == 'true')
|
|
102
|
+
use_dom = use_dom is True or (isinstance(use_dom, str) and use_dom.lower() == 'true')
|
|
103
|
+
|
|
101
104
|
# Calculate scale factor to cap resolution at 1080p (1920x1080)
|
|
102
105
|
scale_width = MAX_IMAGE_WIDTH / screen_size.width if screen_size.width > MAX_IMAGE_WIDTH else 1.0
|
|
103
106
|
scale_height = MAX_IMAGE_HEIGHT / screen_size.height if screen_size.height > MAX_IMAGE_HEIGHT else 1.0
|
|
@@ -201,7 +204,8 @@ def scroll_tool(loc:list[int]=None,type:Literal['horizontal','vertical']='vertic
|
|
|
201
204
|
)
|
|
202
205
|
)
|
|
203
206
|
@with_analytics(analytics, "Move-Tool")
|
|
204
|
-
def move_tool(loc:list[int], drag:bool=False, ctx: Context = None)->str:
|
|
207
|
+
def move_tool(loc:list[int], drag:bool|str=False, ctx: Context = None)->str:
|
|
208
|
+
drag = drag is True or (isinstance(drag, str) and drag.lower() == 'true')
|
|
205
209
|
if len(loc) != 2:
|
|
206
210
|
raise ValueError("loc must be a list of exactly 2 integers [x, y]")
|
|
207
211
|
x,y=loc[0],loc[1]
|
|
@@ -256,7 +260,8 @@ def wait_tool(duration:int, ctx: Context = None)->str:
|
|
|
256
260
|
)
|
|
257
261
|
)
|
|
258
262
|
@with_analytics(analytics, "Scrape-Tool")
|
|
259
|
-
def scrape_tool(url:str,use_dom:bool=False, ctx: Context = None)->str:
|
|
263
|
+
def scrape_tool(url:str,use_dom:bool|str=False, ctx: Context = None)->str:
|
|
264
|
+
use_dom = use_dom is True or (isinstance(use_dom, str) and use_dom.lower() == 'true')
|
|
260
265
|
if not use_dom:
|
|
261
266
|
content=desktop.scrape(url)
|
|
262
267
|
return f'URL:{url}\nContent:\n{content}'
|
|
@@ -284,7 +289,8 @@ def scrape_tool(url:str,use_dom:bool=False, ctx: Context = None)->str:
|
|
|
284
289
|
)
|
|
285
290
|
)
|
|
286
291
|
@with_analytics(analytics, "Multi-Select-Tool")
|
|
287
|
-
def multi_select_tool(locs:list[list[int]], press_ctrl:bool=True, ctx: Context = None)->str:
|
|
292
|
+
def multi_select_tool(locs:list[list[int]], press_ctrl:bool|str=True, ctx: Context = None)->str:
|
|
293
|
+
press_ctrl = press_ctrl is True or (isinstance(press_ctrl, str) and press_ctrl.lower() == 'true')
|
|
288
294
|
desktop.multi_select(press_ctrl,locs)
|
|
289
295
|
elements_str = '\n'.join([f"({loc[0]},{loc[1]})" for loc in locs])
|
|
290
296
|
return f"Multi-selected elements at:\n{elements_str}"
|
|
@@ -46,7 +46,12 @@ class Desktop:
|
|
|
46
46
|
self.tree=Tree(self)
|
|
47
47
|
self.desktop_state=None
|
|
48
48
|
|
|
49
|
-
def get_state(self,use_annotation:bool=True,use_vision:bool=False,use_dom:bool=False,as_bytes:bool=False,scale:float=1.0)->DesktopState:
|
|
49
|
+
def get_state(self,use_annotation:bool|str=True,use_vision:bool|str=False,use_dom:bool|str=False,as_bytes:bool|str=False,scale:float=1.0)->DesktopState:
|
|
50
|
+
use_annotation = use_annotation is True or (isinstance(use_annotation, str) and use_annotation.lower() == 'true')
|
|
51
|
+
use_vision = use_vision is True or (isinstance(use_vision, str) and use_vision.lower() == 'true')
|
|
52
|
+
use_dom = use_dom is True or (isinstance(use_dom, str) and use_dom.lower() == 'true')
|
|
53
|
+
as_bytes = as_bytes is True or (isinstance(as_bytes, str) and as_bytes.lower() == 'true')
|
|
54
|
+
|
|
50
55
|
start_time = time()
|
|
51
56
|
|
|
52
57
|
controls_handles=self.get_controls_handles() # Taskbar,Program Manager,Apps, Dialogs
|
|
@@ -418,7 +423,8 @@ class Desktop:
|
|
|
418
423
|
else:
|
|
419
424
|
pg.press(''.join(shortcut))
|
|
420
425
|
|
|
421
|
-
def multi_select(self,press_ctrl:bool=False,locs:list[tuple[int,int]]=[]):
|
|
426
|
+
def multi_select(self,press_ctrl:bool|str=False,locs:list[tuple[int,int]]=[]):
|
|
427
|
+
press_ctrl = press_ctrl is True or (isinstance(press_ctrl, str) and press_ctrl.lower() == 'true')
|
|
422
428
|
if press_ctrl:
|
|
423
429
|
pg.keyDown('ctrl')
|
|
424
430
|
for loc in locs:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|