惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
C
Cybersecurity and Infrastructure Security Agency CISA
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Threat Research - Cisco Blogs
L
LINUX DO - 热门话题
Simon Willison's Weblog
Simon Willison's Weblog
L
Lohrmann on Cybersecurity
S
Schneier on Security
T
The Exploit Database - CXSecurity.com
Know Your Adversary
Know Your Adversary
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Cyberwarzone
Cyberwarzone
T
Threatpost
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
Scott Helme
Scott Helme
WordPress大学
WordPress大学
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
W
WeLiveSecurity
L
LINUX DO - 最新话题
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
S
SegmentFault 最新的问题
Vercel News
Vercel News
Microsoft Azure Blog
Microsoft Azure Blog
有赞技术团队
有赞技术团队
Cisco Talos Blog
Cisco Talos Blog
V2EX - 技术
V2EX - 技术
Apple Machine Learning Research
Apple Machine Learning Research
H
Help Net Security
F
Fortinet All Blogs
The Hacker News
The Hacker News
IT之家
IT之家
Forbes - Security
Forbes - Security
月光博客
月光博客
S
Security @ Cisco Blogs
SecWiki News
SecWiki News
博客园 - 聂微东
GbyAI
GbyAI
S
Security Affairs
H
Heimdal Security Blog
人人都是产品经理
人人都是产品经理
大猫的无限游戏
大猫的无限游戏
AWS News Blog
AWS News Blog
T
Tenable Blog
P
Privacy International News Feed
Microsoft Security Blog
Microsoft Security Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
AI
AI

Show HN

