Skip to main content
Glama
TabHub MCP Server
by WistRu

TabHub

複数の Chromium ブラウザのタブを管理するローカルマネージャー。REST、MCP、ウェブインターフェースを備えています。サーバーは 127.0.0.1 のみをリッスンします。

要件

  • Windows 10/11

  • Node.js 22+

  • Corepack (corepack enable)

Related MCP server: Agentic Tab Organizer MCP

起動

corepack pnpm install
Copy-Item .env.example .env
corepack pnpm dev

個人コンテキストのローカル機能

第一級のコンテキストルートは TABHUB_FEATURE_CONTEXT=true を条件にフェイルクローズされます。本番の /app ナビゲーションは、不透明な HttpOnly; SameSite=Strict ローカルセッションを受け取ります。Vite 開発中は、サーバー側のみのランダムな TABHUB_DEV_PROXY_SECRET を設定してください。Vite プロキシは POST /api/local/session/bootstrap を呼び出し、対応する x-tabhub-dev-proxy-secret ヘッダーを注入する必要があります。この値に VITE_ 変数を使用したり、ブラウザコードに公開したりしないでください。ブートストラップシークレット、ベアラー資格情報、ペアリングコード、コンテキスト本文、生の検索クエリ、冪等性キーはリクエストログから除外されます。

このコマンドはまずウェブインターフェースをビルドし、次にサーバーを起動します。http://127.0.0.1:7717/app/ を開いてください。

ウェブインターフェースは英語とロシア語に対応しています。言語はアプリのヘッダーで選択でき、選択内容はブラウザに保存されます。ポップアップと拡張機能の設定は、ブラウザのインターフェース言語が英語またはロシア語の場合、自動的にその言語を使用します。

サーバーの確認:

Invoke-RestMethod http://127.0.0.1:7717/api/health

現在期待される応答:

{"status":"ok","database":"ok","schemaVersion":26}

デフォルトのデータベースはリポジトリルートからの相対パス data/tabhub.sqlite に作成されます。パスはルートの .env の TABHUB_DB_PATH で変更できます。

TABHUB_FEATURE_LOGICAL_IMPORTANCE=false は、個々の物理タブに対する従来の重要度エディタを維持し、新しい logical-page エンドポイントを無効にします。値 true は、同じ URL ページのすべてのコピーに対して単一の標準的な重要度評価を有効にします。フラグを変更したらサーバーを再起動してください。安全にロールバックするには false に戻します。保存された標準データは削除されませんが、レガシーインターフェースはそれを読み取らず変更もしません。

UI をホットリロードで開発するには、1 つのコマンドでサーバーと Vite を起動し、コンソールに表示される Vite のアドレスを開いてください:

corepack pnpm dev:web

TABHUB_FEATURE_RESOURCES=true は、Resource バックエンドと REST API を有効にします。リソース一覧/詳細/ページ/全期間アクティビティ、リソースコンテキスト、コマンド、ユーザー評価、およびタブ/インスタンス選択のための resource_id 交差を提供します。Resource UI ファセットは W30 で追加され、このサーバーフラグだけでは有効になりません。安全にロールバックするにはフラグを false に戻して再起動してください。保存されたマッピング、コンテキスト、評価は分離されたままで、リソースルートによって削除も公開もされません。

厳密コピーのキャプチャと Drawer Short/Deep ページサマリーフローは、TABHUB_FEATURE_PAGE_SUMMARY_CAPTURE=true を条件に独立してフェイルクローズされます。これは意図的に Resource リサーチフラグを再利用しません。ディープページサマリーは依然として 1 つのキャプチャ済みページを分析しますが、リサーチには別のコーパス、証拠、予算、同意セマンティクスがあります。このフラグがオフ(デフォルト)の場合、/api/features は pageSummaryCapture: false を報告し、HTTP リレーは拡張ディスパッチ前に capture-tab-content のみを拒否し、正確なインスタンス取り込みルートは存在しません。通常のコンテンツ取り込み、既存のキャプチャ済みコンテンツに対する Library のショートサマリーアクション、およびアクティベーション/クローズ/ワークスペースリレーコマンドは引き続き利用可能です。フラグを変更したらサーバーを再起動してください。スキーマ互換のロールバック面を得るには false に戻します。

