Correlaciona logs del navegador y del servidor de desarrollo en una única línea de tiempo para ayudar a los agentes de IA a depurar aplicaciones web y de React Native.
También conocido como vincentvella/devloop, devloop-mcp
- Stars
- 2
- Herramientas
- 41
- Descargas, 30 días
- —
- Última versión
- 0.13.0
- Último commit
- 10 nov 2026
- Licencia
- MIT
¿Qué es Devloop MCP?
Devloop es un MCP server. Correlaciona logs del navegador y del servidor de desarrollo en una única línea de tiempo para ayudar a los agentes de IA a depurar aplicaciones web y de React Native. Expone 41 herramientas, como dev_start, dev_stop, dev_status.
Resumen generado a partir del README del proyecto
Acerca del MCP server de Devloop
Devloop proporciona un entorno de depuración unificado que sincroniza los logs del navegador y del servidor de desarrollo en una única línea de tiempo con marcas de tiempo. Esto permite a los desarrolladores y a los agentes de IA correlacionar errores de la consola del frontend con trazas de la pila (stack traces) del backend del mismo instante.
Los usuarios pueden interactuar con el servidor a través de un modo stdio headless para herramientas como Claude Code, un demonio de larga ejecución mediante HTTP/SSE, o una aplicación de escritorio completa basada en Electron llamada Cockpit. La interfaz de Cockpit incluye paneles de navegador integrados y espejos de dispositivos interactivos en vivo para pruebas móviles. Para la depuración móvil nativa, el sistema se integra con Metro, Hermes, idb para iOS y adb para Android para proporcionar pilas con source maps y captura de red.
Esta herramienta está diseñada para ingenieros que necesitan verificar funciones en vivo en lugar de depender únicamente del análisis de código. Ofrece herramientas especializadas como browser_snapshot para la selección de elementos basada en accesibilidad, repro para reproducir secuencias de interacción y diagnose para agrupar errores con solicitudes de red fallidas.
Qué puedes hacer con él
- 1Correlacionar errores de frontend y backendUn agente de IA puede alinear un error de la consola del navegador con una traza de la pila específica del backend utilizando un reloj monotónico compartido.
- 2Depurar aplicaciones de React NativeLos desarrolladores pueden depurar aplicaciones móviles visualizando errores de la consola JS y logs de dispositivos nativos en una línea de tiempo unificada.
- 3Verificar correcciones de funciones en vivoEn lugar de asumir que los cambios de código funcionan, un agente puede usar una secuencia de reproducción para confirmar una corrección en la aplicación en ejecución.
Escrito a partir del README del proyecto. Cada caso de uso se verifica con una cita del mismo.
Cómo instalar Devloop MCP
Formatos verificados el 10 nov 2026Instalar Devloop MCP en Claude Code
$ claude mcp add devloop -- npx -y devloop-mcpInstalar Devloop MCP en Cursor
~/.cursor/mcp.json
{
"mcpServers": {
"devloop": {
"command": "npx",
"args": [
"-y",
"devloop-mcp"
]
}
}
}Instalar Devloop MCP en VS Code
.vscode/mcp.json
{
"servers": {
"devloop": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"devloop-mcp"
]
}
}
}Instalar Devloop MCP en Claude Desktop
claude_desktop_config.json
{
"mcpServers": {
"devloop": {
"command": "npx",
"args": [
"-y",
"devloop-mcp"
]
}
}
}Instalar Devloop MCP en Codex
~/.codex/config.toml
[mcp_servers.devloop] command = "npx" args = ["-y", "devloop-mcp"]
Instalar Devloop MCP en Gemini CLI
~/.gemini/settings.json
{
"mcpServers": {
"devloop": {
"command": "npx",
"args": [
"-y",
"devloop-mcp"
]
}
}
}Herramientas de Devloop MCP 41
Detectado desde el READMEdev_startdev_stopdev_statusnative_opennative_closenative_buildnative_doctorbrowser_navigatebrowser_backbrowser_screenshotbrowser_clickbrowser_type
| dev_start | — | |
| dev_stop | — | |
| dev_status | — | |
| native_open | — | |
| native_close | — | |
| native_build | — | |
| native_doctor | — | |
| browser_navigate | — | |
| browser_back | — | |
| browser_screenshot | — | |
| browser_click | — | |
| browser_type | — |
Mostrar las 41 herramientasMostrar menos herramientas
browser_hoverbrowser_wait_for_idlebrowser_clear_storagebrowser_emulatebrowser_throttlebrowser_evalbrowser_snapshotbrowser_wait_forget_logsget_logs_aroundget_networkexport_hardiagnoseexport_bundleclear_logsreproproject_listproject_addproject_removepane_listpane_newpane_selectpane_closepane_poppane_set_labelext_listext_installext_removeext_set_enabled
| browser_hover | — | |
| browser_wait_for_idle | — | |
| browser_clear_storage | — | |
| browser_emulate | — | |
| browser_throttle | — | |
| browser_eval | — | |
| browser_snapshot | — | |
| browser_wait_for | — | |
| get_logs | — | |
| get_logs_around | — | |
| get_network | — | |
| export_har | — | |
| diagnose | — | |
| export_bundle | — | |
| clear_logs | — | |
| repro | — | |
| project_list | — | |
| project_add | — | |
| project_remove | — | |
| pane_list | — | |
| pane_new | — | |
| pane_select | — | |
| pane_close | — | |
| pane_pop | — | |
| pane_set_label | — | |
| ext_list | — | |
| ext_install | — | |
| ext_remove | — | |
| ext_set_enabled | — |
Configuración
DEVLOOP_DAEMON_IDLE_MS
| Nombre | Descripción | Tipo |
|---|---|---|
| DEVLOOP_DAEMON_IDLE_MS | — |
Verificaciones automáticas
Ejecutado 12 nov 2026Informe completo →Pasó nuestras verificaciones automáticas. Esto no es una auditoría de seguridad: lee el código y dale al servidor el acceso más limitado que necesite. Cómo funcionan las verificaciones
- Repositorio de origen vinculado y accesibleAprobado
- Licencia de código abierto (OSI)Aprobado
- Commit o lanzamiento en el último añoAprobado
- El nombre del paquete no es similar a un paquete popularAprobado
- El endpoint remoto usa HTTPSNo verificado
- Las herramientas destructivas están etiquetadasAprobado
- Sin instrucciones ocultas para el modeloAprobado
- Sin avisos críticos en el paquete ni en sus dependenciasAprobado
README
Ver en GitHubA unified dev-loop tool: it drives a browser and your dev server, pushing both sides into one timestamped buffer so you can correlate a browser console error with the backend stack trace from the same moment. It runs two ways from a shared core:
- Headless (stdio) — drives Chrome via Puppeteer, served over stdio. The lightweight mode Claude Code spawns per session. Run
devloop-mcp daemonto instead serve one shared, long-running instance over HTTP/SSE that many agents/sessions connect to (see Daemon mode). - Cockpit (Electron) — a single desktop window: tabbed browser panes (embedded
WebContentsViews driven via CDP) with a browser bar (back/forward/reload + address) beside a collapsible side panel that toggles between logs and a repro builder. Project picker, auto-navigate, pop-out targets. The renderer is React 19 + Tailwind v4 + Radix + lucide-react. Serves the same tools over HTTP.
Because every event (browser console/network/page-errors and server stdout/stderr) shares one monotonic clock, get_logs_around / repro return a correlated, cross-source slice of the timeline.
Native targets — Expo / React Native (iOS + Android)
The cockpit also drives Expo/React Native projects, not just web. Open a native project and you get one pane with a Web · iOS · Android target switcher, a bundler toggle (Metro) separate from a Build button (expo run:ios / expo run:android, with @expo/fingerprint staleness detection), and:
- JS console + errors over CDP via Metro's Hermes inspector (both platforms) — with source-mapped stacks (your bundled
index.bundle:1:…resolves to original.tsx). - RN network capture — an injected
XMLHttpRequesthook turns the app's fetch/XHR traffic into the samenetworktimeline rows as web (soget_network/export_har/ the network chip work for native too). - Native device logs merged onto the timeline as a
nativesource — iOSsimctl log stream, Androidlogcat. - A live, interactive device embedded in the pane — iOS via serve-sim (MJPEG, tap/scroll/type), Android via Expo's serve-emu (scrcpy H.264, up to 60fps, with tap/swipe/scroll/type). Screenshots on both.
- Agent-drivable interactions —
browser_snapshotreads the native accessibility tree (iOS via idb's UIKit a11y tree; Android viauiautomator dump) andbrowser_click/type/scroll/pressdrive the device by an element'spt:x,yref (from the snapshot) or its label — replayable throughrepro, openable over MCP vianative_open/native_build. The same agent tools as web, mapped onto native.
All of it lands on the same correlated timeline, app-scoped — the web dev-loop experience, for a native app. (macOS + Apple Silicon for the embedded iOS simulator; Android works wherever the Android SDK + an emulator do.)
iOS interactions need idb: brew install facebook/fb/idb-companion and pipx install fb-idb (use Python <3.14 — newer Python breaks fb-idb). Android interactions need the Android SDK platform-tools (adb) + a booted emulator. The cockpit's Settings → native readiness runs a per-platform preflight (iOS: idb · companion · booted sim; Android: adb · booted device) and shows the exact fix for anything missing; observation (logs/screenshots) works without the interaction tooling.
serve-sim is vendored into the cockpit and run via Electron's own Node, so the embedded simulator works out of the box — offline, no bun/node/npx or first-run fetch. (Running from source uses the copy in node_modules instead.)
Architecture
Three transports expose one shared core, which drives one of several substrates (a real browser, or — in the cockpit — a native device). Everything pushes onto a single timestamped timeline.
%%{init: {"flowchart": {"wrappingWidth": 700}}}%%
flowchart TD
clients["<b>MCP clients</b><br/>Claude Code · agents · mcporter"]
clients --> stdio & daemon & cockpit
stdio["<b>stdio</b><br/><i>spawned per session</i>"]
daemon["<b>daemon</b><br/><i>HTTP/SSE · one shared instance</i>"]
cockpit["<b>cockpit</b><br/><i>HTTP/SSE · Electron app</i>"]
stdio --> mcp
daemon --> mcp
cockpit --> mcp
mcp(["<b>MCP Server</b><br/><i>stdio transport, or HTTP/SSE for the daemon + cockpit</i>"])
mcp --> core
core["<b>shared core</b> · <i>transport- and substrate-agnostic</i><br/>the MCP tool layer + one unified, correlated timeline"]
core --> iface(["<b>IBrowserController · IBrowserManager · ITargetController</b><br/><i>capability-gated by the active target</i>"])
iface --> pup & elec & rn
pup["<b>web</b> · Puppeteer / Chrome<br/><i>stdio + daemon</i>"]
elec["<b>web</b> · Electron CDP panes<br/><i>cockpit · per-project partitions</i>"]
rn["<b>native</b> · React Native (Hermes)<br/><i>JS + network over Metro CDP</i>"]
rn -->|"idb / adb"| nd["<b>NativeDriver</b><br/>iOS idb · Android adb<br/>taps · snapshot · screens · logs"]
The tool layer never knows what's behind it — Puppeteer or Electron, stdio or HTTP, web page or native app. It's wired once at startup. The browser sits behind a single IBrowserController interface; the cockpit's pane manager implements the richer IBrowserManager (multiple panes, delegating browser_* to the active one — or to the native controller when an iOS/Android target is open). A capability layer gates tools by the active target, so an agent gets a clear message instead of a substrate error.
stdout is reserved for the MCP protocol in stdio mode; all human-facing output goes to stderr.
The layers
- Transports — three entrypoints over two protocols: stdio (one server per session) and HTTP/SSE (the long-running daemon, and the cockpit). All build the same MCP server bound to the tool layer; only the HTTP transports are multi-client (each connecting client gets its own session, one shared backend).
- Shared core — the tool layer (the MCP tools + a capability-gated dispatcher) over one unified, correlated timeline (server output, browser console/network/errors, native logs), backed by a separate full-capture network ring. The cross-cutting features the tools expose — a project registry, error diagnostics, source-map resolution, HAR export, and bug-report bundles — live here too.
- Browser substrates — a shared controller interface with two web implementations (Puppeteer/Chrome for headless; Electron
WebContentsViewpanes over CDP in the cockpit) and a native one (React Native over Hermes/Metro). Shared page-action + accessibility-snapshot logic and device/throttle emulation sit above them. - Native targets — an RN controller (JS/errors/network over Metro CDP) delegates taps + snapshots to a
NativeDriver(idb on iOS, adb on Android); native logs (simctl / logcat), screenshots + live mirrors, build orchestration (expo run), and a readiness preflight round it out. - State & isolation — an on-disk registry (projects / session / panes), per-project session partitions, and Chrome-extension management.
- Cockpit (Electron) — the desktop shell: a pane manager (per-project partitions, native routing), the React UI (timeline, browser bar, repro builder, target switch, Android mirror), the vendored serve-sim iOS mirror and serve-emu Android stream, the in-store "Add to Devloop" injection, and the in-app updater.
Install
Headless MCP (stdio) — no clone needed, register it with Claude Code:
claude mcp add devloop --scope user -- npx -y devloop-mcp
(Published as devloop-mcp on npm; Puppeteer fetches Chromium on first install.)
Cockpit (desktop app) — grab the installer for your OS from Releases (.dmg / .exe / .AppImage). macOS ships both Apple Silicon (arm64) and Intel (x64) builds. The app checks GitHub for a newer release on launch and prompts before downloading or installing — or trigger it yourself from settings → updates → check for updates.
From source (dev) — requires bun:
bun install
bun run app # build + launch the Electron cockpit
bun run start # or run the stdio MCP directly
Use it from your coding agent
Once it's registered, drop this into your CLAUDE.md (or any agent's rules file) so the agent drives features through Devloop and verifies them live instead of reasoning from the code alone:
## Devloop — use it for any web/mobile feature work
When you build, test, or debug a feature that runs in a **browser** or an **Expo /
React Native** app, drive it through **devloop** instead of reasoning from the code
alone. It puts the dev-server logs and the live browser/device on one correlated
timeline, so you can see what actually happened.
- **Start the loop:** `dev_start` (auto-detects the dev command), then
`browser_navigate` to the page — or `native_open` for an iOS/Android target.
- **Act, then verify — don't assume:** after a change, reproduce it with `repro`
(a navigate/click/type sequence) and read the result. Never claim a fix works
without exercising it in the running app.
- **Find/target elements** with `browser_snapshot` (returns clickable `ref`
selectors) — prefer it over screenshots.
- **When something breaks:** `diagnose` first (groups errors + failed requests),
then `get_logs_around` a timestamp to line up the browser console error with the
matching server stack trace from the same moment. `get_network` / `export_har`
for request detail.
- **Definition of done:** the feature is verified live in devloop — no console or
page errors, the expected network calls succeeded, the UI reflects the change —
not just "the code looks right."
- **Setup stays yours:** if a native build needs a toolchain that isn't installed,
devloop tells you exactly what's missing and the command to fix it — it
**diagnoses, it never installs or touches your toolchain.** Run the fix, then rebuild.
Register once: `claude mcp add devloop --scope user -- npx -y devloop-mcp`
Tools (46)
Dev server — runtime, no per-project registration needed
dev_start({ project?, cmd?, cwd? })— start a dev server and tee its logs. Specify it three ways: a saved registryproject; explicitcmd+cwd; or neither (cwddefaults to the server's dir,cmdauto-detected frompackage.jsonscripts:dev/develop/web/start/serve).dev_stop()— stop it. Kills the whole process group (sonext dev/metrograndchildren die too).dev_status()— running?, plus cmd/cwd/pid.
Native targets — Expo/React Native (cockpit only; needs Electron + a simulator/emulator)
native_open({ platform })— open the iOS simulator or Android device mirror for the active pane;browser_*then drive the native app (idb/adb) and JS + native logs stream to the timeline. Returnsok:falsewith a reason if the device/tooling isn't ready.native_close()— back to the pane's web content.native_build({ platform, cwd? })—expo run:ios/expo run:android, streamed to the timeline (cwddefaults to the active pane's project). Android returns a toolchain checklist instead of building if the SDK/JDK isn't set up.native_doctor()— re-check native readiness without building or opening: iOS + Android interactions + the Android build toolchain, each a ✓/✗ checklist with the fix for anything missing. Run it after installing a missing tool to confirm it's resolved.- In headless stdio/daemon mode these report that the cockpit is required (Puppeteer is web-only).
Browser control — act on the active pane
browser_navigate({ url })browser_back()·browser_forward()·browser_reload({ hard? })— history nav + reload (the browser bar's ←/→/⟲;hardignores cache).browser_screenshot({ fullPage? })→ PNG imagebrowser_click({ selector })browser_type({ selector, text })browser_hover({ selector })·browser_scroll({ selector? | x?, y? })·browser_select({ selector, value })·browser_press({ key, selector? })— keys likeEnter/Escape/Tab/ArrowDown.browser_wait_for_idle({ idleMs?, timeoutMs? })— wait until network settles.browser_clear_storage({ allOrigins? })— clear cookies / localStorage / IndexedDB / cache / service workers for the current origin (or the whole session) — log out / test a fresh user.browser_emulate({ device? | width?, height?, mobile?, deviceScaleFactor?, userAgent?, reset? })— emulate a device/viewport (device:iphone/ipad/pixel, or custom;reset→ desktop).browser_throttle({ profile })— network conditions:slow-3g/fast-3g/offline/none.browser_eval({ expression })— runs in page context (not blocked by CSP)browser_snapshot()— structured page snapshot: url, title, and interactive/landmark elements (role, accessible name, value/state, heading level) each with a CSS selectorrefusable bybrowser_click/browser_type. Prefer this over a screenshot to find/target elements reliably.browser_wait_for({ selector?, text?, timeoutMs? })— wait until a selector appears or text is present (after a navigation/async render). Returns{ ok, waitedMs }.
Logs & correlation
get_logs({ source?, stream?, grep?, app?, sinceSeq?, limit? })— unified tail.sourceisserver|browser;streamisstdout/stderr/console/network/pageerror.appscopes to one project's logs — it matches a pane's label (project name) or id (seepane_list) and filters both that pane's server and browser logs, regardless of which pane is active. Pass the lastseqassinceSeqto tail incrementally.get_logs_around({ ts, windowMs?, source?, app? })— the correlation tool: all events within ±windowMsof a timestamp, time-ordered across both sources (optionally scoped to oneapp).- The timeline shows network events that are failures or status ≥
DEVLOOP_NET_THRESHOLD(set it to0to surface everything inline), carrying richdetailon all substrates (Puppeteer / CDP / React Native): method, status, resource type, mime, duration, request + response headers, and capped request/response bodies. get_network({ grep?, app?, limit? })— every request from the full capture ring, independent of the threshold (vsget_logs, which shows only the curated timeline). Use it when a fast 200 you care about isn't on the timeline.export_har({ app? })— export the full network ring as a HAR 1.2 document (import into Chrome DevTools / Charles); complete regardless of the threshold. Scope to oneappif you like.diagnose({ windowMs?, app? })— triage what's broken right now: groups/dedupes repeated errors (console / page / server) with counts, lists failed/4xx-5xx network requests, and returns a one-line summary. Start here before digging throughget_logs.- Page errors carry a
resolvedStack— minified browser stack traces are mapped back to original source via the bundle's source map (the browser only de-minifies in its DevTools UI;error.stackstays compiled, so we resolve it for you). On the entry'sdetail. export_bundle({ app?, windowMs? })— a shareable bug-report bundle (JSON): diagnose summary + timeline + screenshots + HAR + repro. The cockpit's report button saves it as a self-contained HTML page.clear_logs()— reset before reproducing an issue.repro({ actions | action, waitFor?, settleMs?, stepSettleMs?, idleMs?, timeoutMs?, continueOnError?, clear? })— reproduce-and-correlate: clears the buffer, performs one action or a sequence, waits, and returns everything that happened on both sides across the sequence — with per-step results (steps[]), abyStreamcount, and a pre-filterederrorslist.actions: [{kind, ...}]— kinds:navigate/click/type/hover/scroll/select/press/eval/wait/none.action(singular) = one-step convenience.- Waits
stepSettleMs(default 300) between steps,settleMs(default 1000) after the last.waitFor: "networkidle"waits until no network activity foridleMs(default 500) up totimeoutMs(default 10000) — use it for slow/streaming responses (Expo's first web bundle takes ~12s). On timeout you still get what landed, with awaitNote. continueOnError(default false) — otherwise stops at the failing step (stoppedAtStep).
Project registry — saved projects, persisted to ~/.devloop/projects.json
project_list()— list saved projects (name, cwd, cmd, url, steps).project_add({ name, cwd, cmd?, url?, steps? })— save/replace a project (incl. a saved reprostepssequence), so you candev_start({ project })by name.project_remove({ name }).
Panes — multi-target (cockpit only; stdio mode is single-pane and reports so)
pane_list()— each pane:{ id, url, active, popped }. The active pane is whatbrowser_*/reprotarget; events are tagged with their paneid.pane_new({ url? })— open a new pane and make it active.pane_select({ id })— make a pane active.pane_close({ id }).pane_pop({ id })— detach a pane into its own standalone window (side-by-side targets).pane_set_label({ id, label })— rename a pane (same as double-clicking the tab).
Extensions — Chrome extension management (cockpit only)
ext_list()— installed extensions:{ id, name, version, enabled }.ext_install({ idOrUrl })— install by Chrome Web Store id/URL.ext_remove({ id })— uninstall.ext_set_enabled({ id, enabled })— enable/disable without uninstalling.
Console arguments
console.log(obj) is captured with arguments resolved to real values (e.g. [log] user {"id":7}), not JSHandle@object. The Electron substrate renders them synchronously from CDP previews; the Puppeteer substrate uses a reserve-then-fill pattern (stamp seq/ts synchronously at arrival, patch resolved args in afterward) so ordering matches emit order and interleaves correctly with server logs.
Headless mode (stdio)
Register once, at user scope — works for every project:
claude mcp add devloop --scope user -- npx -y devloop-mcp
Then, in any project: "dev_start and repro a navigate to /projects". dev_start defaults cwd to the project you're in and auto-detects the command.
| Var | Default | Meaning |
|---|---|---|
DEVLOOP_HEADLESS |
false |
"true" runs Chrome headless; default headful so you can watch. |
DEVLOOP_CHROME_PATH |
(bundled) | Explicit Chrome executable path. |
DEVLOOP_NET_THRESHOLD |
400 |
Log network responses with status >= this (failures always logged). |
DEVLOOP_ACTION_TIMEOUT |
10000 |
Cap (ms) on interactions — a wedged page fails fast instead of hanging. |
DEVLOOP_NAV_TIMEOUT |
30000 |
Cap (ms) on navigations. |
DEVLOOP_LOG_CAPACITY |
5000 |
Max buffered events. |
DEVLOOP_NET_RING |
3000 |
Max requests held in the full-capture network ring (get_network / export_har), independent of DEVLOOP_NET_THRESHOLD. |
DEVLOOP_DEV_CMD / DEVLOOP_DEV_CWD |
(none) | Optional dev-server auto-start on boot (normally use dev_start). |
DEVLOOP_HOME |
~/.devloop |
Registry location. |
Daemon mode (shared HTTP/SSE)
Run one long-running daemon yourself (stdio launches already do this per project; see Shared mode below) they all connect to over HTTP/SSE — many clients, one Devloop instance (one browser, one dev server, one correlated timeline):
devloop-mcp daemon # headless; serves MCP at http://localhost:7333/mcp
# then point any number of MCP clients at it:
claude mcp add --transport http devloop http://localhost:7333/mcp
Same backend + env vars as stdio (defaults headless; set DEVLOOP_HEADLESS=false to watch), and it auto-picks a free port from DEVLOOP_HTTP_PORT (default 7333), or any free port if the next ten are all taken. Each client gets its own MCP session but shares the same backend, so one agent's dev_start / navigation shows up on another's get_logs. (The Electron cockpit serves the very same HTTP transport — the daemon is just the headless version of it.)
Manage the daemon's lifecycle:
devloop-mcp daemon --status # is one running? (pid + url)
devloop-mcp daemon --stop # SIGTERM the running daemon
DEVLOOP_DAEMON_IDLE_MS=60000 devloop-mcp daemon # auto-exit 60s after the last client disconnects
Shared mode — on by default for stdio
You don't need to run a daemon yourself. A plain stdio launch (npx -y devloop-mcp) bridges to a daemon for its project: it connects to the one already running for that directory, or spawns and detaches one if there isn't one. Restarting Claude Code, /mcp reconnects, and new sessions in the same repo therefore reuse the same Chrome instead of opening another one. Two repos open at once get separate daemons, so their dev servers and timelines don't collide.
The stdio process becomes a thin proxy: it speaks stdio to the client and forwards tools to the daemon over HTTP. Chrome only opens when a browser tool is first used, never just because a session started. An auto-spawned daemon keeps stdio's visible browser (DEVLOOP_HEADLESS=true to hide it), runs in the project directory, and exits 10 minutes after its last session disconnects (DEVLOOP_DAEMON_IDLE_MS to change that). Run devloop-mcp daemon --status / --stop inside the project to manage that project's daemon. If the daemon goes away mid-session (stopped, crashed, or idled out), the bridge reconnects on the next call, starting a new daemon if needed, so you don't have to /mcp reconnect. If anything goes wrong at launch (the daemon won't start, etc.), the session falls back to a normal local instance, so it never just dies.
npx -y devloop-mcp --shared # or DEVLOOP_DAEMON=1: one global daemon shared by every project
npx -y devloop-mcp --local # or DEVLOOP_DAEMON=0: the old behavior, one browser per session
The global daemon advertises itself in $DEVLOOP_HOME/daemon.json, and per-project daemons in $DEVLOOP_HOME/daemons/.
Preguntas sobre Devloop MCP
¿Cómo agrego Devloop MCP a Claude Code?
Ejecuta claude mcp add devloop -- npx -y devloop-mcp en tu terminal. Añade --scope user para que esté disponible en todos los proyectos.
¿Cómo agrego Devloop MCP a Cursor?
Abre ~/.cursor/mcp.json y añade el servidor en mcpServers, usando la configuración de Cursor que se muestra en la sección de instalación de arriba.
¿Qué herramientas proporciona Devloop MCP?
Expone 41 herramientas, incluidas dev_start, dev_stop, dev_status, native_open, native_close.
¿Cómo instalo la versión headless de MCP?
Puedes registrarlo con Claude Code usando el comando: claude mcp add devloop --scope user -- npx -y devloop-mcp.
¿Devloop es compatible con el desarrollo de aplicaciones móviles?
Sí, es compatible con proyectos de Expo y React Native tanto para iOS como para Android, proporcionando errores de la consola JS, captura de red y logs de dispositivos nativos.
¿Qué se necesita para la interacción con iOS?
Las interacciones con iOS requieren tener instalados el compañero idb y fb-idb a través de brew y pipx respectivamente.
¿Puedo usar Devloop con Android?
Sí, las interacciones con Android requieren las platform-tools del Android SDK (adb) y un emulador en ejecución.