GitHub - flightdeckhq/flightdeck: Observability and control plane for AI agents. CSP Radar GitHub - Light-Heart-Labs/DreamServer: Turn your PC, Mac, or Linux box into an AI server. LLM inference, chat UI, voice, agents, workflows, RAG, and image generation. GitHub - Diplomat-ai/diplomat-agent-ts: What can your TypeScript AI agent do to the real world? Scan your code. See which tool calls have zero checks Code Block Selector - Visual Studio Marketplace Prometheus dependency graph — interactive showcase | Riftmap Show HN: I made a vi-like modal keyboard plugin for Figma GitHub - run-llama/liteparse: A fast, helpful, and open-source document parser GitHub - dalemyers/Roar: A macOS CLI tool for notifications GitHub - district-solutions/open-agent-tools-coder: Enables small-to-large self-hosted ai models to use local source code when running tool-calling agentic workloads. We actively data mine 20,900+ (2+ TB) popular github repos using large and small ai models to create reuseable: json, markdown and parquet files for local-first tool-calling models. GitHub - progapandist/stripeek: A local TUI proxy for real-time Stripe API debugging, built for navigating complex payloads fast. GitHub - sir1st/hermes-desktop: All-in-one cross-platform desktop app for Hermes Agent — bundles Python + hermes-agent + hermes-web-ui GitHub - astefanutti/shaderbang: Shebang for Shaders Show HN: Generate Claude Code Workflows using Spec Driven Development approach GitHub - nixys/nxs-universal-chart: The Helm chart you can use to install any of your applications into Kubernetes/OpenShift Show HN: AI agents for UK GDAD PCF roles and their skills The Two Pillars: Mixer Mode and Meta-Software in the Reorganization of Software Work After AI GitHub - JaiCode08/teleport-env What 1,000+ Harness Experiments Taught Me About Self-Improving Agents Show HN: Liiists, a Markdown-first, iOS and CLI list app SwiperTab – Get this Extension for 🦊 Firefox (en-US) GitHub - kouhxp/fftext: Summarize, explain, fact-check, or translate any text, URL, or file. No GPU. No cloud. One command GitHub - sweetpad-dev/sweetpad: Develop Swift/iOS projects using VSCode GitHub - dogmaticdev/IRON: IRON a.k.a. Intermediate Representation Object Notation is a Interpreter/Database that is used to create Programming Languages. GitHub - sjhalani7/vaen: Package your AI coding harness into a portable .agent file, and share it across repos, teams, & the community without ever having to copy-paste instructions, skills, MCP config, or secrets. Show HN: Gandalf the Grader Show HN: Citadeld – replay any CI failure locally from a single file GitHub - tdortman/cuSBF: High-Performance GPU Super Bloom Filter coral-ai/claude-code-token-xray at main · Coral-Bricks-AI/coral-ai GitHub - ulyssestenn/funes: Funes is a Git-based framework for LLM-managed knowledge work: an AI Librarian ingests raw sources, builds an interlinked Markdown knowledge base, and uses it to produce cited reports, analyses, and other outputs. GitHub - ThatXliner/gah: Git Add Hunk, built for agents to use GitHub - harmont-dev/harmont-cli: Command-line client for the Harmont CI platform GitHub - brooksmcmillin/mcp-authflow: OAuth 2.0 Authorization Server framework for MCP servers GitHub - javaid-codes/audit-supply-chain-agents GitHub - amorey/gochan: A small library of common channel architectures for Go, inspired by Rust GitHub - arifozgun/OpenGem: Free, Open-Source AI API Gateway with Gemini, OpenAI & Anthropic Compatibility in 1 file GitHub - Pranesh950/BioPetals: 🌸 Run BIOxAI models at home, BitTorrent-style. Fine-tuning and inference up to 10x faster than offloading GitHub - cnguyen14/bounty-doctor: Diagnose a GitHub bounty issue before you waste hours: detects honeypot scam repos, AI-bot attempt swarms, and stale contests. Show HN: CoreMCP – MCP Server for On-Prem DBs Show HN: KittyHTML – Render HTML/CSS as an inline image in your terminal GitHub - bingud/filemat: Web-based file manager Show HN: TruthLens – Free multi-signal deepfake image detector GitHub - apexlocal-jz/claude-usage-tray: Windows system-tray app showing your Claude Code rate-limit usage at a glance. Zero deps, ~300 lines of PowerShell. Cross-IDE (works regardless of VS Code, Cursor, plain terminal). Release v0.1.2.1 · kouhxp/yapsnap GitHub - noopolis/moltnet: Self-hostable chat network for AI agents. Pre-built bridges for Claude Code, Codex, and the Claws. Rooms, DMs, history. No Slack bots, no Matrix, no glue code. GitHub - tamerh/enju: Coordinating Humans, AI Agents, and Compute as Peers on a Shared Workflow Graph Show HN: Continuity-auth – Respect-weighted rate limits for the open web GitHub - luml-ai/luml: AI lifecycle platform where engineers and agents track experiments, train models, and ship to production. GitHub - mrdanielcasper/CoreTex: A UNIX-inspired, biomimetic, flat-file AI harness and knowledge engine. GitHub - clemg/pierre-github: Pierre's diffs.com and trees.software for Github GitHub - lyriks-io/unspaghettit: Behavior-driven AI development without prompt spaghetti. GitHub - sofumel/claude-handoff-revive: Resume Claude Code work after rate/usage/context limits without replaying the prior transcript. Auto-saves at 90%/95% usage. Plugin-installable, 10 languages. GitHub - dotexorg/saferpc: Typed, end-to-end encrypted RPC over any bidirectional channel. GitHub - BeeZeeAgent/beezee: Agent harness orchestration Legato Next.js Boilerplate for Internal Tools · CoreUI GitHub - clark-labs-inc/clark-hash: Clark Hash, 32x smaller searchable sketches for embeddings GitHub - ZeroPointRepo/youtube-mcp: The fastest YouTube transcript + YouTube search MCP for AI agents. Try for free. Typing Mastery — climb toward 100+ WPM, deliberately GitHub - Andebugulin/Awareen GitHub - fayzan123/claude-workflow-composer: Visual desktop app for composing multi-agent coding workflows. Drag agents, attach skills and MCPs, wire handoffs, export to .claude/ GitHub - harshaneel/humanize: Best static AI text humanizer. Two research-grounded skills that work in any LLM (Claude, ChatGPT, Gemini, Codex): humanize beats perplexity-based detectors, ai-check produces forensic scoring with evidence-quoted flags. Nine levers, 50+ peer-reviewed sources, 2024-2026 detection literature. GitHub - StackOneHQ/stack-nudge GitHub - nodes-app/swift-markdown-engine: A native AppKit Markdown editor for macOS, built on TextKit 2 and bridged to SwiftUI. We hardened an LLM agent. Each defense we added made it more exploitable. GitHub - alkait/WhatsKept: Agent-queryable WhatsApp history from an iOS backup — a single Go binary. GitHub - octelium/cordium: Open-source, general-purpose sandbox platform for devs and AI agents that provides identity-based secure access to infrastructure without credentials. WAR.GOV/UFO Microfilm5 GitHub - scosman/videowright: Build animated explainer videos with your coding agent GitHub - dipankar/dscode: The code editor you can take apart. GitHub - zoharbabin/web-researcher-mcp: MCP server (Go) for AI assistants: web search, content extraction, academic/patent/news research. Multi-provider routing, 4-tier scraping, search lenses. Works with Claude, Cursor, and any MCP client. GitHub - ruvnet/RuView: π RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel of video. GitHub - scanaislop/aislop: Catch the slop AI coding agents leave in your code: narrative comments, swallowed exceptions, as-any casts, dead code, oversized functions. 50+ rules across 7 languages (TypeScript, JavaScript, Python, Go, Rust, Ruby, PHP). Sub-second, deterministic, no LLM at runtime. MIT-licensed. GitHub - kouhxp/cheap-im: CPU-only voice agent approximating Thinking Machines' Interaction Models demo GitHub - unprovable/OrchidMantis: Orchid Mantis — standalone framework for Zero-Knowledge Proofs of eXploit (ZKPoX). GitHub - MarcellM01/TinySearch: Shrink the web for your local LLMs! GitHub - pileax-ai/pileax: PileaX is an all-in-one AI knowledge base system. 🍀 GitHub - TangibleResearch/Halgorithem: A Algo designed to detect AI Hallucitions GitHub - DO-SAY-GO/freelang: I love freelang GitHub - CarpseDeam/Aura-IDE: An AI coding harness that shaped itself - Planner/Worker agents, repo awareness, surgical edits, validation, recovery, and safe diff approvals. GitHub - chojs23/concord: A feature-rich TUI client for Discord GitHub - tommyjepsen/awesome-ux-skills: UX & AI Product designs skills you can use today in Claude Code GitHub - aerf-spec/aerf: Agent Evidence Receipt Format (AERF) — an open specification for tamper-evident, independently verifiable records of AI agent actions. GitHub - kklimuk/docx-cli: CLI for AI agents (Claude, Codex) to read, edit, and comment on .docx files with full format fidelity. GitHub - Jwrede/tokentoll: Catch LLM cost changes in code review. Infracost for LLM spend. GitHub - samchon/ttsc: A `typescript-go` toolchain for compiler-powered plugins and type-safe execution + 500x faster lint integrated into compiler GitHub - Higangssh/homebutler: 🏠 Manage your homelab from chat. Single binary, zero dependencies. GitHub - olalie/tapmap: See where your computer connects and what stands out on a live world map. GitHub - matisiekpl/neond: DX-focused control plane for Postgres dedicated to non-critical workloads. Your postgres:latest replacement 🐘 GitHub - Diplomat-ai/diplomat-agent: What can your AI agent do to the real world? Scan your code. See which tool calls have zero checks GitHub - Bajusz15/beacon: Open-source agent for secure remote access, monitoring, and deploys across home-lab and self-hosted machines like Raspberry Pi, N100, or any Linux server. Open web based TTY or tunnel Home Assistant and other local services securely without opening ports. BigTech AI News - Chrome 应用商店 GitHub - vinhnx/VTCode: VT Code is an open-source coding agent with LLM-native code understanding and robust shell safety. Supports multiple LLM providers with automatic failover and efficient context management. GitHub - michaelaz774/decision-engine: A decision operating system for startup founders, powered by Claude Code. Synthesizes wisdom from 25+ legendary founders and investors into interactive AI-driven decision frameworks. GitHub - Chrilleweb/dotenv-diff: Validate environment variable usage in your codebase GitHub - Lumen-Labs/brainapi2: BrainAPI is a knowledge graph–powered AI memory layer that transforms unstructured data into structured knowledge, enabling intelligent search, recommendations, and contextual memory for AI agents and applications. GitHub - familiar-software/familiar: Let AI watch you work. Familiar lets your AI update its memory, skills, and knowledge by watching your screen. GitHub - skorotkiewicz/rudo: A small, elegant dock for Wayland GitHub - muxshed/shed: One stream in, or many. Every destination, simultaneously. No cloud middleman, no per-channel fees, no limits. make sidebar/address bar rounded corner toggleable
GitHub - varbhat/desktopmcp: MCP server for the Linux desktop 🐧🤖
varbhat · 2026-06-25 · via Show HN