キャプチャ済みのみの Resource/ページリサーチは、TABHUB_FEATURE_RESEARCH=true を条件に独立してデフォルトオフになっています。Schema 24 は無条件でインストールされるため、フラグを false に戻した場合でも既存のリサーチ履歴とプライバシー編集は読み取り可能なままです。無効フラグは、新しい preflight、run、research-cancel 変更のみをブロックします。実行にはさらに ANTHROPIC_API_KEY が必要です。プロバイダーがない場合、preflight、履歴、ジョブ読み取り、プライバシー編集は利用可能ですが、run/refine は書き込み前に 503 RESEARCH_PROVIDER_UNAVAILABLE で失敗します。

プロバイダーは ANTHROPIC_RESEARCH_MODEL、ANTHROPIC_RESEARCH_INPUT_USD_PER_MTOK と ANTHROPIC_RESEARCH_OUTPUT_USD_PER_MTOK による不変の起動時価格、およびオプションの明示的な ANTHROPIC_RESEARCH_PRICING_VERSION を使用します。バージョンが空の場合、TabHub は有効な価格からバージョンを導出します。TABHUB_RESEARCH_MAX_OUTPUT_TOKENS は 8192 に上限があり、TABHUB_RESEARCH_TIMEOUT_MS は 1 回の呼び出しを制限します。ワーカーは 1 同時呼び出し、10 回の試行、UTC 1 日あたり USD 2 の予約を許可しますが、各実行はユーザー承認済みの予算内に収まる必要もあります。リサーチはキャプチャ済みの承認済みコーパスのみを消費します。URL をフェッチ、オープン、またはナビゲートすることはありません。リサーチフラグまたはプロバイダー設定を変更したらサーバーを再起動してください。

Schema-26 の制限付きライブ取得は、TABHUB_FEATURE_LIVE_ACQUISITION=true を条件に独立してデフォルトオフになっています。有効にすると、承認された C90b コーディネーターは Resource のみの preflight/start/status フローを公開し、クローズされたサーバー内部の SafePublicHttpClient を使用し、制限付きの公開エビデンスを具体化し、不変のキャプチャ済み/ライブコーパスを既存のリサーチワークフローに渡します。これは汎用フェッチエンドポイントを公開せず、ブラウザーナビゲーション、拡張フェッチ、リダイレクト、再試行、スクリプト、サブリクエスト、タブ/ウィンドウの変更を一切使用しません。明示的にレビューされたロールアウト以外では、フラグを false のままにしてください。

TABHUB_FEATURE_PRIVACY_PURGE=true は、新しい永続的なプライバシーパージの作成を有効にします。フラグがオフの場合でも、既存の schema-26 パージ状態と再試行/リカバリは利用可能なため、新しい処理を無効にしてもアクティブなパージが中断されることはありません。

デイリーアクティビティは、2 つの独立したフェイルクローズフラグによって制御されます。TABHUB_FEATURE_ACTIVITY_DAILY_WRITER=true を設定すると、受け入れられたアクティビティを UTC 日次バケットに収集し、ギャップ/重複/順序異常のメトリクスを更新します。TABHUB_FEATURE_ACTIVITY_WINDOWS=true を TABHUB_FEATURE_ACTIVITY_DAILY_WRITER=true および TABHUB_FEATURE_RESOURCES=true と一緒に設定すると、7d/30d のページ/リソースウィンドウとアクティビティメトリクスを UI/アダプターに通知して公開します。両方のアクティビティフラグはデフォルトで false です。読み取り専用モードは、日次カバレッジが不完全になるため、G3 全期間アクティビティにフェイルクローズします。書き込み専用モードは、新しい読み取りを公開せずにバケットを収集するため、段階的ロールアウトに有効です。

