kairan

kairan

A local MCP server that lets AI agents publish markdown/HTML to a browser viewer with session management, revision diffs, and live updates via a single tool call.

Category
访问服务器

README

KAIRAN

Claude Code / Codex などの agent が生成した markdown / HTML を、tool call ひとつでブラウザに表示するローカル MCP サーバー。

3ペインUI(セッション / ファイル / ビュー)

リビジョン差分(unified / side-by-side) ダークモード
差分表示 ダークモード
  • 何個の agent から接続されても、表示サーバーは 1 つ・port は 1 つ(初回 tool call で自動起動、全員がいなくなると自動停止)
  • URL は http://localhost:5766/<セッションID>/<ファイル名>。全 URL が deep link
  • 同じ名前で再 publish すると新リビジョンとして積まれ、リビジョン間の差分(unified / side-by-side)が見られる
  • 3 ペイン UI(セッション / ファイル / ビュー)+ SSE live update。新着 publish への自動追従は「新着に追従」トグルで制御
  • agent が終了したセッションは自動で archive され、サイドバーの「archived」トグルで表示できる
  • markdown は GFM + shiki シンタックスハイライト + mermaid 図に対応。HTML は iframe でそのまま実行(ローカル用途のため制限なし)
  • publish 時に macOS 通知センターへ通知(設定で off 可)。terminal-notifier が入っていれば通知クリックでそのファイルをブラウザで開けるbrew install terminal-notifier。無ければ osascript 通知にフォールバック、クリック遷移なし)
  • 人間 → agent のフィードバックにも対応。文書にインラインコメントを付けて GitHub PR レビューのように一括送信でき(request_review で agent が受け取る)、agent からの選択肢つき質問(ask_user)にブラウザ上で回答できる

セットアップ

bun install
bun link   # `kairan` コマンドをグローバルに登録

Claude Code

claude mcp add --scope user kairan -- kairan mcp

Codex CLI

# ~/.codex/config.toml
[mcp_servers.kairan]
command = "kairan"
args = ["mcp"]

tool

publish

markdown / HTML をブラウザに表示する。path(ファイルパス)か content(文字列)のどちらかを渡す。

引数 説明
path 表示するファイルのパス(content と排他)
content 本文の直接渡し(name 必須)
name セッション内のファイル ID(URL セグメント)。省略時は path の basename。同名で再 publish = 上書き = 新リビジョン
format markdown / html。省略時は拡張子から推定
session 名前付きセッションへの publish(固定 URL 化・別プロセスからの継続に使う)。省略時はこのプロセス専用の自動採番セッション
title ファイルリストに表示するタイトル
open true で強制オープン / false でオープン抑制

戻り値: { url, sessionId, fileId, revision, pendingFeedback }pendingFeedback は未受領フィードバック件数)

list_files

自セッション(または session で指定した名前付きセッション)の publish 済みファイル一覧。

request_review

人間にブラウザでのレビューを依頼し、送信されるまでブロックする。人間側はコメントを下書きとして溜め、総評とともに「送信」した時点でまとめて返る(GitHub PR レビューと同じモデル。コメント 0 件 + 総評空の「コメントなしで返す」も可)。timeout(デフォルト 20 分、timeout_seconds で変更可)で「まだフィードバックなし」が返るので、続けて待つ場合は再度呼ぶ(再呼び出しループで何時間でも待てる)。

戻り値には各コメントの commentId・対象ファイル・引用文(選択範囲)・本文と、総評・スレッド返信・未回収の質問回答が含まれる。

ask_user

選択肢つきの質問カードをブラウザに表示し、回答されるまでブロックする。複数 question を 1 カードに積め、各 question は選択肢 + 自由記述(常設)を持つ。人間は全問に答えてから送信する。file を渡すとその質問がどのファイルの話かサイドバーにバッジ表示される。timeout 後に同じ質問で再度呼ぶと既存カードを再利用して待ち直す(カードは増えない)。