MCP server for the Linux desktop. It gives AI models access to the Linux desktop.

desktopmcp connects AI assistants to the Linux desktop through three system interfaces: XDG Desktop Portals for sandboxed desktop operations, AT-SPI for semantic UI understanding, and D-Bus for low-level system access. It exposes 144 tools over the Model Context Protocol, letting an AI see what's on screen, understand UI structure, move cursor, click buttons, type text, manage files, and interact with desktop services.

Why

AI models are blind to the desktop. They can't see a window, read a button label, click a menu item, or control the desktop.

desktopmcp solves this by giving AI models two complementary ways to interact with the desktop:

  • Visual: screenshots, screen capture, color picking, mouse and keyboard input
  • Semantic: the full accessibility tree (AT-SPI), where every UI element has a name, role, position, and set of actions the AI can invoke directly

The semantic path means an AI can call find_element(role="push button", name="Save") instead of scanning pixels to find where "Save" might be. It can read text content, check which element is focused, traverse the UI tree, and perform actions like "click" on any element -- all without needing a screenshot.

Everything goes through XDG Desktop Portals, so the user gets permission dialogs, and a single binary runs on GNOME, KDE, Sway, or any Wayland compositor.

What it can do

144 tools organized into five groups:

Category Tools What they do
Remote Desktop & Input 13 Start sessions, take screenshots, move/click mouse, type text, touch events, scroll
XDG Portals 35 Notifications, file dialogs, clipboard, wallpaper, network status, location, email, printing, camera, settings, global shortcuts, secrets, power profile, game mode, and more
Dynamic Launcher 8 Install, launch, inspect, and remove .desktop application launchers
AT-SPI Accessibility 76 Full accessibility tree: find elements, read text, click buttons, get/set values, table and hyperlink inspection, document metadata, event subscriptions, collection search
D-Bus Bridge 12 Call any D-Bus method, read/write properties, introspect services, subscribe to signals

