Best MCP for Cursor: Local Tools That Name UI

The best MCP for Cursor is a local Model Context Protocol server whose tools return a named UI element, a confidence score, and a cropped screenshot the Agent can act on. Marketplace lists are useful for discovery. They are not a ranking.
Most "best of" pages count stars. I count whether pinvari_next_instruction style payloads stop the model from guessing which Submit is which.
What does the best MCP for Cursor actually return?
MCP is a wire. Cursor is the client. The server is only as good as the tool result.
A filesystem server that returns a path is useful. A browser server that returns a CSS selector is useful. A screen server that returns "button, Save, frame, confidence 0.94, circled" is the one I keep on all day.
A JPEG plus "the button on the right" is not a tool result. It is homework for the vision model.
Read what an MCP server is if the handshake still feels like magic. Then come back to payloads.
The protocol is plumbing. The payload is the product. Rank servers by what the Agent can execute without a second question.
Named element plus confidence is the bar I use for UI work.
How do I install an MCP server in Cursor without breaking mcp.json?
Cursor reads two files. Global: ~/.cursor/mcp.json. Project: .cursor/mcp.json in the repo root.
Project wins on a name collision. Put always-on tools in the global file. Put repo-only tools in the project file.
A stdio server looks like this:
{
"mcpServers": {
"pinvari": {
"command": "/Users/you/.pinvari/mcp/pinvari-mcp",
"args": []
}
}
}
An HTTP or SSE server you already started looks like this:
{
"mcpServers": {
"local-tools": {
"url": "http://127.0.0.1:3402/sse"
}
}
}
Fully quit Cursor. Reopen. Settings, MCP should show a green dot and a tool list.
The Cursor MCP setup page is the longer install path. This page is the ranking.
Keep secrets out of the file. Dotfile repos leak mcp.json.
One-click installers inside a Mac app write the same block. If the green dot never appears, the process is not running or the path is wrong. The JSON is rarely the mystery.
Which Cursor MCP servers belong in a short list?
I keep five classes. I do not run twenty.
Filesystem and git
Type: stdio, local.
Capture: paths, diffs, blame.
Resolution: a file, not a pixel.
Use it so the Agent stops asking you to paste src/app/page.tsx into chat.
Browser or Playwright
Type: local or hosted.
Capture: DOM, console, network.
Resolution: a selector if the page is honest.
Jam.dev still wins for browser-only console capture. It cannot see a native Mac window. Do not ask it to.
Tracker: Linear, GitHub, Slack
Type: hosted, needs a token.
Capture: issues and comments.
Resolution: a ticket id.
Useful after you already have a named bug. Useless as the first description of a UI miss.
Docs and search
Type: hosted or local index.
Capture: markdown, API pages.
Resolution: a citation.
Good for "what does this SDK method take." Bad for "this toggle is on the wrong side."
Spatial capture on the Mac
Type: local, 127.0.0.1.
Capture: screenshot, on-device transcript, focused-window text up to 40,000 characters, pointer trail.
Resolution: Accessibility role, label, frame, confidence, circled-versus-dwelled provenance.
This is the class I mean when I say the best MCP for Cursor for UI feedback.
MCP tools in practice is the catalog view. Here I only care what Cursor's Agent can call without leaving the machine.
Why do screenshot-only MCP servers waste Cursor tokens?
Vision is expensive. A 4K desktop is a lot of tokens for one misaligned label.
The Agent then invents a selector. It edits the wrong Button. You spend the next turn saying "no, the other Save."
A named element skips that loop. Role plus label plus frame is cheaper than pixels and more honest than a guess.
On AX-blind canvas or some Electron surfaces the tree is empty. Say that. Fall back to on-device OCR. Do not invent a data-testid you did not see.
Ask, never guess is the rule I want in the server, not just in my head.
If confidence is below about 0.8, the Agent should ask. A silent guess looks like a confident patch and wastes a review.
How does a Mac point-and-speak server change Cursor Agent mode?
I hold Option-Command-A. I circle or dwell on the control. I speak the change.
Transcription stays on-device. The connector lives at ~/.pinvari/mcp/pinvari-mcp and talks to the app on 127.0.0.1:3402.
The Agent calls pinvari_next_instruction and gets the path, the spoken line split per mark, the crop, and the window text. pinvari_mark_done closes it. Mid-task, pinvari_request_capture lights the notch island so I can point again.
Deictic words bind to the pointer trail. "Make this blue" knows what "this" was at that timestamp.
Dwell of about 0.2 seconds resolves an element without a circle. Three marks in one breath get three word buckets.
Multi-display marks remember the monitor. Scroll-aware marks keep their own frame after Option-Command-P pause.
None of that is "MCP" as a slogan. It is a payload Cursor can execute.
PinVari is a notarized Developer-ID DMG for macOS 14 and later, Apple Silicon and Intel. The pricing block is $39 launch for the first 500 licenses, then $59, one-time. No subscription for the core app.
You still bring your own model. Cursor's bill is Cursor's bill.
What should I refuse to add to mcp.json?
Anything that needs a cloud key for a job the Mac can do locally.
Anything that screenshots the whole desktop on every turn.
Anything whose tool names collide with a server you already trust.
Anything you cannot name in one sentence.
A long list of red tools in Settings, MCP is not a stack. It is latency.
I also refuse servers that claim they "understand the screen" when they only ship a PNG. Understanding is a name, a score, and a provenance.
How do I test a candidate in ten minutes?
Pick one real bug. Not a demo todo app.
Ask Agent to call the new tools only. Watch the first tool result.
If you still have to paste a screenshot, the server lost.
If the result names the control and the Agent edits the right file, keep it.
If the server hangs, check the process. Local connectors die when the parent app is quit.
Crash-safe session recovery is a product feature, not an MCP feature. Still, I notice when a capture survives a crash.
FAQ
Is the best MCP for Cursor the same as the most popular one?
No. Popular lists mix hosted search, git, and browser tools. Popularity is a discovery signal. Payload quality is the rank.
Can I run more than one MCP server in Cursor?
Yes. I run filesystem, one tracker, and one spatial capture server. More than that and the Agent spends tokens reading tool schemas.
Does Cursor need the PinVari app running?
If you use that connector, yes. The binary talks to the app on 127.0.0.1:3402. A one-click Connect inside the app writes the Cursor block. The CLI form for Claude Code is claude mcp add --scope user pinvari -- "$HOME/.pinvari/mcp/pinvari-mcp". Never the bare claude mcp add pinvari.
What if the green dot never appears?
Quit Cursor fully. Confirm the command path exists. Confirm the app or process is running. Then reopen Settings, MCP. A stale stdio child is the usual fault.
Are hosted MCP servers unsafe?
They are a different trust model. A local 127.0.0.1 server can see the window. A hosted server can see whatever you send it. I keep UI capture local. I let trackers stay hosted.
Do I still need Cursor rules if I have good MCP tools?
Yes. Rules tell the Agent when to call a tool and when to ask. Tools do not replace taste. They replace pasted screenshots.
When should I pick a browser MCP over a Mac spatial MCP?
If the bug only exists in Chromium and you need console plus network, a browser MCP or Jam.dev is the faster first capture.
If the bug is in Cursor itself, in a native preference pane, in Slack, or in an Electron app with a lazy AX tree, a browser tool is blind.
I keep both. I start with spatial capture when I am already looking at the window. I add console lines only when the named control is not enough.
Electron and Chromium often build the AX tree lazily. A serious Mac server sets AXManualAccessibility and retries for about 150ms until a labeled node appears.
A bare AXGroup is not a name. labeledDescendant should walk to the deepest labeled child. Chromium identity attributes (AXDOMIdentifier, AXDOMClassList) can name a title-less node.
If the overlay is topmost, a naive hit-test resolves to the capture app. chainExcludingSelf has to walk the on-screen window list and hit-test the real app. That is unglamorous. It is why the name is trustworthy.
I would rather have that honesty than a prettier gallery of MCP logos.
Bring your own agent still applies. The server does not replace Cursor. It feeds it.
Pick the best MCP for Cursor by reading one tool result. If it names the control, you are done shopping.
Hand your agent the exact element
PinVari resolves what you point at into a named, executable instruction — on-device, no keys, your own agent. One click inside PinVari connects Claude Code, Cursor, VS Code or Codex — or paste one CLI line from pinvari.com/connect.
PinVari → Connect → your agent (one click)Get PinVari — $39 →


