astro-ai-locator-mcp
Enables AI agents to locate source code of UI elements in an Astro dev server by clicking them, providing exact file, line, and column information.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@astro-ai-locator-mcpastro_hash_0123456789abcdef change padding"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
astro-ai-locator
Click a UI element in your Astro dev server. Your AI agent gets the exact source file, line, and column.
No browser extension. No editor-specific deep links. Just a hash on your clipboard and an MCP server that resolves it.
Demo
Related MCP server: Carto MCP Server
Why
Telling an AI agent "fix the padding on the card in the pricing section" makes it guess. It greps, it opens the wrong file, it edits a component that renders somewhere else entirely.
astro-ai-locator removes the guessing. You point at the pixel. The agent gets the line.
You: [pastes astro_hash_0123456789abcdef01234567] make this card's padding tighter
Agent: → get_astro_element_by_hash
src/components/PricingCard.astro:24:5 <div> → <div>
...edits the right file on the first tryInstall
Requires Node.js ≥ 22.12 and Astro 7.
npm install --save-dev astro-ai-locatorAdd the integration:
// astro.config.mjs
import { defineConfig } from "astro/config";
import { astroAiLocator } from "astro-ai-locator";
export default defineConfig({
integrations: [astroAiLocator()]
});Ignore the runtime manifest in your project:
# .gitignore
.astro-ai-locator/Usage
Run astro dev, then:
Step | Action |
1 | Hold the trigger key — |
2 | Read the overlay: faint grey outlines every trackable element, a muted purple outline marks the nearest metadata-bearing ancestor, and a solid purple overlay marks the current target. |
3 | Click the element. |
4 | A hash like |
5 | Paste it into any MCP-connected CLI or ACP chat and ask for the change. |
The hover label
The current target shows a label in the form:
<SourceTag→DomTag> │ FileName.astro │ line:columnThe filename keeps its extension, and the arrow is omitted when the source tag and the rendered DOM tag are identical. The full project-relative path is preserved in the DOM metadata, the manifest, and the MCP response.
Changing the trigger key
A translucent grey fox button sits in the bottom-left corner of every dev page. Click it to open a blurred, high-density settings popover.
Pick
Control,Option / Alt, orCommand / Metafrom a 28px-row list.The active key is marked with a small purple keycap; the hovered row lightens.
Pressing or releasing the trigger key never opens or closes the popover.
Combinations that include another modifier are not intercepted by the locator.
Drag the fox button to reposition it — the popover follows and the position persists in the browser.
Close the popover with an outside click or
Escape. It always starts closed on reload.
The Overlay Color chip under Preferences is a preview for a future theming feature and is not clickable yet.
Options
Option | Type | Default | Description |
|
|
| Outline every trackable element while the locator is active. Set to |
integrations: [astroAiLocator({ showAllBoundaries: false })]MCP setup
Register a project-local stdio command with your MCP host. --project-root must be an absolute path to the Astro project.
{
"command": "npx",
"args": [
"--no-install",
"astro-ai-locator-mcp",
"--project-root",
"/absolute/path/to/your/astro-project"
]
}If your host launches commands from outside the Astro project, point command directly at the binary instead:
/absolute/path/to/your/astro-project/node_modules/.bin/astro-ai-locator-mcpThe tool
When a prompt contains an astro_hash_ value, the model calls get_astro_element_by_hash and receives:
the project-relative file path, plus a validated absolute path
line, column, source tag, and rendered DOM tag
the code surrounding the selection
Full file contents are never included in the MCP response. The connected CLI or ACP reads only the range it needs, from the validated path.
How it works
In dev mode the Astro integration installs a Vite plugin and a small browser client.
Inject. Before Astro/React compilation, the plugin adds source-location attributes to
.astro,.tsx, and.jsxtags inside the project root. Thesedata-*attributes survive into the real DOM, including after React islands hydrate.Select. The browser posts the chosen location to an authenticated local dev endpoint.
Hash. The server derives a deterministic hash and records it in a manifest.
Resolve. A standalone stdio MCP server reads that manifest and maps the hash back to source.
Picking the right element
The client calls document.elementsFromPoint() to get the DOM stack under the pointer, then de-duplicates metadata candidates. It ranks them by the area of the actual rendered box containing the pointer, then DOM depth, then browser stack order — so the most specific element wins.
While the locator is active, ::before and ::after are prevented from intercepting hit testing. Elements with pointer-events: none — which the browser excludes from the hit stack entirely — are collected once on activation and folded into the same candidate evaluation.
The result: elements behind real DOM overlays or stretched links, and nested JSX children inside islands, all resolve to the correct source location.
Overlay hierarchy
Layer | Appearance |
All trackable elements | Faint grey dotted outline |
Nearest ancestor with metadata | 2px purple solid outline at 40% opacity, no fill, no label, drawn 2px outside the ancestor box so the current boundary never covers it |
Current target | 2px purple solid outline with a 10% fill, plus the hover label |
Hash stability
Repeated renders of the same .astro tag share one hash across all DOM instances. When the file changes through HMR — or is deleted — its existing hashes are invalidated.
Runtime files
Per-project selection manifest (gitignore this):
.astro-ai-locator/manifest.jsonUser-global trigger key, shared across every repository and worktree:
~/.astro-ai-locator/settings.jsonThe browser never touches this file directly. On page load the client makes one authenticated call to a local Vite endpoint, and the Vite process reads or atomically writes the file. Changes apply immediately on the current page; other open pages pick them up on refresh. A missing or corrupted file falls back to Option/Alt, and the file is not created until you actually change a setting.
Scope
Supported | Notes |
✅ | Full source tracking |
✅ React | Including nested JSX inside |
✅ Astro/React component call sites | Metadata is injected at the call site; selectable when the component forwards its received |
⚠️ Monorepo UI packages outside the project root | Source is not transformed. Only components that forward |
❌ Vue, Svelte, and other framework islands | Fine-grained source tracking inside them is not supported yet |
Additional constraints:
Dev mode only. Production builds receive no client, no endpoint, and no source metadata.
If clipboard permission is denied, the client falls back to a browser prompt for manual copy.
Key combinations the browser never delivers to the page — OS-reserved
Command/Metashortcuts, for example — cannot be intercepted.Assumes one Astro dev server per project directory.
Security
Dev endpoints require a token that is regenerated for every process. The element-registration endpoint caps the request body and the source file size, and accepts only real .astro / .tsx / .jsx files inside the project root at valid line and column positions. The settings endpoint reads and writes exactly three allowed modifiers.
The MCP server normalizes both manifest and source paths with realpath, blocking path traversal and symlink escapes. On stdio, stdout carries the MCP protocol only — all diagnostics go to stderr.
Current limitations
A hash is derived from file path, line, column, and DOM tag. Moving the tag or changing what it renders produces a new hash.
Astro major versions that change the compiler AST need separate compatibility verification.
MCP SDK 1.29 carries a moderate advisory on a
serve-staticpath affecting Windows, via its HTTP helper dependency. This package does not expose that HTTP server — it uses the local stdio transport only.This release provides source lookup only. File-write permission and the actual code edits belong to the connected AI host.
License
ISC
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Imjungjuna/astro-ai-locator'
If you have feedback or need assistance with the MCP directory API, please join our Discord server