Architecture

AI model (Claude, etc.)
    |
    |  MCP protocol (JSON-RPC over stdio or HTTP)
    v
desktopmcp               (Rust, async, single binary)
    |
    |--- XDG Desktop Portals  (ashpd)  --> screenshots, input, files, settings, ...
    |--- AT-SPI bus            (zbus)   --> UI tree, element actions, text, events
    |--- D-Bus session/system  (zbus)   --> arbitrary service access
    |--- PipeWire              (pipewire-rs) --> screen capture frames
    v
Linux desktop  (GNOME / KDE / Sway / ...)

XDG Portals ensure every sensitive operation (screen capture, input injection, file access) goes through a user-facing permission dialog. The AI cannot act without the user granting consent.

Requirements

  • Linux with a Wayland compositor (GNOME 40+, KDE Plasma 5.27+, Sway, or similar)
  • xdg-desktop-portal and a desktop-specific backend (xdg-desktop-portal-gnome, -kde, -wlr)
  • PipeWire (for screen capture)
  • AT-SPI2 (at-spi2-core, typically pre-installed on any desktop with accessibility support)
  • D-Bus session bus (present on all modern Linux desktops)

Build requirements:

  • Rust 1.85+ (edition 2024)
  • System libraries: libdbus, libpipewire-0.3, at-spi2-core, pkg-config
  • LLVM/Clang (for pipewire-sys bindgen)

Installation

Using Nix (recommended)

Run directly without cloning:

nix run github:varbhat/desktopmcp -- --t http # or stdio

Or clone and build locally. The repository includes a flake.nix that provides all system dependencies automatically:

git clone <repo-url>
cd desktopmcp
nix develop
cargo build --release

Release AppImage (recommended)

We use Github Actions to build and release AppImages automatically. Grab the latest AppImage from the releases page. Mark it as executable and run it. It's built using nix-appimage which bundles the nix derivation and all its dependencies into a single-file executable, and hence the size of the AppImage is very big (It's something we'll optimize in upcoming releases—but hey, it lets you try it!).

