Repository navigation
v7.1.0
Native MCP surfaces the server wasn't exposing yet (resources, lifespan warm-up, icons, tool annotations), stricter HTTP-transport security, finer-grained tool feedback through MCP notifications/message, and a consolidated system-level brief delivered through the spec-canonical instructions field.
Added
- MCP resources.
ghostdesk://apps(JSON catalogue of installed GUI apps) andghostdesk://clipboard(current clipboard text) mirror theapp_list/clipboard_gettools so clients that surface resources in a dedicated picker can reach read-only state without spending an agent turn on a tool call. - FastMCP lifespan. The server pre-binds
zwlr_virtual_pointer_v1andzwp_virtual_keyboard_v1during ASGI startup. Missing compositor protocols now fail at boot instead of surfacing mid-request on the firstmouse_click. - MCP context notifications on tools.
mouse_*andkey_*push awarningwhen the 200×200 zone around the action does not change within 2 s — the miss is visible in the client's transcript, not only in the tool result dict.app_launchandclipboard_setmirror their outcomes throughctx.info/ctx.error. - GhostDesk icon on every MCP surface. The branded mark is advertised on the server itself, every tool, and both resources through MCP's
iconsfield. Inlined as a base64 SVG data URI — no packaging asset to ship alongside the wheel. ToolAnnotationson every tool.readOnlyHint,destructiveHint, andidempotentHintlet MCP clients differentiate approval flows for read-only vs destructive actions:screen_shot/clipboard_get/app_listare tagged read-only + idempotent,mouse_click/mouse_drag/key_pressare tagged destructive, etc.- Origin header validation (MCP Streamable HTTP spec § DNS-rebinding). Browser requests must match
GHOSTDESK_ALLOWED_ORIGINS(comma-separated) or get a403. Non-browser clients (noOriginheader) pass through unchanged. - Loopback bind by default.
GHOSTDESK_HOSTdefaults to127.0.0.1; the container entrypoint exports0.0.0.0so Docker port-publishing still reaches the server, but standaloneuv run ghostdeskno longer silently exposes the port to the LAN.
Changed
- Consolidated system-level brief. The full agent doctrine (SEE → ACT → SEE, prefer-keyboard, interruption handling, scroll-to-end, final self-check) is now carried by the server
instructionsfield — the MCP spec-canonical payload delivered in theinitializeresponse and auto-injected by every compliant client. Per the MCP spec,promptsare user-controlled templates (slash commands, picker entries), which makes them the wrong mechanism for a system-level brief that must always reach the model. One document, guaranteed delivery. - Package layout for MCP surfaces.
resourcesis now a package (matchingapps,clipboard,input,screen) — every domain with aregister(mcp)function follows the same__init__.pyconvention. warn_on_misshelper. Lives ininput/feedback.pyalongsidebuild_feedbackandpoll_for_change, so mouse and keyboard tools share the miss-warning path without crossing underscore-prefixed module boundaries.mcp[cli]pinned to>=1.27. Unlocks theToolAnnotations,Icon, and lifespan APIs used throughout this release.
Fixed
- Wheel scroll direction inverted.
mouse_scroll(direction="up")(and"left") silently scrolled the other way: the virtual-pointeraxis_discreterequest was sent withdiscrete=+1regardless ofvalue's sign, violating thewl_pointerprotocol invariant that the two must match within a frame. Firefox — like any wheel-aware client — trustsdelta_discrete, so every "up" scroll collapsed into "down" and pinned at the page bottom. Sign is now carried in_SCROLL_VECTORSalongsidevalue, and a static test locks the invariant.
Removed
- Standalone
SYSTEM_PROMPT.md. Its content is now folded into the serverinstructionsfield, delivered automatically at session init. Users who referenced the markdown file directly no longer need to — the guidance now reaches the model through the MCP handshake.
Full Changelog: v7.0.1...v7.1.0