不変のマイグレーション利用可能エポックは、日次トラッキングが利用可能になった時点を記録します。別の永続化されたライターライフサイクルエポックは、サーバー側の日次ライターが有効になっていた現在の連続期間のみを記録します。これはブラウザ拡張機能が可能なすべての観測を配信したことを主張するものではなく、ギャップと配信ヘルスは別のテレメトリ上の懸念事項です。ライターを無効にして再度有効にすると、新しい連続エポックが開始され、両方のアクティビティフラグが現在有効でない限り、有限読み取りは利用できません。

優先度評価のロールアウトは、3 つの独立したデフォルトオフフラグを使用します。TABHUB_FEATURE_PRIORITY_ASSESSMENT_WRITER は段階的な評価書き込みを許可し、TABHUB_FEATURE_PRIORITY_READERS は schema-22 リーダーを許可し、TABHUB_FEATURE_PRIORITY_SHADOW はリーダーも有効な場合にのみシャドウ表示を許可します。C50 はこれらのフラグを宣言して検証するだけで、収集を開始したり優先度ルートを公開したりしません。ライターはリーダーやシャドウなしで段階的に導入できますが、要求されたすべての機能は schema 22 より古いデータベースではフェイルクローズします。

Windows での自動起動

常時ローカル実行するには、まず本番アーティファクトをビルドし、手動で確認してください:

corepack pnpm install --frozen-lockfile
corepack pnpm build
corepack pnpm start

サーバーは引き続き 127.0.0.1 でのみ接続を受け付けます。v1 には認証がないため、他の TABHUB_HOST の値は拒否されます。自動起動するには、タスクスケジューラ → タスクの作成 を開き、以下を設定します:

  • トリガー ログオン時;

  • 全般 タブで「ユーザーがログオンしているときのみ実行する」を選択します。ブラウザのウィンドウ間でフォーカスを移動するには対話型デスクトップが必要なためです;

  • 操作 プログラムの開始;

  • プログラム: (Get-Command node).Source の絶対パス;

  • 引数: (Resolve-Path packages/server/dist/main.js).Path の絶対パスを引用符で囲んだもの;

  • 作業フォルダー: (Resolve-Path .).Path のパス。

  • 設定 タブで「タスクが 3 日を超えて実行される場合は停止する」をオフにし、失敗時の再起動を有効にします(例: 1 分後、最大 3 回)。

保存後、タスクを手動で実行し、Invoke-RestMethod http://127.0.0.1:7717/api/health で確認してください。TabHub を更新したら、corepack pnpm install --frozen-lockfile と corepack pnpm build を再度実行し、実行中のサーバー(またはタスクスケジューラのタスク)を再起動して新しいマイグレーションを適用し、health エンドポイントが schemaVersion: 26 を表示することを確認してください。ブラウザの拡張機能ページで TabHub をリロードし、アプリのページを更新して新しいスナップショットを送信します。タスクを再作成する必要はありません。

Chromium 拡張機能

1 つの Manifest V3 ビルドを作成します:

corepack pnpm --filter @tabhub/extension build

各ブラウザで拡張機能ページを開き、デベロッパーモードを有効にして、解凍したフォルダー packages/extension/.output/chrome-mv3 を読み込みます:

  • Chrome: chrome://extensions

  • Edge: edge://extensions

  • Yandex Browser: browser://extensions

TabHub の設定を開き、現在のブラウザ名を明示的に選択してください。これは必須です。Chromium API では Chrome と Yandex Browser を確実に区別できないため、明示的に選択するまで自動・手動のタブ送信は無効になります。旧バージョンから更新した場合も、ブラウザを再度選択する必要があります。これにより、以前の自動値 chrome が Edge や Yandex を誤ってマークすることを防ぎます。設定済みの値を変更すると、拡張機能はまず古いスナップショットを閉じてから、新しいアイデンティティで完全なスナップショットを送信します。拡張機能のインストールごとに独自の UUID が保存され、ブラウザ内で現在読み込まれている拡張機能セッションには別のセッション UUID が使用され、ネイティブな tabId も送信されます。そのため、同じブラウザの 2 つのプロファイルや、同じ URL を持つ 2 つの物理タブが統合されることはなく、再起動や拡張機能のリロード後に古い tabId が切り替えに使われることもありません。

