mcp-server-screeny


Namemcp-server-screeny JSON
Version 0.1.17 PyPI version JSON
download
home_pageNone
SummarymacOS MCP server for window enumeration and screenshot capture
upload_time2025-07-29 16:57:56
maintainerNone
docs_urlNone
authorNone
requires_python>=3.10
licenseMIT
keywords macos mcp screenshot server window
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ![Screeny Banner](screeny_banner.png)

[![MCP Server](https://badge.mcpx.dev?type=server "MCP Server")](https://mcpx.dev/server/mcp-server-screeny)
[![version](https://badge.fury.io/py/mcp-server-screeny.svg)](https://pypi.org/project/mcp-server-screeny/)
[![PyPI Downloads](https://static.pepy.tech/badge/mcp-server-screeny)](https://pepy.tech/projects/mcp-server-screeny)
[![macOS](https://img.shields.io/badge/macOS-only-blue.svg)](https://www.apple.com/macos/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

# Screeny MCP Server: Privacy first macOS Screenshots for AI Agents

A **privacy-first, macOS-only MCP server** that enables AI agents to capture screenshots of pre-approved application windows, providing secure visual context for development and debugging tasks.

[![Install MCP Server](https://cursor.com/deeplink/mcp-install-light.svg)](https://cursor.com/install-mcp?name=screeny&config=eyJjb21tYW5kIjoidXZ4IG1jcC1zZXJ2ZXItc2NyZWVueSJ9)

> [!IMPORTANT]
> Requires **Screen Capture permission** + **Window Approval Setup** - see instructions below.

## 🔒 Privacy-First Design

Unlike other screenshot tools, Screeny requires **explicit user approval** for each window before it can be captured:

- **Window approval system** - Only pre-approved windows can be captured (approved during setup)
- **User-controlled access** - You decide exactly which windows are accessible
- **Non-intrusive capture** - Screenshots taken in background without changing window focus or interrupting your workflow
- **No external connections** - Screeny runs entirely on your device, screenshots are deleted immediately after use

## Available Tools

- `listWindows` - Lists all approved application windows available for screenshot capture.

  - Only shows user approved windows

- `takeScreenshot` - Captures a screenshot of a specific window by its ID.
  - **Captures windows in background** - no need to bring window to front, but cannot capture minimized windows
  - **Provides actual pixel data** - full-fidelity image, not OCR or text extraction
  - **Can compress image** - if needed, compresses large images to fit within 1MB

### Resources

- `screeny://info` - Server information and configuration details

## Configuration

### Claude Desktop

1. Open Claude settings → Developer → Edit Config
2. Add configuration
3. **Restart Claude Desktop** after saving config

<details>
<summary><strong>Using pipx</strong></summary>

First install with: `pipx install mcp-server-screeny`

```json
{
  "mcpServers": {
    "screeny": {
      "command": "mcp-server-screeny",
      "args": []
    }
  }
}
```

> **Note:** If you get an `ENOENT` error, replace `"mcp-server-screeny"` with the full path to the executable (find it with `which mcp-server-screeny` in your terminal).

</details>

<details>
<summary><strong>Using uvx</strong></summary>

```json
{
  "mcpServers": {
    "screeny": {
      "command": "uvx",
      "args": ["mcp-server-screeny"]
    }
  }
}
```

> **Note:** If you get a "spawn uvx ENOENT" error, replace `"uvx"` with the full path to uvx:
>
> ```bash
> which uvx  # Find your uvx path
> ```
>
> Then use that full path in the config (e.g., `"/opt/homebrew/bin/uvx"`).

</details>

### Cursor

1. Open Cursor settings → Tools & Integrations → MCP Tools
2. Add configuration
3. **Restart Cursor** after saving config

<details>
<summary><strong>Using pipx</strong></summary>

First install with: `pipx install mcp-server-screeny`

```json
{
  "mcpServers": {
    "screeny": {
      "command": "mcp-server-screeny",
      "args": []
    }
  }
}
```

> **Note:** If you get an `ENOENT` error, replace `"mcp-server-screeny"` with the full path to the executable (find it with `which mcp-server-screeny` in your terminal).

</details>

<details>
<summary><strong>Using uvx</strong></summary>

```json
{
  "mcpServers": {
    "screeny": {
      "command": "uvx",
      "args": ["mcp-server-screeny"]
    }
  }
}
```

> **Note:** If you get a "spawn uvx ENOENT" error, replace `"uvx"` with the full path to uvx:
>
> ```bash
> which uvx  # Find your uvx path
> ```
>
> Then use that full path in the config (e.g., `"/opt/homebrew/bin/uvx"`).

</details>

## Setup

### 1. Grant Screen Capture Permission (Required)

**Important:** Grant permission before running window approval.

> **Note**: You need to grant Screen Capture permission to BOTH:
>
> 1. **Your Terminal application** (Terminal.app, iTerm2, etc.) - Required for running setup (can be disabled after)
> 2. **Your MCP host** (Claude Desktop, Cursor) - Required for taking screenshots
>
> To add them:
>
> 1. Open **System Settings** > **Privacy & Security** > **Screen & System Audio Recording**
> 2. Click the **"+"** button
> 3. Add your Terminal application AND your MCP host application
> 4. **Restart both applications** after granting permissions

### 2. Window Approval (Required)

After configuring your MCP client above, approve which windows can be captured.

<details>
<summary><strong>If using pipx</strong></summary>

```bash
# Interactive approval
mcp-server-screeny --setup

# Auto-approve all current windows
mcp-server-screeny --setup --allow-all
```

</details>

<details>
<summary><strong>If using uvx</strong></summary>

```bash
# Interactive approval
uvx mcp-server-screeny --setup

# Auto-approve all current windows
uvx mcp-server-screeny --setup --allow-all
```

</details>

Approvals are saved to `~/.screeny/approved_windows.json`. Re-run setup when you want to update the list of approved windows.

## Security & Privacy

- Only user-approved windows can be captured
- All processing stays local on your machine
- Screenshots are temporary and deleted immediately after use

## Troubleshooting

### Permission Issues

```bash
# Test window detection and permissions
mcp-server-screeny --debug

# Re-run setup if windows changed
mcp-server-screeny --setup
```

### Common Issues

**"spawn uvx ENOENT" error**

- Solution: Use the full path to uvx in your MCP config instead of just `"uvx"`
- Find path with: `which uvx`
- Example: `"/opt/homebrew/bin/uvx"` or `"/usr/local/bin/uvx"`

**"No approved windows found"**

- Solution: Run `mcp-server-screeny --setup` first (or `uvx mcp-server-screeny --setup` if using uvx)

**"Screen Recording permission required" or "No windows found"**

- Solution: Grant Screen Recording permission in System Settings > Privacy & Security > Screen & System Audio Recording
  - Click "+" button and manually add your MCP host (Claude Desktop, Cursor, etc.)
  - Restart your MCP host application after granting permissions
- Try running setup again after granting permissions

## Contributing

Pull requests are welcome! Feel free to contribute new ideas, bug fixes, or enhancements.

This is my first MCP project - if you encounter any bugs, please open an issue and I'll do my best to fix them!

<details>
<summary><strong>Why I Built This</strong></summary>

I created this tool to streamline my mobile development workflow. I was tired of
manually taking screenshots repeatedly to describe UI issues. With Screeny, Cursor can directly capture screenshots of my iOS simulator and iterate on the design in a loop. I'm excited to see how others will use this!

</details>

## Requirements

- Python 3.10+
- macOS
- Screen Capture permission

## License

MIT License

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "mcp-server-screeny",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "macos, mcp, screenshot, server, window",
    "author": null,
    "author_email": "Rohan Ravindran <r8ravind@uwaterloo.ca>",
    "download_url": "https://files.pythonhosted.org/packages/5c/4e/bc8f1ee71e6fe6985691d065681caa946cfc44ffa4794c207445305cdaba/mcp_server_screeny-0.1.17.tar.gz",
    "platform": null,
    "description": "![Screeny Banner](screeny_banner.png)\n\n[![MCP Server](https://badge.mcpx.dev?type=server \"MCP Server\")](https://mcpx.dev/server/mcp-server-screeny)\n[![version](https://badge.fury.io/py/mcp-server-screeny.svg)](https://pypi.org/project/mcp-server-screeny/)\n[![PyPI Downloads](https://static.pepy.tech/badge/mcp-server-screeny)](https://pepy.tech/projects/mcp-server-screeny)\n[![macOS](https://img.shields.io/badge/macOS-only-blue.svg)](https://www.apple.com/macos/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n# Screeny MCP Server: Privacy first macOS Screenshots for AI Agents\n\nA **privacy-first, macOS-only MCP server** that enables AI agents to capture screenshots of pre-approved application windows, providing secure visual context for development and debugging tasks.\n\n[![Install MCP Server](https://cursor.com/deeplink/mcp-install-light.svg)](https://cursor.com/install-mcp?name=screeny&config=eyJjb21tYW5kIjoidXZ4IG1jcC1zZXJ2ZXItc2NyZWVueSJ9)\n\n> [!IMPORTANT]\n> Requires **Screen Capture permission** + **Window Approval Setup** - see instructions below.\n\n## \ud83d\udd12 Privacy-First Design\n\nUnlike other screenshot tools, Screeny requires **explicit user approval** for each window before it can be captured:\n\n- **Window approval system** - Only pre-approved windows can be captured (approved during setup)\n- **User-controlled access** - You decide exactly which windows are accessible\n- **Non-intrusive capture** - Screenshots taken in background without changing window focus or interrupting your workflow\n- **No external connections** - Screeny runs entirely on your device, screenshots are deleted immediately after use\n\n## Available Tools\n\n- `listWindows` - Lists all approved application windows available for screenshot capture.\n\n  - Only shows user approved windows\n\n- `takeScreenshot` - Captures a screenshot of a specific window by its ID.\n  - **Captures windows in background** - no need to bring window to front, but cannot capture minimized windows\n  - **Provides actual pixel data** - full-fidelity image, not OCR or text extraction\n  - **Can compress image** - if needed, compresses large images to fit within 1MB\n\n### Resources\n\n- `screeny://info` - Server information and configuration details\n\n## Configuration\n\n### Claude Desktop\n\n1. Open Claude settings \u2192 Developer \u2192 Edit Config\n2. Add configuration\n3. **Restart Claude Desktop** after saving config\n\n<details>\n<summary><strong>Using pipx</strong></summary>\n\nFirst install with: `pipx install mcp-server-screeny`\n\n```json\n{\n  \"mcpServers\": {\n    \"screeny\": {\n      \"command\": \"mcp-server-screeny\",\n      \"args\": []\n    }\n  }\n}\n```\n\n> **Note:** If you get an `ENOENT` error, replace `\"mcp-server-screeny\"` with the full path to the executable (find it with `which mcp-server-screeny` in your terminal).\n\n</details>\n\n<details>\n<summary><strong>Using uvx</strong></summary>\n\n```json\n{\n  \"mcpServers\": {\n    \"screeny\": {\n      \"command\": \"uvx\",\n      \"args\": [\"mcp-server-screeny\"]\n    }\n  }\n}\n```\n\n> **Note:** If you get a \"spawn uvx ENOENT\" error, replace `\"uvx\"` with the full path to uvx:\n>\n> ```bash\n> which uvx  # Find your uvx path\n> ```\n>\n> Then use that full path in the config (e.g., `\"/opt/homebrew/bin/uvx\"`).\n\n</details>\n\n### Cursor\n\n1. Open Cursor settings \u2192 Tools & Integrations \u2192 MCP Tools\n2. Add configuration\n3. **Restart Cursor** after saving config\n\n<details>\n<summary><strong>Using pipx</strong></summary>\n\nFirst install with: `pipx install mcp-server-screeny`\n\n```json\n{\n  \"mcpServers\": {\n    \"screeny\": {\n      \"command\": \"mcp-server-screeny\",\n      \"args\": []\n    }\n  }\n}\n```\n\n> **Note:** If you get an `ENOENT` error, replace `\"mcp-server-screeny\"` with the full path to the executable (find it with `which mcp-server-screeny` in your terminal).\n\n</details>\n\n<details>\n<summary><strong>Using uvx</strong></summary>\n\n```json\n{\n  \"mcpServers\": {\n    \"screeny\": {\n      \"command\": \"uvx\",\n      \"args\": [\"mcp-server-screeny\"]\n    }\n  }\n}\n```\n\n> **Note:** If you get a \"spawn uvx ENOENT\" error, replace `\"uvx\"` with the full path to uvx:\n>\n> ```bash\n> which uvx  # Find your uvx path\n> ```\n>\n> Then use that full path in the config (e.g., `\"/opt/homebrew/bin/uvx\"`).\n\n</details>\n\n## Setup\n\n### 1. Grant Screen Capture Permission (Required)\n\n**Important:** Grant permission before running window approval.\n\n> **Note**: You need to grant Screen Capture permission to BOTH:\n>\n> 1. **Your Terminal application** (Terminal.app, iTerm2, etc.) - Required for running setup (can be disabled after)\n> 2. **Your MCP host** (Claude Desktop, Cursor) - Required for taking screenshots\n>\n> To add them:\n>\n> 1. Open **System Settings** > **Privacy & Security** > **Screen & System Audio Recording**\n> 2. Click the **\"+\"** button\n> 3. Add your Terminal application AND your MCP host application\n> 4. **Restart both applications** after granting permissions\n\n### 2. Window Approval (Required)\n\nAfter configuring your MCP client above, approve which windows can be captured.\n\n<details>\n<summary><strong>If using pipx</strong></summary>\n\n```bash\n# Interactive approval\nmcp-server-screeny --setup\n\n# Auto-approve all current windows\nmcp-server-screeny --setup --allow-all\n```\n\n</details>\n\n<details>\n<summary><strong>If using uvx</strong></summary>\n\n```bash\n# Interactive approval\nuvx mcp-server-screeny --setup\n\n# Auto-approve all current windows\nuvx mcp-server-screeny --setup --allow-all\n```\n\n</details>\n\nApprovals are saved to `~/.screeny/approved_windows.json`. Re-run setup when you want to update the list of approved windows.\n\n## Security & Privacy\n\n- Only user-approved windows can be captured\n- All processing stays local on your machine\n- Screenshots are temporary and deleted immediately after use\n\n## Troubleshooting\n\n### Permission Issues\n\n```bash\n# Test window detection and permissions\nmcp-server-screeny --debug\n\n# Re-run setup if windows changed\nmcp-server-screeny --setup\n```\n\n### Common Issues\n\n**\"spawn uvx ENOENT\" error**\n\n- Solution: Use the full path to uvx in your MCP config instead of just `\"uvx\"`\n- Find path with: `which uvx`\n- Example: `\"/opt/homebrew/bin/uvx\"` or `\"/usr/local/bin/uvx\"`\n\n**\"No approved windows found\"**\n\n- Solution: Run `mcp-server-screeny --setup` first (or `uvx mcp-server-screeny --setup` if using uvx)\n\n**\"Screen Recording permission required\" or \"No windows found\"**\n\n- Solution: Grant Screen Recording permission in System Settings > Privacy & Security > Screen & System Audio Recording\n  - Click \"+\" button and manually add your MCP host (Claude Desktop, Cursor, etc.)\n  - Restart your MCP host application after granting permissions\n- Try running setup again after granting permissions\n\n## Contributing\n\nPull requests are welcome! Feel free to contribute new ideas, bug fixes, or enhancements.\n\nThis is my first MCP project - if you encounter any bugs, please open an issue and I'll do my best to fix them!\n\n<details>\n<summary><strong>Why I Built This</strong></summary>\n\nI created this tool to streamline my mobile development workflow. I was tired of\nmanually taking screenshots repeatedly to describe UI issues. With Screeny, Cursor can directly capture screenshots of my iOS simulator and iterate on the design in a loop. I'm excited to see how others will use this!\n\n</details>\n\n## Requirements\n\n- Python 3.10+\n- macOS\n- Screen Capture permission\n\n## License\n\nMIT License\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "macOS MCP server for window enumeration and screenshot capture",
    "version": "0.1.17",
    "project_urls": null,
    "split_keywords": [
        "macos",
        " mcp",
        " screenshot",
        " server",
        " window"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "30cc48d0154051ba1d30c2ca00a4db6a4df32f2eb43617349520a60ccc139518",
                "md5": "1dc4ff3f4f34e316f25e7a2db40b8af6",
                "sha256": "f8529e96ec106d9cef3695c7e81812ab9590b1ebfa3b01e86397e869dc4ef47f"
            },
            "downloads": -1,
            "filename": "mcp_server_screeny-0.1.17-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "1dc4ff3f4f34e316f25e7a2db40b8af6",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 12839,
            "upload_time": "2025-07-29T16:57:55",
            "upload_time_iso_8601": "2025-07-29T16:57:55.170404Z",
            "url": "https://files.pythonhosted.org/packages/30/cc/48d0154051ba1d30c2ca00a4db6a4df32f2eb43617349520a60ccc139518/mcp_server_screeny-0.1.17-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5c4ebc8f1ee71e6fe6985691d065681caa946cfc44ffa4794c207445305cdaba",
                "md5": "a0887725db5478db46e33b9c858533c8",
                "sha256": "6298a2f318ac05754029ff84e4f25f1f09d3f9cc2a35c5fe71ecaf2297069ae3"
            },
            "downloads": -1,
            "filename": "mcp_server_screeny-0.1.17.tar.gz",
            "has_sig": false,
            "md5_digest": "a0887725db5478db46e33b9c858533c8",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 941345,
            "upload_time": "2025-07-29T16:57:56",
            "upload_time_iso_8601": "2025-07-29T16:57:56.014489Z",
            "url": "https://files.pythonhosted.org/packages/5c/4e/bc8f1ee71e6fe6985691d065681caa946cfc44ffa4794c207445305cdaba/mcp_server_screeny-0.1.17.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-29 16:57:56",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "mcp-server-screeny"
}
        
Elapsed time: 0.55233s