Without Nix

Install system dependencies, then build:

# Debian / Ubuntu
sudo apt install libdbus-1-dev libpipewire-0.3-dev at-spi2-core \
                 pkg-config libclang-dev

# Fedora
sudo dnf install dbus-devel pipewire-devel at-spi2-core-devel \
                 pkg-config clang-devel

# Arch
sudo pacman -S dbus pipewire at-spi2-core pkgconf clang

# Build
cargo build --release

The binary is at target/release/desktopmcp.

Usage

# stdio mode (default; Your MCP Client will do this for you)
desktopmcp

# HTTP mode -- for remote-mcp (You need to run this beforehand)
desktopmcp --transport http --bind 127.0.0.1:3000

In stdio mode, MCP messages are exchanged over stdin/stdout (JSON-RPC). Logs go to stderr. In HTTP mode, the server listens at http://<bind>/mcp using Streamable HTTP with Server-Sent Events. You can configure your MCP Client to use desktopmcp in stdio mode by specifying the binary path. Or you can run the desktopmcp in HTTP remote-mcp mode and configure your MCP Client to use it by specifying the URL.

Quick examples

Ask AI: "What windows are open on my desktop?"

The AI calls get_window_list and gets back a structured list of every window with title, application name, position, and size -- no screenshot needed.

Ask AI: "Click the Save button in Firefox"

1. find_element(role="push button", name="Save", app_name="Firefox")
   -> returns element ID with position and available actions
2. atspi_do_action(id="...", action_name="click")
   -> button is clicked via the accessibility API

Ask AI: "Take a screenshot and tell me what you see"

1. start_session(devices=["pointer"], with_screencast=true)
   -> user approves the permission dialog once
2. take_screenshot(session_id="...", format="jpeg")
   -> AI receives a base64-encoded image

Ask AI: "Type my email address into the login form"

1. find_element(role="entry", name="Email")
   -> finds the text field
2. type_into(id="...", text="user@example.com")
   -> text is entered via the EditableText accessibility interface

Ask AI: "Send me a notification when the download finishes"

1. send_notification(id="dl-done", title="Download Complete", body="file.zip is ready")
   -> desktop notification appears

Tool reference

Remote Desktop & Input

These tools require an active session created with start_session. The user sees a one-time permission dialog.

Tool Description
start_session Create a remote desktop session (optionally with screencast and clipboard)
stop_session End a session and release resources
simple_screenshot One-shot screenshot via the Screenshot portal (no session needed)
take_screenshot Capture a frame from an active screencast session (PNG or JPEG)
pick_color Pick a color from anywhere on screen
mouse_move Move the mouse by a relative offset
mouse_move_absolute Move the mouse to an absolute screen position
mouse_click Click a mouse button (left, right, middle)
mouse_scroll Scroll the mouse wheel (smooth)
mouse_scroll_discrete Scroll the mouse wheel (discrete click-by-click steps)
keyboard_key Press, release, or tap a key by keycode
keyboard_type Type a text string as a sequence of key taps
touch_event Send touch events (down, motion, up) for touchscreen simulation

XDG Portal Tools

These tools use sandboxed XDG Desktop Portal APIs. Most work without a session.

Tool Description
send_notification Send a desktop notification
open_uri Open a URI in the default application
open_file Open a local file in its default application
open_directory Open a directory in the file manager
scheme_supported Check if a URI scheme (https, ftp, etc.) is handled
open_file_dialog Show an open-file dialog
save_file_dialog Show a save-file dialog
save_files_dialog Show a save-multiple-files dialog
clipboard_read Read text from the clipboard (requires session)
clipboard_write Write text to the clipboard (requires session)
get_appearance Get color scheme and accent color
read_setting Read a specific XDG setting by namespace and key
read_all_settings Read all settings in one or more namespaces
network_status Check network connectivity, metered status
can_reach Test reachability of a hostname:port
set_wallpaper Set wallpaper from a URI
set_wallpaper_file Set wallpaper from a local file
trash_file Move a file to the system trash
get_user_information Get current user's ID, name, avatar
request_background Request permission to run in the background
set_background_status Set a background status message
check_camera Check if a camera is available
compose_email Open the default email client with a pre-composed message
get_location Get geographic coordinates (requires user permission)
get_memory_warning Poll for low-memory warnings
get_power_profile Check if power-saver mode is active
get_proxy Resolve proxy settings for a URI
retrieve_secret Get the app secret from the system keyring
game_mode_status Check GameMode status
list_shortcuts List registered global keyboard shortcuts
bind_shortcuts Register global keyboard shortcuts
print_file Print a file via the system print dialog
session_inhibit Prevent logout, suspend, or idle
get_available_device_types Query available input device types
get_screencast_capabilities Query available cursor modes and source types

