mcpField
R
read

read

github.com/davepoon生産性3.7k60 回インストール今日更新
リポジトリ

read について

Markdown ファイルを開く前にページを確認するための Origin 用プレビュー技能です。タイトルや語句で検索するほか、ID を指定して取得できます。

主な機能

  1. 01IDでページを取得
  2. 02タイトルや語句で検索
  3. 03簡潔なページプレビューを表示
  4. 04リンクと古さを報告
  5. 05ユーザー編集済みページを表示

活用シーン

  1. 01ページを開く前に内容を確認
  2. 02タイトルや語句からページを検索
  3. 03ページのリンクと鮮度を確認

MCP 対応

Origin MCP ツールでページを検索・取得し、プレビュー用にページリンク情報も取得します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/davepoon/buildwithclaude --skill read

インストール後、Claude Code で/readを入力して読み込まれたか確認します。

詳細

/read

ユーザーがページを開くかどうかを判断できるよう、ページの概要を表示します。 /read は全文ではなくプレビューです。本文はディスク上にあります。プレビューにすることで、チャットを見やすく保ち、Bash 出力の切り捨てを避け、「md が正本で、ビューアーはユーザーのエディター」というモデルを尊重できます。

呼び出し方

次の 2 つの形式を受け付けます。

  1. ページ ID(page_ で始まるもの。従来の concept_ ID も引き続き使用できます)→ 直接取得します。
  2. タイトルまたは自由形式の語句 → 検索し、最適な候補を選んで取得します。

どちらも最後に同じプレビューブロックを表示します。

1. 直接 ID を指定

ページを取得するには MCP ツールを呼び出します。

get_page(page_id="<id>")

応答は { "page": {...} } を含む JSON オブジェクトです。ページから title、summary、space、source_memory_ids を読み取り、 ~/.origin/pages/.origin/state.json で md ファイル名を調べます。

Bash: python3 -c '
import json, os, sys
state_path = os.path.expanduser("~/.origin/pages/.origin/state.json")
pid = "<id>"
filename = None
try:
    with open(state_path) as f:
        filename = json.load(f).get("pages", {}).get(pid, {}).get("file")
except FileNotFoundError:
    pass
print(f"~/.origin/pages/{filename}" if filename else "(no md projection on disk)")
'

ページのフィールドと解決した md パスを組み合わせ、プレビューブロックを出力します。

2. タイトルまたは自由形式の語句を指定

まず検索し、最上位の候補を ID で取得して、同じプレビューブロックを表示します。必ず search_pages MCP ツールを使って解決してください。クライアント側でスラッグを推測してはいけません(アポストロフィや句読点に対するスキルの推測方法は、正規の slugify() とずれるためです)。

search_pages(query="<arg>", limit=1)

返された JSON を解析します。応答の形式は { "pages": [...] } です。 最初の候補の id を読み取ります。pages が空の場合は、「<arg> に一致するページが見つかりません。作成するには /distill <arg> を試してください」とユーザーに伝えて終了します。それ以外の場合は get_page(page_id=<id>) を呼び出し、セクション 1 と同じプレビューブロックを出力します。

出力形式

次の行だけを、本文なしで必ず表示します。

Title:    <title>
Version:  v<N> — <last_edited_by> <relative_time> (<last_delta_summary>)
Summary:  <one sentence>
Sources:  <N> memories
Space:    <space or (none)>
Links:    <N inbound, M outbound (<K> broken)>
Open:     ~/.origin/pages/<slug>.md
⚠ Stale: <stale_reason> — run /distill to refresh

ロックバナーのルール:

get_page が返したページのペイロードで user_edited == true の場合は、タイトルより前の出力の最初の行に、次の行を追加します。

🔒 You've edited this page. Auto-refresh paused. `/distill rebuild <page-id>` to unlock.

<page-id> は実際の page.id の値に置き換えます。user_edited が false または未指定の場合、この行は完全に省略します。

ロックされると、デーモンの distill サイクルでソースからこのページの文章が自動的に書き換えられなくなります。ユーザーが /distill rebuild を明示的に実行して消去・再生成するまで、編集内容はそのまま維持されます。

バージョン行のルール:

  • 必ず v<N> を表示します。version が null または欠落している場合は、この行を省略します。
  • last_edited_by に値がある場合は、 — <last_edited_by> を追加します(例:re_distill、user、agent)。
  • last_edited_at が設定されている場合は、相対時間を追加します(例:2h ago、3d ago)。
  • last_delta_summary が空でない場合は、(<last_delta_summary>) を追加します。
  • 例:
    • v1 — synthesized 4h ago
    • v4 — re_distill 2h ago (+mem_xyz, +250 chars)
    • v3 — user 1d ago

古いページの警告ルール:

  • stale_reason が null でも空でもない場合に限り、⚠ Stale: 行を出力します。
  • stale_reason はそのまま表示します(デーモンが設定する値であり、source_updated、new_memories などは人間にも十分わかりやすいものです)。

リンク行のルール(変更なし):get_page の直後に get_page_links(page_id="<id>") を呼び出し、次のように数えます。

  • inbound = len(inbound)
  • outbound = len(outbound)
  • broken = target_page_id が null の outbound エントリー

broken が 0 の場合は括弧内を省略します。inbound + outbound が 0 の場合は行全体を省略します。

タイトルを言い換えたり、概要を短くしたり、プレビューを装飾したりしないでください。ブロックは 1 画面に収まり、予測しやすく、ざっと読みやすいものにします。

本文全体を読みたい場合は、ユーザー自身のエディター(Obsidian、VS Code、glow、bat など)で md ファイルを開きます。プラグインは、ユーザーのツールより優れた Markdown 表示を提供するものではありません。

使用する場面

  • ユーザーが「X のページを見せて」「 には何が書かれている?」「プレビューして」と頼んだとき。
  • /distill の完了後に /read "<title>" を続けて実行するとき(タイトルはどの表示画面でも変わらず、ID は見た目上切り詰められる場合があります)。

使用しない場面

  • 生のメモリーを検索する場合 → /recall を使用します。
  • すべてのページを一覧表示する場合 → list_pages_recent MCP ツール、または ls ~/.origin/pages/ を使用します。
  • 本文全体を読む場合 → ユーザーのエディターで md ファイルを開きます。

コメント