TabHub MCP Server
TabHub
Administrador local de pestañas para varios navegadores Chromium con REST, MCP e interfaz web. El servidor solo escucha en 127.0.0.1.
Requisitos
Windows 10/11
Node.js 22+
Corepack (
corepack enable)
Inicio
corepack pnpm install
Copy-Item .env.example .env
corepack pnpm devCapacidad local de contexto personal
Las rutas de contexto de primera clase tienen cierre ante fallos (fail-closed) detrás de TABHUB_FEATURE_CONTEXT=true. La navegación de /app en producción recibe una sesión local opaca HttpOnly; SameSite=Strict. Durante el desarrollo de Vite, define un secreto TABHUB_DEV_PROXY_SECRET aleatorio y exclusivo del servidor; el proxy de Vite debe llamar a POST /api/local/session/bootstrap e inyectar la cabecera x-tabhub-dev-proxy-secret correspondiente. Nunca uses una variable VITE_ para este valor ni lo expongas en el código del navegador. El secreto de bootstrap y las credenciales bearer, los códigos de emparejamiento, los cuerpos de contexto, las consultas de búsqueda sin procesar y las claves de idempotencia se excluyen de los registros de solicitudes.
El comando primero compila la interfaz web y después inicia el servidor. Abre http://127.0.0.1:7717/app/.
La interfaz web está disponible en inglés y ruso. El idioma se elige en la cabecera de la aplicación; la elección se guarda en el navegador. El popup y la configuración de la extensión usan automáticamente el idioma de la interfaz del navegador, si es inglés o ruso.
Comprobación del servidor:
Invoke-RestMethod http://127.0.0.1:7717/api/healthLa respuesta esperada actual:
{"status":"ok","database":"ok","schemaVersion":26}La base de datos por defecto se crea en data/tabhub.sqlite, relativa a la raíz del repositorio. La ruta se puede cambiar mediante TABHUB_DB_PATH en el .env raíz.
TABHUB_FEATURE_LOGICAL_IMPORTANCE=false conserva el editor de importancia clásico para una pestaña física individual y desactiva los nuevos endpoints logical-page. El valor true activa una única valoración canónica de importancia para todas las copias de la misma URL-página. Después de cambiar la bandera, reinicia el servidor. Para una reversión segura, vuelve a false: los datos canónicos guardados no se eliminan, pero la interfaz legacy no los lee ni los modifica.
Para desarrollar la UI con hot reload, inicia el servidor y Vite con un único comando y luego abre la dirección de Vite desde la consola:
corepack pnpm dev:webTABHUB_FEATURE_RESOURCES=true habilita el backend de recursos y la API REST: listado/detalle de recursos, páginas/actividad general, contexto de recursos, comandos, evaluación del usuario e intersecciones de resource_id para selecciones de pestañas/áreas de trabajo. La faceta de UI de recursos llega en la W30 y no se activa únicamente con esta bandera. Vuelve la bandera a false y reinicia para una reversión segura: los mapeos, contextos y evaluaciones almacenados quedan intactos y no se eliminan ni se exponen por las rutas de recursos.
El flujo de captura de copia exacta y de resumen de página Corto/Profundo del Drawer tiene su propio último fallo cerrado detrás de TABHUB_FEATURE_PAGE_SUMMARY_CAPTURE=true. No reutiliza deliberadamente la bandera de investigación de recursos: el resumen a fondo sigue analizando una página capturada, mientras que la investigación tiene una semántica separada de corpus, evidencia, presupuesto y consentimiento. Con esta bandera desactivada (el comportamiento por defecto), /api/features informa pageSummaryCapture: false, el relé HTTP rechaza únicamente capture-tab-content antes de la entrega a la extensión y la ruta de ingestión de instancias exactas no está presente. La ingestión de contenido normal, la acción de resumen corto de Library para contenido ya capturado y los comandos de relé de activación/cierre/área de trabajo permanecen disponibles. Reinicia el servidor después de cambiar la bandera; vuelve a ponerla en false para obtener una superficie de reversión compatible con el esquema.
La investigación de recursos solo sobre contenido capturado está, por separado, desactivada por defecto detrás de TABHUB_FEATURE_RESEARCH=true. El esquema 24 se instala incondicionalmente para que el historial de investigación existente y las redacciones por privacidad sigan siendo legibles cuando la bandera vuelve a false; la bandera + desactivada solo bloquea nuevas mutaciones de preflight, ejecución y cancelación de investigación. La ejecución requiere además ANTHROPIC_API_KEY. Sin un proveedor, el preflight, el historial, la lectura de tareas y la redacción por privacidad siguen disponibles, mientras que ejecutar/perfeccionar falla antes de escribir con 503 RESEARCH_PROVIDER_UNAVAILABLE.
El proveedor usa ANTHROPIC_RESEARCH_MODEL, precios de arranque inmutables de ANTHROPIC_RESEARCH_INPUT_USD_PER_MTOK y ANTHROPIC_RESEARCH_OUTPUT_USD_PER_MTOK, además de un ANTHROPIC_RESEARCH_PRICING_VERSION opcional. Cuando la versión está vacía, TabHub deriva una de los precios efectivos. TABHUB_RESEARCH_MAX_OUTPUT_TOKENS está limitado a 8192 y TABHUB_RESEARCH_TIMEOUT_MS limita una llamada. El trabajador permite una llamada simultánea, diez intentos y una reserva de USD 2 por día, al tiempo que cada ejecución también debe caber dentro de su presupuesto aprobado por el usuario. La investigación solo consume el corpus capturado y aprobado: nunca obtiene, abre ni navega a una URL. Reinicia el servidor después de modificar cualquier bandera o ajuste de investigación.
La adquisición en vivo acotada del esquema 26 está, de forma independiente, desactivada por defecto detrás de TABHUB_FEATURE_LIVE_ACQUISITION=true. Cuando se habilita, el coordinador C90b aceptado expone solo flujos de preflight/inicio/estado de recursos, usa el SafePublicHttpClient interno cerrado, materializa evidencia pública acotada y entrega un corpus inmutable capturado/vivo al flujo de investigación existente. No expone un endpoint de fetch genérico y nunca usa la navegación del navegador, fetch de extensión, redirecciones, reintentos, scripts, subconsquuestos ni mutación de pestañas/ventanas. Mantén la bandera en false fuera de un despliegue explícitamente revisado.
TABHUB_FEATURE_PRIVACY_PURGE=true permite crear nuevas purgas de privacidad persistente. El estado de purga del esquema 26 y la recuperación/reintento siguen disponibles con la bandera desactivada para que deshabilitar este trabajo nuevo no deje paralizada una purga activa.
La actividad diaria se controla con dos banderas independientes con fallo cerrado. Pon TABHUB_FEATURE_ACTIVITY_DAILY_WRITER=true para recoger la actividad aceptada en unidades diarias UTC y actualizar las métricas de huecos/duplicados/orden incorrecto. Pon TABHUB_FEATURE_ACTIVITY_WINDOWS=true junto con TABHUB_FEATURE_ACTIVITY_DAILY_WRITER=true y TABHUB_FEATURE_RESOURCES=true para anunciar y exponer las ventanas de página/recurso de 7d/30d y las métricas de actividad a UI/adaptadores. Ambas banderas de actividad tienen false por defecto. El modo solo lectura falla en estado cerrado y devuelve la actividad general G3, porque la cobertura diaria sería incompleta; el modo solo escritura recolecta cubos sin exponer los nuevos lectores y es válido para un despliegue gradual.
La época de disponibilidad de la migración inmutable registra cuándo estuvo disponible el seguimiento diario. Una época de ciclo del escritor guardada por separado registra solo el período continuo actual durante el cual el escritor diario del servidor estuvo habilitado. No afirma que la extensión del navegador haya entregado cada posible observación; los vacíos y la información de entrega siguen siendo temas de telemetría separados. Deshabilitar y re-habilitar el escritor inicia una nueva época continua; los lectores finitos no están disponibles a menos que ambas banderas de activación estén activas.
El despliegue de la evaluación de prioridad usa tres flags independientes por defecto desactivados: TABHUB_FEATURE_PRIORITY_ASSESSMENT_WRITER permite escrituras de evaluación escalonadas, TABHUB_FEATURE_PRIORITY_READERS permite los lectores de la versión 22 del esquema y TABHUB_FEATURE_PRIORITY_SHADOW permite la presentación en sombra solo cuando también estén habilitados los lectores. C500 solo declara y valida estos flags; no inicia la recopilación ni muestra rutas de prioridad. El escritor se puede desplegar por etapas sin lectores, y cada capacidad solicitada falla cerrada en una base de datos anterior al esquema 22.
Inicio automático en Windows
Para una puesta en marcha local permanente, primero compila los artefactos de producción y compruébalos manualmente:
corepack pnpm install --frozen-lockfile
corepack pnpm build
corepack pnpm startEl servidor sigue verificando conexiones y solo en 127.0.0.1; cualquier otro valor de TABHUB_HOST se rechaza porque en v1 no hay autorización. Para el arranque automático, abre el Programador de tareas → Crear tarea y define:
desencadenante Al iniciar sesión;
en la pestaña Créditos elige “Ejecutar solo para el usuario actual”, porque mover el foco entre ventanas del navegador requiere un escritorio interactivo;
acción Iniciar un programa;
programa: el comando
nodedesde una nueva ruta absoluta(Get-Command node).Source;elementos: la ruta absoluta de
(Resolve-Path packages/server/dist/main.js).Path, entre comillas;carpeta de trabajo: la ruta de
(Resolve-Path .).Pathy,en la pestaña Configuración, desmarca “detener la tarea si se ejecuta más de 3 días” y habilita el reinicio de la tarea al fall, por ejemplo cada 1 minuto, hasta 3 intentos.
Después de guardar, ejecuta la tarea manualmente y verifica con Invoke-RestMethod http://127.0.0.1:7717/api/health. Después de actualizar TabHub, vuelve a ejecutar corepack pnpm install --frozen-lockfile y corepack pnpm build; luego reinicia el servidor en ejecución (por ejemplo programado en el Planner) para aplicar las nuevas migraciones y comprueba que la salud endpoint muestra schemaVersion: 26. Recarga la extensión en la página de extensiones del navegadory refresca la página de la copia para enviar una instantánea nueva; la tarea no debe recrearse.
Extensión Chromium
Compila una única versión de Manifest V3:
corepack pnpm --filter @tabhub/extension buildEn cada navegador abre la página de extensiones, activa el modo desarrollador y carga la carpeta descomprimida packages/extension/.output/chrome-mv3:
Chrome:
chrome://extensionsEdge:
edge://extensionsYandex Browser:
browser://extensions
Abre los ajustes de TabHub y elige por separado el nombre del navegador actual. Esto es obligatorio: la API de Chromium no puede distinguir Chrome de Yandex Browser, así que antes de esa selección el envío automático y manual de pestañas está deshabilitado. Tras actualizar desde una versión antigua hay que elegir de nuevo el navegador: evitar que el antiguo valor automático chrome marque Edge o Yandex por error. Al cambiar un valor ya configurado, la extensión primero cierra la instantánea y después envía una instantánea lata con la nueva identidad. Cada instalación de la extensión guarda su propio UUID y, para la sesión extend actualmente cargada, aun UUID de sesión independiente, y pasa el tabId original; por eso dos perfiles del mismo navegador y dos pestañas físicas con la misma URL ya no se mezclan, y un tabId obsoleto tras un reinicio no se usa paraconmutar la una a la otra.
En popup están la comprobación del servidor local, el número de pestañas físicas no sincronizadas y operaciones, la metamarca manual y la captura de contenido actual o todas las pestañas HTTP(S) disponibles. La instantánea completa sin un límite estricto de recuento de captura también se activa al inicio, tras cambios con debounce y cada cinco minutos mediante chrome.alarms; transporte solo comprueba el tamaño real del payload (si el servidor está apagado, los datos en espera se guardan en chrome.storage.local; las instantáneas reemplazadas y el contenido duplicado se compactan; la cola se limita únicamente por un tamaño seguro de 32 MiB, sin importar el número de operaciones). Los errores HTTP 4xx recurrentes, excepto 408/425/429, van a un registro limitado a 50 entradas y no bloquean siguientes elementos; los errores temporales conservan el orden y se repiten automáticamente.
La interfaz web abre por defecto Library, y Graph queda como visualización alternativa de las mismas páginas canónicas. La pestaña principal separada Open tabs ya no existe. Library conserva la secuencia original de aparición de páginas y la ordenación fija de navegadores Chrome → Yandex → Edge → Other; las etiquetas, resumen y enlaces no duplican entre copias físicas. En la columna Tab una pestaña cerrada no tiene destinatario físico, una copia abiertam .
. se muestra como una pestaña real del navegador, y dos o más copias se expanden en una lista con ventana, posiciona y tabId original. Click y cierre desde esa lista se dirigen con la identidad completa browser / installation / browserSession / browserTabId, de forma que TabHub foca o unifica la pestaña elegida en su propio Chrome, Yandex Browser, Edge u otro perfil Chromium y no abre una URL duplicada.Filter Multiple open copies deja solo las filas canónicas con openInstanceCount > 1; se aplica en el servidor antes de contar y paginar, y es intencionadamente distinto de la comprobación de duplicados excluyendo el raw únicamente el fragmento (#...) entra en la identidad de página canónica; los parámetros utm_* sin sensibilidad a mayúsculas o minúsculas se siguen eliminando como parámetros de seguimiento.
En el estado normal, la casilla de verificación de la Library selecciona las páginas canónicas para cambiar el estado y los temas. Un botón independiente Manage browser tabs / Administrar pestañas del navegador habilita la selección masiva de instancias físicas: la casilla de la fila principal selecciona todas las copias abiertas de esa página, y la lista desplegada permite conservar solo las concretas. La selección física se mantiene al cambiar de página en la paginación, pero se limpia al cambiar los filtros de la Library, al desactivar la gestión o al pasar al Graph; pasar al Graph también restablece el modo normal de páginas. El conjunto completo y filtrado de pestañas físicas se resuelve mediante una solicitud separada no paginada, sin el límite de SQLite de 999 parámetros enlazados. En este modo están disponibles Move, Close, Pin/Unpin, Mute/Unmute, Sleep, Reload, Workspaces y la exportación en URL/Markdown/JSON, así como los presets Extra exact copies, los de hostname exacto y los de antigüedad. Un comando live normal solo puede referirse a una combinación exacta browser/install/session; cualquier selección mixta, obsoleta u offline se bloquea por completo. La acción separada y explícita Close all matching duplicates procesa únicamente las copias adicionales seguras con el raw-URL exacto entre los perfiles conectados, conserva un keeper en cada grupo, ejecuta una previsualización live estricta por separado para cada perfil y, antes de la confirmación global, muestra los perfiles excluidos. El cierre masivo muestra un recibo por perfiles y un Reopen closed tabs accesible; un resultado desconocido nunca se reintenta automáticamente. Hacer clic con la rueda sobre una fila de la Library cierra, sin ventana modal, solo una copia física; si hay varias copias, primero hay que seleccionar la fila exacta en la lista desplegada. La pestaña TabHub permanece protegida y los comandos live no tienen un límite oculto de destinos.
Dentro de la Library hay colecciones personales: Para revisar y Papelera. A Para revisar solo llegan las recomendaciones débiles sobre páginas del Inbox con importancia cero: la interfaz siempre muestra los motivos y las advertencias, pero no elimina nada automáticamente. Para cualquier página, independientemente del sitio o del tema, se puede elegir explícitamente Conservar, Más tarde o Cerrar y olvidar. Esta última acción requiere confirmación, se dirige a cada copia física conocida en su propio navegador, exige un resultado de cierre completo y exacto y solo entonces oculta la página canónica de la Library normal. Si una copia está offline, ha cambiado o no es localizable, la página no se olvida; si un fallo ocurre durante el cierre de varios navegadores, el resultado informa de cuántas copias alcanzaron a cerrarse y la página permanece en la Library para repetir la operación con seguridad. Una página olvidada permanece siete días en la Papelera reversible; reabrirla o restaurarla explícitamente anula el borrado, y los registros cerrados ya vencidos se limpian por el servidor en segundo plano.
En la columna Activity de la Library, TabHub agrega dos métricas históricas para la página canónica en todas las sesiones de navegación rastreadas. Estos valores persisten al cerrar la pestaña física y al reiniciar el navegador; al navegar, los intervalos se refieren a la URL en la que se registraron, por lo que el tiempo de las páginas no se mezcla. Aunque una navegación corta termine antes de la snapshot con debounce, el intervalo de actividad aceptado crea por sí mismo un registro cerrado en la Library, y la snapshot posterior lo abre y lo enriquece sin duplicarlo. On screen cuenta solo el tiempo en que la pestaña está seleccionada, su ventana está en primer plano y el ordenador no está inactivo ni bloqueado. Active use es un subconjunto de ese tiempo, correspondiente a los 60 segundos posteriores a un movimiento o una pulsación confirmados: clic y teclado, desplazamiento o toque. El drawer muestra por separado la actividad histórica Page activity / Actividad de la página y las métricas Open copies / Copias abiertas de las pestañas físicas concretas de la sesión de navegador actual. La extensión guarda solo intervalos y totales, no coordenadas de puntero, teclas pulsadas ni texto. En las páginas protegidas del navegador, donde no hay content script disponible, solo se cuenta On screen. Después de un reinicio completo del navegador, los contadores de pestañas físicas inician una sesión nueva, de modo que un tabId de Chromium reutilizado no herede tiempo ajeno, pero la actividad histórica de la página sí sigue acumulándose. El agregado histórico exacto comienza con esquema 15: los antiguos totales físicos sin URL guardada no se traspasan intencionadamente a páginas al azar; el esquema 16 materializa los URL exactos solo de actividad, que un snapshot no llegó a ver.
Workspaces guarda en SQLite una instantánea con nombre de todas las instancias físicas seleccionadas, incluidas las que comparten URL, en la orden vigente del servidor, browser/window/index. La solicitud contiene identificadores compactos y, después de un comando live, la extensión sincroniza primero el nuevo orden y las flags; por eso Save inmediatamente después de Move/Pin/Mute no captura el estado anterior. Save & close primero guarda la instantánea con confirmación y solo después abre una vista previa de cierre. Todo el conjunto guardado puede abrirse en la ventana actual o en una nueva, renombrarse o eliminarse; la restauración abre secuencialmente cada elemento guardado, sin truncamiento oculto. Durante la restauración se bloquea una nueva ejecución y, si el resultado es desconocido, tras el timeout la interfaz pide primero comprobar el navegador. Las pestañas secadas también pueden copiarse como lista de URL, Markdown o JSON.
El contenido solo se extrae bajo demanda: Readability obtiene el texto principal y el HTML del artículo y, para páginas sin artículo adecuado, se usa document.body.innerText. No hay recorrido automático de todas las pestañas en v1.
Después de las snapshots de varios navegadores, los registros aparecen en una tabla común con una columna del navegador. Una nueva snapshot actualiza una URL normalizada existente; la publicación que ha desaparecido permanece en la base de datos con isOpen=false.
Comprobación REST sin la extensión
$body = @{
browser = 'chrome'
tabs = @(@{
url = 'https://example.com/?utm_source=test#section'
title = 'Example'
windowId = 1
index = 0
})
} | ConvertTo-Json -Depth 4
Invoke-RestMethod -Method Post -Uri http://127.0.0.1:7717/api/ingest/snapshot -ContentType application/json -Body $body
Invoke-RestMethod http://127.0.0.1:7717/api/tabsLa variable GET /api/tabs admite una ordenación global antes de la paginación: sort_by acepta title, topics, browser, activity, status, importance, state o age, y sort_direction acepta asc o desc. La ordenación por columnas no se combina con search_mode=semantic ni con similar_to, donde el orden lo determina la relevancia.
Búsqueda de texto completo
La búsqueda funciona sobre el título y la URL completa (texto) bajo título, incluso antes de capturarse el contenido, incluyendo el título y la URL original de cada pestaña física fusionada con la página maestra; después de la captura también tiene en cuenta el texto depurado y el resumen. Las palabras parcialmente escritas coinciden por prefijo, y los fragmentos literales del título y la URL coinciden como subcadena Unicode sin diferenciar mayúsculas/minúsculas; la puntuación de la consulta del usuario no se interpreta como sintaxis FTS:
Invoke-RestMethod 'http://127.0.0.1:7717/api/tabs?q=local-first'En la interfaz web, el mismo parámetro está disponible en el campo de búsqueda que sobre esa tabla.
Búsqueda semántica y clústeres de inbox
Los embeddings se crean solo tras una petición explícita. Por defecto, TabHub usa el Ollama local en http://127.0.0.1:11434; antes del primer índice, instale el modelo:
ollama pull nomic-embed-textPara Voyage, defina EMBEDDING_PROVIDER=voyage, VOYAGE_API_KEY y, si es necesario, VOYAGE_EMBEDDING_MODEL en .env. EMBEDDING_PROVIDER=disabled desactiva por completo el proveedor. Ambas opciones guardan vectores de 512 dimensiones en la tabla local sqlite-vec; el texto capturado, antes de enviarse al proveedor, se limita a 32 000 caracteres y se trunca en lotes de 100 pestañas.
Invoke-RestMethod -Method Post `
-Uri http://127.0.0.1:7717/api/embeddings/reindex `
-ContentType application/json `
-Body '{"limit":100}'
Invoke-RestMethod 'http://127.0.0.1:7717/api/tabs?q=compiler&search_mode=semantic'
Invoke-RestMethod 'http://127.0.0.1:7717/api/tabs?similar_to=1'
Invoke-RestMethod -Method Post `
-Uri http://127.0.0.1:7717/api/clusters/inbox `
-ContentType application/json `
-Body '{"maxClusters":8}'Una nueva captura de texto retira el vector antiguo. cluster_inbox indexa solo las pestañas aún sin indexar con estado inbox y, después, propone de forma determinista clústeres con nombre; no inscribe los IDs ni toca el marcado del usuario.
Resumen por solicitud
TabHub no resume las pestañas automáticamente. Para permitir peticiones manuales desde la interfaz de usuario o MCP, defina ANTHROPIC_API_KEY en .env y reinicie el servidor. Por defecto el modo corto usa claude-haiku-4-5-20251001, y el modo profundo, claude-sonnet-5; los modelos y los precios calculados se pueden sustituir con las variables ANTHROPIC_* de .env.example.
La petición crea una tarea fiable en SQLite y un worker en segundo plano ejecuta como máximo una llamada a Anthropic a la vez. Los errores temporales se reintentan con backoff, las tareas sin terminar se recuperan tras un reinicio y no se sobrescriben resultados obsoletos sobre contenido recapturado. TABHUB_DAILY_SUMMARY_LIMIT limita exactamente los intentos de llamar al proveedor por día UTC; el gasto de tokens y el coste calculado se registran en cada intento y se escriben en el log de tarea exitosa.
$job = Invoke-RestMethod -Method Post `
-Uri http://127.0.0.1:7717/api/tabs/1/summarize `
-ContentType application/json `
-Body '{"depth":"short"}'
Invoke-RestMethod "http://127.0.0.1:7717/api/jobs/$($job.jobId)"Si la clave no está configurada, el endpoint devuelve 503 SUMMARY_PROVIDER_UNAVAILABLE y no no crea ninguna tarea. En la tabla de la UI, cada pestaña con texto capturado tiene la opción de generar o actualizar un sumario breve; el estado de la cola y los errores pueden verse junto a la acción.
Organización de pestañas
La tabla permite seleccionar filas y cambiar el estado en lote o asignar una ruta jerárquica de tema, por ejemplo, Research/AI/Agents. El campo tema del panel en lote de la tarjeta de la pestaña sugiere rutas existentes con buscador, pero sigue siendo editable para crear una nueva ruta; el tema del sistema Без темы no aparece en las sugerencias. Toda la página actual de filas se virtualiza con medición dinámica de altura, así que los resúmenes desplegados siguen correctos sin tener que montar toda la página en el DOM. La barra lateral de temas muestra un árbol de profundidad arbitraria con contadores acumulados: se pueden crear temas divisores y secundarios, renombrar, mudar, asignar color y, tras la confirmación, borrar temas que no tengan subvisualizaciones. Un filtro por ruta de superior incluye las pestañas de todos los temas hijos. Clic en una fila abre la tarjeta de la pestaña con contenido, queries, temas, relaciones dirigidas, importancia y campos personalizados.
El tema protegido de sistema Без темы incluye automáticamente todas las páginas sin tema de usuario. Al asignar el primer tema normal se quita esa relación, y al eliminar el último tema normal se vuelve a incluir durante el proceso. Без темы puede usarse como filtro en Library y Graph, pero no se puede renombrar, mover, eliminar ni asignar manualmente. En el graph, el propio tema del sistema y sus conexiones estructurales no se muestran: los páginas del fit look como page tabs common no assigned.
PATCH /api/tabs/:id acepta cualquier combinación no vacía de status, importance y customFields. Un valor de tipo string crea o actualiza el campo; null lo elimina. La importancia masiva se gestiona con PATCH /api/tabs/importance. El CRUD de temas se encuentra en /api/tags; la asignación de ruta es POST /api/tags/assign. Las relaciones universales pestaña-pestaña, pestaña-tema y tema-tema están disponibles en /api/ relações; el antiguo /api/links se conserva como una proyección compatible para las relaciones entre las pestañas, excepto. Los cambios manuales se guardan con origen user, y los cambios de MCP, con origen agent.
Grafo de relaciones
El apartado Graph abre un grafo WebGL tridimensional en el que las pestañas y los temas aparecen como tipos de nodos separados. Con el ratón se puede rotar la escena, desplazarse por el plano y podemos acertar la cámara y alejarla del objeto. Un clic selecciona un nodo, orienta la cámara hacia él y abre la inspector de la barra con metadatos, enlace a una pestaña existente del navegador o tema seleccionado de la Library.
Para el nodo elegido se puede definir una profundidad de foco de entre uno y cinco pasos: todos los nodos y vínculos dentro de ese entorno no dirigido permanecen blancos y brillan, mientras que el resto de la escena se vuelve transparente. Todo el entorno restante se hace transparente. Con un filtro activo, el servidor conserva los vínculos directos que atraviesan el límite del campo; para obtener el entorno más profundo de determinados nodos, se descarga un subconjunto con una proyección limitada separada, sin necesidad de extraer el grafo global completo. En el inspector se pueden crear enlaces semánticos dirigidos con cualquier nodo visible, definir tipo y notal, o eliminar un vínculo semántico existente. La jerarquía de temas y la pertenencia de pestañas se muestran como enlaces estructurales, pero no se duplican en la tabla de relaciones de usuario.
El filtro del árbol de temas carga solo el subárbol seleccionado. Para grafos con muchos nodos, la interfaz reduce el tiempo de simulación, choca simplificada la geometría y desactiva el costables arrastre de nodos individuales; el propio código 3D se descarga como un lazy chunk aparte y no pesa en la apertura inicial de la Library. La respuesta REST canónica tipada está disponible por separado, y el endpoint antiguo se conserva por compatibilidad:
Invoke-RestMethod http://127.0.0.1:7717/api/graph/v2
Invoke-RestMethod 'http://127.0.0.1:7717/api/graph/v2?root_topic_id=1'
Invoke-RestMethod 'http://127.0.0.1:7717/api/graph/v2?root_topic_id=1&focus_node_type=topic&focus_node_id=2&focus_depth=3'
Invoke-RestMethod http://127.0.0.1:7717/api/relations
Invoke-RestMethod http://127.0.0.1:7717/api/graphMCP para Claude Desktop y Codex
Primero compile el servidor MCP stdio y mantenga el servidor principal de TabHub ejecutándose en 127.0.0.1:7717:
corepack pnpm --filter @tabhub/mcp build
corepack pnpm devEl proceso MCP utiliza TABHUB_API_URL y sigue siendo un adaptador fino sobre la API REST. Proporciona las herramientas list_tabs, get_tab, search_tabs, summarize_tab, cluster_inbox, set_status, set_importance, tag_tabs, link_tabs, list_tags, get_stats, review_disposable_pages, set_page_retention, close_and_forget_page, list_retention_trash, restore_retention_page y el recurso tabhub://tab/{id}. list_tabs acepta los mismos filtros que la lista REST, incluidos q, search_mode y similar_to; search_tabs admite los modos fulltext y semantic. cluster_inbox indexa explícitamente las pestañas sin clasificar y devuelve sugerencias con títulos, palabras clave e identificadores de pestañas. La herramienta obsoleta set_importance primero lee /api/features: cuando la importancia lógica está habilitada, el servidor registra una entrada de agente on_behalf_of_user, y cuando la bandera está deshabilitada o se usa un servidor antiguo con schema-17, se utiliza el registro escalar anterior solo de las pestañas seleccionadas. Un contrato de características incorrecto no produce ningún registro. review_disposable_pages solo muestra sugerencias y advertencias personales; set_page_retention guarda las decisiones «conservar» o «más tarde». La herramienta destructiva close_and_forget_page requiere confirmed=true, cierra todas las instancias físicas conocidas solo cuando el resultado está exactamente confirmado y luego mueve la página a la papelera de siete días; esta puede verse y revertirse mediante list_retention_trash y restore_retention_page. summarize_tab marca la solicitud como de agente, la coloca en la misma cola SQLite y espera su finalización hasta 55 segundos; si el trabajo aún no ha finalizado, una llamada posterior continúa esperando la misma tarea activa. El contenido de las respuestas MCP está limitado a aproximadamente 20 000 caracteres.
Claude Desktop
Abra Settings → Developer → Edit Config, añada el servidor en %APPDATA%\Claude\claude_desktop_config.json y reinicie Claude Desktop por completo:
{
"mcpServers": {
"tabhub": {
"command": "C:\\Program Files\\nodejs\\node.exe",
"args": ["D:\\VibeCoding\\TabHub\\packages\\mcp\\dist\\main.js"],
"env": {
"TABHUB_API_URL": "http://127.0.0.1:7717"
}
}
}
}Si Node.js o el repositorio están en otra ubicación, obtenga las rutas absolutas mediante los comandos (Get-Command node).Source y (Resolve-Path packages/mcp/dist/main.js).Path y reemplace los valores anteriores.
Codex
Añada el servidor mediante CLI:
codex mcp add tabhub --env TABHUB_API_URL=http://127.0.0.1:7717 -- 'C:\Program Files\nodejs\node.exe' 'D:\VibeCoding\TabHub\packages\mcp\dist\main.js'
codex mcp listConfiguración manual equivalente en %USERPROFILE%\.codex\config.toml:
[mcp_servers.tabhub]
command = 'C:\Program Files\nodejs\node.exe'
args = ['D:\VibeCoding\TabHub\packages\mcp\dist\main.js']
cwd = 'D:\VibeCoding\TabHub'
startup_timeout_sec = 10
tool_timeout_sec = 60
[mcp_servers.tabhub.env]
TABHUB_API_URL = "http://127.0.0.1:7717"Después de conectarse, abra /mcp en Codex y asegúrese de que tabhub y todas las herramientas enumeradas anteriormente estén disponibles.
Comprobaciones
corepack pnpm test
corepack pnpm typecheck
corepack pnpm buildCopia de seguridad
Con el servidor detenido o en ejecución, la copia de seguridad en línea de SQLite se crea mediante el comando:
corepack pnpm backupEl archivo aparecerá en la carpeta raíz backups/.
Estado de implementación
Etapa 0: esqueleto del monorepositorio, esquemas comunes, migración de SQLite y healthcheck — completada.
Etapa 1: instantáneas de los navegadores Chromium, cola de extensión fiable, ingesta REST, deduplicación y tabla común — completada.
Etapa 2: captura manual del contenido de Readability, FTS5 y búsqueda en la UI — completada.
Etapa 3: operaciones de gestión REST, etiquetas jerárquicas, estadísticas y herramientas MCP para Claude Desktop/Codex — completada.
Etapa 4: sumarización explícita a través de una cola SQLite fiable, worker secuencial de Anthropic, UI y MCP — completada.
Etapa 5: árbol de temas, tarjeta de pestaña, relaciones, importancia, campos personalizados y operaciones masivas en UI/MCP — completada.
Etapa 6:
sqlite-vec, indexación explícita a través de Ollama/Voyage, búsqueda semántica, pestañas similares y clústeres de inbox con nombre en REST/MCP — completada.Etapa 7: grafo 3D tipado de pestañas y temas con navegación WebGL, relaciones cruzadas arbitrarias, inspector y enfoque en el entorno con una profundidad de 1–5 pasos — completada.
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.
Related MCP Connectors
Private-by-default, local-first memory/context/task orchestrator for MCP apps and agents.
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
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/WistRu/Hypomnema'
If you have feedback or need assistance with the MCP directory API, please join our Discord server