Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
제작자가 쓴 설명(영어 원문)
Agents use real GNOME/Wayland apps: on your screen, or an invisible second desktop you never see
이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.
이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.
쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.
DESKWRIGHT_SESSION, DESKWRIGHT_INPUT_BACKEND필요한 것
어떤 앱을 쓰세요?
위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.
Claude Desktop → Settings → Developer → Edit Config를 열고 claude_desktop_config.json에 이 내용을 붙여 넣으세요
{
"mcpServers": {
"deskwright": {
"command": "uvx",
"args": [
"deskwright"
],
"env": {
"DESKWRIGHT_SESSION": "your-value",
"DESKWRIGHT_INPUT_BACKEND": "your-value"
}
}
}
}터미널에서 이 명령어를 실행하세요
claude mcp add deskwright --env DESKWRIGHT_SESSION=your-value --env DESKWRIGHT_INPUT_BACKEND=your-value -- uvx deskwright실행하기 전에 빈 값을 채워 주세요.
프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요
{
"mcpServers": {
"deskwright": {
"command": "uvx",
"args": [
"deskwright"
],
"env": {
"DESKWRIGHT_SESSION": "your-value",
"DESKWRIGHT_INPUT_BACKEND": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
프로젝트의 .vscode/mcp.json에 붙여 넣으세요
{
"servers": {
"deskwright": {
"type": "stdio",
"command": "uvx",
"args": [
"deskwright"
],
"env": {
"DESKWRIGHT_SESSION": "your-value",
"DESKWRIGHT_INPUT_BACKEND": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
이 서버는 내 컴퓨터에서 실행되는데, ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
DESKWRIGHT_SESSION envDESKWRIGHT_INPUT_BACKEND env이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.
내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.
누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 7일 점검
레지스트리 이름이 GitHub 계정 tristanmuzzu 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요
내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요
내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
레지스트리에 필수 키가 나와 있지 않아요. 다만 처음 쓸 때 로그인을 요구하는 서버도 있어요.
내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(0.1.1)은 2개월 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 Python (uv)도 있어야 해요.
같은 카테고리에는: Spec Driven Development, Remote Desktop Commander, AvaHR
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Read hiring data and create inactive assessment and questionnaire drafts for human review.
제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.
Computer use for AI agents on GNOME Wayland.
Let your coding agent use your Linux desktop. Or give it one of its own, so it stops stealing your mouse.
Install • What it can do • A desktop of its own • When something's off • Security
Claude Code can edit your files and run your commands. It can't open GIMP, click a button in a settings dialog, or read what a native app is showing you. On macOS and Windows it can, through computer use. On Linux that's still on Anthropic's list.
This fills the gap on GNOME. It's an MCP server plus a small shell extension, and it hands an agent the actual desktop: launching apps, reading widgets, clicking, typing, dragging, window management, OCR and screen recording. Any MCP client can drive it. Claude Code, Codex, Cursor, your own script.
The part people tend to like most: DESKWRIGHT_SESSION=headless runs all of it on a virtual monitor that isn't on any of your screens. Your agent gets a real GNOME desktop to work on, and it never takes your focus.
The beta adds guarded native controls, exact multi-control queries, adaptive visual fallback and shorter verified execution batches. It supports GNOME Wayland; Windows is not implemented. See the interaction guide and measurements and limits.
For a new installation:
pipx install --system-site-packages 'deskwright==0.2.0b1'
deskwright-setup
For an existing pipx installation, pipx upgrade --pip-args='--pre' deskwright keeps its existing system-site-packages setting. Run deskwright-setup to copy the updated extension, then log out and back in if setup reports a changed extension. Restart the MCP connection to load the updated Python tools. A connection restart alone cannot reload GNOME Shell's extension.
Wayland deliberately stops an application from seeing or touching any other window. That's a good rule, and it's why xdotool, wmctrl and grim either do nothing on GNOME or fail in ways that look like your own mistake. Every Linux computer-use project I found either shipped a Docker container running X11, or quietly assumed X11 and broke.
So I went looking for what GNOME actually permits, and it turns out to be quite a lot, just not where anyone looks. Mutter answers D-Bus. AT-SPI, the accessibility layer built for screen readers, exposes every real widget in every running app with its name, its role and the action it performs. And a shell extension runs inside gnome-shell itself, where the rest lives.
That middle one matters more than it sounds. Pressing a widget's own accessibility action isn't a nicer way to click. It's a different thing: it can't miss, it survives the window moving, and it needs no pointer at all. An agent working this way stops guessing at coordinates, and stops taking a screenshot after every action to find out what happened.
You need GNOME Shell on Wayland. Check with echo $XDG_CURRENT_DESKTOP $XDG_SESSION_TYPE, which should mention GNOME and wayland.
Open Claude Code, or Codex, or whatever you use, and say:
Set up https://github.com/tristanmuzzu/deskwright on this machine,
follow the AGENTS.md.
AGENTS.md is a runbook written for agents. Every command, how to check each one worked, the right package names for Debian, Fedora and Arch, and the handful of things that go wrong with their fixes. Your agent will ask you for a sudo password once and tell you to log out once. That's your whole involvement.
pipx install --system-site-packages deskwright
deskwright-setup
deskwright-setup narrates every step. It turns on the accessibility flag, installs the bundled shell extension, and tells you about any missing system package with the right install line for your distro, so you're never guessing at package names. It never runs sudo itself.
Then log out and log back in. Once. There's no way around this one: on Wayland, gnome-shell only picks up an extension at session start.
Last step, point your client at it:
claude mcp add deskwright --scope user -- deskwright
That's it. Ask your agent to open an app and it will.
Why --system-site-packages , and what breaks without it
PyGObject publishes no wheels to PyPI. It's a distro package everywhere (python3-gi, python3-gobject, python-gobject), so an isolated venv can't import it. Leave the flag off and you get a server that starts cleanly and then dies on the first click with input_backend_failed.
uvx has no equivalent flag, which is the only reason this says pipx. If you'd rather skip pipx, a plain python3 -m venv --system-site-packages followed by pip install deskwright works identically.
As a Claude Code plugin instead
The repo is also a plugin marketplace. It registers the server plus a skill that teaches an agent which tool to reach for first.
claude plugin marketplace add tristanmuzzu/deskwright
claude plugin install deskwright@deskwright
The plugin runs the server from its own checkout, so there's no pip install. You still need the system packages and the extension, so run the setup out of the checkout Claude Code cloned for you, once:
~/.claude/plugins/marketplaces/deskwright/bin/deskwright-setup
Then log out and back in, same as above.
From a clone, if you want to hack on it
git clone https://github.com/tristanmuzzu/deskwright
cd deskwright bin/deskwright-setup ./mcp_server.py --self-test
./mcp_server.py is the same entry point as the deskwright command, by the path older registrations already point at. CONTRIBUTING.md has the layout and which test suites need a real session.
DESKWRIGHT_SESSION=headless deskwright --self-test
You want 18/18 passed. It runs on a virtual monitor rather than your screen, so it's safe to run while you're working. The first run takes about 20 seconds because it has to start a second gnome-shell.
Drop DESKWRIGHT_SESSION=headless and it tests your real desktop instead. Do that one while you're looking at the screen: the self-test injects real input, because it's checking the guards that refuse dangerous key combinations.
When something's wrong, ask your agent to call desktop_health. It answers in one line whether this desktop is usable, then says which mechanisms work right now and what each of them will actually do.
41 tools. Each returns enough that you do not need a second call to work out what happened. The order below is the order an agent should reach for them. Use native controls and exact queries where useful, with screenshots and ordinary input for visual work or incomplete accessibility.
| Tool | What it's for |
|---|---|
ui_apps, ui_tree, ui_find | Find things. ui_find searches 30 levels deep by default, because GTK4 nests far deeper than you'd expect. |
ui_press | Compatibility API for invoking a widget by index path. Requires expect_name or expect_role; inspect the resulting state. Prefer ui_action for native identity and modal guards. |
ui_observe, ui_snapshot, ui_query, ui_inspect, ui_action, ui_wait | Bounded native references, guarded actions and exact completion checks. See semantic interaction. |
ui_set_text | Compatibility API for writing by index path, with exact readback. Prefer ui_action for native references, current-value comparison and modal guards. |
ui_read_text | Read a widget's contents. This is how you verify something worked. |
launch_app | Start an app by desktop id and wait for its window, inside one call. |
screen_map | Where everything is, in pixels: windows top of stack first, plus every pressable widget of the focused app with the point to click it at. Each carries a ref: N you pass straight to ui_press or pointer_click. No coordinates to copy, identity re-checked on use. |
pointer_click, pointer_move, pointer_drag, pointer_scroll | Real pointer input in absolute screen coordinates. Pass expect_window and a click that would land somewhere else is refused, with the blocker named so you can redirect in the same call. |
pointer_path | Draw a continuous curve through a list of screen points, with one button press, bounded duration and interruption checks. Requires a target window. |
window_at, pointer_position | What a click at a point would hit, before you click it. And where the pointer is now, or an honest note that only the last position it set is known. |
find_text | Where a visible string is, in screen coordinates. OCR, about 0.3s for a window, and no image in your transcript. This is the answer for Chrome, Electron and Qt, which expose almost nothing to ui_find. |
wait_for | Wait for a window, a widget, some text, a focus change or the clipboard, instead of sleeping a guessed number of seconds. |
region_changed | Wait for pixels to change. For what wait_for can't express, like a reply arriving or a spinner stopping. |
assert_state | Pass or fail with evidence, so a long run can decide for itself that it's finished. |
do_steps | A known sequence in one call, validated before anything runs, with per-step retry and one picture at the end, or at the step that broke. |
list_windows, activate_window, window_layout, window_manage | Window list, focus and layout. window_layout cannot close windows; general window_manage retains close. |
screenshot, zoom | A picture, or a full-resolution crop of one window, region or widget. zoom never scales, so small text stays readable. |
screencast, frames | For anything that moves, because a still can't show motion. frames also reports a per-frame delta series, which is how you tell a smooth scroll from a juddering one. |
type_text, press_keys, hold_key | Keyboard input through compositor keysyms, with focus proven before anything gets typed. |
clipboard_read, clipboard_write | Pasting beats two thousand keystrokes, and reading back is how you check it arrived. |
journal | The trail of everything the agent did: arguments, outcome, whether it landed, screenshot hashes. For reviewing an unattended run, or working out where you are after a context reset. |
desktop_health | One line on whether this desktop is usable, then the detail. |
An agent that needs your screen is only half useful. deskwright-headless starts a separate GNOME session on a virtual monitor, with its own session bus, its own gnome-shell --headless and its own runtime directory. A server pinned to it drives that desktop with the same 41 tools while you keep the physical one.
deskwright-headless start # about 200 MB of gnome-shell, idempotent
deskwright-headless status # live
앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요