mcpField
W
webflow-mcp:review-comments

webflow-mcp:review-comments

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

webflow-mcp:review-comments について

Webflow サイトの未解決コメントスレッドを確認し、分類するスキルです。分類レポートを作成し、返信モードでは対象となる一部のコメントに返信を投稿できます。

主な機能

  1. 01未解決コメントスレッドの確認
  2. 02ノイズ・古い・対応必要・ページ単位の分類
  3. 03既存エージェント返信の確認
  4. 04レポートのみ/返信モード
  5. 05Markdown の分類レポート作成

活用シーン

  1. 01特定サイトのコメントを整理
  2. 02複数サイトの未解決コメントを調査
  3. 03対応が必要なデザイン意見を特定
  4. 04古いスレッドに解決案を返信

MCP 対応

Webflow MCP ツールでサイトを検索し、コメントスレッドと返信を取得します。返信モードではコメントへの返信も投稿します。

インストール

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

$npx skills add https://github.com/webflow/webflow-skills --skill webflow-mcp:review-comments

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

詳細

Webflow サイトの未解決コメントスレッドを確認し、それぞれをトリアージします。

入力: $ARGUMENTS — サイト名(例:「Workhaus」)、サイト ID(例:6808fd4eff835ee3af009d6f)、または -reply フラグを付けたもの(例:Workhaus -reply)。

フラグ:

  • -reply — レポートの作成に加えて、未解決の各スレッドにボットの返信を投稿します。このフラグがない場合、スキルはレポートのみのモード(読み取り専用)で実行されます。

開始時に $ARGUMENTS を解析します。入力から -reply を取り除いてサイト識別子を取得し、-reply が含まれていた場合は replyMode = true、それ以外の場合は false に設定します。


ステップ 1 — サイトを特定する

