
o-sumo
us.osada/o-sumo
Grand Sumo (大相撲) banzuke, torikumi results, and rikishi profiles from osada.us. Read-only, no auth.
Documentation
o-sumo
Agentsの対応状況はこちら
o-sumo は、大相撲の番付、取組、力士・行司・呼出名鑑を配信する Web アプリです。React 19 + TypeScript + Vite で構築し、Cloudflare Pages からサイトと JSON API を公開しています。AI エージェント向けには MCP、WebMCP、Markdown 表示と発見用メタデータを用意しています。
2026年11月4日から、エンドユーザー向けに相撲データをMCPで配信しています。導入手順
目次
- ドキュメント一覧
- 概要
- AIエージェントから利用する
- 主な機能
- 技術スタック
- ローカル開発
- データ更新
- 自動更新
- テスト
- Cloudflare Pages
- 令和八年十一月場所の更新運用
- 主要ファイル
- 連絡先
- ライセンス
- ダウンロード
ドキュメント一覧
- README: README.md / README_en.md
- 開発ガイド: DEVELOPMENT.md / DEVELOPMENT_en.md
- MCP 連携キット: mcp/README.md
- Skills 一覧: SKILLS.md / SKILLS_en.md
- API 仕様: docs/api/v1.md / docs/api/v1.en.md
- API ポリシー: docs/api/policy.md / docs/api/policy.en.md
- API 変更履歴: docs/api/changelog.md / docs/api/changelog.en.md
- 力士プロフィール・合い口更新手順: docs/rikishi-profile-refresh-runbook.md
- 行司・呼出データ更新手順: docs/official-profile-refresh-runbook.md
- エージェント向けガイド: docs/agent-ready.md
概要
- Web ルート:
- ホーム:
/ - 過去場所一覧:
/archives - 力士一覧:
/rikishi - 力士プロフィール:
/rikishi/{id} - マイ力士:
/my-rikishi/ - プライバシーポリシー:
/privacy/ - 力士比較:
/compare/?ids={id1},{id2} - 行司名鑑:
/gyoji/ - 行司プロフィール:
/gyoji/{id}/ - 呼出名鑑:
/yobidashi/ - 呼出プロフィール:
/yobidashi/{id}/ - 番付:
/{YYYYMM}-banzuke/ - 結果ハブ:
/{YYYYMM}-torikumi - 予定ハブ:
/{YYYYMM}-yotei - 日別結果:
/{YYYYMMDD}-torikumi - 日別予定:
/{YYYYMMDD}-yotei - 決まり手:
/kimarite - 場所ステータス分析:
/analytics/
- ホーム:
- 現行ルート例:
/202611-banzuke//202611-torikumi//20261108-yotei//compare/?ids=3842,4227/kimarite
- 読みもの:
https://blog.osada.us/ /202609-o-sumo/などの対応済み旧番付 URL は、同じ場所の月別番付を表示します。/archives/cat11/などの廃止済み URL は HTTP 410 を返します。- 公開 API:
/api/v1/banzuke.json/api/v1/torikumi.json/api/v1/rikishi.json/api/v1/rikishi/{id}.json/api/v1/rikishi-matchups.json/api/v1/gyoji.json/api/v1/gyoji/{id}.json/api/v1/yobidashi.json/api/v1/yobidashi/{id}.json/api/v1/news.json/api/v1/blog.json
関連ドキュメント:
docs/api/v1.mddocs/api/policy.mddocs/api/changelog.mdDEVELOPMENT.md
Skill 公開:
SKILLS.mdpublic/.well-known/agent-skills/osumo-content/SKILL.mdpublic/.well-known/agent-skills/osumo-discovery/SKILL.mdskills/osumo-api/SKILL.md
AIエージェントから利用する
AIエージェント向け利用ガイドから、クライアント別の導入手順とJSON API仕様を参照できます。公開 JSON API、公開スキル、相撲データ用 MCP は、o-sumo のアカウントや API キーなしで利用できます。
検索と回答生成時の参照を許可し、モデル学習は許可しません(search=yes, ai-input=yes, ai-train=no)。
| 目的 | 入口 |
|---|---|
| APIを見つける | 公開JSON APIの案内 |
| 番付・取組・力士データをツールで取得する | 相撲データ用MCP連携キット |
| 記事やプロフィールを自然言語で探す | AI Search MCPの案内 |
| 取得方法・ページURLを調べる | Agent Skillsの案内 |
| 認証方針を確認する | 利用条件と認証方針 |
| 対応範囲・運用を確認する | エージェント向けガイド |
上の表は人が読むための案内ページです。機械向けのURLは案内ページに記載しています。
torikumi.json の bashoId は通し番号です。月は pathDate の先頭6桁から求め、
予定・結果は各配列の status と更新時刻を確認してください。
ホーム・主要一覧・月別ページと、公開データに存在する日別予定/結果は
Accept: text/markdown で取得できます。個別人物ページなど未対応ルートはHTMLを返します。
相撲データ用 MCP は Streamable HTTP(https://osada.us/mcp)の読み取り専用サーバーで、search_rikishi、
get_rikishi_profile、get_banzuke、get_torikumi、list_basho を提供します。
クライアント別の導入手順で、接続方法と開発者向け設定例を確認できます。
AI Search MCP は自然言語検索用の search ツールを提供します。
curl -fsS https://osada.us/.well-known/agent-skills/index.json
curl -fsS https://osada.us/mcp/server-card
curl -fsS https://osada.us/api/v1/torikumi.json
curl -i -H 'Accept: text/markdown' https://osada.us/20261108-yotei/
対応ブラウザーでは別途 WebMCP の4ツール(search_rikishi、list_basho、
get_banzuke_for_month、get_torikumi_for_day)をページ内で登録します。これは上記の
リモート MCP エンドポイントとは別の仕組みです。A2A カードは発見用で、タスク操作は未実装です。
主な機能
- ホームから
番付 / 取組予定 / 結果 / 力士・行司・呼出名鑑 / マイ力士 / 力士比較 / 場所ステータス分析に直接遷移 - 今日のみどころ(注目取組ピックアップ):
- トップページの Hero 直下に、当日の注目取組(1〜2番)をピックアップして表示
- 東西力士の対戦カード、番付、アバター、合口(直接対戦成績・勝率比率メーター)、みどころ解説文、および力士比較ページへのワンタップ導線を提供
- 公式取組データが存在する日は当日の幕内結びから自動生成。手書きの固定対戦・固定解説・固定 head-to-head レコードは廃止
- 公式取組が未発表の日は「今日のみどころ / 公式取組発表待ち / 公式取組の発表後に、注目取組・合口・比較への導線を掲載します。」のみを中立で表示し、力士名・記事・合口・比較・取組リンク・一言物申すは一切出さない
- 合口は
/api/v1/rikishi-matchups.json(公式プロフィール履歴から事前集計された JSON)からのみ取得し、取得成功時だけ表示。失敗時は合口を隠して比較・取組リンクは維持
- 力士比較の全面刷新 (
/compare/?ids={id1},{id2}):- 相撲ファン注目の「合口(直接対戦成績・相性)」を主役に据えたスコアボード(スコア、勝率、勝ち越しバッジ、ツートンメーターバー)
- 東 vs 西のグラフィカルな対決カード(番付・アバター・今場所成績)
- 身長・体重・通算勝率の左右ビジュアル比較バー & 体格差ハイライト
- 本場所アーカイブから自動集計した得意決まり手(勝ち技ランキング)の並列比較
- 注目対戦(横綱・大関・関脇対決等)やマイ力士ペアからのワンタップクイック選択
- 日本相撲協会公式サイトを出典とする現役行司42名・呼出45名の一覧と個別プロフィールを日英表示。公式数値IDをURLとJSON APIに使用し、写真は掲載しません
- 番付ページで幕内・十両の番付と成績を表示し、MiniMax I2I Generation で加工した力士プロフィール画像とあわせて力士プロフィールへ遷移
- マイ力士 (
/my-rikishi/) で最大10名まで四股名を登録し、ナビゲーション件数バッジ表示、URL 同期・localStorage永続化・Google ログインによるクラウド同期で端末をまたいで保持。日別取組ページの「推しだけ表示」は端末に設定を保存し、対象の取組をXで共有できます - 場所ステータス分析 (
/analytics/) で幕内優勝・三賞・十両優勝を一覧表示 - 各ページの URL を
ShareCurrentLinkボタンでクリップボードへコピー(手動フォールバック付き) - 月別ハブで 15 日分の日別ページを一覧表示
- 日別ページで幕内・十両の取組を表示し、取組力士名からプロフィールへ遷移
- 番付・月別ハブ・日別ページで
昇順 / 降順を切り替え可能 - 未更新日は
pendingとして URL を先出しし、空状態メッセージを表示 - 月キーは
app/lib/torikumi-data.tsの生成データから動的に決まります - ホームの 最新ニュース セクションで日本相撲協会のお知らせと相撲界ニュース(dmenu スポーツから最新 5 件)を 2 つのサブセクションに分けて表示
- ホームの 決まり手 カードから全 82 手の索引ページ
/kimariteへ遷移し、カテゴリ別の目次と並んで技の和英解説を閲覧可能 - ニュース JSON は GitHub Actions の
news-feed-updateワークフローから Python スクレイパで自動生成(/api/v1/news.json) - 「読みもの」は
blog/posts/*.mdで管理する日本語の静的ブログです。blog.osada.us用の配信物はnpm run blog:buildでdist-blog/に生成し、トップページ連携用の/api/v1/blog.jsonも同時に更新します - AI エージェント対応ブラウザー向けに WebMCP 4 ツール (
search_rikishi/list_basho/get_banzuke_for_month/get_torikumi_for_day) を公開 (document.modelContext.registerToolを優先、navigator.modelContext.registerToolにフォールバック)
技術スタック
- フロントエンド: React 19, TypeScript, React Router, Vite
- テスト: Vitest, Testing Library, jsdom
- データ生成: Python (
scripts/update_sumo_data.py,scripts/update_official_profiles.py) - 配信: Cloudflare Pages
- データ取得元: 日本相撲協会の Ajax エンドポイント、および行司・呼出の公式会員一覧/プロフィールページ
- 力士画像: 日本相撲協会プロフィール写真をベースに MiniMax I2I Generation で加工したローカル PNG
- ニュース取得元: 日本相撲協会のお知らせページと dmenu スポーツ (
https://sumo.sports.smt.docomo.ne.jp/news/)
ローカル開発
前提:
- Node.js 20.19 以上、または 22.12 以上
- npm 9 以上
- Python 3.10 以上
セットアップ:
git clone https://github.com/dai/o-sumo.git
cd o-sumo
npm install
補足:
package-lock.jsonは commit します- 初回セットアップは
npm install - 再現性重視の再構築や CI は
npm ci
主要コマンド:
# 開発サーバー
npm run dev
# 型チェック
npm run typecheck
# テスト
npm test
# 本番ビルド
npm run build
# 現行データ切替の読み取り専用事前確認
npm run preflight:current-data
# ビルド結果のローカル確認
npm run preview
# 読みものの配信物を生成
npm run blog:generate
ローカル確認先:
http://localhost:3001/http://localhost:3001/archiveshttp://localhost:3001/rikishihttp://localhost:3001/rikishi/{id}http://localhost:3001/my-rikishi/http://localhost:3001/compare/?ids={id1},{id2}http://localhost:3001/gyoji/http://localhost:3001/gyoji/{id}/http://localhost:3001/yobidashi/http://localhost:3001/yobidashi/{id}/http://localhost:3001/{YYYYMM}-banzuke/http://localhost:3001/{YYYYMM}-torikumihttp://localhost:3001/{YYYYMM}-yoteihttp://localhost:3001/{YYYYMMDD}-torikumihttp://localhost:3001/{YYYYMMDD}-yoteihttp://localhost:3001/kimaritehttp://localhost:3001/analytics/http://localhost:3001/api/v1/rikishi-matchups.jsonhttp://localhost:3001/api/v1/news.json
データ更新
フル更新(番付 + 取組 + 力士プロファイル):
python scripts/update_sumo_data.py
力士プロファイルのみを更新:
python scripts/update_sumo_data.py --rikishi-only
この全件更新ではプロフィール詳細に加え、改名前後の四股名を公式力士IDへ統合した rikishi-matchups.json も生成します。全対象の取得・ID解決・相互整合が完了した場合だけ置き換え、部分取得や解析失敗時は正常な既存ファイルを保持します。公開前の確認手順は docs/rikishi-profile-refresh-runbook.md を参照してください。
力士プロファイル取得を最初の10人に限定(テスト用):
python scripts/update_sumo_data.py --rikishi-only --profile-limit 10
取組だけを更新:
python scripts/update_sumo_data.py --torikumi-only
結果のみ / 予定のみを更新:
python scripts/update_sumo_data.py --torikumi-scope result
python scripts/update_sumo_data.py --torikumi-scope schedule
取組だけを対象に結果または予定だけを更新:
python scripts/update_sumo_data.py --torikumi-only --torikumi-scope result
python scripts/update_sumo_data.py --torikumi-only --torikumi-scope schedule
ニュースフィードだけを更新(日本相撲協会お知らせ + dmenu スポーツ):
python scripts/update_news_feed.py
行司・呼出名鑑だけを日本相撲協会公式サイトから更新:
python scripts/update_official_profiles.py
python scripts/update_official_profiles_test.py
生成内容と公開前の整合確認は docs/official-profile-refresh-runbook.md を参照してください。
九月場所は確定済みで、app/lib/september2026-data.ts と app/lib/september2026-banzuke-data.ts に不変スナップショットを保持しています。現在の /api/v1/banzuke.json と /api/v1/torikumi.json は十一月場所を返し、九月場所はアーカイブとして参照できます。
場所切替前の確認は npm run preflight:current-data で実行します。公式年間日程と公式番付を取得し、現行の番付・取組、archive、ルート、sitemap、workflow の整合性を読み取り専用で検査します。今回の十一月場所切替では --current-month 202609 --target-month 202611 を使用しました。すべてのゲートが [OK] のときだけ READY(exit code 0)、公式公開前・取得失敗・不整合がある場合は BLOCKED(exit code 1)になります。生成器は実行せず、データ・ルート・sitemap・redirect・workflow は変更しません。
別の月を確認するときは npm run preflight:current-data -- --current-month YYYYMM --target-month YYYYMM のように npm 経由で -- 以降に引数を渡してください(npm 8.x 以降)。あるいは python scripts/preflight_current_basho.py --current-month YYYYMM --target-month YYYYMM を直接呼び出すこともできます。npm script は固定の既定値のままなので、次回以降の切替時は月引数を毎回指定してください。
次の場所への切替では、現行の十一月場所データと九月場所の不変スナップショットを変更せず、banzuke.json と torikumi.json を新しい場所の確定データへ同時に切り替えます。切替前には、番付・取組・公開JSON・月別ルート・sitemapの整合性を検証します。
生成・更新対象:
app/lib/sumo-data.tsapp/lib/torikumi-data.tspublic/api/v1/banzuke.jsonpublic/api/v1/torikumi.jsonpublic/api/v1/rikishi.jsonpublic/api/v1/rikishi/{id}.json(全力士分、name/yomi/currentRank/sourceUrl/updatedAtを含む)public/api/v1/rikishi-matchups.json(公式プロフィール履歴から生成した一意なIDペアと双方の勝数)public/api/v1/news.json(日本相撲協会お知らせ 3 件 + dmenu スポーツ最新 5 件)public/api/v1/gyoji.json/public/api/v1/gyoji/{id}.json(行司42名)public/api/v1/yobidashi.json/public/api/v1/yobidashi/{id}.json(呼出45名)public/images/rikishi/{id}.png(全力士分の加工済みプロフィールイラスト、個別ページと番付ページで恒久的に使用)
主な検証内容:
- 幕内 42 人
- 十両 28 人
- 結果 / 予定アーカイブを 15 日分生成
- 公開済み日は取得済みデータで埋める
- 未更新日は
pendingのプレースホルダーとして残す - 行司42名・呼出45名の一覧と個別JSONが一致し、画像フィールドを含まない
自動更新
GitHub Actions では取組予定、取組結果、ニュースを別々に取得します。いずれも共通の data-update.yml で検証し、差分を main に直接公開します。
共通スクリプト:
scripts/ci/run_torikumi_generator.sh— 最大 2 回リトライでupdate_sumo_data.pyを実行scripts/ci/validate_torikumi.py—public/api/v1/torikumi.jsonの構造検証scripts/ci/validate_news.py—public/api/v1/news.jsonの構造検証
ワークフロー一覧:
- 日次更新:
.github/workflows/daily-data-update.yml- 現在のトリガー:
workflow_dispatch - 実行内容: 取組予定のみ更新(
--torikumi-only --torikumi-scope schedule) - 手動実行: GitHub Actions の
Run workflowまたはgh workflow run daily-data-update.yml -R dai/o-sumo --ref main
- 現在のトリガー:
- 結果更新:
.github/workflows/realtime-torikumi-direct-update.yml- 現在のトリガー:
workflow_dispatch - 実行内容: 取組結果のみ更新(
--torikumi-only --torikumi-scope result --skip-rikishi-fetch --strict-torikumi-fetch) - 手動実行: GitHub Actions の
Run workflowまたはgh workflow run realtime-torikumi-direct-update.yml -R dai/o-sumo --ref main - ログ: GitHub Actions の Job Summary に step result / committed / event / run URL を集約
- 現在のトリガー:
- ニュース更新:
.github/workflows/news-feed-update.yml- 実行時刻: JST 09:05・19:05 の1日2回(公開は19:05の実行時)
- 実行内容: 日本相撲協会お知らせ + dmenu スポーツを更新(
python scripts/update_news_feed.py) - 公開対象に差分がなければ
news.jsonは更新しない - 取得状態は
automation/news-stateに保持し、公開対象として選んだ検証済みスナップショットをmainにコミットします。
テスト
- test runner: Vitest
- component test: Testing Library
- workflow:
.github/workflows/test.yml
現在の主な対象:
app/lib/torikumi-routes.tsのルーティング helperapp/lib/sorting.tsの並び替え helperapp/lib/kimarite-data.tsの 82 手マスタ- ホームの主要導線
- ホームのニュースセクション(相撲協会 / 相撲界ニュース 2 セクション・空状態・see-all リンク)
- 番付ページのソート
- 月別ハブの 15 日表示とソート
- 日別取組ページのソートと未更新表示
- 行司・呼出の一覧/詳細、日英階級、公式数値ID、APIパス、動的メタデータ、sitemap
- マイ力士のトグル/一覧/IME 入力補正と URL 同期
- 力士比較(2名固定)の4種類検索、URL同期、指定7項目、列順に応じた合い口表示
- 場所ステータス分析 (
/analytics/) の幕内・三賞・十両結果 WebMcpProviderの 4 ツール登録 (document.modelContext.registerTool/navigator.modelContext.registerTool)
GitHub Actions では PR と main / codex/** / automation/data-updates への push で以下を実行します。
npm cinpm run typechecknpm testnpm run build
Cloudflare Pages
- 本番 URL:
https://osada.us - SPA fallback:
public/_redirects(アプリルートのみ。/api/v1/*は静的 JSON をそのまま配信) - 日付ベースの URL を直接開いても
index.htmlにフォールバックします
令和八年十一月場所の更新運用
- 十一月の current API は切替済みです。九月の TypeScript snapshot は不変 archive として維持します。
- 取組予定・結果のワークフローは現在、手動実行です。
mainで定期実行を有効にする手順は場所中の定期実行手順を参照してください。GitHub Actions の実行が遅れたり、スキップされたりする場合があります。 - 11月6日ごろの公式取組発表後、
gh workflow run daily-data-update.yml -R dai/o-sumo --ref mainを手動実行し、実行結果、公開コミット、mainの JSON、本番 JSON を順に確認します。公式発表前に両部門が空の場合は、公開データを更新せずに終了します。 - 場所中に定期実行を有効にした場合は、11月22日の最終結果と翌日の確認後に、別 PR で両方の cron を削除します。ワークフローのサマリーに加え、公開コミットと本番反映を確認します。
preflight:current-dataは workflow 停止中に行う場所切替専用の安全 gate で、場所中の readiness check ではありません。不戦は validator の限定的例外で、取得の部分失敗時は旧データを保持します。- ニュース更新だけは JST 09:05・19:05 の1日2回に継続します。
- CLI では
gh workflow run daily-data-update.yml -R dai/o-sumo --ref main/gh workflow run realtime-torikumi-direct-update.yml -R dai/o-sumo --ref main/gh workflow run news-feed-update.yml -R dai/o-sumo --ref mainを使えます。 - 結果更新 workflow は
--torikumi-only --torikumi-scope result --skip-rikishi-fetchを使い、取組結果に限定します。 - 「結果未更新」を確認した場合は、
run履歴→runログ(event.schedule, JST, updatedAt系)→供給元 judgeの順で切り分けます。 - Cloudflare の従量抑制のため、
public/_headersでキャッシュ方針を固定します。 /assets/*:public, max-age=31536000, immutable/manifest.webmanifest:public, max-age=3600/sw.js:public, max-age=0, must-revalidate/:public, max-age=300- PWA の Service Worker 更新は
registerType: "autoUpdate"で運用し、更新を自動反映します。
主要ファイル
app/main.tsx: ルーティング定義app/page.tsx: ホームapp/archives/page.tsx: 過去場所一覧ページapp/banzuke/page.tsx: 番付ページapp/kimarite/page.tsx: 全 82 手一覧ページapp/officials/page.tsx: 行司・呼出の一覧/個別プロフィールapp/torikumi/page.tsx: 取組結果 / 取組予定の月別ハブapp/analytics/page.tsx: 場所ステータス分析ページapp/rikishi/MyRikishiPage.tsx: マイ力士ページapp/rikishi/CompareRikishiPage.tsx: 力士比較ページapp/components/TorikumiDayPage.tsx: 日別の結果 / 予定ページapp/components/BanzukeTable.tsx: 番付テーブルコンポーネントapp/components/MyRikishiToggle.tsx: マイ力士登録トグルapp/components/ShareCurrentLink.tsx: 現在の URL をクリップボードへコピーapp/components/NewsSection.tsx: ホームのニュースセクション(相撲協会 + 相撲界ニュースの 2 セクション)app/components/GreetingSection.tsx: ホームの「編集者より」最新記事カード (h3、getLatestBlogPost()利用、MonomosuSection内にネスト)app/components/MonomosuSection.tsx: ホームの「物申す」独立セクション (visible h2 + 座布団リアクション + textarea drawer + 内包GreetingSection)app/components/KimariteCard.tsx: ホームの「決まり手」カードapp/components/WebMcpProvider.tsx: WebMCP ツール登録(document.modelContext.registerTool優先)app/components/PrimaryNavigation.tsx: プライマリーナビゲーションapp/lib/archives-data.ts: 過去場所データapp/lib/torikumi-routes.ts: 月キー付き URL とナビゲーション解決app/lib/sumo-data.ts: 番付データ(力士型定義を含む)app/lib/torikumi-data.ts: 取組アーカイブデータapp/lib/news-data.ts: ニュースフィードの静的データapp/lib/kimarite-data.ts: 決まり手 82 手のマスタapp/lib/official-profile.ts: 行司・呼出の型、API取得、数値IDパスapp/lib/my-rikishi.ts: マイ力士の登録状態(localStorage 同期)app/lib/basho-status.ts: 場所ステータス(live / upcoming / final)判定app/lib/webmcp.ts: WebMCP ツール定義(4 ツール)app/lib/july2026-data.ts: 七月場所(名古屋)不変スナップショットapp/lib/july2026-banzuke-data.ts: 七月場所番付不変スナップショットapp/lib/september2026-data.ts: 九月場所(秋)不変スナップショットapp/lib/september2026-banzuke-data.ts: 九月場所番付不変スナップショットapp/lib/archive-basho-data.ts: 過去場所・現行場所の集約データapp/lib/blog-build.ts: 読みものの静的HTML・RSS・sitemap生成app/lib/agent-skills.ts: Agent Skills Index メタデータfunctions/mcp/[[path]].ts: Streamable HTTP MCP サーバーエンドポイントmcp/: 各種 AI エージェント・クライアント向け MCP 連携キットscripts/update_sumo_data.py: 番付・取組・力士プロファイル生成スクリプトscripts/update_news_feed.py: ニュースフィード生成スクリプトscripts/update_official_profiles.py: 行司・呼出データ生成スクリプトscripts/build_blog.ts: 読みもの配信物とblog.jsonの生成スクリプト
連絡先
ライセンス
MIT
ダウンロード
No installation packages available.