hoverify-mcp 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 UnveelWorks
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,270 @@
1
- # Temporary Holding Version
1
+ # hoverify-mcp
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Lets coding agents use [Hoverify](https://tryhoverify.com) in your own browser: audit a page for SEO, accessibility and AI search, inspect an element's HTML and CSS, and take screenshots. It works on logged-in pages, staging and `localhost`, because it runs in the browser you already have open.
4
+
5
+ It's a standard MCP server over stdio, so it works with any agent that runs local MCP servers: Claude Code, Codex, Cursor, VS Code, Gemini CLI, OpenCode, Grok Build, Muse Code and the others listed below.
6
+
7
+ ## Requirements
8
+
9
+ - The Hoverify extension for Chrome or Firefox, signed in with an active license
10
+ - Node.js 18 or later
11
+ - An agent that runs local (stdio) MCP servers
12
+
13
+ ## Setup
14
+
15
+ 1. In the Hoverify popup, open **AI agent** and switch on **Connect to agent**.
16
+ 2. Add the server to your agent, as shown for each agent below.
17
+ 3. The first time the agent connects, the Hoverify icon shows a **!**. Click it and choose **Allow**.
18
+
19
+ You only allow once per computer: every agent on it shares the same key, so the next ones connect without asking. **Forget** on the AI agent page disconnects them all, and Hoverify asks again next time. The connection switches itself off after 30 minutes without calls.
20
+
21
+ ### Add it to your agent
22
+
23
+ Every agent runs the same thing: the command `npx` with the arguments `-y hoverify-mcp`. Most agents take it in this shape:
24
+
25
+ ```json
26
+ {
27
+ "mcpServers": {
28
+ "hoverify": {
29
+ "command": "npx",
30
+ "args": ["-y", "hoverify-mcp"]
31
+ }
32
+ }
33
+ }
34
+ ```
35
+
36
+ Agents with an add command:
37
+
38
+ | Agent | Command |
39
+ |---|---|
40
+ | Claude Code | `claude mcp add hoverify -- npx -y hoverify-mcp` |
41
+ | Codex (CLI, IDE extension and app) | `codex mcp add hoverify -- npx -y hoverify-mcp` |
42
+ | Amp | `amp mcp add hoverify -- npx -y hoverify-mcp` |
43
+ | Cline CLI | `cline mcp add hoverify --yes -- npx -y hoverify-mcp` |
44
+ | Devin CLI | `devin mcp add hoverify -s user -- npx -y hoverify-mcp` |
45
+ | Factory Droid | `droid mcp add hoverify "npx -y hoverify-mcp"` |
46
+ | Gemini CLI | `gemini mcp add -s user hoverify npx -y hoverify-mcp` |
47
+ | GitHub Copilot CLI | `copilot mcp add hoverify -- npx -y hoverify-mcp` |
48
+ | Grok Build | `grok mcp add hoverify -- npx -y hoverify-mcp` |
49
+ | Kilo Code | `kilo mcp add hoverify -- npx -y hoverify-mcp` |
50
+ | OpenCode | `opencode mcp add hoverify -- npx -y hoverify-mcp` |
51
+ | Qwen Code | `qwen mcp add hoverify npx -y hoverify-mcp` |
52
+ | VS Code | `code --add-mcp '{"name":"hoverify","type":"stdio","command":"npx","args":["-y","hoverify-mcp"]}'` |
53
+
54
+ Gemini CLI starts MCP servers only in folders you've trusted, so accept its trust prompt in your project.
55
+
56
+ Agents that take the config above in a file or a settings screen:
57
+
58
+ | Agent | Where it goes |
59
+ |---|---|
60
+ | Claude Desktop | Settings > Developer > Edit Config, then restart the app |
61
+ | Antigravity | `~/.gemini/config/mcp_config.json`, or `.agents/mcp_config.json` in a project |
62
+ | Cline in VS Code | MCP Servers > Configure > Configure MCP Servers |
63
+ | Cursor | `~/.cursor/mcp.json`, or `.cursor/mcp.json` in a project |
64
+ | Devin Desktop (formerly Windsurf) | Its MCP settings, or `devin mcp add` as above |
65
+ | JetBrains AI Assistant | Settings > Tools > AI Assistant > Model Context Protocol (MCP) > Add |
66
+ | Junie | `~/.junie/mcp/mcp.json`, or `.junie/mcp/mcp.json` in a project |
67
+ | Kiro | `~/.kiro/settings/mcp.json`, or `.kiro/settings/mcp.json` in a project |
68
+ | Warp | Settings > Agents > MCP servers > Add, or `~/.warp/.mcp.json` |
69
+
70
+ Agents with their own format:
71
+
72
+ - **OpenCode**, to share it with a project in `opencode.json` (the add command above writes your global config). Kilo Code takes the same `mcp` block in `kilo.jsonc`.
73
+
74
+ ```json
75
+ {
76
+ "$schema": "https://opencode.ai/config.json",
77
+ "mcp": {
78
+ "hoverify": {
79
+ "type": "local",
80
+ "command": ["npx", "-y", "hoverify-mcp"],
81
+ "enabled": true
82
+ }
83
+ }
84
+ }
85
+ ```
86
+
87
+ - **VS Code**, to share it with a project in `.vscode/mcp.json`:
88
+
89
+ ```json
90
+ {
91
+ "servers": {
92
+ "hoverify": {
93
+ "type": "stdio",
94
+ "command": "npx",
95
+ "args": ["-y", "hoverify-mcp"]
96
+ }
97
+ }
98
+ }
99
+ ```
100
+
101
+ - **Zed**, in its settings file:
102
+
103
+ ```json
104
+ {
105
+ "context_servers": {
106
+ "hoverify": {
107
+ "command": "npx",
108
+ "args": ["-y", "hoverify-mcp"]
109
+ }
110
+ }
111
+ }
112
+ ```
113
+
114
+ - **Muse Code**, in `~/.config/muse/settings.json`, which must keep `"schema_version": 1`:
115
+
116
+ ```json
117
+ {
118
+ "schema_version": 1,
119
+ "mcp_servers": {
120
+ "hoverify": {
121
+ "transport": "stdio",
122
+ "command": "npx",
123
+ "args": ["-y", "hoverify-mcp"]
124
+ }
125
+ }
126
+ }
127
+ ```
128
+
129
+ - **Goose**, through `goose configure` or in `~/.config/goose/config.yaml`:
130
+
131
+ ```yaml
132
+ extensions:
133
+ hoverify:
134
+ name: hoverify
135
+ type: stdio
136
+ cmd: npx
137
+ args: ["-y", "hoverify-mcp"]
138
+ enabled: true
139
+ timeout: 300
140
+ ```
141
+
142
+ The environment variables below (`HOVERIFY_MCP_PORT`, `HOVERIFY_HOME`, `HOVERIFY_BROWSER`) go in the server's `env` block: `environment` in OpenCode and Kilo Code, `envs` in Goose. Add commands take them as `--env NAME=value`, or `-e NAME=value` in Gemini CLI, Qwen Code and Grok Build, placed before the server's command:
143
+
144
+ ```sh
145
+ codex mcp add hoverify --env HOVERIFY_MCP_PORT=48000 -- npx -y hoverify-mcp
146
+ ```
147
+
148
+ Cline CLI and Devin CLI have no env flag, so add them to the config file; Cline keeps them inside the server's `transport` block. Codex and Copilot CLI don't pass your shell's variables on to the server, so set them in the config rather than in your shell.
149
+
150
+ ### Teach your agent the workflow
151
+
152
+ [`skills/hoverify`](skills/hoverify) is an [Agent Skill](https://agentskills.io) that teaches the agent the audit-and-fix loop and how to design screenshots.
153
+
154
+ In Claude Code, the plugin installs the server and the skill together:
155
+
156
+ ```sh
157
+ claude plugin marketplace add UnveelWorks/hoverify-mcp
158
+ claude plugin install hoverify@hoverify
159
+ ```
160
+
161
+ In other agents, or in Claude Code without the plugin, copy the folder into the agent's skills folder:
162
+
163
+ | Folder | Read by |
164
+ |---|---|
165
+ | `~/.claude/skills/` | Claude Code |
166
+ | `~/.agents/skills/` | Codex, Cursor, VS Code, GitHub Copilot CLI, Gemini CLI, OpenCode, Amp, Zed, Warp, Junie, Factory Droid, Kilo Code, Devin, Grok Build, Muse Code, Goose |
167
+ | `~/.cline/skills/` | Cline |
168
+ | `~/.kiro/skills/` | Kiro |
169
+ | `~/.qwen/skills/` | Qwen Code |
170
+
171
+ ```sh
172
+ git clone --depth 1 https://github.com/UnveelWorks/hoverify-mcp.git /tmp/hoverify-mcp
173
+ mkdir -p ~/.agents/skills && cp -R /tmp/hoverify-mcp/skills/hoverify ~/.agents/skills/
174
+ ```
175
+
176
+ To share it with a project instead, put it in the project's `.agents/skills/`.
177
+
178
+ ### More than one browser
179
+
180
+ Hoverify can be on in several browsers at once, say Chrome and Helium. Give each a name under **Browser name** on its AI agent page. Browsers built on Chromium call themselves Chrome, so this is how agents tell them apart. Each agent session then picks a browser like this:
181
+
182
+ 1. **You ask for one.** Tell the agent "do it in Helium", and it passes `browser: "helium"` to the tool. The session stays in that browser afterwards, even if it's renamed, ahead of the project's config or a browser keeping the project, until it's asked for another one. If that browser closes, calls say so instead of moving elsewhere.
183
+ 2. **The project's config names one.** Add `--browser` and the name to the args in that project's MCP config, and every session in the project uses that browser:
184
+
185
+ ```json
186
+ "args": ["-y", "hoverify-mcp", "--browser", "Helium"]
187
+ ```
188
+
189
+ `HOVERIFY_BROWSER=Helium` in the environment does the same. A browser picked either way is never swapped for another: if it isn't connected, the call fails and says so.
190
+ 3. **You keep the project in a browser.** The **Sessions** tab on a browser's AI agent page lists the connected agent sessions by project folder. Switch one on to keep that project there, and its sessions work in that browser from their next call. **Only kept projects** makes the browser turn every other project away, even when an agent asks for it. A project's MCP config still wins over a browser keeping it.
191
+ 4. **Otherwise**, a session's first call goes to the browser you used last, and the session stays there. If that browser goes away, its next call moves to another one and says so.
192
+
193
+ `get_status` shows which browser the session uses, why, its project, and which other browsers are connected. Sessions in the same browser each reach the tab you're viewing plus only the tabs they opened.
194
+
195
+ ## Tools
196
+
197
+ | Tool | What it does |
198
+ |---|---|
199
+ | `get_status` | Checks the connection and shows the active tab |
200
+ | `open_url` | Opens a URL for the agent to work on and returns its tab id |
201
+ | `reload_tab` | Reloads a tab and waits for it to load |
202
+ | `close_tab` | Closes one or all of the tabs the agent opened |
203
+ | `audit_seo` | Meta tags, headings, images, links and structured data, plus broken links (`check_links: true`) and PageSpeed Insights (`page_speed: true`) |
204
+ | `audit_accessibility` | axe-core plus Hoverify's checks, with selectors, snippets and contrast fixes |
205
+ | `audit_geo` | How well AI search can read and cite the page, with a score |
206
+ | `get_site_stack` | Frameworks, libraries, hosting, DNS and SSL |
207
+ | `inspect_element` | An element's HTML, authored CSS, custom properties and box |
208
+ | `get_selected_element` | The element you pinned or are hovering in the Hoverify inspector |
209
+ | `capture` | A screenshot of the viewport, the full page, an element or an area, with its page context, optionally marked up with annotations pointing at elements by selector |
210
+ | `design_screenshot` | A finished, shareable image made in Hoverify's screenshot editor: a background built from glows, gradients, patterns, type, photos and grain, padding, browser or device frame, tilt, annotations pointing at elements by selector, and headlines, text and logos placed on the canvas, or the same without a screenshot |
211
+ | `get_design` | Reads a design the user has open in the screenshot editor, as they have it now: a preview, its choices in `design_screenshot`'s terms, which of the agent's choices the user changed, and every annotation with whose it is and where it sits |
212
+ | `capture_devices` | The page on up to 6 phones, tablets and desktop sizes, each loaded fresh at its screen size with its own browser's user agent and shown in the device with its browser bars, as Hoverify's Responsive view draws it; or each device's full page |
213
+ | `get_fonts` | Font families with weights, sizes, where they're used and where they load from, plus fonts that didn't load |
214
+ | `get_colors` | Colour variables, the colours used for text, backgrounds and borders, and every declared colour |
215
+ | `list_assets` | Images, inline SVGs, videos, Lottie files, PDFs and the favicon, with sizes and dimensions |
216
+ | `download_assets` | Saves chosen assets from the page to local files |
217
+
218
+ Audits return a ranked fix list in Markdown by default; pass `format: "json"` for the raw result.
219
+
220
+ `capture`, `capture_devices`, `design_screenshot` and `get_design` follow your capture settings in Hoverify: with "Hide sensitive content" on, emails, phone numbers, card numbers, keys and filled-in fields found on the page are pixelated in the image before it leaves the browser, and with "Hide clutter" on, cookie banners and chat widgets are hidden while it captures. The agent can pass `raw: true` to `capture` when it needs those exact pixels, and the result then says the settings were skipped.
221
+
222
+ You can switch off individual tools, PageSpeed and the GEO AI review in the Hoverify popup, on the AI agent page. A tool that's switched off tells the agent so instead of running.
223
+
224
+ The agent can reach the tab you're viewing and tabs it opened with `open_url`, nothing else. It can close only the tabs it opened, it can download only assets that are on the page, and it can't click or type on pages.
225
+
226
+ ## What leaves your machine
227
+
228
+ The server listens on `127.0.0.1` only, and it makes no network requests of its own. Web pages can't connect to it.
229
+
230
+ On first run it writes a random key to `~/.hoverify/agent.key`, readable only by you. When you allow an agent, Hoverify keeps a copy, and after that the extension and the server each prove they hold the key on every connection without sending it. A program that grabs the port can't drive your browser without Hoverify asking you first.
231
+
232
+ What the tools return goes to your agent, and from there to the agent's model provider, like anything else the agent reads. Some tools also reach outside services, the same way they do in the extension:
233
+
234
+ - `get_site_stack` looks up the page's hostname for hosting (check-host.net, or Hoverify's own server when that fails), DNS (Google Public DNS) and SSL (decoder.link).
235
+ - `audit_seo` with `check_links: true` requests every link on the page from your browser.
236
+ - `audit_seo` with `page_speed: true` sends the page's URL to Google PageSpeed Insights and the Chrome UX Report.
237
+ - `audit_geo` with `ai: true` sends the page's text to the model provider you set up in Hoverify.
238
+
239
+ Screenshots are saved as PNG files in your system's temp folder, under `hoverify/`.
240
+
241
+ ## Troubleshooting
242
+
243
+ | The agent says | What to do |
244
+ |---|---|
245
+ | Hoverify isn't connected | Switch on **Connect to agent** in the popup. It switches off after 30 idle minutes and when you sign out. |
246
+ | Hoverify is asking whether to let this agent connect | Click the Hoverify icon and choose **Allow**. |
247
+ | Hoverify isn't connected, and another app already uses port 47862 | Pick a free port under **Port** on Hoverify's AI agent page, then add the server to your agent again with the snippets there. They set `HOVERIFY_MCP_PORT` to the same port. |
248
+ | Another agent session holds the connection and uses a different key file | The agents run with different home folders, so each made its own key. Set `HOVERIFY_HOME` to the same folder for all of them. |
249
+ | Helium isn't connected, or the browser this session was asked to use isn't connected | The session was asked for a browser, or its config names one, and that browser isn't connected. Switch on **Connect to agent** in it, have the agent pass `browser` to use another connected one, or check the name under **Browser name** on its AI agent page. |
250
+ | Helium only works for the projects the user keeps in it | That browser has **Only kept projects** on. Keep this project there on its **Sessions** tab, or switch the option off. |
251
+ | More than one connected browser is named Chrome | Give the browsers different names on their AI agent pages. |
252
+ | Hoverify and hoverify-mcp are different versions | Update the extension, and restart the agent so `npx` runs the latest hoverify-mcp. |
253
+ | Another agent session holds the connection to Hoverify and runs a different version of hoverify-mcp | An agent session started before an update still holds the connection. Restart your agent sessions. A newer session also takes over on its own once no browser is connected through the older one, which happens when Hoverify updates. |
254
+ | The tab never became visible | Chrome can only screenshot a tab that's on screen. Bring the browser window forward, or keep it beside your editor. |
255
+
256
+ ## Running from source
257
+
258
+ Straight from GitHub, without cloning (it builds on install): in your agent's config, use the arguments `-y github:UnveelWorks/hoverify-mcp` in place of `-y hoverify-mcp`.
259
+
260
+ Or from a clone:
261
+
262
+ ```sh
263
+ npm install
264
+ npm run build
265
+ npm test
266
+ ```
267
+
268
+ Then point your agent at the command `node` with the argument `/path/to/hoverify-mcp/dist/index.js`.
269
+
270
+ A release bumps the version in `package.json`, `server.json` (twice), `.claude-plugin/plugin.json` and the pinned `npx` version in `.mcp.json`.