ポップアップでは、ローカルサーバーの確認、未同期の物理タブ数と操作数、手動スナップショット、現在のタブまたは利用可能なすべての HTTP(S) タブのコンテンツキャプチャが利用できます。タブ数にハードリミットのない完全なスナップショットは、起動時、タブ変更後(デバウンス付き)、および 5 分ごとに chrome.alarms 経由でも送信されます。トランスポートは実際の payload サイズのみをチェックします。サーバーがオフの場合、保留中のデータは chrome.storage.local に保存されます。置き換えられたスナップショットと重複コンテンツは圧縮され、キューは操作数に制限なしで安全なサイズ 32 MiB のみに制限されます。408/425/429 を除く永続的な HTTP 4xx エラーは、50 エントリの制限付きログに記録され、後続のアイテムをブロックしません。一時的なエラーは順序を保持し、自動的に再試行されます。

ウェブインターフェースはデフォルトで Library を開き、Graph は同じ正規ページの代替ビジュアライゼーションとして残ります。独立したメインタブ Open tabs はもうありません。Library は、ページが最初に表示された順序と、Chrome → Yandex → Edge → Other という固定のブラウザ順を維持します。タグ、summary、リンクは物理コピー間で重複しません。Tab 列では、閉じたページには物理的なターゲットがなく、1 つの開いたコピーはコンパクトな正確なブラウザタブとして表示され、2 つ以上のコピーはウィンドウ、位置、ネイティブな tabId を含むリストに展開されます。このリストからの移動と閉じる操作は、完全な identity browser / installation / browserSession / browserTabId でアドレス指定されるため、TabHub は選択したタブをそのタブ自身の Chrome、Yandex Browser、Edge、または他の Chromium プロファイルでフォーカスまたはクローズし、URL の重複を開くことはありません。Multiple open copies フィルターは、openInstanceCount > 1 の正規行のみを残します。これはサーバー側でカウントとページネーションの前に適用され、raw URL の exact-duplicate チェックとは意図的に異なります。Fragment(#...)は正規ページのアイデンティティに含まれ、大文字小文字を区別しない utm_* は引き続きトラッキングパラメータとして削除されます。

通常の状態では、Library のチェックボックスは、ステータスとトピックを変更するための正規ページを選択します。専用の Manage browser tabs / タブ管理 ボタンは、物理インスタンスの一括選択を有効にします。親行のチェックボックスは開いているすべてのコピーを選択し、展開されたリストでは特定のコピーだけを残せます。物理的な選択はページネーションをまたいで保持されますが、Library フィルターの変更、管理の無効化、Graph への移動でクリアされます。Graph への移動は通常のページモードにも戻します。フィルタリングされた物理タブの完全なセットは、SQLite の 999 バインドパラメータの制限なしに、別の非ページネーションリクエストで取得されます。このモードでは、Move、Close、Pin/Unpin、Mute/Unmute、Sleep、Reload、Workspaces、URL/Markdown/JSON エクスポートに加えて、Extra exact copies、正確な hostname、および age のプリセットが利用できます。通常の live コマンドは、単一の正確な browser/install/session にのみ適用できます。混合、古い、またはオフラインの選択は全体がブロックされます。個別の明示的なアクション Close all matching duplicates は、接続されたプロファイル全体で安全な余分な exact raw-URL コピーのみをバッチ処理し、各グループで keeper を保持し、プロファイルごとに別々の厳密な live preview を実行し、全体の確認の前に除外されたプロファイルを表示します。一括クローズは、プロファイルごとのレシートと、利用可能な Reopen closed tabs を表示します。不明な結果は自動的には再試行されません。Library の行をマウスホイールクリックすると、モーダルなしで単一の物理コピーだけを閉じます。複数のコピーがある場合は、まず展開されたリストで正確な行を選択する必要があります。TabHub タブは保護されたままであり、live コマンドに隠れたターゲット制限はありません。

Library 内には、個人コレクションの レビュー待ち と ゴミ箱 があります。レビュー待ちに入るのは、Inbox からの重要度ゼロの弱いページレコメンデーションのみです。インターフェースは常に理由と警告を表示しますが、何も自動的に削除しません。どのページでも、サイトやトピックに関係なく、保持、後で、または 閉じて忘れる を明示的に選択できます。最後のアクションは確認を必要とし、既知の各物理コピーをそれぞれのブラウザで対象とし、完全で正確なクローズ結果を要求してから、通常の Library から正規ページを非表示にします。オフライン、変更済み、またはアドレス指定できないコピーがある場合、ページは忘れられません。複数のブラウザのクローズ中に障害が発生した場合は、結果はクローズに成功したコピー数を報告し、レコードは安全な再試行のために Library に残ります。忘れられたページは 7 日間、元に戻せるゴミ箱に残ります。再オープンまたは明示的な復元は削除を取り消し、期限切れのクローズ済みレコードはサーバーがバックグラウンドでクリアします。

Library の Activity 列では、TabHub は追跡されたすべてのブラウザセッションにわたって、正規ページの 2 つの履歴指標を集計します。これらの値は、物理タブが閉じられた後やブラウザの再起動後も保持されます。ナビゲーション時、インターバルは記録された URL に対応付けられるため、ページの時間が混ざることはありません。短い遷移がデバウンスされた snapshot より先に終了した場合でも、受理された activity インターバル自体がクローズ済みの Library レコードを作成し、後続の snapshot が重複なしにそれを開いて拡充します。On screen は、タブが選択され、そのウィンドウがフォアグラウンドにあり、コンピュータがアイドルでもロックでもない時間だけを考慮します。Active use は、確認されたマウスの移動またはクリック、キーボード操作、スクロール、タッチの 60 秒以内のこの時間のサブセットです。Drawer は、現在の browser session の特定の物理タブについて、履歴の Page activity / ページアクティビティ と Open copies / オープンコピー のメトリクスを別途表示します。拡張機能は、ポインター座標、押されたキー、テキストを除き、インターバルと合計のみを保存します。content script が利用できない保護されたブラウザページでは、On screen のみがカウントされます。ブラウザを完全に再起動すると、物理タブのカウンターは新しいセッションを開始するため、再利用された Chromium の tabId が他人の時間を受け取ることはありませんが、ページの履歴アクティビティは蓄積され続けます。正確な履歴集計は schema 15 から始まります。保存された URL のない以前の物理的な合計は、意図的にページにランダムに転送されません。schema 16 は、snapshot が確認できなかった正確な activity-only URL を具体化します。

Workspaces は、選択されたすべての物理インスタンスの名前付きスナップショットを、同一 URL も含めて、最新のサーバー側の browser/window/index 順序で SQLite に保存します。リクエストにはコンパクトな識別子が含まれ、live コマンドの後、拡張機能はまず新しい順序とフラグを同期します。そのため、Move/Pin/Mute の直後の Save は古い状態を記録しません。Save & close は、まず確認付きでスナップショットを保存し、その後にのみ close preview を開きます。保存されたセット全体は、現在のウィンドウまたは新しいウィンドウで開いたり、名前を変更したり、削除したりできます。復元は、隠れた切り詰めなしに、保存された各要素を順番に開きます。復元中は再実行がブロックされ、タイムアウトで結果が不明な場合、UI は最初にブラウザを確認するよう求めます。選択されたタブは、URL リスト、Markdown、JSON としてもコピーできます。

コンテンツはコマンド実行時のみ取得されます。Readability は記事の本文テキストと HTML を取得し、適切な記事がないページには document.body.innerText が使用されます。v1 にすべてのタブを自動クロールする機能はありません。

複数のブラウザのスナップショット後、レコードはブラウザの列を持つ共通テーブルに表示されます。再スナップショットは既存の正規化されたリンクを更新します。消えたタブは isOpen=false のままデータベースに残ります。

拡張機能なしの REST チェック

$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/tabs

GET /api/tabs は、ページネーション前のグローバルソートをサポートします。sort_by は title、topics、browser、activity、status、importance、state、age を受け入れ、sort_direction は asc または desc を受け入れます。列によるソートは、順序が関連性によって決定される search_mode=semantic および similar_to とは組み合わせられません。

全文検索

検索は、コンテンツ取得前のタイトルと完全な URL に対して機能し、正規ページに結合された各物理タブのタイトルと元の URL も含みます。取得後は、クリーンアップされたテキストと summary も考慮されます。部分的に入力された単語はプレフィックス一致し、タイトルと URL のリテラル断片は大文字小文字を区別しない Unicode サブストリングで一致します。ユーザークエリの句読点は FTS 構文として解釈されません。

Invoke-RestMethod 'http://127.0.0.1:7717/api/tabs?q=local-first'

ウェブ UI では、同じパラメータがテーブル上の検索ボックスで利用できます。

セマンティック検索と inbox クラスター

エンベディングは明示的なリクエストがあった場合のみ作成されます。デフォルトでは、TabHub は http://127.0.0.1:11434 のローカル Ollama を使用します。最初のインデックス作成前にモデルをインストールしてください。

ollama pull nomic-embed-text

Voyage を使用するには、.env で EMBEDDING_PROVIDER=voyage、VOYAGE_API_KEY、必要に応じて VOYAGE_EMBEDDING_MODEL を設定します。EMBEDDING_PROVIDER=disabled はプロバイダーを完全に無効にします。どちらのオプションも、512 次元のベクトルをローカルの sqlite-vec テーブルに保存します。取得されたテキストはプロバイダーに送信される前に 32,000 文字に制限され、100 タブずつのバッチで処理されます。

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}'