サイト識別子が空または空白の場合 — 全サイトのコメント調査
  1. data_sites_tool > list_sites を呼び出して全サイトを取得します。すべて収集できるまでページを切り替えて取得します。
  2. 各サイトについて、isResolved: false および limit: 100 を指定して data_comments_tool > list_comment_threads を呼び出します。未解決のスレッドをすべて収集できるまでページを切り替えて取得します。API が isResolved によるフィルタリングをサポートしていない場合は、全スレッドを取得してからクライアント側で isResolved === false のものに絞り込みます。サイトを 20 件ずつ処理し、複数のアクションを 1 回のツール呼び出しにまとめます。各バッチの処理後に、進捗を示す行を記録します:Batch {N}/{total} done (sites {start}–{end}): {summary of findings, e.g. "all 0 threads" or "SiteName has X threads, rest 0"}.
  3. 各サイトについて、次の値を計算します。
    • unresolvedCount = 未解決スレッドの合計数
    • newestDate = そのサイトの全未解決スレッドにおける lastUpdated の最大値(ISO 形式から人が読みやすい日付に変換します。例:「Apr 3, 2026」)。スレッドがない場合は — を表示します。
    • oldestDate = そのサイトの全未解決スレッドにおける lastUpdated の最小値(ISO 形式から人が読みやすい日付に変換します)。スレッドがない場合は — を表示します。
  4. サイトを unresolvedCount の降順に並べ替え、上位 10 件を選びます。
  5. 表の上に、見出し行 ### Checked {totalSiteCount} sites — {sitesWithUnresolved} have unresolved comments. を表示します。
  6. 次の形式で表を表示します(サイト名だけを https://webflow.com/design/{siteId} にリンクします)。
| Site | Unresolved Comments | Newest / Oldest |
|------|---------------------|-----------------|
| [Site Name](https://webflow.com/design/{siteId}) ({siteId}) | {N} | {newestDate} / {oldestDate} |
  1. 表の後に、ユーザーに次のように伝えます:「特定のサイトを確認するには、/webflow-mcp:review-comments <site name or ID> を実行してください。」
  2. 調査結果をファイルに書き込みます。
    • comment-reviews/ が存在することを確認します(存在しない場合は mkdir comment-reviews で作成します)。
    • ファイル名:現在のローカル時刻を使用した comment-reviews/triage-report-{YYYY-MM-DD-HH-MM}.md(ゼロ埋め)。
    • ファイルの内容:太字の H1 タイトル # **Webflow Comment Review**、空行、H3 行 ### Report created on: {human-readable date, time, and timezone, e.g. "April 16, 2026 at 10:39 AM PDT"}、空行、手順 5〜6 の H3 見出し行(### Checked …)と表全体を Markdown 形式で記述します。
    • 書き込み後にパスを記録します。例:Report written to comment-reviews/triage-report-2026-04-16-14-30.md。
  3. 停止 — ステップ 2 に進まないでください。
サイト識別子が 24 桁の 16 進数の Webflow サイト ID に見える場合は、そのまま使用します。
それ以外の場合は data_sites_tool > list_sites を呼び出し、displayName が識別子と一致するサイトを探します(一致判定では大文字と小文字を区別しません)。一致するサイトがない場合はユーザーに伝えて停止します。

ステップ 2 — すべての未解決スレッドを取得する

ここでは必ず新たに API を呼び出してください。会話の以前のスレッドデータを再利用してはいけません。前回の実行後にユーザーがコメントを追加または解決している場合があります。

isResolved: false および limit: 100 を指定して data_comments_tool > list_comment_threads を呼び出します。スレッドをすべて収集できるまでページを切り替えて取得します。

Site: {displayName} および Found {N} open thread(s) を記録します。


ステップ 3 — ページ単位の要素マップを作成する

すでに取得したスレッド一覧から、すべてのスレッドを対象に elementId.element → Set<pageId> の頻度マップを作成します。異なるページで 2 回以上 出現する elementId.element は、ほぼ確実にページのルート/body 要素です(実際の要素 ID はページごとにスコープされるため、複数のページで繰り返されるのは共有される構造上のルートに限られます)。

API 呼び出しは不要です。スレッドデータに対するローカル計算です。

ステップ 4 — 各スレッドをトリアージする

各スレッドについて、以下を実行します。

4a — 返信を取得する

このスレッドに対して data_comments_tool > list_comment_replies を呼び出します。

4b — 重複チェック

content に文字列 — 🤖 Comment Review Agent を含む返信を探します。

見つかった場合は、最も新しいものを記録します(lastAgentReply)。lastAgentReply.createdOn より後に createdOn がある人間の返信がない場合、このスレッドをスキップします(スキップ数を増やし、次のスレッドに進みます)。

4c — 要素のコンテキストを算出する
  • elementId = thread.elementId?.element
  • isPageLevel = Step 3 の頻度マップで、elementId が 2 つ以上の異なる pageId に出現する
4d — スレッドを分類する

以下の基準を使用します。

noise — 実質的なデザイン上またはエンジニアリング上の価値がない:

  • テスト/プレースホルダーテキスト(「hello world」、「testing」、「asdf」、ランダムな文字列)
  • 要望を伴わない軽いリアクション(「looks nice」、「nice!」、「hey hey」)
  • 追加の価値がない、重複した感想

stale — 実質的な懸念だが古く、おそらく対応済み:

  • 返信やフォローアップのない、14 日以上前の具体的なコメント
  • おそらく解決済みの質問(「beta for how long?」、「is this good contrast?」)
  • 通常のレビューで気づけたはずのアクション項目

open — 対応が必要な、実質的で実行可能な懸念:

  • 明示的なタスク(「Should be sentence case」、「fix image」、「Look at name wrt L10N」)
  • デザイン上の決定がまだ必要
  • 具体的で明確な懸念

page-level — 特定の要素ではなく、ページのルートに付けられたコメント:

  • isPageLevel が true の場合に使用します
  • コメントは特定の要素に紐付いていません。意図的なものか、削除された要素から取り残されたものかもしれません
4e — 返信を作成する

返信テキストは必ず作成します(モードにかかわらずレポートに表示されます)。

  • noise:解決して問題ないことを確認する一文。例:"Looks like test text — safe to resolve."
  • stale:経過日数を示し、解決を提案して、必要であれば再開するよう案内します。例:"This is 302 days old with no follow-up. Safe to resolve — reply here if it's still relevant."
  • open:返信テキストなし。レポートにのみ表示します。
  • page-level:特定の要素に紐付いていないことを示す一文。例:"This comment is on the page root rather than a specific element — it may be an orphan from a deleted element. Safe to resolve if no longer relevant."

すべての返信テキストの末尾に \n\n— 🤖 Comment Review Agent を追加します。

4f — 返信を投稿する(replyMode = true の場合のみ)

replyMode が true で、判定が open ではない場合、作成した返信内容を指定して data_comments_tool > create_reply を呼び出します。

各スレッドを次の形式で記録します。

{VERDICT_EMOJI} {verdict}  "{preview (60 chars)}"
                {one-sentence classification reason}
                ↳ {reply posted | no reply — report only | skipped}

判定の絵文字:noise = 🗑、stale = 🕰、open = 🔴、page-level = 📄


ステップ 5 — レポートを作成する

すべてのスレッドを処理した後、以下を実行します。

  1. 作業ディレクトリの最上位に comment-reviews/ ディレクトリが存在するか確認します。存在しない場合は、mkdir comment-reviews で作成します。
  2. comment-reviews/{slugified-site-name}-comments-triage-report.md(小文字、ハイフン区切り、特殊文字なし)に Markdown レポートを書き込みます。

レポートの形式:

# Comment Review — [{siteName} ({siteId})](https://webflow.com/design/{siteId})

**Run:** {human-readable date and time}
**Mode:** {Report only | Report + replies posted}
**Threads:** {total} total | 🔴 {open} open | 🕰 {stale} stale | 📄 {page-level} page-level | 🗑 {noise} noise | ⏭ {skipped} skipped

---

## 🔴 Needs Attention ({count})

| Comment | Author | Age | Link |
|---------|--------|-----|------|
| "{first 80 chars of content}" | {author.name} | {age in days}d | [Open ↗]({thread.url}) |

## 🕰 Stale — Candidates to Resolve ({count})

| Comment | Author | Age | Suggested Reply | Link |
|---------|--------|-----|-----------------|------|
| "{first 80 chars of content}" | {author.name} | {age in days}d | {composed reply text, without the `— 🤖 Comment Review Agent` suffix} | [Open ↗]({thread.url}) |

## 📄 Page-level — Not Anchored to a Specific Element ({count})

| Comment | Author | Age | Suggested Reply | Link |
|---------|--------|-----|-----------------|------|
...

---

**🗑 Noise:** {count} thread(s) — {if replyMode: "replied to" | if report-only: "suggested replies in report"}. Safe to bulk-resolve.

項目がないセクションには _None._ を使用します。

概要行を記録し、レポートのパスを確認します。

コメント