Dynamic Launcher

Install and manage .desktop application launchers.

Tool Description
launcher_supported_types Query supported launcher types (application, web app)
launcher_prepare_install Show install dialog for user confirmation (returns a token)
launcher_install Install a .desktop launcher using a token
launcher_request_token Get an install token without a dialog
launcher_uninstall Remove an installed launcher
launcher_launch Launch an app by its .desktop file ID
launcher_get_desktop_entry Read the .desktop file content
launcher_get_icon Get the launcher icon as base64

AT-SPI Accessibility

Semantic access to every UI element on the desktop. No screenshot or coordinate guessing required.

Tree traversal & element inspection:

Tool Description
atspi_get_desktop Get the accessibility tree root and list all applications
atspi_get_applications List running applications with toolkit info
atspi_get_element Get full properties of an element by ID
atspi_get_children Get child elements
atspi_get_child_at_index Get a specific child by index
atspi_get_parent Get the parent element
atspi_get_properties Get name, role, states, interfaces, position, size
atspi_get_attributes Get key-value attributes (CSS properties, etc.)
atspi_get_relation_set Get relations (labelled-by, controlled-by, etc.)
atspi_get_extended_properties Get Locale, AccessibleId, HelpText
atspi_get_application_info Get toolkit name/version, AT-SPI version

Search & UI tree:

Tool Description
find_element Search by role, name, and/or application (high-level)
find_focused Get the currently focused element
get_ui_tree Build a hierarchical UI tree to a given depth
get_window_list List open windows with titles, positions, sizes
wait_for_element Poll until an element appears or timeout
refresh_ui_cache Refresh the application list
atspi_collection_get_matches Fast server-side search by role, interfaces, attributes
atspi_collection_get_matches_to Backwards search from a given element
atspi_get_active_descendant Get the focused item in a container

Actions & interaction:

Tool Description
click_element Find an element and perform a click action (high-level)
type_into Find a text field and type into it (high-level)
atspi_get_actions List available actions on an element
atspi_do_action Perform an action by name or index
atspi_get_action_details Get name, description, key binding for one action
atspi_grab_focus Move keyboard focus to an element

Text:

Tool Description
read_element_text Find an element and read its text (high-level)
atspi_get_text Read text content, character count, caret offset
atspi_set_text Replace text content
atspi_edit_text Cut, copy, paste, insert, delete operations
atspi_set_caret_offset Move the text cursor
atspi_get_text_at_offset Get word/sentence/line at a character offset
atspi_get_string_at_offset Get text segment by granularity
atspi_get_character_extents Get screen bounding box of a character
atspi_get_offset_at_point Get character offset at screen coordinates
atspi_get_text_selections Get active text selection ranges
atspi_set_text_selection Add, modify, or remove text selections
atspi_get_text_attributes Get font, size, style at an offset
atspi_get_text_attribute_value Get a single named text attribute
atspi_get_attribute_run Get the uniform attribute run at an offset
atspi_get_default_attribute_set Get default attributes for the whole text
atspi_get_range_extents Get bounding box of a text range
atspi_get_bounded_ranges Find text ranges within a screen rectangle
atspi_scroll_substring_to Scroll a text range into view
atspi_scroll_substring_to_point Scroll a text range to a specific screen point

Component (geometry, scroll, focus):

Tool Description
atspi_get_position Get screen position and size of an element
atspi_get_size Get width and height
atspi_get_layer Get rendering layer and alpha transparency
atspi_contains Hit-test: check if a point is inside an element
atspi_get_accessible_at_point Find the element at screen coordinates
atspi_scroll_to Scroll an element into the viewport
atspi_scroll_to_point Scroll to a specific point
atspi_set_geometry Move or resize an element (position, size, or extents)