テキストを再取得すると、古いベクトルが削除されます。cluster_inbox は、まだインデックス化されていないステータス inbox のタブのみをインデックス化し、その後、決定論的に名前付きクラスターを提案します。タグを作成したり、ユーザーのマークアップを変更したりすることはありません。

オンデマンド要約

TabHub はタブを自動的に要約することはありません。UI または MCP からの手動リクエストを有効にするには、.env で ANTHROPIC_API_KEY を設定し、サーバーを再起動します。デフォルトでは、短いモードは claude-haiku-4-5-20251001 を使用し、深いモードは claude-sonnet-5 を使用します。モデルと計算された価格は、.env.example の ANTHROPIC_* 変数で上書きできます。

リクエストは SQLite に永続的なジョブを作成し、バックグラウンドワーカーは Anthropic への呼び出しを同時に 1 回だけ実行します。一時的なエラーはバックオフ付きで再試行され、未完了のジョブは再起動後に復元され、古い結果は再取得されたコンテンツの上に書き込まれません。TABHUB_DAILY_SUMMARY_LIMIT は、UTC 日ごとのプロバイダー呼び出しの試行のみを制限します。トークン消費量と計算コストは試行ごとに保存され、成功したジョブのログに書き込まれます。

$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)"

キーが設定されていない場合、エンドポイントは 503 SUMMARY_PROVIDER_UNAVAILABLE を返し、ジョブを作成しません。UI テーブルでは、取得済みテキストがある各タブについて、短い summary の作成または更新が可能です。キューの状態とエラーはアクションの隣に表示されます。