reply_comment

request_review / list_feedback が返した commentId へのスレッド返信。resolve: true でコメントを解決済みにできる(人間側から再オープン可)。

list_feedback

ブロックせずに、送信済み・未受領のフィードバック(レビュー・質問回答)を回収する。agent が待っていない間に送信されたぶんの回収用。各項目は一度だけ返る。

CLI

kairan status    # デーモンの稼働確認
kairan restart   # デーモンの再起動(コード・設定変更の反映用)
kairan stop      # デーモンの停止(通常は不要: 全接続が消えると自動停止する)
kairan daemon    # デーモンをフォアグラウンド起動(通常は自動起動されるため不要)

コード変更の反映

  • デーモン側(Web UI・API・レンダリング・通知など大半のロジック): kairan restart で反映される
  • stdio ランチャー側(tool 定義・入力解決): ランチャープロセスは agent が起動・保持しているため kairan 側からは再起動できない。agent の MCP 再接続で反映される(Claude Code は /mcp → Reconnect、または新しいセッションを開始)

設定

~/.kairan/config.json(すべて任意)と環境変数で上書きできる。優先度: 環境変数 > config.json > デフォルト。

キー 環境変数 デフォルト 説明
port KAIRAN_PORT 5766 デーモンの listen port
host KAIRAN_HOST 127.0.0.1 bind アドレス(127.0.0.1 / localhost / ::1 のみ。認証なしのため loopback 限定)
dataDir KAIRAN_DATA_DIR ~/.kairan SQLite / lock の置き場所
autoOpen KAIRAN_AUTO_OPEN session-first session-first(セッション初回のみ自動オープン)/ always / never
reopenWhenNoTab KAIRAN_REOPEN_WHEN_NO_TAB true publish 時にそのセッションを見ているタブが無ければ開き直す
notifications KAIRAN_NOTIFICATIONS true macOS 通知センターへの通知
notifyOn KAIRAN_NOTIFY_ON all all(上書きも通知)/ new-file(新規ファイルのみ)
openCommand KAIRAN_OPEN_COMMAND open ブラウザを開くコマンド
followDefault KAIRAN_FOLLOW_DEFAULT true UI「新着に追従」トグルの初期値
reuseTab KAIRAN_REUSE_TAB true 自動オープン・通知クリック時に既存の kairan タブを再利用する(Chrome 系 / Safari。初回に macOS の自動化許可が必要。false で常に新規タブ)
shutdownGraceMs KAIRAN_SHUTDOWN_GRACE_MS 5000 全接続 0 になってから自動停止するまでの猶予
feedbackWaitMs KAIRAN_FEEDBACK_WAIT_MS 1200000(20 分) request_review / ask_user の 1 回の待機時間。timeout 後は agent が再呼び出しで待ち直す

設定ファイルのパス自体は KAIRAN_CONFIG_PATH で変更できる。

アーキテクチャ

agent (Claude Code / Codex)
  │ stdio MCP
  ▼
kairan mcp(agent ごとに 1 プロセス。port は使わない)
  │ HTTP(初回 tool call 時にデーモンを自動 spawn・生存申告の SSE を維持)
  ▼
kairan daemon(全体で 1 つ・port 1 つ)── SQLite (~/.kairan/kairan.db)
  │ HTTP + SSE
  ▼
browser(3ペイン UI)
  • stdio プロセス = 1 セッション。プロセス終了(= agent 終了)で TCP が切れ、デーモンがセッションを archive する
  • デーモンは「active セッション 0 かつ 閲覧タブ 0」になると自動停止する。データは SQLite に永続化されているため、次回起動時も過去セッションを閲覧できる
  • 設計判断の経緯: .local/docs/adr/0001-stdio-launcher-shared-daemon.md

開発

bun test            # テスト
bun run typecheck   # tsc
bun run lint        # biome
bun run dev         # デーモンをフォアグラウンド起動

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选