尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證議会の審議内容をAIで要約・構造化し、スレッド形式で届けるオープンソース公共メディア / Open-source public media that restructures parliamentary proceedings with AI
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗open-gikai.net | 🇯🇵 日本語版はこちら / Japanese
OpenGIKAI (議会) is an open-source public media project that transforms Japanese parliamentary proceedings into a modern, accessible thread format — like social media, but with official sources. It ingests multiple sources including Diet records (NDL), Prime Minister press conferences (kantei.go.jp), and government council meeting minutes (審議会).
Parliamentary records are public but hard to read. OpenGIKAI makes them accessible without editorializing — every summary links back to the original transcript. The AI prompts and processing logic are fully open-source to ensure transparency and political neutrality.
| Layer | Technology |
|---|---|
| Frontend | Next.js 16 (App Router), TypeScript, Tailwind CSS |
| Deployment | Vercel — two projects from one repo: SSG frontend at the root, dynamic MCP server at apps/mcp/ |
| Data Pipeline | Python + Claude API (Message Batches API + prompt caching) |
| Data Sources | NDL Diet Records API, kantei.go.jp, cao.go.jp councils |
| Public API | Read-only MCP server for Claude Desktop / Cline / custom agents |
# Clone the repository
git clone https://github.com/wharfe/open-gikai.git
cd open-gikai
# Install frontend dependencies
npm install
# Start the frontend dev server
npm run dev
The MCP server is a separate Next.js project under apps/mcp/ with its own dependencies:
cd apps/mcp
npm install
npm run dev # serves on http://localhost:3100
See apps/mcp/README.md for MCP deployment details.
├── src/ # Frontend (Next.js SSG — output: "export")
│ ├── app/ # App Router pages
│ ├── components/ # React components
│ ├── lib/ # Utilities and data fetching
│ └── types/ # TypeScript type definitions
├── apps/
│ └── mcp/ # MCP server (separate Vercel project, dynamic Node runtime)
├── scripts/ # Python batch processing
│ ├── sources/ # Source adapters (NDL, kantei, council, …)
│ └── pipeline/ # AI pipeline (grouping, summarization, news ranker)
├── data/ # Generated JSON consumed by both frontend SSG and MCP server
│ ├── threads/ # Per-date thread files
│ └── members.json # Accumulated Diet member registry
├── public/ # Static assets (incl. sitemap, RSS feed)
└── .github/workflows/ # daily-batch.yml (6:00 AM JST cron)
The frontend uses output: "export", so anything requiring a Node runtime (Route Handlers, dynamic APIs) lives under apps/.
Sources (NDL, kantei, council)
├─► fetch (sliding 30-day window per run)
│
├─► group by topic ┐
├─► classify tension │ Claude API
├─► summarize at 3 levels (Batches) │ + prompt caching
├─► extract commitments / outcomes ┘
│
├─► enrich with related news (Bing News + Claude relevance ranker)
│
└─► generate JSON
├─► frontend SSG → open-gikai.net (Vercel)
└─► MCP server → /api/mcp (Vercel, apps/mcp)
scripts/pipeline/news_ranker.py) picks the most-relevant 3 articles from the candidate pool. Auxiliary information layer — see CLAUDE.md "Summary Layer Invariants" for the boundary.data/threads/*.json and data/members.json are consumed by the Next.js SSG to produce static HTML pages.apps/mcp (dynamic MCP server).(+N threads) in the message; the workflow emits a CI warning when 7+ consecutive runs add 0 threads (catches fetcher regressions that the green checkmark alone wouldn't). A hard job failure (e.g. NDL API 403 from a datacenter IP, Anthropic credit exhaustion) opens or updates a pipeline-failure GitHub Issue so it surfaces without polling gh run list.
input_hash) are persisted to a committed sidecar at data/pending-batches/{date}.json and resumed on the next run, which re-fetches raw, verifies the hash, and assembles without re-grouping. A batch stuck in-flight for >2 days opens/updates the same pipeline-failure Issue. When a resume cannot finish, the reason decides what happens next: a batch-side failure is resubmitted, a missing local file is simply held for a later run, and a failure that is deterministic given today's inputs (a changed hash, an exhausted retry budget) is held for a person — never resubmitted, never charged again. All of them red the run and none of them block the day's publish; only a date whose batch has aged past recovery is reported as a permanent loss.# 1. Fetch speeches across a sliding window (30 days catches retroactive NDL uploads)
python scripts/fetch_ndl.py --lookback-days 30
python scripts/fetch_kantei.py --lookback-days 30
python scripts/fetch_council.py --lookback-days 30 --council kisei
# (... repeat per council, see daily-batch.yml for the full list)
# 2. Summarize via Message Batches API (auto-resumes against existing data/threads/)
# Requires ANTHROPIC_API_KEY in .env.
python scripts/summarize.py --date 2026-04-22 --batch
# 3. Enrich with news, filtered through Claude relevance ranker
python scripts/enrich-news.py --date 2026-04-22 --rank-with-claude
# 4. Generate sitemaps, feeds, and validation; build the SSG
node scripts/validate-data.mjs --fix
node scripts/generate-feeds.js
node scripts/generate-sitemap.mjs
npm run build && npx serve out
See .env.example for configuration. The daily batch workflow at .github/workflows/daily-batch.yml runs all of these in sequence at 6:00 JST.
OpenGIKAI exposes its dataset as a read-only Model Context Protocol server so Claude Desktop, Cline, or any MCP-capable agent can query Diet discussions directly.
| Tool | Purpose |
|---|---|
search_threads | Find threads by keyword, date range, committee, or source |
get_thread | Fetch a full thread with 3-level summaries, original quotes, tension classifications, and outcomes |
get_member | Diet member profile |
list_members | Paginate members, filter by name/party |
list_dates | Index of dates with available threads |
The server lives in apps/mcp/ and is deployed as a second Vercel project from the same repository. OpenGIKAI does NOT pay for LLM inference — the MCP client (Claude Desktop, etc.) calls Claude with its own API key, and the server only returns JSON. See apps/mcp/README.md for the endpoint URL and Claude Desktop configuration snippet.
CLAUDE.md for the non-negotiable rules (stateless, deterministic, prompt-only) and the boundary between the summary layer and auxiliary layers (news enrichment, MCP server) where LLM/agent patterns are allowed.attribution block making this explicit for downstream agents.Diet records are sourced from the National Diet Library's Diet Records Search System. These records are not subject to copyright under Japan's Copyright Act, Article 13. Press conference transcripts are sourced from kantei.go.jp. Government council meeting minutes (審議会) are sourced from cao.go.jp and other ministry websites.
AI-generated summaries are clearly attributed as such. Related news articles are linked from Bing News RSS; only URLs, source names, publication dates, and OGP preview images are displayed — no article content is reproduced.
See CONTRIBUTING.md for guidelines.