タブの整理

テーブルは行の選択と一括ステータス変更、または Research/AI/Agents のような階層トピックパスの割り当てをサポートします。一括パネルとタブカードのトピックフィールドは、検索付きで既存のパスを提案しますが、新しいパスを作成できるよう編集可能なままです。システムトピックの Без темы は候補に含まれません。現在のページの行は動的な高さ測定で仮想化されるため、展開された summary はページ全体を DOM にマウントせずに正しく表示されます。トピックサイドバーは、累積カウンター付きの任意の深さのツリーを表示します。ルートトピックと子トピックの作成、名前の変更と移動、色の設定、確認後の子のないトピックの削除が可能です。親パスによるフィルターは、すべての子トピックのタブを含みます。行をクリックすると、コンテンツ、summary、トピック、方向性のあるリンク、重要度、カスタムフィールドを含むタブカードが開きます。

保護されたシステムトピック Без темы は、ユーザートピックがないすべてのタブを自動的に含みます。最初の通常トピックが割り当てられるとこの関連は解除され、最後の通常トピックが削除されると復元されます。Без темы は Library と Graph でフィルターとして使用できますが、名前の変更、移動、削除、手動での割り当てはできません。グラフでは、システムトピック自体とその構造的な関連は表示されません。フィルタリングされたタブは、トピックが割り当てられていない通常のタブのように見えます。

