Pyjab MCP server
io.github.gaozhao1989/pyjab-mcp·v0.3.1Drive Java desktop apps from an AI agent, through the JVM's own accessibility tree
0 stars636 downloads/wk
Reviews
Write oneNobody has reviewed Pyjab yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
Pyjab tools (16, 1 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
java_attach_windowBind to one Java window and return a session id for later calls.
java_clickClick an element: a button, a menu item, a check box, a link, a tree node.
java_diagnosticsReport whether this machine can drive a Java application right now.
java_fill_formFill several fields in one call: a list of ``{"handle": ..., "value": ...}``.
java_findSearch an attached window and get a handle for each match.
java_focus_windowBring an attached window to the front, and report whether it actually came forward.
java_get_elementEverything known about one element, and whether it is still the same element.
java_get_tableRead a Java table, a page of rows at a time.
java_get_textRead the text of an element: a label, a text field, a table cell, a document.
java_list_windowsList the Java windows Java Access Bridge can see on this machine.
java_screenshotA PNG of the window, or of one element inside it.
java_selectSelect an option in a combo box, list or tab set — or a row or cell in a table.
java_send_keyswrite actionSend a keyboard shortcut — ``alt+y``, ``ctrl+shift+s`` — to the window.
java_set_textType into a text field, text area or editable combo box.
java_snapshotThe bounded tree view of an attached window, one line per element, with handles.
java_wait_forWait for something to happen, instead of asking too early and being told no.
Public scan report
scanner v0.1.10 · 2026-10-12 · same rubric, same numbers if you re-run it
- Code scan27 source files scanned25/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitylocal package, no credentials required12/15
- Maintenancelast push 0 days ago15/15
- Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10
How Pyjab compares
Against every graded Productivity MCP server, from our own scans and uptime checks. Updated after each scan run.
- Safety score
- 92/100
- higher than 90% of 1,299 Productivity servers
- Tools
- 16
- the typical Productivity server has 7
- Tools that change things
- 6%
- typical: 0%. Fewer write tools means less an agent can break
- Downloads a week
- 636
- more than 86% of 427 Productivity servers with a package
What its tools let an agent do: 15 read · 1 change
Install Pyjab in Claude Code, Cursor or VS Code
claude mcp add pyjab-mcp -- uvx pyjab-mcp
What the publisher says
From the Pyjab repository's README, as published. We do not edit it. Read it on GitHub
pyjab-mcp
An MCP server that lets an AI agent drive Java desktop applications — Swing and AWT — through pyjab, which reads the JVM's own accessibility tree via Java Access Bridge. JavaFX is not supported: it publishes its accessibility through UI Automation rather than Java Access Bridge, so a JavaFX window is not a Java window as far as JAB is concerned (pyjab#227).
<!-- The MCP Registry proves ownership of the PyPI package by finding this exact line in the README of the published package, so it cannot be added after a release. Keep it. --> mcp-name: io.github.gaozhao1989/pyjab-mcp
It never modifies, restarts or injects into the target application. That constraint is the point: launch parameters, classpaths and dependency JARs stay exactly as they are, which is what makes this usable against a production Java client that you cannot change.
The alternative is to put an agent inside the target JVM. An agent is attached to a JVM that is already running, or named on the command line with -javaagent when the application starts, and either way the tool's code sits inside someone else's process — a JVM it did not launch and does not control. This server does neither: it loads nothing into the application and reads the accessibility tree through Java Access Bridge from outside it, which is how it can attach to a process it did not launch.
The dynamic half of that — attaching an agent to a JVM that is already running — is the half the JDK has a direction on, with no release date attached. JEP 451 shipped in JDK 21 as the preparation stage: loading an agent into an already-running JVM now warns. The JEP states its aim as "prepare users for a future release which disallows the dynamic loading of agents by default", a release that has not been named; its own non-goals leave agents named with -javaagent at startup, and any use of the Attach API that is not loading an agent, outside that direction.
Status
Released on PyPI — 16 tools: javadiagnostics, javalistwindows, javaattachwindow, javasnapshot, javafind, javagetelement, javagettext, javagettable, javaclick, javasettext, javaselect, javafillform, javasendkeys, javafocuswindow, javawaitfor, and javascreenshot. It needs pyjab>=1.11.0: 1.9.0 brought the tree walk a snapshot is built on, 1.10.0 brought the public window listing and JABDriver.detach(), which releases a driver's binding without terminating the process — this server has no tool that releases a session, so a binding lasts for the life of the process — and 1.11.0 brought JABDriver.sendkeys, so javasendkeys sends a real chord, and JABDriver.focus(), so javafocus_window can bring a window forward.
javasendkeys sends a chord to whichever window has the keyboard focus, and attaching does not give a window focus (pyjab#180). javafocuswindow is the missing half: it brings the window forward and, because asked for focus and got focus are different facts, it reports whether the window actually came forward rather than assuming it did. It probes for the API rather than assuming it, so an install below the pin is told which release has it instead of failing with an AttributeError.
Two elements can share a name, which is why a handle carries where an element is as well as what it is called: searching by name returns every match, each gets its own handle, and the end-to-end suite checks that clicking one acts on that one and not the other.
Shortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
Pyjab: common questions
- Is Pyjab MCP server safe?
- Yes, by our scan: it is graded A (92/100). Read the Pyjab safety report
- How do I install Pyjab?
- It runs on your machine. Copy the Claude Code, Cursor, VS Code or Claude Desktop config from the install section.
- Does Pyjab need an API key?
- Not as far as the registry entry and our scan can tell: no credentials are declared or required.
- Is Pyjab maintained?
- The last commit was 23 days ago (2026-10-12). The latest release is v0.3.1.
- What can I use instead of Pyjab?
- Servers from other publishers that do the same job: Argent MCP server, Flutter MCP Toolkit MCP server and Hunch MCP server. Compare all Pyjab alternatives.
- How does Pyjab compare with other Productivity MCP servers?
- safety score 92/100 (higher than 90% of 1,299 Productivity servers); tools 16 (the typical Productivity server has 7); tools that change things 6% (typical: 0%. Fewer write tools means less an agent can break). Full comparison.
Alternatives to Pyjab
Same job from other publishers: the closest match first, then the best rated.
- ArgentDrive iOS Simulators, Android emulators, TVs and Electron/web apps from your coding agentnot reviewedWidely usedA
Flutter MCP ToolkitInspect and drive Flutter debug apps/games: semantic snapshots, search, and custom client toolsnot reviewedGrowingA- HunchFocus-free macOS control for AI agents: drive your real Mac apps in the background, no stolen focus.not reviewedGrowingA
- gflow-cliDrive Google Flow from an agent: Veo video and Imagen image generationnot reviewedEstablishedA
- Buoy GgLet AI agents read and drive a running React Native or Flutter app through Buoy's devtools.not reviewedEstablishedA