Blame Today について
Blame Todayは、Nostrを基盤とする匿名投票ボードのウェブクライアントです。投票はアカウントや投票経路上のバックエンドを介さずリレーへ直接送信され、話題の閲覧や投票、リレー集計のランキング確認に使えます。
主な機能
- 01匿名のNostr投票
- 02リレーへのイベント直接送信
- 03全期間・24時間ランキング
- 04見出しからの話題提案
- 05コンテンツフィルター
活用シーン
- 01アカウントなしで対象に投票
- 02人気・急上昇中の対象を閲覧
- 03ニュース見出しから話題を探す
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://blame.today/mcpclaude mcp add --transport http today-blame https://blame.today/mcp{"mcpServers":{"today-blame":{"type":"http","url":"https://blame.today/mcp"}}}Cursor で開く{"servers":{"today-blame":{"type":"http","url":"https://blame.today/mcp"}}}VS Code で開く{"mcpServers":{"today-blame":{"type":"http","url":"https://blame.today/mcp"}}}{"mcpServers":{"today-blame":{"serverUrl":"https://blame.today/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
1このツールにパラメーターはありません。
詳細
blame-web
blame.today のウェブクライアント。「生のファイアホース」です。Nostr リレーと直接通信する、クライアントサイドの Svelte + Vite アプリです。投票経路にはバックエンドも認証もレート制限もありません(イベントはリレーに直接送信されます)。薄い Cloudflare Worker が静的サイトの前段に置かれ、https を強制し、www -> apex にリダイレクトし、/mcp で MCP ポインターを提供します。これは blame のオープンな標準実装です。iOS アプリは別リポジトリの blame-ios にあります。
blame-today/blame-mobile(旧 iOS アプリ + Worker リポジトリ)から切り出し、それぞれのプラットフォームを独立したものとして扱えるようにしました。ブランドと pureblameapp Nostr タグは共有していますが、コード、ビルド、デプロイは共有していません。
概要
- blame の対象は
pureblameappタグ付きの Nostrkind 1イベントで、投票はe:<targetId>+pureblameappタグ付きのkind 7リアクションです。イベントごとに使い捨ての鍵を使用します。 - リーダーボードは、イベントを取得するのではなく、リレーの
COUNT(全期間 + 24 時間の「ホット」期間)から構築されます。 - ニュースタブでは、クライアントサイドで今日の見出しを抽出し(
compromise)、クリック可能な候補にします。 - コンテンツフィルター(不適切な言葉/PII/意味不明な文字列)が唯一のゲートです。オープンなファイアホースです。
開発
投票はクリックごとに一度署名され、同じイベント ID で再試行されます。新しい対象に対する最初の投票を送信する前に、その対象が承認されている必要があります。5 回失敗すると、ボードには同じ署名済みイベントで再試行する選択肢が表示されます。キューに入った配信と失敗した配信は、現在のタブ内にのみ保持されます。保留中の投票が完了するまで、タブを開いたままにしてください。
件数はリレーの推定値です。対象と期間ごとに、設定済みリレーから得た最新の異なる報告のうち、2 番目に大きい値を使用します。報告が 2 件未満の場合は利用不可となり、0 ではなく省略記号で表示されます。ライブイベントまたは承認を受け取ると、新しいスナップショットを要求します。スナップショットに件数を加算することはないため、配信が重複しても二重計上されません。リレーが推定値を下方修正する場合もあります。90 秒より古いサンプルは、新しい応答を受け取ったとき、または次の 45 秒ごとの再同期時に、応答がない状態でも削除されます。これはリレー間の正確な和集合ではありません。NIP-45 はアプリケーションタグとイベント種別でフィルターできますが、リアクションの内容ではフィルターできません。受信したボードイベントは、形式、アプリケーションタグ、正規 ID、署名について別途検証されます。
COUNT の応答は、リレーが署名なしで申告する値です。不正なリレーが 1 つあっても、すべての正直なリレーが報告した件数を上回る推定値にはできませんが、その範囲内では結果に影響を与えられます。不正なリレーが 2 つあれば、偽の件数を裏付けることができます。部分的なカバレッジと無制限の署名済み投票は、このオープンなボードの一部であり、これらの推定値は検証済みの投票総数ではありません。あるリレーが投票を受け付けても、件数は別の応答を待つことがあります。「自分の投票」には送信したトピックが保持されます。古いキャッシュ済みの合計は再読み込み時に破棄されますが、保存済みのトピックと所有権は保持されます。
各タブが保持するリモート対象は最大 1,000 件で、これに自身が所有する対象が加わります。新しい対象は、所有者のいないリモート対象のうち最も古いものと置き換わるため、キャッシュ済みのボードがいっぱいでもライブトピックを受け取れます。受信フレームのサイズ上限は 128 KiB で、検証待ちのフレームはリレーごとに最大 1,024 件/1 MiB です。このキューが上限を超えたリレーは切断され、再試行されます。未応答の COUNT リクエストはプール全体で最大 12,000 件に制限され、置き換えられたリクエストは削除されます。これらはクライアントのリソース制限であり、リレーが受け付けるイベントには影響しません。
npm install
npm run dev # vite dev server
npm test # vitest unit tests
npm run test:e2e # playwright
npm run build # -> dist/
デプロイ
main にプッシュすると、.github/workflows/deploy-web.yml が dist/ をビルドして wrangler deploy を実行し、blame.today を配信する Cloudflare Worker(blame-today、Workers + Static Assets)に公開します。Worker(worker/index.js)は dist/ を静的アセットとして配信し、http → https に強制アップグレードし、www → apex にリダイレクトして、/mcp で MCP をインライン配信します(worker/mcp.js)。リポジトリシークレットとして CLOUDFLARE_API_TOKEN(Workers:Edit)と CLOUDFLARE_ACCOUNT_ID が必要です。/about の文章は public/about/ にあり、Vite が dist/about/ にコピーします。
2026-06-16 に GitHub Pages から移行しました。現在、ゾーンは Cloudflare にあり、blame.today は Worker のカスタムドメインです。scripts/** または infra/** のみを変更するプッシュでは、再ビルドはスキップされます。
infra(Worker を取り巻く Cloudflare 設定)
CF の「クリック操作レイヤー」――DNS レコード、ゾーン設定(HSTS、Always Use HTTPS)、www → apex リダイレクトルール、メールルーティング(*@blame.today → gmail)――は、infra/ に宣言的 IaC(OpenTofu)として記述されています。Worker のコードと apex カスタムドメインは wrangler が管理し、それ以外は OpenTofu が管理します。各リソースの管理者は必ず 1 つです。infra/README.md を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。