NicheDB について
NicheDBは、増え続ける公開データのコレクションを収集・提供するオープンプラットフォームです。定期的なデータソースから検索可能なフィードを作る用途に向き、アダプターを通じてデータを集め、Web、RSS、JSON、API、コマンドライン、MCPで提供します。
主な機能
- 01公開データソース用アダプター
- 02コレクションと保存済みクエリのフィード
- 03Web、RSS、JSON Feed、APIアクセス
- 04プッシュ、メール、署名付きWebhook通知
- 05コマンドラインとMCPアクセス
- 06PostgresとRedisによるセルフホスト
活用シーン
- 01公開レジストリの新着情報を追跡する
- 02政府文書や研究データのフィードを作る
- 03保存済みクエリの変更を追う
- 04収集データをアプリやエージェントに提供する
MCP 対応
NicheDBは、収集済みデータやフィードにアクセスするMCPツールを提供します。プロフィールコレクションでは、update_profile MCPツールによるプロフィール更新にも対応します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://nichedb.dev/mcpclaude mcp add --transport http dev-nichedb-nichedb https://nichedb.dev/mcp{"mcpServers":{"dev-nichedb-nichedb":{"type":"http","url":"https://nichedb.dev/mcp"}}}Cursor で開く{"servers":{"dev-nichedb-nichedb":{"type":"http","url":"https://nichedb.dev/mcp"}}}VS Code で開く{"mcpServers":{"dev-nichedb-nichedb":{"type":"http","url":"https://nichedb.dev/mcp"}}}{"mcpServers":{"dev-nichedb-nichedb":{"serverUrl":"https://nichedb.dev/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
27このツールにパラメーターはありません。
詳細
NicheDB
データソースを取り込み、フィードとして配信します。 増え続けるデータベースのためのオープンプラットフォームです。ゲームのリリース情報、パッケージレジストリ、政府への提出書類など、初期データが豊富で日々増えていくあらゆる公開データに対応します。Postgres と Redis をそれぞれ 1 つずつ使い、すべての行に Web、RSS、JSON、API、CLI、MCP からアクセスできます。
最初のデプロイ先は nichedb.dev です。Postgres と Redis が使える環境なら、どこでも独自のインスタンスを実行できます。
モデル
| 項目 | 内容 |
|---|---|
| コレクション | games、packages、filings などのニッチです。 |
| ソース | 1 つの上流ソースを対象にしたアダプターです。それぞれ独自の頻度でデータを取得します。Steam の新着リリース一覧、npm の変更フィード、EDGAR の Form D 提出書類などがあります。 |
| アイテム | ソースが生成した 1 行分のデータです。タイトル、URL、日時(time_known と precision を含む)、タグ、および data 内のアダプターのペイロードを含みます。 |
| フィード | コレクションに対する保存済みクエリです。ページ、RSS および JSON Feed の表示形式、API エンドポイントを備え、プッシュ通知、メール、署名付き Webhook で変更を通知するフォロワーがいます。 |
アダプターはそれぞれ packages/adapters/src にある 1 つのファイルです。現在、46 のコレクションにわたって 161 個が提供されています。
| コレクション | アダプター | 必要なキー |
|---|---|---|
| ゲーム | steam、steam-news、igdb、igdb-catalog(IGDB が把握しているすべてのゲーム。ID 順に取得し、updated_at に基づいて最新状態を維持)、wikidata-games、steam-catalog | IGDB のみ(Twitch クライアント) |
| パッケージ | npm、pypi、crates、go-modules、huggingface、github-releases(ランタイムとフレームワーク、および NIST 独自のソフトウェア。usnistgov のものは github-releases-nist として収録) | 不要(GitHub トークンは任意) |
| 申請書類 | edgar、federal-register | 不要 |
| 法律 | courtlistener(Atom フィードから取得した最新の判決。すべての裁判所と各裁判所独自のフィードを交互に取得するか、1 つの裁判所を指定)、courtlistener-oral-arguments(ポッドキャスト。MP3 を含む)、courtlistener-api(訴訟記録、裁判官、財務開示。無料枠の1日125リクエスト以内で、実行ごとに1リクエスト)、courtlistener-catalog(四半期ごとの一括ダンプから取得した、すべての裁判所、学歴と所属政党を含む裁判官、報告内容が分かる財務開示、口頭弁論、判例集の引用をタグとして含む意見書クラスター、および FJC データベース。訴訟記録はオプトイン) | API ソースのみ COURTLISTENER_TOKEN が必要。フィードとダンプはキー不要で、パブリックドメインです |
| 音楽 | musicbrainz、musicbrainz-catalog、discogs-catalog | 不要 |
| 書籍 | openlibrary、gutenberg-catalog、librivox-catalog、openlibrary-catalog | 不要 |
| テーブルトップ | scryfall-sets、scryfall-cards | 不要 |
| 宇宙 | launch-library | 不要 |
| チェス | lichess-broadcasts | 不要 |
| アラート | usgs-earthquakes、gdacs | 不要 |
| 天気 | nws-alerts、nhc-cyclones、swpc-space-weather、eonet-events | 不要 |
| 障害情報 | statuspage(任意の Statuspage ホスト) | 不要 |
| 拡張機能 | firefox-addons、vscode-extensions | 不要 |
| ヘルスケア | openfda-recalls、clinical-trials | 不要 |
| 研究 | arxiv、crossref、openalex(トピックまたは検索ごとに新しい論文から取得。openalex-algorithms はシード済み)、nist-datasets(data.nist.gov 上のすべてのデータセットを最終改訂日順に取得)、nist-csrc-drafts(コメントを受け付けている NIST のセキュリティ草案。終了時には同じ場所で終了済みとしてマーク) | 不要 |
| 自動車 | fueleconomy-catalog、nhtsa-recalls、nhtsa-complaints、nhtsa-safety-ratings | 不要 |
| 市場 | iso-mic-exchanges、alpaca-corporate-actions、alpaca-news、alpaca-assets、equity-history、nasdaq-halts、ecb-fx-rates、sec-fundamentals | Alpaca(APCA_API_KEY_ID、APCA_API_SECRET_KEY、APCA_FEED は iex または sip)。SEC ではユーザーエージェントに CONTACT_EMAIL が必要です |
| 暗号資産 | coingecko-assets、crypto-pairs | キー不要(COINGECKO_API_KEY は任意。データセンターから Binance.US に接続する場合は CRYPTO_PROXY_URL が必要) |
| 犯罪 | socrata-crime、uk-police-crime、fbi-crime-estimates、police-updates(カリフォルニア州の警察フィード39件。ソースの対象範囲) | FBI のみ(無料の api.data.gov キーが必要) |
| 公的資金 | usaspending-awards、ocds-tenders、ted-notices | 不要 |
| 住宅 | uk-land-registry、freddie-mac-rates、building-permits、ruuster(エージェントが保存した検索) | 不要 |
| 求人 | bls-series、eurostat、warn-layoffs、agenticjobs | 不要 |
| 人口 | worldbank-population(世界銀行 WDI の全対象国、CC BY 4.0)、census-acs(ACS 5-year Summary File から取得した米国の全州・都市・ZIP コード、パブリックドメイン)、geonames-cities(その他の地域における人口15,000人以上の都市とその地域、CC BY 4.0)。/population でツリーを閲覧するか、/api/v1/population/{key} にアクセスしてください | 不要 |
| イベント | musicbrainz-events(MusicBrainz JSON ダンプから取得した約126,000件のコンサート、フェスティバル、ショー。役割ごとの出演者、座標付きの会場、日付と現地開始時刻、セットリスト、チケット販売および setlist.fm へのリンクを含む。CC0)、wikidata-festivals(ウェブサイト、開催地、ジャンル、MusicBrainz シリーズを含む、Wikidata 上のすべての音楽フェスティバル。CC0)。チケット価格はありません。Ticketmaster と SeatGeek の利用規約ではデータの保存が禁止されており、StubHub と Vivid Seats が提供しているのはアフィリエイトプログラムのみです | 不要 |
| ラジオ | radiobrowser(radio-browser.info の約67,000局のインターネットラジオ。うち60,000局が放送中。ストリームとホームページ、国、言語、ジャンル、コーデックとビットレート、最終ストリーム確認時刻、投票数と前日のリスナー数、判明している場合は座標を含む。無料で利用でき、毎日収集) | 不要 |
| AI インシデント | rogue-ai-incidents、rogue-ai-research、aiid-reports | 不要 |
| ニュース | newsfeed(ニュース編集部のフィード、および NIST の28件のトピック、イベント、ブログフィードを nist-news として収録)、gdelt、rssamplifier、brisk、news-channels | 不要 |
| ドメイン | ntld-totals、ntld-tlds、ntld-launches、ntld-changes | 不要 |
| ポッドキャスト | podcasts、p0dcasters、podcastindex-catalog | 不要 |
| 航空 | faa-nas-status、aviation-hazards、aviation-metar、ntsb-accidents、adsb-flights | 不要(NTSB では mdbtools と unzip が必要です。Dockerfile に含まれています) |
| 水 | nwps-river-gauges、coops-water-levels、drought-monitor、ndbc-buoys、nws-surf-zone | 不要 |
| 消費者金融 | cfpb-complaints、fdic-institutions、fdic-structure-changes | 不要 |
| お買い得情報 | slickdeals、dealnews、dealcatcher、bensbargains、reddit-deals | 不要 |
| スポーツ | espn-catalogue、espn-schedule、espn-live、espn-plays、livetennis、sportsdb-tv、sportsdb-leagues、sportsdb-teams、sportsdb-live、sportsdb-schedule | Live Tennis、TheSportsDB(SPORTSDB_API_KEY:共有キー 3 では、どのリストも1件しか返さず、ライブフィードもありません。購読者キーでは、リストからカタログを取得し、sportsdb-live と sportsdb-schedule が有効になります)。ESPN はキー不要です(クラウドから外部に接続する場合は SPORTS_PROXY_URL が必要) |
| 映像作品 | tmdb-releases、tvmaze-schedule、tvmaze-catalog(TVmaze が把握しているすべての番組。CC BY-SA。1回取得した後、/updates/shows から最新状態を維持)、anilist-airing、imdb-ratings、wikidata-films、kitsu-anime、thetvdb-catalog(TheTVDB の全シリーズ。THETVDB_API_KEY と帰属表示リンクが必要) | TMDB のみ |
| チャンネル | iptv-org-channels | 不要 |
| SaaS | saasrow、opensaas(まず nichedb.dev を取得。その後、/.well-known/opensaas.json を提供する任意のサービスを対象) | 不要 |
| マーケットプレイス | d0rz、bl0ggers | 不要 |
| AI メディア | aiornot | 不要 |
| フォーラム | tsbb | 不要 |
| クーポン | c0upons(c0upons.com が独自に取り込んだ情報。投稿コードと同サイトの r/couponcodes 掲載情報。deals からコピーした行は再読み込みされません) | 不要 |
| DHT | bittorrented-dht(成人向けコンテンツは除外) | bittorrented.com の Supabase URL と公開可能キー(BITTORRENTED_SUPABASE_URL、BITTORRENTED_SUPABASE_KEY)。これらがない場合は一時停止 |
| ホスティング | findhost、buyvps、vultr-plans、linode-types、scaleway-instances、ovh-vps、storefront(WHMCS、Blesta、WooCommerce の注文フォーム)、lowendbox、openserver、hetzner-plans、digitalocean-sizes、upcloud-plans | 最初の8つは不要(FindHost のデータは CC BY 4.0 です。FindHost と findhost.app のクレジットを表示してください。JavaScript のみのショップでは OBSCURA_MCP_URL は任意)。Hetzner(HETZNER_API_TOKEN)、DigitalOcean(DIGITALOCEAN_TOKEN)、UpCloud(UPCLOUD_USERNAME、UPCLOUD_PASSWORD)ではそれぞれ読み取り専用の認証情報が必要で、認証情報がない場合は一時停止 |
| 脅威 | openthreat(まず ThreatCrush を取得。その後、/.well-known/openthreat.json を提供する任意の報告機関を対象)、nvd(すべての CVE を15分ごとに lastModified 順で取得。「この製品は NVD API を使用していますが、NVD に推奨または認定されているものではありません」)、surbl(SURBL のリストをカタログとして収録し、指定したドメインを multi.surbl.org で検索。SURBL の利用ポリシーに基づく無料の DNS ルックアップ。リスト全体はフィードとしてのみ販売) | 不要(NVD_API_KEY は任意。指定するとレート制限が10倍になります) |
| プロフィール | openprofiles(まず p0dcasters と OutreachGraph の掲載情報を取得。その後、OpenProfile.md ファイルを公開している任意のアプリを対象)、sportarr-persons(Sportarr の11万件の名前のうち、Wikidata でスポーツを行う人物として登録されている人のみを保持し、ソーシャルアカウントも収録)、sportsdb-players、installmap-yc-people(MCP サーバーを運用する YC 企業を、アカウントと創業者を含む組織として収録) | 不要 |
出口(OpenSaaS)
nichedb は、独自の OpenSaaS ディスクリプターを /.well-known/opensaas.json で提供します。そこには、チェックアウトで販売されるプラン(前払いで、自動更新されるものはありません)と、ここで実際に利用できるアクションが記載されています。それぞれに、人が開くページと、エージェントが OpenAccess ベアラートークンを使って呼び出すエンドポイントがあります。subscribe(POST /api/v1/billing/subscribe。チェックアウトページを返して pending と応答)、cancel(POST /api/v1/billing/cancel。ワンクリックで即日解約され、返金はありません)、unsubscribe(ページは /settings。メールを送るフォローを解除します)、export(POST /api/v1/account/export。一度に 1 つの JSON ドキュメントをエクスポート)、delete(POST /api/v1/account/delete。アカウントのメールアドレス宛てに送られるリンクで確認し、即時に削除され、何も保持されません)。ページからも同じ手続きができます。ページは /account/billing、/account/export、/account/delete です。opensaas アダプターは、他のサービスのディスクリプターを saas コレクションに読み込みます。プランごとに 1 行が作成され、利用開始と終了の手順を示すサービス独自の steps と confirm が、各プランの横に表示されます。
人物(/c/profiles)
OpenProfile.md を提供するすべてのアプリから情報を集め、1 人につき 1 件のエントリーを作成します。openprofiles アダプターは各アプリの一覧(/api/openprofiles?since=…)をページ分割して取得し、一覧を提供したホストから各ドキュメントをすべて取得します。識別キー(Web URL、任意の Accounts URL、Email、DID)を共有するドキュメントを 1 つのプロフィールに統合します。名前が同じというだけで統合することはありません。ページの URL は /c/profiles/<slug>-<id>(ID が解決に使われ、名前は見た目上のものです。名前が間違っている場合は 301 リダイレクトされます)です。所有者がハンドルを取得した後は /c/profiles/<handle> になります。その隣にある …/openprofile.md がファイルで、text/markdown として CORS が開放されており、ページには <link rel="openprofile"> が設定されます。
本人は This is me からエントリーの所有権を申請できます(プロフィールに記載されたメールアドレス、または本人のサイトや番組からこのページへのリンクで証明します。管理者はメールアドレス宛てに申請できます)。ページ上のエディター、PUT /api/v1/profiles/<ref>(JSON オーバーレイまたは text/markdown ファイル全体)、nichedb profile edit、または update_profile MCP ツールから編集できます。セッション、API キー、または openprofile:edit を持つ OpenAccess トークンが必要です。所有者が記述した内容は、すべてのソースより優先され、再読み込み後も保持されるオーバーレイになります。none と記述されたセクションは削除されます。Broadcast セクションと Guest セクション(OpenBroadcast、OpenGuest)は、podcasters フィードと guests フィードの絞り込みに使われます。
ページには、Markdown から読み込まれる、OpenProfile 0.4 がデフォルトとして定める 3 つの識別フィールドが表示されます。Emoji(1 つの書記素、または OpenEmoji の :shortcode:)は名前の横に、Pronouns は記載どおりにハンドルの横に表示されます(記載がない場合は未指定とし、推測しません)。また、Web も表示されます(Website、Homepage、Site は同じキーとして読み込まれます)。API と MCP の応答では、それぞれ emoji、pronouns、web として返されます。所有者はエディター、PUT または update_profile の emoji/pronouns/web、あるいは nichedb profile edit <ref> --emoji … --pronouns … --web … で設定できます。
職業に関するファセットは、本人(またはアダプターがすでに読み取る公開ページ)が公開した情報のみを使用します。大文字と小文字を区別せずに、Title:(または Job Title:、Role:、Position:)の識別情報行と Company:(または Employer:)の行を読み取ります。Company: Acme (https://acme.com)、[Acme](https://acme.com)、acme.com、社名のみのいずれも認識され、Title: CEO at Acme は役職名と会社名の両方を抽出します。役職レベル(c-suite、vp、director、manager、senior、entry、またはなし)は、役職名のキーワードから判定されます。API と MCP の応答には title、company({name, domain})、seniority、facets が含まれます。コレクションの項目には title:<slug>、company:<domain>(ドメインがない場合は名前のスラッグ)、seniority:<level> のタグが付くため、?tags= で他のファセットと同様に絞り込めます。また、GET /api/v1/profiles(および search_profiles、nichedb profiles)では title、company、seniority、tags を指定できます。GET /api/v1/profiles?linkedin=<url>(find_profile_by_linkedin、nichedb profiles --linkedin)は、LinkedIn ページがどの公開プロフィールに属するかを返します。意図的にメールアドレスによる検索はありません。メールアドレスを持つ人なら誰でも、その持ち主が掲載されているかどうかを調べられてしまうためです。
| directory | outreachgraph | いいえ |
| sites | opensite | いいえ |
| algorithms | nist-dads(NIST のアルゴリズムおよびデータ構造辞典。各項目に定義と関連情報を掲載。パブリックドメイン)、wikidata-algorithms(Wikidata の全アルゴリズムおよびデータ構造。考案者、時期、計算量を掲載。CC0)、pwc-archive(Hugging Face にアーカイブされた Papers With Code の手法およびデータセットのカタログ。コールセンターのスパムは除外。CC BY-SA 4.0)、rosetta-code(各プログラミング課題と、それを解決する言語。GFDL)、thealgorithms(各リポジトリの DIRECTORY.md にある、言語別の The Algorithms の実装。MIT)。docs/algorithms.md | いいえ |
| models | modelsdev(models.dev にある、すべての AI モデルとその料金。MIT)。モデルごとではなく、プロバイダーの提供内容ごとに1行を掲載します。同じモデルを223のプロバイダーからさまざまな料金で利用できるためです。入力、出力、キャッシュ済みトークンの100万トークンあたりの料金、コンテキストと出力の上限、モダリティ、機能フラグを含み、件数は8,179です。さらに、メーカーが独自のページを公開しているモデルを1件ずつ掲載したラボカタログと、プロバイダー自体も含みます。openmodel(プロバイダー自身が /.well-known/openmodel.json に置いたファイル。記載されたオリジンから配信された場合にのみ有効とみなします。隣接する models.dev の行と同じ語彙を使用するため、1つのフィードで両方を取得できます)。docs/models.md | GLAMA_API_KEY が必要で、設定されていない場合は一時停止される glama-mcp を除き、キー不要(GITHUB_TOKEN を設定すると検索とエンリッチメントのレート制限が緩和されます) |
| mcp | mcp-registry(公式レジストリ。最新バージョンのサーバーごとに1行で、パッケージ、リモート、ステータスを掲載)、docker-mcp(Docker のカタログ。プル数、カテゴリ、ライセンス、各サーバーが公開するツールを掲載)、smithery(Smithery のプロキシ経由で各サーバーが実際に呼び出される頻度)、awesome-mcp(punkpeye、wong2、appcypher のリストと、プロトコルリポジトリのリファレンスサーバー)、aitmpl-mcps(すぐに使える設定)、github-mcp-topics(MCP のトピックが付いたリポジトリ。最新のプッシュ順)、installmap-yc-mcp(Installmap の CC BY クロールに基づく、サーバーを運用する Y Combinator 企業。エンドポイントを調査した OpenMCP レコードとして掲載し、各企業のアカウントと創業者も含みます。企業と創業者は installmap-yc-people を通じて、OpenProfiles として profiles にも追加されます)、glama-mcp(Glama のディレクトリを最後に処理し、他のソースにないサーバーのみを追加します。Glama が品質スコア3.5以上と評価し、リポジトリがリスト作成者の所有であるものに限るため、クローンのスパムは除外されます。ライセンス付きデータのため、Glama の各行に「MCP data from Glama」と Glama の掲載ページへのリンクを表示します)。URL で重複を排除し、最初にそのサーバーを掲載したソースのものを残します。docs/mcp-and-workflows.md | glama-mcp は GLAMA_API_KEY が必要で、設定されていない場合は一時停止。それ以外はキー不要(GITHUB_TOKEN を設定すると検索とエンリッチメントのレート制限が緩和されます) |
| workflows | reddit-workflows(r/ClaudeWorkflows のライブラリ。ワークフローごとに投稿を1件掲載し、投稿から評価、新しさ、レベル、カテゴリを抽出)、awesome-claude-code(リストの生成元である CSV から読み込むため、管理者が無効とマークした項目は除外)、aitmpl-components(設定バンドル、エージェントのループ、動作変更機能)、github-agent-topics(Claude Code、スキル、サブエージェントのトピックが付いたリポジトリ)。/workflows と /c/workflows で提供されます。docs/mcp-and-workflows.md | キー不要(上記のとおり、GITHUB_TOKEN は任意) |
| skills | aitmpl-skills(インストール数と各スキルをインストールするコマンドを含む890件のスキル)、awesome-claude-code-skills(厳選されたスキル)。/skills | いいえ |
| agents | aitmpl-agents(カテゴリ別の420件のサブエージェント)、awesome-agents(サブエージェントが同梱されるバンドルではなく、各サブエージェント名を記載したコミュニティのリスト。VoltAgent が初期データを提供)。/agents | いいえ |
| commands | aitmpl-commands(インストール数を含む290件のスラッシュコマンド)。/commands | いいえ |
| plugins | plugin-marketplaces(指定したリポジトリの .claude-plugin/marketplace.json で宣言されているすべてのプラグイン。公式リポジトリも含みます)。/plugins | いいえ |
| hooks | aitmpl-hooks(ツールの呼び出し、プロンプト、セッションの前後に実行される処理)。/hooks | いいえ |
モデレーター
ニッチにはモデレーターを置けます。コレクションの運営はせず、そこに追加する提案を審査する人です。サインイン済みのユーザーは誰でも /<niche>/moderate で申請できます(質問は3つです)。申請はロールが付いた申請として登録され、ほかの申請とともに /admin/knowledge に一覧表示され、承認するかどうかは管理者だけが決定します。承認されたモデレーターは、そのニッチのメンバーとなり、共有上限はゼロで、スコア行はありません。モデレーションをしても報酬は得られず、ランクを上がる段階にもなりません。1つのニッチに複数のモデレーターを置けます。モデレーターには、自分のニッチが提供するコレクションに絞り込まれた提案キューが /admin/submissions に表示され、そのコレクションにのみ承認できます。また、ナビゲーションに「キュー」リンクが表示されます。
サイト(/c/sites)
ページごとに1件のレコードを登録し、OpenSite の説明どおりに読み取ります。タイトル、カードに表示する説明文・画像・種類、キーとして使う正規のアドレス、作成者、フィード、そして og:、twitter:、JSON-LD タグをそのまま記録します。opensite アダプターは各自のサイトをトップページとサイトマップから巡回し、1回の実行につき100ページを読み取ります。その際、robots.txt と各サイト独自の /.well-known/opensite.json に従います。それ以外のアドレスは、誰かが /c/sites/add に貼り付けた時点で読み取られます。このページではすべてのタグと、X、Slack、iMessage、Discord、LinkedIn、WhatsApp で表示されるカードを確認できます。同じ読み取りは POST /api/v1/sites { "url" } でも実行でき、GET /api/v1/sites?url= は保存済みのレコードを返すか、1時間以上前のものであればページを読み取ります。貼り付けまたはアップロードした最大1万件のアドレス一覧は、同じページから、または JSON の urls かテキスト本文を指定した POST /api/v1/sites/bulk から、投稿者自身の情報源になります。ワーカーは1回の実行につき250ページを巡回し、実行間隔は1分です。進捗は /s/<slug> で確認できます。一覧を登録するとデプロイが定期的にフェッチするため、サインイン済みアカウントが必要です。ページの識別情報がクエリに含まれている場合があるため、ページのパスはクエリ文字列も含めて /c/sites/<host>/<path> となります。
歌詞(/lyrics)
Profullstack 自身のバンド(Þrøngva、Velocity Vibe、Meine Mutter)の歌詞です。nixamp ラジオサーバーが読み取りと書き込みを行います。エンドポイントは /lyrics、/lyrics/<artist>、/lyrics/<artist>/<title>、および GET/POST/DELETE /api/v1/lyrics です。掲載するのは自分たちの歌詞のみ(source は embedded、author、または transcribed)で、歌詞サイトからのインポートはありません。書き込みには lyrics 権限を持つキーが必要です(scripts/lyrics-key.js)。詳しくは docs/lyrics.md をご覧ください。
トップレベルドメイン(/tlds)
IANA のルートにあるすべてのラベルを毎日読み取り、ほかでは公開されていない変更ログに差分を記録します。各レジストラの1年分の登録、更新、移管、復旧の価格も併記しています。現在は Porkbun、Dynadot、Cloudflare、OVHcloud に対応しており、OpenTLD ファイルを提供するレジストラにも対応します。種類、更新価格帯、レジストラ、スクリプト、ステータス、レジストリで絞り込みでき、すべての列で並べ替えられます。更新価格を優先して表示し、2年目の価格が初年度の2倍以上になる更新時の落とし穴も、独立したフィルターで絞り込めます。/tlds/check は RDAP を通じて各レジストリに問い合わせ、ドメインが取得済みかを確認します。404 を「取得可能」と判定することはありません。同じデータは GET /api/v1/tlds(JSON または CSV)、MCP(search_tlds、get_tld、tld_changes、check_domain)、CLI(nichedb tlds、nichedb check)から利用できます。詳しくは docs/tlds.md をご覧ください。
自社サイトのアグリゲーター
運営するサイトのうち10サイトは、それぞれ独自の公開フィードまたは API を提供しており、ここでは他のリーダーと同様に、それらをキーなしで読み取ります。エンドポイントは 2026-09-12 にライブで確認したものです(c0upons は 2026-09-13)。スラッグはシードされたソースです。
| サイト | エンドポイント | コレクション | ソーススラッグ | 種類 |
|---|---|---|---|---|
| p0dcasters.com | /opml(すべての番組:フィード、サイト、タイトル) | podcasts | p0dcasters-shows | show |
| saasrow.com | /api/v1/products(オフセットページネーション、1ページあたり100件) | saas | saasrow-products | product |
| d0rz.com | /asks/rss.xml、/offers/rss.xml | marketplace | d0rz-marketplace | ask、offer |
| bl0ggers.com | /asks/rss.xml、/offers/rss.xml | marketplace | bl0ggers-marketplace | ask、offer |
| aiornot.vote | /rss.xml、/rss/featured.xml、/rss/trending.xml | ai-media | aiornot-media | submission |
| agenticjobs.work | /api/v1/jobs(オフセットページネーション、1ページあたり100件) | jobs | agenticjobs-postings | job |
| outreachgraph.com | /api/v1/public/directory(カーソルページネーション、1ページあたり200件。企業とサイトはドメイン単位、人物は自ら公開したもののみ) | directory | outreachgraph-directory | company、site、person |
| tsbb.dev | /api/v1/forums、続いてフォーラムごとに /f/{slug}/feed.xml | forums | tsbb-topics | post |
| c0upons.com | /api/coupons(オフセットページネーション、1ページあたり200件。店舗情報を結合。source: nichedb の行はスキップ) | coupons | c0upons-coupons | coupon |
| bittorrented.com | サイト独自の Supabase 上の PostgREST rpc/browse_dht_torrents。カーソルから日付順に取得し、1ページあたり500件(サイトには送信またはエクスポート用エンドポイントがありません) | dht | bittorrented-dht | torrent |
| c0ncerts.com | まだありません:/api/events は 501 "coming soon" を返し、/api/v1/events は 404 を返します | — | — | — |
saasrow の /api/v1/listings はアカウントごとのもので、キーが必要なため、公開されている製品ディレクトリのみを読み取ります。複数のフィードに掲載されている aiornot の投稿は、1回だけ保存し、各フィードのタグを付けます。tsbb のボード横断 /api/v1/latest ではトピックがどのフォーラムにあるか分からないため、フォーラムごとに巡回します。
Ruuster の住宅検索
ruuster-san-jose-homes は、Real Estate Experts / Talar Davoudi の保存済み検索を
1 時間ごとに読み取り、/f/san-jose-homes に取り込みます。この検索では、サンノゼの
一戸建て住宅のうち、ステータスが Active または Coming Soon、寝室数が 2 以上、
バスルーム数が 1 以上、床面積が 750 平方フィート以上、敷地面積が 4,500 平方フィート以上、
建築年が 2000 年以降の物件を対象とします。Ruuster では敷地面積フィルターを
lotSizeAcresMin と呼んでいますが、ここでは平方フィートを受け付けます。物件レコードでは
エーカーで返され、NicheDB は両方の単位を保持します。検索結果と寸法は上流の観測値であり、
MLS の値が矛盾していても、暗黙のうちに修正されることはありません。
別の ruuster ソースを作成するには、savedSearchUrl、pages(デフォルトは 20 ページで、
1 ページあたり 10 件)および currency(USD または CAD)を指定します。トラッキング用の
パラメーターは削除され、重複するステータスフィルターは統合されます。公開詳細リクエストでは、
写真、物件情報、MLS の出典情報が追加されます。シンジケートされた複製は、MLS のリスティング番号と住所で
結合されます。住所が非公開のレコードと削除済みのレコードは除外されます。ワーカーの詳細取得件数の上限と
期限が守られ、未完了のページにはカーソルが使われます。取得が完了した巡回は、次回の更新時に 1 ページ目から
開始します。
アイテムには、検索条件に一致していた間に最後に確認されたステータスが保持されます。物件が検索結果から 消えたことは、売却された証拠にはなりません。また、このソースは検索対象から外れた後の過去のリスティングを すべて再確認するわけではありません。
設定済みのデータベースに対して bun run ingest ruuster-san-jose-homes を実行するか、
データベースを使わずに bun scripts/scrape-ruuster.js > properties.json を実行してエクスポートします。
エクスポートでは、位置引数として保存済み検索 URL と、任意の新しい出力ファイル名も指定できます。Ruuster の
利用規約では書面による同意なしの自動アクセスが制限されており、IDX に関する通知では再利用が制限されています。
このアダプターを導入しても、再配布権が付与されるわけではありません:https://realestateexperts.ruuster.com/terms-of-service.
MusicBrainz のウェブサービスへのリクエストは、プロセス全体で共有されるキューを使用し、リクエスト間に
最低 1.1 秒の間隔を設けます。429 または 503 が返された場合は、5 秒、15 秒、45 秒のバックオフで最大 3 回再試行し、
HTTP 日付を含め、より長い Retry-After の値に従います。再試行のヒントが 0 でも、即時再試行は行われません。
このキューが対象とするのは 1 つのワーカープロセスです。複数のプロセスで送信元 IP を共有する環境では、
それらのプロセス間でも調整が必要です。
エンリッチメント
取り込み後、各アイテムには、適用されるエンリッチャー(packages/enrichers/src)によるエンリッチメントが行われ、その結果はアイテムの enrichment.<name> に保存されます。
| エンリッチャー | 追加する内容 | デフォルトで有効な対象 |
|---|---|---|
youtube | 人気動画(予告編、公式音源、ウェブキャスト)。Data API キーは任意です | ゲーム、音楽、テーブルトップ、宇宙、チェス、書籍 |
wikipedia | 記事のリード段落と画像 | ゲーム、音楽、書籍、宇宙、テーブルトップ、ホスティング |
github-repo | スター数、フォーク数、トピック、ライセンス、言語、最終プッシュ日時 | パッケージ、拡張機能、MCP、ワークフロー、スキル、エージェント、コマンド、プラグイン、フック |
npm-stats | 先週のダウンロード数 | パッケージ |
sec-company | 届出企業のティッカー、取引所、業種、州、ウェブサイト | 届出書類 |
company-ticker | ホスティングプロバイダーの上場企業:SEC の企業リストから取得したティッカーと CIK を名前で照合 | ホスティング |
developer | 公式 CLI とそのインストールコマンド(ベンダーのガイドから取得するか、Homebrew、npm、Terraform レジストリでドメインを照合)、API ドキュメント、Terraform プロバイダー、ステータスページ | ホスティング |
semantic-scholar | 要約、引用数、オープンアクセス PDF(キーは任意です) | 研究 |
openlibrary-work | 説明と主題 | 書籍 |
opengraph | ページ独自のプレビュー画像と説明 | ほとんどのコレクション |
tmdb-artwork | TMDB の情報がない状態で IMDb のダンプから取り込まれたタイトルのポスター、背景画像、あらすじ、評価、TMDB ID(TMDB_API_KEY) | 画面 |
corpusdata | data.corpusdata.articles が指定されている場合は、タイトル、本文、日付、エンティティのシグナルを使って NOW の記事と照合した結果。それ以外の場合は検索リンク | ニュース、研究、書籍、AI メディア、ホスティング、パッケージ |
フィードの enrichers リストで表示するエンリッチャーを選択します。指定がない場合は、そのコレクションのデフォルトが使われます。フィードビルダーではチェックボックスで選択できます。アイテムは一度だけエンリッチされ、新しい順に、各コレクションへ公平に割り当てられます(1 回の実行で ENRICH_PER_RUN 件、そのうち任意の 1 コレクションからは ENRICH_PER_COLLECTION 件)。エンリッチャーで見つかった情報を使って、画像、要約、タグの欠落を補います。ただし、常にソース独自の記述が優先されます。
実行する
git clone https://github.com/profullstack/niche-db && cd niche-db
bun install
docker compose up -d db redis # or point at your own Postgres 16+ and Redis
cp .env.example .env # DATABASE_URL, SITE_URL, CONTACT_EMAIL at minimum
bun run build:client
bun run dev # web + worker in one process on :3000
マイグレーションは起動時に自動で適用されます。すべてのコレクション、そのデフォルトソース、フィードは初回起動時にシードされます。デプロイ環境に必要な認証情報がなく、アダプターがそれを必要とするソースは、一時停止状態で作成されます。最初にサインインしたアカウントが管理者になります。
bun run ingest [slug ...] を実行すると、Redis を使わずにターミナルからソースを実行できます。bun test はプロセス内の Postgres(PGlite)を使ってテストスイートを実行するため、サーバーは不要です。
インターフェース
- ウェブ:PWA です。
/sourcesではソース(ステータス、最終実行、次回実行、今すぐ実行、一時停止、設定の編集)を管理できます。/feeds/newではライブプレビューを見ながらフィードを作成できます。/settingsではパスキー、API キー、通知を管理できます。 - RSS / JSON Feed:
/f/<slug>.rss、/f/<slug>.json。 - API:
/api/v1。/docs/apiにドキュメントがあります。読み取りにはキーは不要です。 - CLI:
curl -fsSL https://nichedb.dev/install.sh | sh(bun があれば bun、なければ Node 22 以降の npm を使用します。sudo は不要です)、またはnpm i -g @profullstack/nichedb→nichedb。/docs/cliにドキュメントがあります。 - MCP:
/mcp(Streamable HTTP、ステートレス)、または stdio 経由のnichedb mcp。/docs/mcpにドキュメントがあります。 - llms.txt:
/llms.txtにはデプロイ全体が 1 つのドキュメントにまとめられています。
アカウントと料金
マジックリンクとパスキーのみを使用し、パスワード用のカラムはありません。API キーは設定から発行でき、一度だけ表示されます。
無料のページとフィードには、CrawlProof の広告が1つとトラッカー(CRAWLPROOF_AD_SLOT、CRAWLPROOF_SITE_ID)が含まれます。これらを外すには、CoinPay を通じて次の2つのプランを購入できます。
- Premium — 1日1ドル、1か月30ドル、または1年300ドル(
/premium)。広告なし、トラッキングなし、メンバー向けラウンジ、アワードを贈るための月1,000クレジット、バッジ、6種類のテーマと5種類のアプリアイコン、新しいコレクションへの早期アクセス、1時間あたり30,000件の API リクエスト、無制限のフィード、独自のソース、従量課金制の車両照会が含まれます。/premiumには Reddit Premium との項目ごとの比較が掲載されています。GET /api/v1/premiumで同じ内容を JSON として取得できます。docs/premium.md をご覧ください。 - Pro — 1か月120ドル(
/pro)。Premium の全機能に加え、1時間あたり120,000件の API リクエストと、契約期間全体を対象とするクロールパス(GET /api/v1/crawl-pass)が含まれます。これにより、メンバー自身のエージェントがペイウォールを通過できます。
紹介リンクを利用すると、新規顧客は20%の割引を受けられ、紹介者には初回支払い額の60%が支払われます。
トレーニング用クローラー(GPTBot、ClaudeBot、CCBot、meta-externalagent など)には、x402 オファー付きの402応答が返され、/crawl でパスを購入できます。料金はすべてのコンテンツを対象に1日1ドルで、このサイトでの購入額が多いほど1日あたりの料金が安くなります(CRAWL_LOYALTY。デフォルトでは10ドル以上で20%、50ドル以上で40%、100ドル以上で60%の割引。売上ごとに crawl_sales に1行記録されます)。パスでは、?disable=ads,tracking を指定して、そのリクエストに限り広告またはトラッキングを無効にできます。一般ユーザー、検索エンジン、検索用クローラーには影響しません。
ナレッジインフルエンサー
ここにある各コレクションは、誰かが運営できるニッチ分野でもあります。ナレッジインフルエンサーとは、ある業界の実情を理解し、その業界向けのソフトウェア、データ、プロモーションを構築するエージェントを監督する人です。コーディングは必要ありません。ニッチの収益の**20%から始まり、検証済みの貢献が積み重なるにつれて80%**まで上がります。
/opportunities には、運営者を募集しているニッチが一覧表示されます。/<niche> はニッチの公開ページ(エージェント向けの skill.md と manifest.json もあります)、/@<handle> は運営者のプロフィール、/dashboard/niches は運営者自身のダッシュボード、/admin/knowledge は申請と貢献を検証する場所です。
エージェントが、実務経験のある人にしか答えられない問題で行き詰まると、質問をします。質問は運営者のダッシュボードに届き、回答はニッチの知識およびスコア付きの貢献となり、Chovy に通知されます。「コンテキストが不十分」と答えることも正式な回答として扱われ、費用はかかりません。検証される推測をするより、未解決の質問として残すほうがニッチにとってよいためです。docs/agent-questions.md をご覧ください。
スコアに反映されるのは、誰かが検証した貢献だけであり、投稿数によってスコアが上がることはありません。同じ種類の投稿を繰り返すたびに報酬は減り、顧客や支払いに関する申告には外部の根拠が必要で、重複した投稿は1回だけ記録されます。段階の設定は contribution_tiers にあるため、デプロイごとに調整できます。ニッチの収益は精算時点で、その時点で適用される配分率に基づいて分配されます。そのため、翌日に段階が変わっても、前日の売上の配分は変わりません(docs/revenue-ledger.md)。docs/knowledge-influencers.md と docs/revenue-share.md をご覧ください。
技術スタック
Bun、Hono(サーバーサイドレンダリング JSX)、Bun のネイティブドライバー経由の Postgres、Redis 上の BullMQ、Biome。bun apps/worker/src/enrich-cli.js [n] を実行すると、ターミナルから情報拡充を実行できます。共有 Profullstack モジュール:@profullstack/x402-gateway、@profullstack/emailer、@profullstack/coinpay、@profullstack/referrals、@profullstack/api-key-manager、@profullstack/autoblog(署名付き Webhook)、@profullstack/favicon-generator。
ブランドアセット
brand/logo.svgは編集可能なSVGのマスターです。bun run build:brandを実行すると、SVGCrusherで圧縮されてfavicon.svgが生成されます。その後、インストール済みのfav CLIを実行してapps/web/public/iconsを再生成します。ビルドでは、/logo.svg、/favicon.svg、メンバーパレット、マスク可能なアプリアイコンも更新されます。ページとアプリマニフェストではSVGが推奨されます。PNGとICOはフォールバックとして残されています。brand/preview.htmlですべてプレビューできます。
SVGCrusherの最初のCLIリリースはvendor/に同梱されているため、npmリリース前のクリーンなチェックアウトからでもこのコマンドを実行できます。単独のソースコードはprofullstack/svgcrusherにあります。
設定
すべての設定はpackages/config/src/index.jsで環境変数から一度だけ読み込まれます。.env.exampleにはすべての変数が記載されています。本番環境のシークレットは、logicsrcのnichedb--prodボルトに保管されています。
bun run secrets:pull # logicsrc teams pull profullstack nichedb prod --env .env
bun run secrets:push # after adding a key locally
ROLES=web,workerを指定すると、すべてを1つのコンテナで実行します。2つ目のサービスでROLES=workerを指定すると、1つのインスタンスでは足りなくなった際に、データ取り込みを分離できます。
デプロイ
Dockerfileが1つ、Railwayサービスが1つ、さらにRailwayのPostgresとRedisを使用します。railway.jsonでは、ヘルスチェックのパスに/healthzを設定しています。誰かがパスキーを登録する前に、SITE_URLに公開オリジンを設定してください。パスキーのリライングパーティーIDは、この値から導出されます。
アダプターの追加
import { defineAdapter } from '@nichedb/core/adapter';
export const example = defineAdapter({
name: 'example',
title: 'Example API',
collection: 'packages',
description: 'What it watches, in one paragraph.',
kinds: ['thing'],
cadenceMinutes: 30,
configFields: [{ key: 'topic', label: 'Topic', required: true }],
defaultSources: [{ slug: 'example-default', name: 'Example', config: { topic: 'all' } }],
async pull({ config, cursor, http, log, budget, deadline }) {
const page = await http.json(`https://example.com/api?topic=${config.topic}&since=${cursor.since ?? ''}`);
return {
items: page.results.map((r) => ({ externalId: r.id, kind: 'thing', title: r.name, url: r.url, publishedAt: r.at, tags: r.tags, data: r })),
cursor: { since: page.next },
note: `${page.results.length} things`,
};
},
});
packages/adapters/src/index.jsに登録します。コアは項目を正規化し、変更のない行の書き込みが不要になるようハッシュ化して、バッチ単位で書き込み、実行を記録して再スケジュールします。
ダンプのストリーミング
MusicBrainz、Discogs、Open Library、Podcast Index などの数ギガバイトのファイルを読み込むソースは、配列を一度に返すことはできません。ファイルがメモリに収まらず、読み込みも一度の実行では完了しないためです。代わりに pull がバッチを順次生成し、コアが一つずつ処理して書き込み、次を読み込む前にカーソルを保存します。pull は async * ジェネレーター(または { items: <async iterable> } を返す形式で、同じ動作です)です。生成される各値は { items, cursor } で、ジェネレーターの return 値は実行時の { cursor, note, nextInMinutes } です。
import { dumpDir, gzipLines } from '@nichedb/core/dump';
export const example = defineAdapter({
name: 'example-dump',
// ...
cadenceMinutes: 60,
budgetMs: 60 * 60_000,
async *pull({ cursor, http, log, deadline }) {
const version = await http.text('https://example.com/dumps/LATEST');
const skip = cursor.version === version ? Number(cursor.skip) || 0 : 0;
if (cursor.version === version && cursor.done) return { cursor, note: 'unchanged' };
const dir = await dumpDir('example');
const file = `${dir}/${version}.ndjson.gz`;
const dl = await http.download('https://example.com/dumps/latest.ndjson.gz', file);
if (!dl.complete) return { cursor: { version, skip }, note: 'download in progress', nextInMinutes: 1 };
let n = skip;
let batch = [];
for await (const line of gzipLines(file, { skip })) {
n += 1;
batch.push(toItem(JSON.parse(line)));
if (batch.length === 500) {
yield { items: batch, cursor: { version, skip: n } };
batch = [];
if (Date.now() > deadline) return { cursor: { version, skip: n }, nextInMinutes: 1 };
}
}
if (batch.length) yield { items: batch, cursor: { version, skip: n } };
return { cursor: { version, skip: n, done: true }, note: 'complete' };
},
});
ルールは次のとおりです。
budgetMsは実行の実時間予算で、このアダプターではINGEST_RUN_DEADLINE_MS(4 minutes)に代わるものです。リーパーの猶予時間と BullMQ のロック時間は、宣言された最大の予算に合わせて延長されるため、1 時間の予算を安全に宣言できます。コアはこれをdeadlineとして渡します。バッチ間および終了前に確認してください。期限を過ぎて書き込まれたバッチは、コア側でも実行を終了し、1 分後に再スケジュールされますが、アダプターが先に確認することで、実行をロック時間内に収められます。- 各バッチの
cursorは、そのバッチの項目を処理した後の位置(行数、バイトオフセット、最後の ID など)に、ファイルを識別する情報(ダンプの日付、バージョン、LATESTの値など)を加えたものです。これにより、新しい上流ファイルが来たときに読み込み位置をリセットできます。バッチがテーブルに書き込まれた時点ですぐ保存されます。少なくとも 1 回の配信で問題ありません。クラッシュ後にバッチが再書き込みされても、(source, externalId)に対する冪等なアップサートとなり、変更のない行ではコストがかかりません。 - 最後に
{ cursor, note, nextInMinutes }をreturnします。nextInMinutes: 1を指定すると、未完了の読み込みを次の実行サイクルまで継続できます。カーソルのdone: trueにより、上流ファイルに変更がない場合、次の実行を即座に終了できます。 http.download(url, path, { timeoutMs, headers, onProgress })はディスクにストリーミングし、すでに存在する部分からRangeで再開します(206 なら追記、200 なら最初から再開、416 なら全体が揃っています)。{ path, bytes, complete }を返します。complete: falseの場合は終了し、次回の実行で再度呼び出してください。ユーザーエージェントが送信されます。Podcast Index はユーザーエージェントなしのリクエストを拒否します。Discogs はRangeを無視し、厳しいレート制限を適用します。最初から再開することを想定し、リクエストは 1 時間に数回程度に抑えてください。dumpDir(name)はファイルの保存先です。INGEST_DATA_DIRが設定されている場合はその下(ここにボリュームをマウントしてください)、設定されていない場合は OS の一時ディレクトリで、再デプロイ時に消去されます。カーソルが読み込み位置を管理し、ディレクトリはキャッシュです。- リーダー:
gzipLines(path, { skip })、xzLines(path, { member, skip })(MusicBrainz 用。ホストにxzが必要です)、Open Library の 5 列の行用のtsvJsonLines(path, { skip })(各レコードにlineNoが含まれます)、シークが必要なプレーンファイル用のlineOffsetReader(path, { offset })、Podcast Index 用のuntar(path, dir)とsqliteRows(dbPath, sql)、CourtListener の bzip2 CSV テーブル用のbzip2CsvRows(path, { skip, escape })(純粋な JS デコーダーで、bzip2 バイナリは不要です。レコードが複数行にまたがる場合があり、引用符で囲まれていない空フィールドはnull、""は空文字列です。内部ではcsvRecords(chunks, opts)が RFC 4180 または COPY のESCAPE '\'を読み込みます)。すべてのリーダーは各行を生成するため、ファイル内の位置はskip + 読み込んだ行数です。圧縮ファイルの途中までスキップする場合は、先頭から再展開します(gzip は 1 GB あたり数秒、xz はそれより遅く、bzip2 はさらに遅く約 10 MB/s です)。プレーンファイルのoffsetはシークです。途中で切れた bzip2 ファイルは最後の完全なレコードの後で反復を正常に終了し、onTruncatedで通知します。破損したファイルの場合は例外が発生します。
ライセンス
MIT
地理的フィルタリングとスキャナーのコンテキスト
位置情報付きコレクション、検索、フィードでは、?lat=41.88&long=-87.62&radius=10 を使用してください。地理クエリでは、API、CLI/MCP フラグ、権限付きスキャナーカタログ、カバレッジのセマンティクス、移行について説明しています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。