PATCH /api/tabs/:id は、status、importance、customFields の空でない任意の組み合わせを受け入れます。文字列値はフィールドを作成または更新し、null は削除します。一括重要度は PATCH /api/tabs/importance で利用できます。トピックの CRUD は /api/tags にあり、パスの割り当ては POST /api/tags/assign です。タブ間、タブとトピック間、トピック間のユニバーサルな関連は /api/relations で利用できます。以前の /api/links は、タブ間の関連の互換性のあるプロジェクションとして保持されています。手動の変更は由来 user で保存され、MCP の変更は agent で保存されます。

関連グラフ

Graph セクションは、タブとトピックが別々のノードタイプとして表される 3D WebGL グラフを開きます。マウスでシーンを回転したり、平面を移動したり、ズームイン/アウトしたりできます。クリックするとノードを選択してカメラをそのノードに移動し、メタデータ、既存のブラウザタブへのジャンプ、または選択した Library トピックへの遷移を備えたインスペクターを開きます。

選択したノードには、1 から 5 ステップのフォーカス深度を設定できます。この無向の環境内のすべてのノードとエッジは明るいままで、残りのシーンは透明になります。フィルターがアクティブな場合、サーバーはトピックの境界を越えた直接の相互リンクを保持し、選択したノードのより深い環境は、別の制限付きプロジェクションで追加読み込みされます。そのために完全なグローバルグラフは必要ありません。インスペクターでは、表示されている任意のノードとの方向性のある意味的リンクを作成し、そのタイプとメモを指定したり、既存の意味的リンクを削除したりできます。トピックの階層とタブの所属は構造的エッジとして表示されますが、ユーザー定義の関連テーブルには複製されません。

トピックツリーのフィルターは、選択したサブツリーのみを読み込みます。密集したグラフの場合、UI はシミュレーション時間を短縮し、ジオメトリを簡素化し、コストのかかる個々のノードのドラッグを無効にします。3D コード自体は別の lazy chunk として読み込まれ、Library の初期表示を重くしません。正規の型付き REST レスポンスは別途利用でき、以前のエンドポイントは互換性のために保持されています:

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/graph

Claude Desktop と Codex 向け MCP

まずstdio MCPサーバーをビルドし、メインのTabHubサーバーを 127.0.0.1:7717 で起動したままにします:

corepack pnpm --filter @tabhub/mcp build
corepack pnpm dev

