webflow-mcp:review-comments について
Webflow サイトの未解決コメントスレッドを確認し、分類するスキルです。分類レポートを作成し、返信モードでは対象となる一部のコメントに返信を投稿できます。
主な機能
- 01未解決コメントスレッドの確認
- 02ノイズ・古い・対応必要・ページ単位の分類
- 03既存エージェント返信の確認
- 04レポートのみ/返信モード
- 05Markdown の分類レポート作成
活用シーン
- 01特定サイトのコメントを整理
- 02複数サイトの未解決コメントを調査
- 03対応が必要なデザイン意見を特定
- 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 — サイトを特定する
サイト識別子が空または空白の場合 — 全サイトのコメント調査
data_sites_tool > list_sitesを呼び出して全サイトを取得します。すべて収集できるまでページを切り替えて取得します。- 各サイトについて、
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"}. - 各サイトについて、次の値を計算します。
unresolvedCount= 未解決スレッドの合計数newestDate= そのサイトの全未解決スレッドにおけるlastUpdatedの最大値(ISO 形式から人が読みやすい日付に変換します。例:「Apr 3, 2026」)。スレッドがない場合は—を表示します。oldestDate= そのサイトの全未解決スレッドにおけるlastUpdatedの最小値(ISO 形式から人が読みやすい日付に変換します)。スレッドがない場合は—を表示します。
- サイトを
unresolvedCountの降順に並べ替え、上位 10 件を選びます。 - 表の上に、見出し行
### Checked {totalSiteCount} sites — {sitesWithUnresolved} have unresolved comments.を表示します。 - 次の形式で表を表示します(サイト名だけを
https://webflow.com/design/{siteId}にリンクします)。
| Site | Unresolved Comments | Newest / Oldest |
|------|---------------------|-----------------|
| [Site Name](https://webflow.com/design/{siteId}) ({siteId}) | {N} | {newestDate} / {oldestDate} |
- 表の後に、ユーザーに次のように伝えます:「特定のサイトを確認するには、
/webflow-mcp:review-comments <site name or ID>を実行してください。」 - 調査結果をファイルに書き込みます。
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。
- 停止 — ステップ 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?.elementisPageLevel= 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 — レポートを作成する
すべてのスレッドを処理した後、以下を実行します。
- 作業ディレクトリの最上位に
comment-reviews/ディレクトリが存在するか確認します。存在しない場合は、mkdir comment-reviewsで作成します。 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._ を使用します。
概要行を記録し、レポートのパスを確認します。