Value, Selection, Table, Hyperlinks, Document, Image:

Tool Description
atspi_get_value / atspi_set_value Read/write numeric widget values (sliders, spinners)
atspi_get_selection / atspi_select_item / atspi_deselect_item Manage selections in lists and combo boxes
atspi_select_all / atspi_clear_selection / atspi_is_child_selected Bulk selection operations
atspi_get_table_info / atspi_get_table_cell Read table dimensions, cell content, row/column spans
atspi_table_select_row / atspi_table_select_column Select table rows/columns
atspi_get_table_selection_counts Get count of selected rows/columns
atspi_get_hyperlinks List hyperlinks with URIs and character ranges
atspi_get_document_info Get document locale, attributes (URL, MIME type), page count
atspi_get_document_text_selections / atspi_set_document_text_selections Cross-element document selections
atspi_get_image_info Get image description, locale, position, and size

Events:

Tool Description
atspi_subscribe_events Subscribe to AT-SPI event categories or specific events
atspi_unsubscribe_events Cancel a subscription
atspi_get_pending_events Poll buffered events
atspi_get_registered_events List all currently registered event listeners
atspi_get_status Check if AT-SPI is enabled and if a screen reader is active

D-Bus Bridge

Direct access to any D-Bus service on the session or system bus. The AI can introspect and interact with arbitrary desktop services.

Tool Description
dbus_list_names List all D-Bus service names
dbus_introspect Introspect a service's interfaces, methods, signals, properties
dbus_list_objects Walk the object tree of a service
dbus_call_method Call any D-Bus method with JSON arguments
dbus_get_property Get a property value
dbus_get_all_properties Get all properties of an interface
dbus_set_property Set a property value
dbus_subscribe_signal Subscribe to D-Bus signals with a match rule
dbus_unsubscribe_signal Cancel a signal subscription
dbus_get_signals Poll buffered signals
dbus_list_subscriptions List active subscriptions
dbus_get_name_owner Resolve a well-known name to a unique bus name

Development

nix develop              # enter dev shell with all dependencies
cargo build              # compile
cargo clippy             # lint
cargo run                # run in stdio mode
cargo run -- -t http     # run in HTTP mode

Verify portals are running:

systemctl --user status xdg-desktop-portal
systemctl --user status pipewire

Enable debug logging:

Test with a raw MCP message:

echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1"}}}' \
  | cargo run --quiet 2>/dev/null

Troubleshooting

Permission dialog does not appear

Restart the portal service:

systemctl --user restart xdg-desktop-portal

PipeWire connection fails

Check that PipeWire is running:

systemctl --user status pipewire
systemctl --user restart pipewire

AT-SPI returns no applications

Make sure the AT-SPI bus is running and accessibility is enabled:

# Check AT-SPI status
dbus-send --session --print-reply --dest=org.a11y.Bus \
  /org/a11y/bus org.freedesktop.DBus.Properties.GetAll \
  string:org.a11y.Status

# Enable accessibility (on Gnome) if disabled
gsettings set org.gnome.desktop.interface toolkit-accessibility true

Mouse/keyboard input has no effect

  • Call start_session first with the required devices (["keyboard", "pointer"])
  • Accept the permission dialog when it appears
  • Verify the session is still active with a valid session_id

Security

desktopmcp is designed around the XDG Desktop Portal security model:

  • Every sensitive operation requires explicit user consent via a system dialog
  • The server works inside Flatpak and other sandboxed environments
  • D-Bus and AT-SPI access follows standard Linux desktop permissions
  • No root privileges are needed
  • The user can deny or revoke access at any time

That said, this server gives AI models significant control over your desktop. Use it with trusted models, review what the AI does, and be aware that an unrestricted AI could perform unintended actions.

Technology

Component Library Version
MCP protocol rmcp 1.7
XDG Portals ashpd 0.13
D-Bus / AT-SPI zbus + zvariant 5
Screen capture pipewire-rs 0.10
Async runtime tokio 1
Image encoding image-rs 0.25
Serialization serde + serde_json 1
CLI clap 4

License

Apache License 2.0