MCPプロセスは TABHUB_API_URL を使用し、REST APIに対する薄いアダプターのままです。ツールとして 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 とリソース tabhub://tab/{id} を提供します。list_tabs はRESTリストと同じフィルター(q, search_mode, similar_to を含む)を受け入れます。search_tabs は fulltext と semantic のモードをサポートします。cluster_inbox は未整理のタブを明示的にインデックス化し、タイトル、キーワード、タブIDを含む提案を返します。非推奨ツールの set_importance は、最初に /api/features を読み取ります。論理的重要度が有効な場合、サーバーはエージェントレコード on_behalf_of_user を記録し、フラグが無効の場合または古い schema-17 サーバーの場合は、選択したタブのみの従来のスカラーレコードが使用されます。フィーチャーコントラクトが不正な場合は記録されません。review_disposable_pages は個人向けの提案と警告を表示するだけです。set_page_retention は「残す」または「後で」の決定を保存します。破壊的な close_and_forget_page は confirmed=true を必須とし、結果が正確に確認できた場合にのみ既知の物理インスタンスをすべて閉じ、その後ページを7日間のゴミ箱に移動します。このページは list_retention_trash と restore_retention_page で表示・復元できます。summarize_tab はリクエストをエージェント発としてマークし、同じSQLiteキューに投入して、最大55秒間完了を待ちます。処理がまだ終了していない場合、再呼び出しは同じアクティブジョブの待機を続けます。MCPレスポンスのコンテンツは約20,000文字に制限されています。

Claude Desktop

Settings → Developer → Edit Config を開き、サーバーを %APPDATA%\Claude\claude_desktop_config.json に追加して、Claude Desktop を完全に再起動します:

{
  "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"
      }
    }
  }
}

Node.js またはリポジトリが別の場所にある場合は、(Get-Command node).Source と (Resolve-Path packages/mcp/dist/main.js).Path のコマンドで絶対パスを取得し、上記の値を置き換えてください。

Codex

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 list

%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"

接続後、Codex で /mcp を開き、tabhub と上記のすべてのツールが利用可能であることを確認してください。

確認

corepack pnpm test
corepack pnpm typecheck
corepack pnpm build

バックアップ

サーバーが停止中でも稼働中でも、SQLite オンラインバックアップは次のコマンドで作成されます:

corepack pnpm backup

ファイルはルートフォルダー backups/ に生成されます。

実装状況

  • ステージ0: モノレポの骨組み、共通スキーマ、SQLiteマイグレーション、ヘルスチェック — 完了。

  • ステージ1: Chromiumブラウザからのスナップショット、信頼性の高い拡張機能キュー、RESTインジェスト、重複排除、共通テーブル — 完了。

  • ステージ2: Readabilityコンテンツの手動キャプチャ、FTS5、UIでの検索 — 完了。

  • ステージ3: REST管理操作、階層タグ、統計、Claude Desktop/Codex用MCPツール — 完了。

  • ステージ4: 信頼性の高いSQLiteキューによる明示的な要約、逐次処理のAnthropicワーカー、UI、MCP — 完了。

  • ステージ5: トピックツリー、タブカード、関連、重要度、カスタムフィールド、UI/MCPでの一括操作 — 完了。

  • ステージ6: sqlite-vec、Ollama/Voyageによる明示的なインデックス作成、セマンティック検索、類似タブ、REST/MCPでの名前付きインボックスクラスタ — 完了。

  • ステージ7: WebGLナビゲーション、任意の相互リンク、インスペクター、深さ1〜5ステップの近傍へのフォーカスを備えた、タブとトピックの型付き3Dグラフ — 完了。

Maintenance

ActivityStale
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables MCP-compatible AI agents to securely control Chrome tabs via a local bridge, with explicit per-tab sharing and human approval for consequential actions.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables MCP-compatible AI agents to inspect, read, close, deduplicate, group, and consolidate live Chromium browser tabs through a secure local bridge, with safety checks and no need for its own AI model or API key.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables local control of existing Chrome/Chromium browser tabs through MCP, including tab management, navigation, content reading, screenshots, and page interaction.
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to create, read, and operate granted background tabs in Chrome via a local stdio MCP server, preserving the human's front tab. Supports tab groups, navigation, clicking/typing, screenshots, and human-priority permissions.
    MIT